RDS: Use spinlock to protect 64b value update on 32b archs
We have a 64bit value that needs to be set atomically. This is easy and quick on all 64bit archs, and can also be done on x86/32 with set_64bit() (uses cmpxchg8b). However other 32b archs don't have this. I actually changed this to the current state in preparation for mainline because the old way (using a spinlock on 32b) resulted in unsightly #ifdefs in the code. But obviously, being correct takes precedence. Signed-off-by: Andy Grover <andy.grover@oracle.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
745cbccac3
commit
8cbd9606a6
@@ -659,7 +659,11 @@ void rds_iw_conn_shutdown(struct rds_connection *conn)
|
||||
|
||||
/* Clear the ACK state */
|
||||
clear_bit(IB_ACK_IN_FLIGHT, &ic->i_ack_flags);
|
||||
rds_iw_set_64bit(&ic->i_ack_next, 0);
|
||||
#ifdef KERNEL_HAS_ATOMIC64
|
||||
atomic64_set(&ic->i_ack_next, 0);
|
||||
#else
|
||||
ic->i_ack_next = 0;
|
||||
#endif
|
||||
ic->i_ack_recv = 0;
|
||||
|
||||
/* Clear flow control state */
|
||||
@@ -693,6 +697,9 @@ int rds_iw_conn_alloc(struct rds_connection *conn, gfp_t gfp)
|
||||
|
||||
INIT_LIST_HEAD(&ic->iw_node);
|
||||
mutex_init(&ic->i_recv_mutex);
|
||||
#ifndef KERNEL_HAS_ATOMIC64
|
||||
spin_lock_init(&ic->i_ack_lock);
|
||||
#endif
|
||||
|
||||
/*
|
||||
* rds_iw_conn_shutdown() waits for these to be emptied so they
|
||||
|
Reference in New Issue
Block a user