···264264static int efx_process_channel(struct efx_channel *channel, int budget)265265{266266 struct efx_tx_queue *tx_queue;267267+ struct list_head rx_list;267268 int spent;268269269270 if (unlikely(!channel->enabled))270271 return 0;272272+273273+ /* Prepare the batch receive list */274274+ EFX_WARN_ON_PARANOID(channel->rx_list != NULL);275275+ INIT_LIST_HEAD(&rx_list);276276+ channel->rx_list = &rx_list;271277272278 efx_for_each_channel_tx_queue(tx_queue, channel) {273279 tx_queue->pkts_compl = 0;···296290 tx_queue->pkts_compl, tx_queue->bytes_compl);297291 }298292 }293293+294294+ /* Receive any packets we queued up */295295+ netif_receive_skb_list(channel->rx_list);296296+ channel->rx_list = NULL;299297300298 return spent;301299}···564554 if (rc)565555 goto fail;566556 }557557+558558+ channel->rx_list = NULL;567559568560 return 0;569561
+3
drivers/net/ethernet/sfc/net_driver.h
···448448 * __efx_rx_packet(), or zero if there is none449449 * @rx_pkt_index: Ring index of first buffer for next packet to be delivered450450 * by __efx_rx_packet(), if @rx_pkt_n_frags != 0451451+ * @rx_list: list of SKBs from current RX, awaiting processing451452 * @rx_queue: RX queue for this channel452453 * @tx_queue: TX queues for this channel453454 * @sync_events_state: Current state of sync events on this channel···500499501500 unsigned int rx_pkt_n_frags;502501 unsigned int rx_pkt_index;502502+503503+ struct list_head *rx_list;503504504505 struct efx_rx_queue rx_queue;505506 struct efx_tx_queue tx_queue[EFX_TXQ_TYPES];
+6-1
drivers/net/ethernet/sfc/rx.c
···634634 return;635635636636 /* Pass the packet up */637637- netif_receive_skb(skb);637637+ if (channel->rx_list != NULL)638638+ /* Add to list, will pass up later */639639+ list_add_tail(&skb->list, channel->rx_list);640640+ else641641+ /* No list, so pass it up now */642642+ netif_receive_skb(skb);638643}639644640645/* Handle a received packet. Second half: Touches packet payload. */