mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-12-28 16:56:26 +00:00
rds: introduce acquire/release ordering in acquire/release_in_xmit()
acquire/release_in_xmit() work as bit lock in rds_send_xmit(), so they are expected to ensure acquire/release memory ordering semantics. However, test_and_set_bit/clear_bit() don't imply such semantics, on top of this, following smp_mb__after_atomic() does not guarantee release ordering (memory barrier actually should be placed before clear_bit()). Instead, we use clear_bit_unlock/test_and_set_bit_lock() here. Fixes:0f4b1c7e89
("rds: fix rds_send_xmit() serialization") Fixes:1f9ecd7eac
("RDS: Pass rds_conn_path to rds_send_xmit()") Signed-off-by: Yewon Choi <woni9911@gmail.com> Reviewed-by: Michal Kubiak <michal.kubiak@intel.com> Link: https://lore.kernel.org/r/ZfQUxnNTO9AJmzwc@libra05 Signed-off-by: Paolo Abeni <pabeni@redhat.com>
This commit is contained in:
parent
9966e329d6
commit
1422f28826
@ -103,13 +103,12 @@ EXPORT_SYMBOL_GPL(rds_send_path_reset);
|
||||
|
||||
static int acquire_in_xmit(struct rds_conn_path *cp)
|
||||
{
|
||||
return test_and_set_bit(RDS_IN_XMIT, &cp->cp_flags) == 0;
|
||||
return test_and_set_bit_lock(RDS_IN_XMIT, &cp->cp_flags) == 0;
|
||||
}
|
||||
|
||||
static void release_in_xmit(struct rds_conn_path *cp)
|
||||
{
|
||||
clear_bit(RDS_IN_XMIT, &cp->cp_flags);
|
||||
smp_mb__after_atomic();
|
||||
clear_bit_unlock(RDS_IN_XMIT, &cp->cp_flags);
|
||||
/*
|
||||
* We don't use wait_on_bit()/wake_up_bit() because our waking is in a
|
||||
* hot path and finding waiters is very rare. We don't want to walk
|
||||
|
Loading…
Reference in New Issue
Block a user