Message ID | 20231123014537.9786-1-lirongqing@baidu.com (mailing list archive) |
---|---|
State | Accepted |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net-next,v4] net/smc: remove unneeded atomic operations in smc_tx_sndbuf_nonempty | expand |
On 23.11.23 02:45, Li RongQing wrote: > The commit dcd2cf5f2fc0 ("net/smc: add autocorking support") adds an > atomic variable tx_pushing in smc_connection to make sure only one can > send to let it cork more and save CDC slot. since smc_tx_pending can be > called in the soft IRQ without checking sock_owned_by_user() at that > time, which would cause a race condition because bh_lock_sock() did > not honor sock_lock() > > After commit 6b88af839d20 ("net/smc: don't send in the BH context if > sock_owned_by_user"), the transmission is deferred to when sock_lock() > is held by the user. Therefore, we no longer need tx_pending to hold > message. > > So remove atomic variable tx_pushing and its operation, and > smc_tx_sndbuf_nonempty becomes a wrapper of __smc_tx_sndbuf_nonempty, > so rename __smc_tx_sndbuf_nonempty back to smc_tx_sndbuf_nonempty > > Suggested-by: Alexandra Winter <wintera@linux.ibm.com> > Co-developed-by: Dust Li <dust.li@linux.alibaba.com> > Signed-off-by: Dust Li <dust.li@linux.alibaba.com> > Signed-off-by: Li RongQing <lirongqing@baidu.com> > --- Looks good to me. Reviewed-by: Alexandra Winter <wintera@linux.ibm.com> However I think this time you did not use scripts/get_maintainer.pl [1] to determine the correct recipient list for this email. [1] https://www.kernel.org/doc/html/v6.3/process/submitting-patches.html#submittingpatches
On 23.11.23 02:45, Li RongQing wrote: > The commit dcd2cf5f2fc0 ("net/smc: add autocorking support") adds an > atomic variable tx_pushing in smc_connection to make sure only one can > send to let it cork more and save CDC slot. since smc_tx_pending can be > called in the soft IRQ without checking sock_owned_by_user() at that > time, which would cause a race condition because bh_lock_sock() did > not honor sock_lock() > > After commit 6b88af839d20 ("net/smc: don't send in the BH context if > sock_owned_by_user"), the transmission is deferred to when sock_lock() > is held by the user. Therefore, we no longer need tx_pending to hold > message. > > So remove atomic variable tx_pushing and its operation, and > smc_tx_sndbuf_nonempty becomes a wrapper of __smc_tx_sndbuf_nonempty, > so rename __smc_tx_sndbuf_nonempty back to smc_tx_sndbuf_nonempty > > Suggested-by: Alexandra Winter <wintera@linux.ibm.com> > Co-developed-by: Dust Li <dust.li@linux.alibaba.com> > Signed-off-by: Dust Li <dust.li@linux.alibaba.com> > Signed-off-by: Li RongQing <lirongqing@baidu.com> > --- To the patch, LGTM! Again, please copy the related subsystem maintainers explicitly! Reviewed-and-tested-by: Wenjia Zhang <wenjia@linux.ibm.com>
On Thu, 23 Nov 2023 09:45:37 +0800 Li RongQing wrote: > The commit dcd2cf5f2fc0 ("net/smc: add autocorking support") adds an > atomic variable tx_pushing in smc_connection to make sure only one can > send to let it cork more and save CDC slot. since smc_tx_pending can be > called in the soft IRQ without checking sock_owned_by_user() at that > time, which would cause a race condition because bh_lock_sock() did > not honor sock_lock() Looks like this was applied by DaveM - commit e7bed88e0530 ("net/smc: remove unneeded atomic operations in smc_tx_sndbuf_nonempty") in net-next. Thank you!
diff v4: remove atomic variable tx_pushing diff v3: improvements in the commit body and comments diff v2: fix a typo in commit body and add net-next subject-prefix net/smc/smc.h | 1 - net/smc/smc_tx.c | 30 +----------------------------- 2 files changed, 1 insertion(+), 30 deletions(-) diff --git a/net/smc/smc.h b/net/smc/smc.h index e377980..cd51261 100644 --- a/net/smc/smc.h +++ b/net/smc/smc.h @@ -196,7 +196,6 @@ struct smc_connection { * - dec on polled tx cqe */ wait_queue_head_t cdc_pend_tx_wq; /* wakeup on no cdc_pend_tx_wr*/ - atomic_t tx_pushing; /* nr_threads trying tx push */ struct delayed_work tx_work; /* retry of smc_cdc_msg_send */ u32 tx_off; /* base offset in peer rmb */ diff --git a/net/smc/smc_tx.c b/net/smc/smc_tx.c index 3b0ff3b..214ac3c 100644 --- a/net/smc/smc_tx.c +++ b/net/smc/smc_tx.c @@ -621,7 +621,7 @@ static int smcd_tx_sndbuf_nonempty(struct smc_connection *conn) return rc; } -static int __smc_tx_sndbuf_nonempty(struct smc_connection *conn) +int smc_tx_sndbuf_nonempty(struct smc_connection *conn) { struct smc_sock *smc = container_of(conn, struct smc_sock, conn); int rc = 0; @@ -655,34 +655,6 @@ static int __smc_tx_sndbuf_nonempty(struct smc_connection *conn) return rc; } -int smc_tx_sndbuf_nonempty(struct smc_connection *conn) -{ - int rc; - - /* This make sure only one can send simultaneously to prevent wasting - * of CPU and CDC slot. - * Record whether someone has tried to push while we are pushing. - */ - if (atomic_inc_return(&conn->tx_pushing) > 1) - return 0; - -again: - atomic_set(&conn->tx_pushing, 1); - smp_wmb(); /* Make sure tx_pushing is 1 before real send */ - rc = __smc_tx_sndbuf_nonempty(conn); - - /* We need to check whether someone else have added some data into - * the send queue and tried to push but failed after the atomic_set() - * when we are pushing. - * If so, we need to push again to prevent those data hang in the send - * queue. - */ - if (unlikely(!atomic_dec_and_test(&conn->tx_pushing))) - goto again; - - return rc; -} - /* Wakeup sndbuf consumers from process context * since there is more data to transmit. The caller * must hold sock lock.