sfc: Skip RX end-of-batch work on channels without an RX queue
authorBen Hutchings <bhutchings@solarflare.com>
Mon, 13 Feb 2012 23:29:16 +0000 (23:29 +0000)
committerBen Hutchings <bhutchings@solarflare.com>
Mon, 13 Feb 2012 23:40:38 +0000 (23:40 +0000)
The code in efx_process_channel() to update the RX queue after each
batch of RX completions works out as a no-op on a TX-only channel
where the RX queue structure is set to all-zeroes, but
(1) efx_channel_get_rx_queue() will BUG() if DEBUG is defined, and
(2) it's a waste of time.

Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
drivers/net/ethernet/sfc/efx.c

index 952d0bf7695a4c89b8e8ca0401dbe964f70d97f5..b7cf9f0108ed3372267c1e62ce241a024165c763 100644 (file)
@@ -224,19 +224,20 @@ static int efx_process_channel(struct efx_channel *channel, int budget)
                return 0;
 
        spent = efx_nic_process_eventq(channel, budget);
-       if (spent == 0)
-               return 0;
+       if (spent && efx_channel_has_rx_queue(channel)) {
+               struct efx_rx_queue *rx_queue =
+                       efx_channel_get_rx_queue(channel);
+
+               /* Deliver last RX packet. */
+               if (channel->rx_pkt) {
+                       __efx_rx_packet(channel, channel->rx_pkt);
+                       channel->rx_pkt = NULL;
+               }
 
-       /* Deliver last RX packet. */
-       if (channel->rx_pkt) {
-               __efx_rx_packet(channel, channel->rx_pkt);
-               channel->rx_pkt = NULL;
+               efx_rx_strategy(channel);
+               efx_fast_push_rx_descriptors(rx_queue);
        }
 
-       efx_rx_strategy(channel);
-
-       efx_fast_push_rx_descriptors(efx_channel_get_rx_queue(channel));
-
        return spent;
 }