@@ -46,6 +46,9 @@ static int ionic_start_queues(struct ionic_lif *lif);
46
46
static void ionic_stop_queues (struct ionic_lif * lif );
47
47
static void ionic_lif_queue_identify (struct ionic_lif * lif );
48
48
49
+ static int ionic_xdp_queues_config (struct ionic_lif * lif );
50
+ static void ionic_xdp_unregister_rxq_info (struct ionic_queue * q );
51
+
49
52
static void ionic_dim_work (struct work_struct * work )
50
53
{
51
54
struct dim * dim = container_of (work , struct dim , work );
@@ -422,6 +425,7 @@ static void ionic_qcq_free(struct ionic_lif *lif, struct ionic_qcq *qcq)
422
425
qcq -> sg_base_pa = 0 ;
423
426
}
424
427
428
+ ionic_xdp_unregister_rxq_info (& qcq -> q );
425
429
ionic_qcq_intr_free (lif , qcq );
426
430
427
431
vfree (qcq -> cq .info );
@@ -862,8 +866,7 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
862
866
.type = q -> type ,
863
867
.ver = lif -> qtype_info [q -> type ].version ,
864
868
.index = cpu_to_le32 (q -> index ),
865
- .flags = cpu_to_le16 (IONIC_QINIT_F_IRQ |
866
- IONIC_QINIT_F_SG ),
869
+ .flags = cpu_to_le16 (IONIC_QINIT_F_IRQ ),
867
870
.intr_index = cpu_to_le16 (cq -> bound_intr -> index ),
868
871
.pid = cpu_to_le16 (q -> pid ),
869
872
.ring_size = ilog2 (q -> num_descs ),
@@ -875,6 +878,13 @@ static int ionic_lif_rxq_init(struct ionic_lif *lif, struct ionic_qcq *qcq)
875
878
};
876
879
int err ;
877
880
881
+ q -> partner = & lif -> txqcqs [q -> index ]-> q ;
882
+ q -> partner -> partner = q ;
883
+
884
+ if (!lif -> xdp_prog ||
885
+ (lif -> xdp_prog -> aux && lif -> xdp_prog -> aux -> xdp_has_frags ))
886
+ ctx .cmd .q_init .flags |= cpu_to_le16 (IONIC_QINIT_F_SG );
887
+
878
888
if (qcq -> flags & IONIC_QCQ_F_CMB_RINGS ) {
879
889
ctx .cmd .q_init .flags |= cpu_to_le16 (IONIC_QINIT_F_CMB );
880
890
ctx .cmd .q_init .ring_base = cpu_to_le64 (qcq -> cmb_q_base_pa );
@@ -1640,6 +1650,12 @@ static int ionic_init_nic_features(struct ionic_lif *lif)
1640
1650
netdev -> priv_flags |= IFF_UNICAST_FLT |
1641
1651
IFF_LIVE_ADDR_CHANGE ;
1642
1652
1653
+ netdev -> xdp_features = NETDEV_XDP_ACT_BASIC |
1654
+ NETDEV_XDP_ACT_REDIRECT |
1655
+ NETDEV_XDP_ACT_RX_SG |
1656
+ NETDEV_XDP_ACT_NDO_XMIT |
1657
+ NETDEV_XDP_ACT_NDO_XMIT_SG ;
1658
+
1643
1659
return 0 ;
1644
1660
}
1645
1661
@@ -1777,6 +1793,21 @@ static int ionic_start_queues_reconfig(struct ionic_lif *lif)
1777
1793
return err ;
1778
1794
}
1779
1795
1796
+ static bool ionic_xdp_is_valid_mtu (struct ionic_lif * lif , u32 mtu ,
1797
+ struct bpf_prog * xdp_prog )
1798
+ {
1799
+ if (!xdp_prog )
1800
+ return true;
1801
+
1802
+ if (mtu <= IONIC_XDP_MAX_LINEAR_MTU )
1803
+ return true;
1804
+
1805
+ if (xdp_prog -> aux && xdp_prog -> aux -> xdp_has_frags )
1806
+ return true;
1807
+
1808
+ return false;
1809
+ }
1810
+
1780
1811
static int ionic_change_mtu (struct net_device * netdev , int new_mtu )
1781
1812
{
1782
1813
struct ionic_lif * lif = netdev_priv (netdev );
@@ -1789,8 +1820,13 @@ static int ionic_change_mtu(struct net_device *netdev, int new_mtu)
1789
1820
.mtu = cpu_to_le32 (new_mtu ),
1790
1821
},
1791
1822
};
1823
+ struct bpf_prog * xdp_prog ;
1792
1824
int err ;
1793
1825
1826
+ xdp_prog = READ_ONCE (lif -> xdp_prog );
1827
+ if (!ionic_xdp_is_valid_mtu (lif , new_mtu , xdp_prog ))
1828
+ return - EINVAL ;
1829
+
1794
1830
err = ionic_adminq_post_wait (lif , & ctx );
1795
1831
if (err )
1796
1832
return err ;
@@ -2166,6 +2202,10 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
2166
2202
int derr = 0 ;
2167
2203
int i , err ;
2168
2204
2205
+ err = ionic_xdp_queues_config (lif );
2206
+ if (err )
2207
+ return err ;
2208
+
2169
2209
for (i = 0 ; i < lif -> nxqs ; i ++ ) {
2170
2210
if (!(lif -> rxqcqs [i ] && lif -> txqcqs [i ])) {
2171
2211
dev_err (lif -> ionic -> dev , "%s: bad qcq %d\n" , __func__ , i );
@@ -2211,6 +2251,8 @@ static int ionic_txrx_enable(struct ionic_lif *lif)
2211
2251
derr = ionic_qcq_disable (lif , lif -> rxqcqs [i ], derr );
2212
2252
}
2213
2253
2254
+ ionic_xdp_queues_config (lif );
2255
+
2214
2256
return err ;
2215
2257
}
2216
2258
@@ -2668,11 +2710,151 @@ static void ionic_vf_attr_replay(struct ionic_lif *lif)
2668
2710
ionic_vf_start (ionic );
2669
2711
}
2670
2712
2713
+ static void ionic_xdp_unregister_rxq_info (struct ionic_queue * q )
2714
+ {
2715
+ struct xdp_rxq_info * xi ;
2716
+
2717
+ if (!q -> xdp_rxq_info )
2718
+ return ;
2719
+
2720
+ xi = q -> xdp_rxq_info ;
2721
+ q -> xdp_rxq_info = NULL ;
2722
+
2723
+ xdp_rxq_info_unreg (xi );
2724
+ kfree (xi );
2725
+ }
2726
+
2727
+ static int ionic_xdp_register_rxq_info (struct ionic_queue * q , unsigned int napi_id )
2728
+ {
2729
+ struct xdp_rxq_info * rxq_info ;
2730
+ int err ;
2731
+
2732
+ rxq_info = kzalloc (sizeof (* rxq_info ), GFP_KERNEL );
2733
+ if (!rxq_info )
2734
+ return - ENOMEM ;
2735
+
2736
+ err = xdp_rxq_info_reg (rxq_info , q -> lif -> netdev , q -> index , napi_id );
2737
+ if (err ) {
2738
+ dev_err (q -> dev , "Queue %d xdp_rxq_info_reg failed, err %d\n" ,
2739
+ q -> index , err );
2740
+ goto err_out ;
2741
+ }
2742
+
2743
+ err = xdp_rxq_info_reg_mem_model (rxq_info , MEM_TYPE_PAGE_ORDER0 , NULL );
2744
+ if (err ) {
2745
+ dev_err (q -> dev , "Queue %d xdp_rxq_info_reg_mem_model failed, err %d\n" ,
2746
+ q -> index , err );
2747
+ xdp_rxq_info_unreg (rxq_info );
2748
+ goto err_out ;
2749
+ }
2750
+
2751
+ q -> xdp_rxq_info = rxq_info ;
2752
+
2753
+ return 0 ;
2754
+
2755
+ err_out :
2756
+ kfree (rxq_info );
2757
+ return err ;
2758
+ }
2759
+
2760
+ static int ionic_xdp_queues_config (struct ionic_lif * lif )
2761
+ {
2762
+ unsigned int i ;
2763
+ int err ;
2764
+
2765
+ if (!lif -> rxqcqs )
2766
+ return 0 ;
2767
+
2768
+ /* There's no need to rework memory if not going to/from NULL program.
2769
+ * If there is no lif->xdp_prog, there should also be no q.xdp_rxq_info
2770
+ * This way we don't need to keep an *xdp_prog in every queue struct.
2771
+ */
2772
+ if (!lif -> xdp_prog == !lif -> rxqcqs [0 ]-> q .xdp_rxq_info )
2773
+ return 0 ;
2774
+
2775
+ for (i = 0 ; i < lif -> ionic -> nrxqs_per_lif && lif -> rxqcqs [i ]; i ++ ) {
2776
+ struct ionic_queue * q = & lif -> rxqcqs [i ]-> q ;
2777
+
2778
+ if (q -> xdp_rxq_info ) {
2779
+ ionic_xdp_unregister_rxq_info (q );
2780
+ continue ;
2781
+ }
2782
+
2783
+ err = ionic_xdp_register_rxq_info (q , lif -> rxqcqs [i ]-> napi .napi_id );
2784
+ if (err ) {
2785
+ dev_err (lif -> ionic -> dev , "failed to register RX queue %d info for XDP, err %d\n" ,
2786
+ i , err );
2787
+ goto err_out ;
2788
+ }
2789
+ }
2790
+
2791
+ return 0 ;
2792
+
2793
+ err_out :
2794
+ for (i = 0 ; i < lif -> ionic -> nrxqs_per_lif && lif -> rxqcqs [i ]; i ++ )
2795
+ ionic_xdp_unregister_rxq_info (& lif -> rxqcqs [i ]-> q );
2796
+
2797
+ return err ;
2798
+ }
2799
+
2800
+ static int ionic_xdp_config (struct net_device * netdev , struct netdev_bpf * bpf )
2801
+ {
2802
+ struct ionic_lif * lif = netdev_priv (netdev );
2803
+ struct bpf_prog * old_prog ;
2804
+ u32 maxfs ;
2805
+
2806
+ if (test_bit (IONIC_LIF_F_SPLIT_INTR , lif -> state )) {
2807
+ #define XDP_ERR_SPLIT "XDP not available with split Tx/Rx interrupts"
2808
+ NL_SET_ERR_MSG_MOD (bpf -> extack , XDP_ERR_SPLIT );
2809
+ netdev_info (lif -> netdev , XDP_ERR_SPLIT );
2810
+ return - EOPNOTSUPP ;
2811
+ }
2812
+
2813
+ if (!ionic_xdp_is_valid_mtu (lif , netdev -> mtu , bpf -> prog )) {
2814
+ #define XDP_ERR_MTU "MTU is too large for XDP without frags support"
2815
+ NL_SET_ERR_MSG_MOD (bpf -> extack , XDP_ERR_MTU );
2816
+ netdev_info (lif -> netdev , XDP_ERR_MTU );
2817
+ return - EINVAL ;
2818
+ }
2819
+
2820
+ maxfs = __le32_to_cpu (lif -> identity -> eth .max_frame_size ) - VLAN_ETH_HLEN ;
2821
+ if (bpf -> prog && !(bpf -> prog -> aux && bpf -> prog -> aux -> xdp_has_frags ))
2822
+ maxfs = min_t (u32 , maxfs , IONIC_XDP_MAX_LINEAR_MTU );
2823
+ netdev -> max_mtu = maxfs ;
2824
+
2825
+ if (!netif_running (netdev )) {
2826
+ old_prog = xchg (& lif -> xdp_prog , bpf -> prog );
2827
+ } else {
2828
+ mutex_lock (& lif -> queue_lock );
2829
+ ionic_stop_queues_reconfig (lif );
2830
+ old_prog = xchg (& lif -> xdp_prog , bpf -> prog );
2831
+ ionic_start_queues_reconfig (lif );
2832
+ mutex_unlock (& lif -> queue_lock );
2833
+ }
2834
+
2835
+ if (old_prog )
2836
+ bpf_prog_put (old_prog );
2837
+
2838
+ return 0 ;
2839
+ }
2840
+
2841
+ static int ionic_xdp (struct net_device * netdev , struct netdev_bpf * bpf )
2842
+ {
2843
+ switch (bpf -> command ) {
2844
+ case XDP_SETUP_PROG :
2845
+ return ionic_xdp_config (netdev , bpf );
2846
+ default :
2847
+ return - EINVAL ;
2848
+ }
2849
+ }
2850
+
2671
2851
static const struct net_device_ops ionic_netdev_ops = {
2672
2852
.ndo_open = ionic_open ,
2673
2853
.ndo_stop = ionic_stop ,
2674
2854
.ndo_eth_ioctl = ionic_eth_ioctl ,
2675
2855
.ndo_start_xmit = ionic_start_xmit ,
2856
+ .ndo_bpf = ionic_xdp ,
2857
+ .ndo_xdp_xmit = ionic_xdp_xmit ,
2676
2858
.ndo_get_stats64 = ionic_get_stats64 ,
2677
2859
.ndo_set_rx_mode = ionic_ndo_set_rx_mode ,
2678
2860
.ndo_set_features = ionic_set_features ,
@@ -2755,6 +2937,8 @@ static void ionic_swap_queues(struct ionic_qcq *a, struct ionic_qcq *b)
2755
2937
swap (a -> q .base , b -> q .base );
2756
2938
swap (a -> q .base_pa , b -> q .base_pa );
2757
2939
swap (a -> q .info , b -> q .info );
2940
+ swap (a -> q .xdp_rxq_info , b -> q .xdp_rxq_info );
2941
+ swap (a -> q .partner , b -> q .partner );
2758
2942
swap (a -> q_base , b -> q_base );
2759
2943
swap (a -> q_base_pa , b -> q_base_pa );
2760
2944
swap (a -> q_size , b -> q_size );
@@ -3391,9 +3575,12 @@ static int ionic_lif_adminq_init(struct ionic_lif *lif)
3391
3575
3392
3576
napi_enable (& qcq -> napi );
3393
3577
3394
- if (qcq -> flags & IONIC_QCQ_F_INTR )
3578
+ if (qcq -> flags & IONIC_QCQ_F_INTR ) {
3579
+ irq_set_affinity_hint (qcq -> intr .vector ,
3580
+ & qcq -> intr .affinity_mask );
3395
3581
ionic_intr_mask (idev -> intr_ctrl , qcq -> intr .index ,
3396
3582
IONIC_INTR_MASK_CLEAR );
3583
+ }
3397
3584
3398
3585
qcq -> flags |= IONIC_QCQ_F_INITED ;
3399
3586
0 commit comments