* [PATCH net-next 0/5] sfc: TXQ refactor
@ 2020-09-02 14:34 Edward Cree
2020-09-02 14:35 ` [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c Edward Cree
` (4 more replies)
0 siblings, 5 replies; 8+ messages in thread
From: Edward Cree @ 2020-09-02 14:34 UTC (permalink / raw)
To: linux-net-drivers, davem; +Cc: netdev
Refactor and unify partner-TXQ handling in the EF100 and legacy drivers.
The main thrust of this series is to remove from the legacy (Siena/EF10)
driver the assumption that a netdev TX queue has precisely two hardware
TXQs (checksummed and unchecksummed) associated with it, so that in
future we can have more (e.g. for handling inner-header checksums) or
fewer (e.g. to free up hardware queues for XDP usage).
Edward Cree (5):
sfc: add and use efx_tx_send_pending in tx.c
sfc: use tx_queue->old_read_count in EF100 TX path
sfc: use efx_channel_tx_[old_]fill_level() in Siena/EF10 TX datapath
sfc: rewrite efx_tx_may_pio
sfc: remove efx_tx_queue_partner
drivers/net/ethernet/sfc/ef100_tx.c | 8 ++-
drivers/net/ethernet/sfc/net_driver.h | 18 +++--
drivers/net/ethernet/sfc/nic_common.h | 40 +----------
drivers/net/ethernet/sfc/tx.c | 99 +++++++++++++++++----------
drivers/net/ethernet/sfc/tx_common.c | 5 +-
5 files changed, 85 insertions(+), 85 deletions(-)
^ permalink raw reply [flat|nested] 8+ messages in thread
* [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c
2020-09-02 14:34 [PATCH net-next 0/5] sfc: TXQ refactor Edward Cree
@ 2020-09-02 14:35 ` Edward Cree
2020-09-02 22:55 ` David Miller
2020-09-02 14:36 ` [PATCH net-next 2/5] sfc: use tx_queue->old_read_count in EF100 TX path Edward Cree
` (3 subsequent siblings)
4 siblings, 1 reply; 8+ messages in thread
From: Edward Cree @ 2020-09-02 14:35 UTC (permalink / raw)
To: linux-net-drivers, davem; +Cc: netdev
Instead of using efx_tx_queue_partner(), which relies on the assumption
that tx_queues_per_channel is 2, efx_tx_send_pending() iterates over
txqs with efx_for_each_channel_tx_queue().
Signed-off-by: Edward Cree <ecree@solarflare.com>
---
drivers/net/ethernet/sfc/tx.c | 59 ++++++++++++++++++-----------------
1 file changed, 31 insertions(+), 28 deletions(-)
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c
index 727201d5eb24..71eb99db5439 100644
--- a/drivers/net/ethernet/sfc/tx.c
+++ b/drivers/net/ethernet/sfc/tx.c
@@ -268,6 +268,19 @@ static int efx_enqueue_skb_pio(struct efx_tx_queue *tx_queue,
}
#endif /* EFX_USE_PIO */
+/* Send any pending traffic for a channel. xmit_more is shared across all
+ * queues for a channel, so we must check all of them.
+ */
+static void efx_tx_send_pending(struct efx_channel *channel)
+{
+ struct efx_tx_queue *q;
+
+ efx_for_each_channel_tx_queue(q, channel) {
+ if (q->xmit_more_available)
+ efx_nic_push_buffers(q);
+ }
+}
+
/*
* Add a socket buffer to a TX queue
*
@@ -336,21 +349,11 @@ netdev_tx_t __efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb
efx_tx_maybe_stop_queue(tx_queue);
- /* Pass off to hardware */
- if (__netdev_tx_sent_queue(tx_queue->core_txq, skb_len, xmit_more)) {
- struct efx_tx_queue *txq2 = efx_tx_queue_partner(tx_queue);
-
- /* There could be packets left on the partner queue if
- * xmit_more was set. If we do not push those they
- * could be left for a long time and cause a netdev watchdog.
- */
- if (txq2->xmit_more_available)
- efx_nic_push_buffers(txq2);
+ tx_queue->xmit_more_available = true;
- efx_nic_push_buffers(tx_queue);
- } else {
- tx_queue->xmit_more_available = xmit_more;
- }
+ /* Pass off to hardware */
+ if (__netdev_tx_sent_queue(tx_queue->core_txq, skb_len, xmit_more))
+ efx_tx_send_pending(tx_queue->channel);
if (segments) {
tx_queue->tso_bursts++;
@@ -371,14 +374,8 @@ netdev_tx_t __efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb
* on this queue or a partner queue then we need to push here to get the
* previous packets out.
*/
- if (!xmit_more) {
- struct efx_tx_queue *txq2 = efx_tx_queue_partner(tx_queue);
-
- if (txq2->xmit_more_available)
- efx_nic_push_buffers(txq2);
-
- efx_nic_push_buffers(tx_queue);
- }
+ if (!xmit_more)
+ efx_tx_send_pending(tx_queue->channel);
return NETDEV_TX_OK;
}
@@ -489,18 +486,24 @@ netdev_tx_t efx_hard_start_xmit(struct sk_buff *skb,
EFX_WARN_ON_PARANOID(!netif_device_present(net_dev));
- /* PTP "event" packet */
- if (unlikely(efx_xmit_with_hwtstamp(skb)) &&
- unlikely(efx_ptp_is_ptp_tx(efx, skb))) {
- return efx_ptp_tx(efx, skb);
- }
-
index = skb_get_queue_mapping(skb);
type = skb->ip_summed == CHECKSUM_PARTIAL ? EFX_TXQ_TYPE_OFFLOAD : 0;
if (index >= efx->n_tx_channels) {
index -= efx->n_tx_channels;
type |= EFX_TXQ_TYPE_HIGHPRI;
}
+
+ /* PTP "event" packet */
+ if (unlikely(efx_xmit_with_hwtstamp(skb)) &&
+ unlikely(efx_ptp_is_ptp_tx(efx, skb))) {
+ /* There may be existing transmits on the channel that are
+ * waiting for this packet to trigger the doorbell write.
+ * We need to send the packets at this point.
+ */
+ efx_tx_send_pending(efx_get_tx_channel(efx, index));
+ return efx_ptp_tx(efx, skb);
+ }
+
tx_queue = efx_get_tx_queue(efx, index, type);
return __efx_enqueue_skb(tx_queue, skb);
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 2/5] sfc: use tx_queue->old_read_count in EF100 TX path
2020-09-02 14:34 [PATCH net-next 0/5] sfc: TXQ refactor Edward Cree
2020-09-02 14:35 ` [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c Edward Cree
@ 2020-09-02 14:36 ` Edward Cree
2020-09-02 14:36 ` [PATCH net-next 3/5] sfc: use efx_channel_tx_[old_]fill_level() in Siena/EF10 TX datapath Edward Cree
` (2 subsequent siblings)
4 siblings, 0 replies; 8+ messages in thread
From: Edward Cree @ 2020-09-02 14:36 UTC (permalink / raw)
To: linux-net-drivers, davem; +Cc: netdev
As in the Siena/EF10 case, it minimises cacheline ping-pong between
the TX and completion paths.
Signed-off-by: Edward Cree <ecree@solarflare.com>
---
drivers/net/ethernet/sfc/ef100_tx.c | 8 ++++++--
drivers/net/ethernet/sfc/net_driver.h | 14 ++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/drivers/net/ethernet/sfc/ef100_tx.c b/drivers/net/ethernet/sfc/ef100_tx.c
index a09546e43408..47d67b1e379b 100644
--- a/drivers/net/ethernet/sfc/ef100_tx.c
+++ b/drivers/net/ethernet/sfc/ef100_tx.c
@@ -359,15 +359,19 @@ int ef100_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb)
goto err;
ef100_tx_make_descriptors(tx_queue, skb, segments);
- fill_level = efx_channel_tx_fill_level(tx_queue->channel);
+ fill_level = efx_channel_tx_old_fill_level(tx_queue->channel);
if (fill_level > efx->txq_stop_thresh) {
+ struct efx_tx_queue *txq2;
+
netif_tx_stop_queue(tx_queue->core_txq);
/* Re-read after a memory barrier in case we've raced with
* the completion path. Otherwise there's a danger we'll never
* restart the queue if all completions have just happened.
*/
smp_mb();
- fill_level = efx_channel_tx_fill_level(tx_queue->channel);
+ efx_for_each_channel_tx_queue(txq2, tx_queue->channel)
+ txq2->old_read_count = READ_ONCE(txq2->read_count);
+ fill_level = efx_channel_tx_old_fill_level(tx_queue->channel);
if (fill_level < efx->txq_stop_thresh)
netif_tx_start_queue(tx_queue->core_txq);
}
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h
index 338ebb0402be..2358d35bffb5 100644
--- a/drivers/net/ethernet/sfc/net_driver.h
+++ b/drivers/net/ethernet/sfc/net_driver.h
@@ -1692,6 +1692,20 @@ efx_channel_tx_fill_level(struct efx_channel *channel)
return fill_level;
}
+/* Conservative approximation of efx_channel_tx_fill_level using cached value */
+static inline unsigned int
+efx_channel_tx_old_fill_level(struct efx_channel *channel)
+{
+ struct efx_tx_queue *tx_queue;
+ unsigned int fill_level = 0;
+
+ efx_for_each_channel_tx_queue(tx_queue, channel)
+ fill_level = max(fill_level,
+ tx_queue->insert_count - tx_queue->old_read_count);
+
+ return fill_level;
+}
+
/* Get all supported features.
* If a feature is not fixed, it is present in hw_features.
* If a feature is fixed, it does not present in hw_features, but
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 3/5] sfc: use efx_channel_tx_[old_]fill_level() in Siena/EF10 TX datapath
2020-09-02 14:34 [PATCH net-next 0/5] sfc: TXQ refactor Edward Cree
2020-09-02 14:35 ` [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c Edward Cree
2020-09-02 14:36 ` [PATCH net-next 2/5] sfc: use tx_queue->old_read_count in EF100 TX path Edward Cree
@ 2020-09-02 14:36 ` Edward Cree
2020-09-02 14:37 ` [PATCH net-next 4/5] sfc: rewrite efx_tx_may_pio Edward Cree
2020-09-02 14:37 ` [PATCH net-next 5/5] sfc: remove efx_tx_queue_partner Edward Cree
4 siblings, 0 replies; 8+ messages in thread
From: Edward Cree @ 2020-09-02 14:36 UTC (permalink / raw)
To: linux-net-drivers, davem; +Cc: netdev
Instead of open-coding the calculation with efx_tx_queue_partner(), use
the functions that iterate over numbers of queues other than 2 with
efx_for_each_channel_tx_queue().
Signed-off-by: Edward Cree <ecree@solarflare.com>
---
drivers/net/ethernet/sfc/net_driver.h | 4 ----
drivers/net/ethernet/sfc/tx.c | 14 ++++++--------
drivers/net/ethernet/sfc/tx_common.c | 5 +----
3 files changed, 7 insertions(+), 16 deletions(-)
diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h
index 2358d35bffb5..08c4858fc604 100644
--- a/drivers/net/ethernet/sfc/net_driver.h
+++ b/drivers/net/ethernet/sfc/net_driver.h
@@ -1681,10 +1681,6 @@ efx_channel_tx_fill_level(struct efx_channel *channel)
struct efx_tx_queue *tx_queue;
unsigned int fill_level = 0;
- /* This function is currently only used by EF100, which maybe
- * could do something simpler and just compute the fill level
- * of the single TXQ that's really in use.
- */
efx_for_each_channel_tx_queue(tx_queue, channel)
fill_level = max(fill_level,
tx_queue->insert_count - tx_queue->read_count);
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c
index 71eb99db5439..713b129f9b83 100644
--- a/drivers/net/ethernet/sfc/tx.c
+++ b/drivers/net/ethernet/sfc/tx.c
@@ -59,13 +59,12 @@ u8 *efx_tx_get_copy_buffer_limited(struct efx_tx_queue *tx_queue,
static void efx_tx_maybe_stop_queue(struct efx_tx_queue *txq1)
{
- /* We need to consider both queues that the net core sees as one */
- struct efx_tx_queue *txq2 = efx_tx_queue_partner(txq1);
+ /* We need to consider all queues that the net core sees as one */
struct efx_nic *efx = txq1->efx;
+ struct efx_tx_queue *txq2;
unsigned int fill_level;
- fill_level = max(txq1->insert_count - txq1->old_read_count,
- txq2->insert_count - txq2->old_read_count);
+ fill_level = efx_channel_tx_old_fill_level(txq1->channel);
if (likely(fill_level < efx->txq_stop_thresh))
return;
@@ -85,11 +84,10 @@ static void efx_tx_maybe_stop_queue(struct efx_tx_queue *txq1)
*/
netif_tx_stop_queue(txq1->core_txq);
smp_mb();
- txq1->old_read_count = READ_ONCE(txq1->read_count);
- txq2->old_read_count = READ_ONCE(txq2->read_count);
+ efx_for_each_channel_tx_queue(txq2, txq1->channel)
+ txq2->old_read_count = READ_ONCE(txq2->read_count);
- fill_level = max(txq1->insert_count - txq1->old_read_count,
- txq2->insert_count - txq2->old_read_count);
+ fill_level = efx_channel_tx_old_fill_level(txq1->channel);
EFX_WARN_ON_ONCE_PARANOID(fill_level >= efx->txq_entries);
if (likely(fill_level < efx->txq_stop_thresh)) {
smp_mb();
diff --git a/drivers/net/ethernet/sfc/tx_common.c b/drivers/net/ethernet/sfc/tx_common.c
index 793e234819a8..02f7c772d261 100644
--- a/drivers/net/ethernet/sfc/tx_common.c
+++ b/drivers/net/ethernet/sfc/tx_common.c
@@ -242,7 +242,6 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index)
{
unsigned int fill_level, pkts_compl = 0, bytes_compl = 0;
struct efx_nic *efx = tx_queue->efx;
- struct efx_tx_queue *txq2;
EFX_WARN_ON_ONCE_PARANOID(index > tx_queue->ptr_mask);
@@ -261,9 +260,7 @@ void efx_xmit_done(struct efx_tx_queue *tx_queue, unsigned int index)
if (unlikely(netif_tx_queue_stopped(tx_queue->core_txq)) &&
likely(efx->port_enabled) &&
likely(netif_device_present(efx->net_dev))) {
- txq2 = efx_tx_queue_partner(tx_queue);
- fill_level = max(tx_queue->insert_count - tx_queue->read_count,
- txq2->insert_count - txq2->read_count);
+ fill_level = efx_channel_tx_fill_level(tx_queue->channel);
if (fill_level <= efx->txq_wake_thresh)
netif_tx_wake_queue(tx_queue->core_txq);
}
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 4/5] sfc: rewrite efx_tx_may_pio
2020-09-02 14:34 [PATCH net-next 0/5] sfc: TXQ refactor Edward Cree
` (2 preceding siblings ...)
2020-09-02 14:36 ` [PATCH net-next 3/5] sfc: use efx_channel_tx_[old_]fill_level() in Siena/EF10 TX datapath Edward Cree
@ 2020-09-02 14:37 ` Edward Cree
2020-09-02 14:37 ` [PATCH net-next 5/5] sfc: remove efx_tx_queue_partner Edward Cree
4 siblings, 0 replies; 8+ messages in thread
From: Edward Cree @ 2020-09-02 14:37 UTC (permalink / raw)
To: linux-net-drivers, davem; +Cc: netdev
Use efx_for_each_channel_tx_queue() rather than efx_tx_queue_partner().
Make some related simplifications of efx_nic_tx_is_empty() to remove
entry points that aren't used.
Signed-off-by: Edward Cree <ecree@solarflare.com>
---
drivers/net/ethernet/sfc/nic_common.h | 30 ++-------------------------
drivers/net/ethernet/sfc/tx.c | 26 ++++++++++++++++++++++-
2 files changed, 27 insertions(+), 29 deletions(-)
diff --git a/drivers/net/ethernet/sfc/nic_common.h b/drivers/net/ethernet/sfc/nic_common.h
index 974107354087..3f88c6444fa1 100644
--- a/drivers/net/ethernet/sfc/nic_common.h
+++ b/drivers/net/ethernet/sfc/nic_common.h
@@ -65,8 +65,7 @@ efx_tx_desc(struct efx_tx_queue *tx_queue, unsigned int index)
/* Report whether this TX queue would be empty for the given write_count.
* May return false negative.
*/
-static inline bool __efx_nic_tx_is_empty(struct efx_tx_queue *tx_queue,
- unsigned int write_count)
+static inline bool efx_nic_tx_is_empty(struct efx_tx_queue *tx_queue, unsigned int write_count)
{
unsigned int empty_read_count = READ_ONCE(tx_queue->empty_read_count);
@@ -76,17 +75,6 @@ static inline bool __efx_nic_tx_is_empty(struct efx_tx_queue *tx_queue,
return ((empty_read_count ^ write_count) & ~EFX_EMPTY_COUNT_VALID) == 0;
}
-/* Report whether the NIC considers this TX queue empty, using
- * packet_write_count (the write count recorded for the last completable
- * doorbell push). May return false negative. EF10 only, which is OK
- * because only EF10 supports PIO.
- */
-static inline bool efx_nic_tx_is_empty(struct efx_tx_queue *tx_queue)
-{
- EFX_WARN_ON_ONCE_PARANOID(!tx_queue->efx->type->option_descriptors);
- return __efx_nic_tx_is_empty(tx_queue, tx_queue->packet_write_count);
-}
-
/* Get partner of a TX queue, seen as part of the same net core queue */
/* XXX is this a thing on EF100? */
static inline struct efx_tx_queue *efx_tx_queue_partner(struct efx_tx_queue *tx_queue)
@@ -97,20 +85,6 @@ static inline struct efx_tx_queue *efx_tx_queue_partner(struct efx_tx_queue *tx_
return tx_queue + EFX_TXQ_TYPE_OFFLOAD;
}
-/* Decide whether we can use TX PIO, ie. write packet data directly into
- * a buffer on the device. This can reduce latency at the expense of
- * throughput, so we only do this if both hardware and software TX rings
- * are empty. This also ensures that only one packet at a time can be
- * using the PIO buffer.
- */
-static inline bool efx_nic_may_tx_pio(struct efx_tx_queue *tx_queue)
-{
- struct efx_tx_queue *partner = efx_tx_queue_partner(tx_queue);
-
- return tx_queue->piobuf && efx_nic_tx_is_empty(tx_queue) &&
- efx_nic_tx_is_empty(partner);
-}
-
int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, struct sk_buff *skb,
bool *data_mapped);
@@ -125,7 +99,7 @@ int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, struct sk_buff *skb,
static inline bool efx_nic_may_push_tx_desc(struct efx_tx_queue *tx_queue,
unsigned int write_count)
{
- bool was_empty = __efx_nic_tx_is_empty(tx_queue, write_count);
+ bool was_empty = efx_nic_tx_is_empty(tx_queue, write_count);
tx_queue->empty_read_count = 0;
return was_empty && tx_queue->write_count - write_count == 1;
diff --git a/drivers/net/ethernet/sfc/tx.c b/drivers/net/ethernet/sfc/tx.c
index 713b129f9b83..09955b5c9d1e 100644
--- a/drivers/net/ethernet/sfc/tx.c
+++ b/drivers/net/ethernet/sfc/tx.c
@@ -264,6 +264,30 @@ static int efx_enqueue_skb_pio(struct efx_tx_queue *tx_queue,
++tx_queue->insert_count;
return 0;
}
+
+/* Decide whether we can use TX PIO, ie. write packet data directly into
+ * a buffer on the device. This can reduce latency at the expense of
+ * throughput, so we only do this if both hardware and software TX rings
+ * are empty, including all queues for the channel. This also ensures that
+ * only one packet at a time can be using the PIO buffer. If the xmit_more
+ * flag is set then we don't use this - there'll be another packet along
+ * shortly and we want to hold off the doorbell.
+ */
+static bool efx_tx_may_pio(struct efx_tx_queue *tx_queue)
+{
+ struct efx_channel *channel = tx_queue->channel;
+
+ if (!tx_queue->piobuf)
+ return false;
+
+ EFX_WARN_ON_ONCE_PARANOID(!channel->efx->type->option_descriptors);
+
+ efx_for_each_channel_tx_queue(tx_queue, channel)
+ if (!efx_nic_tx_is_empty(tx_queue, tx_queue->packet_write_count))
+ return false;
+
+ return true;
+}
#endif /* EFX_USE_PIO */
/* Send any pending traffic for a channel. xmit_more is shared across all
@@ -326,7 +350,7 @@ netdev_tx_t __efx_enqueue_skb(struct efx_tx_queue *tx_queue, struct sk_buff *skb
goto err;
#ifdef EFX_USE_PIO
} else if (skb_len <= efx_piobuf_size && !xmit_more &&
- efx_nic_may_tx_pio(tx_queue)) {
+ efx_tx_may_pio(tx_queue)) {
/* Use PIO for short packets with an empty queue. */
if (efx_enqueue_skb_pio(tx_queue, skb))
goto err;
^ permalink raw reply related [flat|nested] 8+ messages in thread
* [PATCH net-next 5/5] sfc: remove efx_tx_queue_partner
2020-09-02 14:34 [PATCH net-next 0/5] sfc: TXQ refactor Edward Cree
` (3 preceding siblings ...)
2020-09-02 14:37 ` [PATCH net-next 4/5] sfc: rewrite efx_tx_may_pio Edward Cree
@ 2020-09-02 14:37 ` Edward Cree
4 siblings, 0 replies; 8+ messages in thread
From: Edward Cree @ 2020-09-02 14:37 UTC (permalink / raw)
To: linux-net-drivers, davem; +Cc: netdev
All users of this function are now gone.
Signed-off-by: Edward Cree <ecree@solarflare.com>
---
drivers/net/ethernet/sfc/nic_common.h | 10 ----------
1 file changed, 10 deletions(-)
diff --git a/drivers/net/ethernet/sfc/nic_common.h b/drivers/net/ethernet/sfc/nic_common.h
index 3f88c6444fa1..82271f0b8627 100644
--- a/drivers/net/ethernet/sfc/nic_common.h
+++ b/drivers/net/ethernet/sfc/nic_common.h
@@ -75,16 +75,6 @@ static inline bool efx_nic_tx_is_empty(struct efx_tx_queue *tx_queue, unsigned i
return ((empty_read_count ^ write_count) & ~EFX_EMPTY_COUNT_VALID) == 0;
}
-/* Get partner of a TX queue, seen as part of the same net core queue */
-/* XXX is this a thing on EF100? */
-static inline struct efx_tx_queue *efx_tx_queue_partner(struct efx_tx_queue *tx_queue)
-{
- if (tx_queue->label & EFX_TXQ_TYPE_OFFLOAD)
- return tx_queue - EFX_TXQ_TYPE_OFFLOAD;
- else
- return tx_queue + EFX_TXQ_TYPE_OFFLOAD;
-}
-
int efx_enqueue_skb_tso(struct efx_tx_queue *tx_queue, struct sk_buff *skb,
bool *data_mapped);
^ permalink raw reply related [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c
2020-09-02 14:35 ` [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c Edward Cree
@ 2020-09-02 22:55 ` David Miller
2020-09-03 16:48 ` Edward Cree
0 siblings, 1 reply; 8+ messages in thread
From: David Miller @ 2020-09-02 22:55 UTC (permalink / raw)
To: ecree; +Cc: linux-net-drivers, netdev
From: Edward Cree <ecree@solarflare.com>
Date: Wed, 2 Sep 2020 15:35:53 +0100
> + tx_queue->xmit_more_available = true;
I don't understand why you're setting xmit_more_available
unconditionally to true now instead of setting it to 'xmit_more' as
seen by this transmit attempt. Why would you want to signal
that xmit_more handling might be necessary when you haven't been
given an xmit_more tx request?
If this change is in fact correct, it's something you need to explain
in the commit message.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c
2020-09-02 22:55 ` David Miller
@ 2020-09-03 16:48 ` Edward Cree
0 siblings, 0 replies; 8+ messages in thread
From: Edward Cree @ 2020-09-03 16:48 UTC (permalink / raw)
To: David Miller; +Cc: linux-net-drivers, netdev
On 02/09/2020 23:55, David Miller wrote:
> From: Edward Cree <ecree@solarflare.com>
> Date: Wed, 2 Sep 2020 15:35:53 +0100
>
>> + tx_queue->xmit_more_available = true;
>
> I don't understand why you're setting xmit_more_available
> unconditionally to true now instead of setting it to 'xmit_more' as
> seen by this transmit attempt. Why would you want to signal
> that xmit_more handling might be necessary when you haven't been
> given an xmit_more tx request?
After this patch xmit_more_available is something of a misnomer and
really means "xmit pending" (I'll rename it in v2). We unconditionally
set it to true here so that efx_tx_send_pending() knows there is
something to do on this queue; but then we only call efx_tx_send_pending
if !xmit_more (per the __netdev_tx_sent_queue() call). Then
efx_tx_send_pending, via the efx->type->tx_write methods, sets
xmit_more_available to false.
Thus xmit_more_available is only true on return from __efx_enqueue_skb()
if we had xmit_more (and __netdev_tx_sent_queue didn't say "ring it
anyway").
> If this change is in fact correct, it's something you need to explain
> in the commit message.
Will do so for v2, as it is indeed far from obvious.
-ed
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2020-09-03 16:49 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-02 14:34 [PATCH net-next 0/5] sfc: TXQ refactor Edward Cree
2020-09-02 14:35 ` [PATCH net-next 1/5] sfc: add and use efx_tx_send_pending in tx.c Edward Cree
2020-09-02 22:55 ` David Miller
2020-09-03 16:48 ` Edward Cree
2020-09-02 14:36 ` [PATCH net-next 2/5] sfc: use tx_queue->old_read_count in EF100 TX path Edward Cree
2020-09-02 14:36 ` [PATCH net-next 3/5] sfc: use efx_channel_tx_[old_]fill_level() in Siena/EF10 TX datapath Edward Cree
2020-09-02 14:37 ` [PATCH net-next 4/5] sfc: rewrite efx_tx_may_pio Edward Cree
2020-09-02 14:37 ` [PATCH net-next 5/5] sfc: remove efx_tx_queue_partner Edward Cree
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).