@@ -149,20 +149,18 @@ bool mlx5e_xmit_xdp_frame(struct mlx5e_xdpsq *sq, struct mlx5e_xdp_info *xdpi)
149149
150150 cseg -> opmod_idx_opcode = cpu_to_be32 ((sq -> pc << 8 ) | MLX5_OPCODE_SEND );
151151
152- /* move page to reference to sq responsibility,
153- * and mark so it's not put back in page-cache.
154- */
155- sq -> db .xdpi [pi ] = * xdpi ;
156152 sq -> pc ++ ;
157153
158154 sq -> doorbell_cseg = cseg ;
159155
156+ mlx5e_xdpi_fifo_push (& sq -> db .xdpi_fifo , xdpi );
160157 stats -> xmit ++ ;
161158 return true;
162159}
163160
164161bool mlx5e_poll_xdpsq_cq (struct mlx5e_cq * cq , struct mlx5e_rq * rq )
165162{
163+ struct mlx5e_xdp_info_fifo * xdpi_fifo ;
166164 struct mlx5e_xdpsq * sq ;
167165 struct mlx5_cqe64 * cqe ;
168166 bool is_redirect ;
@@ -179,6 +177,7 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
179177 return false;
180178
181179 is_redirect = !rq ;
180+ xdpi_fifo = & sq -> db .xdpi_fifo ;
182181
183182 /* sq->cc must be updated only after mlx5_cqwq_update_db_record(),
184183 * otherwise a cq overrun may occur
@@ -200,19 +199,19 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
200199 get_cqe_opcode (cqe ));
201200
202201 do {
203- u16 ci = mlx5_wq_cyc_ctr2ix ( & sq -> wq , sqcc );
204- struct mlx5e_xdp_info * xdpi = & sq -> db . xdpi [ ci ] ;
202+ struct mlx5e_xdp_info xdpi =
203+ mlx5e_xdpi_fifo_pop ( xdpi_fifo ) ;
205204
206205 last_wqe = (sqcc == wqe_counter );
207206 sqcc ++ ;
208207
209208 if (is_redirect ) {
210- xdp_return_frame (xdpi -> xdpf );
211- dma_unmap_single (sq -> pdev , xdpi -> dma_addr ,
212- xdpi -> xdpf -> len , DMA_TO_DEVICE );
209+ xdp_return_frame (xdpi . xdpf );
210+ dma_unmap_single (sq -> pdev , xdpi . dma_addr ,
211+ xdpi . xdpf -> len , DMA_TO_DEVICE );
213212 } else {
214213 /* Recycle RX page */
215- mlx5e_page_release (rq , & xdpi -> di , true);
214+ mlx5e_page_release (rq , & xdpi . di , true);
216215 }
217216 } while (!last_wqe );
218217 } while ((++ i < MLX5E_TX_CQ_POLL_BUDGET ) && (cqe = mlx5_cqwq_get_cqe (& cq -> wq )));
@@ -230,21 +229,22 @@ bool mlx5e_poll_xdpsq_cq(struct mlx5e_cq *cq, struct mlx5e_rq *rq)
230229
231230void mlx5e_free_xdpsq_descs (struct mlx5e_xdpsq * sq , struct mlx5e_rq * rq )
232231{
232+ struct mlx5e_xdp_info_fifo * xdpi_fifo = & sq -> db .xdpi_fifo ;
233233 bool is_redirect = !rq ;
234234
235235 while (sq -> cc != sq -> pc ) {
236- u16 ci = mlx5_wq_cyc_ctr2ix ( & sq -> wq , sq -> cc );
237- struct mlx5e_xdp_info * xdpi = & sq -> db . xdpi [ ci ] ;
236+ struct mlx5e_xdp_info xdpi =
237+ mlx5e_xdpi_fifo_pop ( xdpi_fifo ) ;
238238
239239 sq -> cc ++ ;
240240
241241 if (is_redirect ) {
242- xdp_return_frame (xdpi -> xdpf );
243- dma_unmap_single (sq -> pdev , xdpi -> dma_addr ,
244- xdpi -> xdpf -> len , DMA_TO_DEVICE );
242+ xdp_return_frame (xdpi . xdpf );
243+ dma_unmap_single (sq -> pdev , xdpi . dma_addr ,
244+ xdpi . xdpf -> len , DMA_TO_DEVICE );
245245 } else {
246246 /* Recycle RX page */
247- mlx5e_page_release (rq , & xdpi -> di , false);
247+ mlx5e_page_release (rq , & xdpi . di , false);
248248 }
249249 }
250250}
0 commit comments