Skip to content

Commit

Permalink
rds: introduce acquire/release ordering in acquire/release_in_xmit()
Browse files Browse the repository at this point in the history
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: 0f4b1c7 ("rds: fix rds_send_xmit() serialization")
Fixes: 1f9ecd7 ("RDS: Pass rds_conn_path to rds_send_xmit()")
Signed-off-by: Yewon Choi <[email protected]>
Reviewed-by: Michal Kubiak <[email protected]>
Link: https://lore.kernel.org/r/ZfQUxnNTO9AJmzwc@libra05
Signed-off-by: Paolo Abeni <[email protected]>
  • Loading branch information
healwon authored and Paolo Abeni committed Mar 19, 2024
1 parent 9966e32 commit 1422f28
Showing 1 changed file with 2 additions and 3 deletions.
5 changes: 2 additions & 3 deletions net/rds/send.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 1422f28

Please sign in to comment.