From: Ben Hutchings <bhutchings@solarflare.com>
To: David Miller <davem@davemloft.net>
Cc: <netdev@vger.kernel.org>, <linux-net-drivers@solarflare.com>
Subject: [PATCH net-next 24/32] sfc: Stop RX refill before flushing RX queues
Date: Thu, 22 Aug 2013 14:00:12 +0100 [thread overview]
Message-ID: <1377176412.1703.29.camel@bwh-desktop.uk.level5networks.com> (raw)
In-Reply-To: <1377175392.1703.5.camel@bwh-desktop.uk.level5networks.com>
rx_queue::enabled guards refill, so rename it to reflect that. Clear
it at the start of the queue teardown process rather than waiting for
the RX queue to be flushed.
Signed-off-by: Ben Hutchings <bhutchings@solarflare.com>
---
drivers/net/ethernet/sfc/efx.c | 9 +++++++--
drivers/net/ethernet/sfc/net_driver.h | 4 ++--
drivers/net/ethernet/sfc/nic.c | 1 -
drivers/net/ethernet/sfc/rx.c | 8 ++++----
4 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/drivers/net/ethernet/sfc/efx.c b/drivers/net/ethernet/sfc/efx.c
index a7818d1..ee9242c 100644
--- a/drivers/net/ethernet/sfc/efx.c
+++ b/drivers/net/ethernet/sfc/efx.c
@@ -248,8 +248,7 @@ static int efx_process_channel(struct efx_channel *channel, int budget)
efx_channel_get_rx_queue(channel);
efx_rx_flush_packet(channel);
- if (rx_queue->enabled)
- efx_fast_push_rx_descriptors(rx_queue);
+ efx_fast_push_rx_descriptors(rx_queue);
}
return spent;
@@ -647,6 +646,12 @@ static void efx_stop_datapath(struct efx_nic *efx)
EFX_ASSERT_RESET_SERIALISED(efx);
BUG_ON(efx->port_enabled);
+ /* Stop RX refill */
+ efx_for_each_channel(channel, efx) {
+ efx_for_each_channel_rx_queue(rx_queue, channel)
+ rx_queue->refill_enabled = false;
+ }
+
/* Only perform flush if dma is enabled */
if (dev->is_busmaster && efx->state != STATE_RECOVERY) {
rc = efx_nic_flush_queues(efx);
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h
index 7c96372..c9f7989 100644
--- a/drivers/net/ethernet/sfc/net_driver.h
+++ b/drivers/net/ethernet/sfc/net_driver.h
@@ -286,7 +286,7 @@ struct efx_rx_page_state {
* @buffer: The software buffer ring
* @rxd: The hardware descriptor ring
* @ptr_mask: The size of the ring minus 1.
- * @enabled: Receive queue enabled indicator.
+ * @refill_enabled: Enable refill whenever fill level is low
* @flush_pending: Set when a RX flush is pending. Has the same lifetime as
* @rxq_flush_pending.
* @added_count: Number of buffers added to the receive queue.
@@ -317,7 +317,7 @@ struct efx_rx_queue {
struct efx_rx_buffer *buffer;
struct efx_special_buffer rxd;
unsigned int ptr_mask;
- bool enabled;
+ bool refill_enabled;
bool flush_pending;
unsigned int added_count;
diff --git a/drivers/net/ethernet/sfc/nic.c b/drivers/net/ethernet/sfc/nic.c
index 2d0a584..deb0ee04 100644
--- a/drivers/net/ethernet/sfc/nic.c
+++ b/drivers/net/ethernet/sfc/nic.c
@@ -1204,7 +1204,6 @@ efx_handle_generated_event(struct efx_channel *channel, efx_qword_t *event)
* queue. Refill it here */
efx_fast_push_rx_descriptors(rx_queue);
} else if (rx_queue && magic == EFX_CHANNEL_MAGIC_RX_DRAIN(rx_queue)) {
- rx_queue->enabled = false;
efx_handle_drain_event(channel);
} else if (code == _EFX_CHANNEL_MAGIC_TX_DRAIN) {
efx_handle_drain_event(channel);
diff --git a/drivers/net/ethernet/sfc/rx.c b/drivers/net/ethernet/sfc/rx.c
index 6af9cfd..8b482de 100644
--- a/drivers/net/ethernet/sfc/rx.c
+++ b/drivers/net/ethernet/sfc/rx.c
@@ -326,6 +326,9 @@ void efx_fast_push_rx_descriptors(struct efx_rx_queue *rx_queue)
unsigned int fill_level, batch_size;
int space, rc = 0;
+ if (!rx_queue->refill_enabled)
+ return;
+
/* Calculate current fill level, and exit if we don't need to fill */
fill_level = (rx_queue->added_count - rx_queue->removed_count);
EFX_BUG_ON_PARANOID(fill_level > rx_queue->efx->rxq_entries);
@@ -738,9 +741,9 @@ void efx_init_rx_queue(struct efx_rx_queue *rx_queue)
rx_queue->max_fill = max_fill;
rx_queue->fast_fill_trigger = trigger;
+ rx_queue->refill_enabled = true;
/* Set up RX descriptor ring */
- rx_queue->enabled = true;
efx_nic_init_rx(rx_queue);
}
@@ -753,9 +756,6 @@ void efx_fini_rx_queue(struct efx_rx_queue *rx_queue)
netif_dbg(rx_queue->efx, drv, rx_queue->efx->net_dev,
"shutting down RX queue %d\n", efx_rx_queue_index(rx_queue));
- /* A flush failure might have left rx_queue->enabled */
- rx_queue->enabled = false;
-
del_timer_sync(&rx_queue->slow_fill);
efx_nic_fini_rx(rx_queue);
--
Ben Hutchings, Staff Engineer, Solarflare
Not speaking for my employer; that's the marketing department's job.
They asked us to note that Solarflare product names are trademarked.
next prev parent reply other threads:[~2013-08-22 13:00 UTC|newest]
Thread overview: 35+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-08-22 12:43 Pull request: sfc-next 2013-08-22 Ben Hutchings
2013-08-22 12:44 ` [PATCH net-next 01/32] sfc: Fix lookup of default RX MAC filters when steered using ethtool Ben Hutchings
2013-08-22 12:44 ` [PATCH net-next 02/32] sfc: const-qualify source pointers for MMIO write functions Ben Hutchings
2013-08-22 12:45 ` [PATCH net-next 03/32] sfc: Use efx_mcdi_mon() to find efx_mcdi_mon structure from efx_nic Ben Hutchings
2013-08-22 12:45 ` [PATCH net-next 04/32] sfc: Move details of a Falcon bug workaround out of ethtool.c Ben Hutchings
2013-08-22 12:46 ` [PATCH net-next 05/32] sfc: Move more Falcon-specific code and definitions into falcon.c Ben Hutchings
2013-08-22 12:46 ` [PATCH net-next 06/32] sfc: Introduce and use MCDI_DECLARE_BUF macro Ben Hutchings
2013-08-22 12:47 ` [PATCH net-next 07/32] sfc: Rationalise MCDI buffer accessors Ben Hutchings
2013-08-22 12:48 ` [PATCH net-next 08/32] sfc: Fill out the set of MCDI accessors Ben Hutchings
2013-08-22 12:48 ` [PATCH net-next 09/32] sfc: Introduce and use MCDI_CTL_SDU_LEN_MAX_V1 macro for Siena-specific code Ben Hutchings
2013-08-22 12:49 ` [PATCH net-next 10/32] sfc: Use proper macros to declare and access MCDI arrays Ben Hutchings
2013-08-22 12:49 ` [PATCH net-next 11/32] sfc: Ensure MCDI buffers, but not lengths, are dword aligned Ben Hutchings
2013-08-22 12:50 ` [PATCH net-next 12/32] sfc: Add and use MCDI_SET_QWORD() and MCDI_SET_ARRAY_QWORD() Ben Hutchings
2013-08-22 12:50 ` [PATCH net-next 13/32] sfc: Move siena_reset_hw() and siena_map_reset_reason() into MCDI module Ben Hutchings
2013-08-22 12:50 ` [PATCH net-next 14/32] sfc: Move efx_mcdi_mac_reconfigure() to siena.c and rename Ben Hutchings
2013-08-22 12:52 ` [PATCH net-next 15/32] sfc: Collect all MCDI port functions into mcdi_port.c Ben Hutchings
2013-08-22 12:53 ` [PATCH net-next 16/32] sfc: Make efx_mcdi_init() call efx_mcdi_handle_assertion() Ben Hutchings
2013-08-22 12:54 ` [PATCH net-next 17/32] sfc: Make MCDI independent of Siena Ben Hutchings
2013-08-22 12:54 ` [PATCH net-next 18/32] sfc: Add GFP flags to efx_nic_alloc_buffer() and make most callers allow blocking Ben Hutchings
2013-08-22 12:55 ` [PATCH net-next 19/32] sfc: Make struct efx_special_buffer less special Ben Hutchings
2013-08-22 12:55 ` [PATCH net-next 20/32] sfc: Rename Falcon-architecture register definitions Ben Hutchings
2013-08-22 12:56 ` [PATCH net-next 21/32] sfc: Remove efx_process_channel_now() Ben Hutchings
2013-08-22 12:57 ` [PATCH net-next 22/32] sfc: Rework IRQ enable/disable Ben Hutchings
2013-08-22 12:59 ` [PATCH net-next 23/32] sfc: Limit scope of a Falcon A1 IRQ workaround Ben Hutchings
2013-08-22 13:00 ` Ben Hutchings [this message]
2013-08-22 13:00 ` [PATCH net-next 25/32] sfc: Remove bogus call to efx_release_tx_buffers() Ben Hutchings
2013-08-22 13:02 ` [PATCH net-next 26/32] sfc: Refactor queue teardown sequence to allow for EF10 flush behaviour Ben Hutchings
2013-08-22 13:05 ` [PATCH net-next 27/32] sfc: Move and rename Falcon/Siena common NIC operations Ben Hutchings
2013-08-22 13:05 ` [PATCH net-next 28/32] sfc: Translate MCDI error numbers received in events Ben Hutchings
2013-08-22 13:07 ` [PATCH net-next 29/32] sfc: Update MCDI protocol definitions for EF10 Ben Hutchings
2013-08-22 13:09 ` [PATCH net-next 30/32] sfc: Add support for MCDI v2 Ben Hutchings
2013-08-22 13:10 ` [PATCH net-next 31/32] sfc: Fix race in completion handling Ben Hutchings
2013-08-22 13:10 ` [PATCH net-next 32/32] sfc: Update and improve kernel-doc for efx_mcdi_state & efx_mcdi_iface Ben Hutchings
2013-08-22 19:09 ` Pull request: sfc-next 2013-08-22 David Miller
2013-08-22 19:16 ` Ben Hutchings
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1377176412.1703.29.camel@bwh-desktop.uk.level5networks.com \
--to=bhutchings@solarflare.com \
--cc=davem@davemloft.net \
--cc=linux-net-drivers@solarflare.com \
--cc=netdev@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox