9
9
#include "i40e_txrx_common.h"
10
10
#include "i40e_xsk.h"
11
11
12
- /**
13
- * i40e_alloc_xsk_umems - Allocate an array to store per ring UMEMs
14
- * @vsi: Current VSI
15
- *
16
- * Returns 0 on success, <0 on failure
17
- **/
18
- static int i40e_alloc_xsk_umems (struct i40e_vsi * vsi )
19
- {
20
- if (vsi -> xsk_umems )
21
- return 0 ;
22
-
23
- vsi -> num_xsk_umems_used = 0 ;
24
- vsi -> num_xsk_umems = vsi -> alloc_queue_pairs ;
25
- vsi -> xsk_umems = kcalloc (vsi -> num_xsk_umems , sizeof (* vsi -> xsk_umems ),
26
- GFP_KERNEL );
27
- if (!vsi -> xsk_umems ) {
28
- vsi -> num_xsk_umems = 0 ;
29
- return - ENOMEM ;
30
- }
31
-
32
- return 0 ;
33
- }
34
-
35
- /**
36
- * i40e_add_xsk_umem - Store a UMEM for a certain ring/qid
37
- * @vsi: Current VSI
38
- * @umem: UMEM to store
39
- * @qid: Ring/qid to associate with the UMEM
40
- *
41
- * Returns 0 on success, <0 on failure
42
- **/
43
- static int i40e_add_xsk_umem (struct i40e_vsi * vsi , struct xdp_umem * umem ,
44
- u16 qid )
45
- {
46
- int err ;
47
-
48
- err = i40e_alloc_xsk_umems (vsi );
49
- if (err )
50
- return err ;
51
-
52
- vsi -> xsk_umems [qid ] = umem ;
53
- vsi -> num_xsk_umems_used ++ ;
54
-
55
- return 0 ;
56
- }
57
-
58
- /**
59
- * i40e_remove_xsk_umem - Remove a UMEM for a certain ring/qid
60
- * @vsi: Current VSI
61
- * @qid: Ring/qid associated with the UMEM
62
- **/
63
- static void i40e_remove_xsk_umem (struct i40e_vsi * vsi , u16 qid )
64
- {
65
- vsi -> xsk_umems [qid ] = NULL ;
66
- vsi -> num_xsk_umems_used -- ;
67
-
68
- if (vsi -> num_xsk_umems == 0 ) {
69
- kfree (vsi -> xsk_umems );
70
- vsi -> xsk_umems = NULL ;
71
- vsi -> num_xsk_umems = 0 ;
72
- }
73
- }
74
-
75
12
/**
76
13
* i40e_xsk_umem_dma_map - DMA maps all UMEM memory for the netdev
77
14
* @vsi: Current VSI
@@ -140,6 +77,7 @@ static void i40e_xsk_umem_dma_unmap(struct i40e_vsi *vsi, struct xdp_umem *umem)
140
77
static int i40e_xsk_umem_enable (struct i40e_vsi * vsi , struct xdp_umem * umem ,
141
78
u16 qid )
142
79
{
80
+ struct net_device * netdev = vsi -> netdev ;
143
81
struct xdp_umem_fq_reuse * reuseq ;
144
82
bool if_running ;
145
83
int err ;
@@ -150,12 +88,9 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
150
88
if (qid >= vsi -> num_queue_pairs )
151
89
return - EINVAL ;
152
90
153
- if (vsi -> xsk_umems ) {
154
- if (qid >= vsi -> num_xsk_umems )
155
- return - EINVAL ;
156
- if (vsi -> xsk_umems [qid ])
157
- return - EBUSY ;
158
- }
91
+ if (qid >= netdev -> real_num_rx_queues ||
92
+ qid >= netdev -> real_num_tx_queues )
93
+ return - EINVAL ;
159
94
160
95
reuseq = xsk_reuseq_prepare (vsi -> rx_rings [0 ]-> count );
161
96
if (!reuseq )
@@ -173,13 +108,7 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
173
108
err = i40e_queue_pair_disable (vsi , qid );
174
109
if (err )
175
110
return err ;
176
- }
177
-
178
- err = i40e_add_xsk_umem (vsi , umem , qid );
179
- if (err )
180
- return err ;
181
111
182
- if (if_running ) {
183
112
err = i40e_queue_pair_enable (vsi , qid );
184
113
if (err )
185
114
return err ;
@@ -197,11 +126,13 @@ static int i40e_xsk_umem_enable(struct i40e_vsi *vsi, struct xdp_umem *umem,
197
126
**/
198
127
static int i40e_xsk_umem_disable (struct i40e_vsi * vsi , u16 qid )
199
128
{
129
+ struct net_device * netdev = vsi -> netdev ;
130
+ struct xdp_umem * umem ;
200
131
bool if_running ;
201
132
int err ;
202
133
203
- if (! vsi -> xsk_umems || qid >= vsi -> num_xsk_umems ||
204
- ! vsi -> xsk_umems [ qid ] )
134
+ umem = xdp_get_umem_from_qid ( netdev , qid );
135
+ if (! umem )
205
136
return - EINVAL ;
206
137
207
138
if_running = netif_running (vsi -> netdev ) && i40e_enabled_xdp_vsi (vsi );
@@ -212,8 +143,7 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
212
143
return err ;
213
144
}
214
145
215
- i40e_xsk_umem_dma_unmap (vsi , vsi -> xsk_umems [qid ]);
216
- i40e_remove_xsk_umem (vsi , qid );
146
+ i40e_xsk_umem_dma_unmap (vsi , umem );
217
147
218
148
if (if_running ) {
219
149
err = i40e_queue_pair_enable (vsi , qid );
@@ -237,20 +167,18 @@ static int i40e_xsk_umem_disable(struct i40e_vsi *vsi, u16 qid)
237
167
int i40e_xsk_umem_query (struct i40e_vsi * vsi , struct xdp_umem * * umem ,
238
168
u16 qid )
239
169
{
170
+ struct net_device * netdev = vsi -> netdev ;
171
+ struct xdp_umem * queried_umem ;
172
+
240
173
if (vsi -> type != I40E_VSI_MAIN )
241
174
return - EINVAL ;
242
175
243
- if (qid >= vsi -> num_queue_pairs )
244
- return - EINVAL ;
176
+ queried_umem = xdp_get_umem_from_qid (netdev , qid );
245
177
246
- if (vsi -> xsk_umems ) {
247
- if (qid >= vsi -> num_xsk_umems )
248
- return - EINVAL ;
249
- * umem = vsi -> xsk_umems [qid ];
250
- return 0 ;
251
- }
178
+ if (!queried_umem )
179
+ return - EINVAL ;
252
180
253
- * umem = NULL ;
181
+ * umem = queried_umem ;
254
182
return 0 ;
255
183
}
256
184
@@ -945,13 +873,11 @@ void i40e_xsk_clean_tx_ring(struct i40e_ring *tx_ring)
945
873
**/
946
874
bool i40e_xsk_any_rx_ring_enabled (struct i40e_vsi * vsi )
947
875
{
876
+ struct net_device * netdev = vsi -> netdev ;
948
877
int i ;
949
878
950
- if (!vsi -> xsk_umems )
951
- return false;
952
-
953
879
for (i = 0 ; i < vsi -> num_queue_pairs ; i ++ ) {
954
- if (vsi -> xsk_umems [ i ] )
880
+ if (xdp_get_umem_from_qid ( netdev , i ) )
955
881
return true;
956
882
}
957
883
0 commit comments