rxrpc: Use refcount_t rather than atomic_t
[ Upstream commit a05754295e01f006a651eec759c5dbe682ef6cef ] Move to using refcount_t rather than atomic_t for refcounts in rxrpc. Signed-off-by: David Howells <dhowells@redhat.com> cc: Marc Dionne <marc.dionne@auristor.com> cc: linux-afs@lists.infradead.org Signed-off-by: David S. Miller <davem@davemloft.net> Stable-dep-of: 3bcd6c7eaa53 ("rxrpc: Fix race between conn bundle lookup and bundle removal [ZDI-CAN-15975]") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
bddde342c6
commit
23c03ee0ee
@@ -112,7 +112,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
|
||||
found_extant_call:
|
||||
rxrpc_get_call(call, rxrpc_call_got);
|
||||
read_unlock(&rx->call_lock);
|
||||
_leave(" = %p [%d]", call, atomic_read(&call->usage));
|
||||
_leave(" = %p [%d]", call, refcount_read(&call->ref));
|
||||
return call;
|
||||
}
|
||||
|
||||
@@ -160,7 +160,7 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp,
|
||||
spin_lock_init(&call->notify_lock);
|
||||
spin_lock_init(&call->input_lock);
|
||||
rwlock_init(&call->state_lock);
|
||||
atomic_set(&call->usage, 1);
|
||||
refcount_set(&call->ref, 1);
|
||||
call->debug_id = debug_id;
|
||||
call->tx_total_len = -1;
|
||||
call->next_rx_timo = 20 * HZ;
|
||||
@@ -301,7 +301,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
call->interruptibility = p->interruptibility;
|
||||
call->tx_total_len = p->tx_total_len;
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_new_client,
|
||||
atomic_read(&call->usage),
|
||||
refcount_read(&call->ref),
|
||||
here, (const void *)p->user_call_ID);
|
||||
if (p->kernel)
|
||||
__set_bit(RXRPC_CALL_KERNEL, &call->flags);
|
||||
@@ -354,7 +354,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
|
||||
goto error_attached_to_socket;
|
||||
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_connected,
|
||||
atomic_read(&call->usage), here, NULL);
|
||||
refcount_read(&call->ref), here, NULL);
|
||||
|
||||
rxrpc_start_call_timer(call);
|
||||
|
||||
@@ -374,7 +374,7 @@ error_dup_user_ID:
|
||||
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
|
||||
RX_CALL_DEAD, -EEXIST);
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_error,
|
||||
atomic_read(&call->usage), here, ERR_PTR(-EEXIST));
|
||||
refcount_read(&call->ref), here, ERR_PTR(-EEXIST));
|
||||
rxrpc_release_call(rx, call);
|
||||
mutex_unlock(&call->user_mutex);
|
||||
rxrpc_put_call(call, rxrpc_call_put);
|
||||
@@ -388,7 +388,7 @@ error_dup_user_ID:
|
||||
*/
|
||||
error_attached_to_socket:
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_error,
|
||||
atomic_read(&call->usage), here, ERR_PTR(ret));
|
||||
refcount_read(&call->ref), here, ERR_PTR(ret));
|
||||
set_bit(RXRPC_CALL_DISCONNECTED, &call->flags);
|
||||
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
|
||||
RX_CALL_DEAD, ret);
|
||||
@@ -444,8 +444,9 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx,
|
||||
bool rxrpc_queue_call(struct rxrpc_call *call)
|
||||
{
|
||||
const void *here = __builtin_return_address(0);
|
||||
int n = atomic_fetch_add_unless(&call->usage, 1, 0);
|
||||
if (n == 0)
|
||||
int n;
|
||||
|
||||
if (!__refcount_inc_not_zero(&call->ref, &n))
|
||||
return false;
|
||||
if (rxrpc_queue_work(&call->processor))
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_queued, n + 1,
|
||||
@@ -461,7 +462,7 @@ bool rxrpc_queue_call(struct rxrpc_call *call)
|
||||
bool __rxrpc_queue_call(struct rxrpc_call *call)
|
||||
{
|
||||
const void *here = __builtin_return_address(0);
|
||||
int n = atomic_read(&call->usage);
|
||||
int n = refcount_read(&call->ref);
|
||||
ASSERTCMP(n, >=, 1);
|
||||
if (rxrpc_queue_work(&call->processor))
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_queued_ref, n,
|
||||
@@ -478,7 +479,7 @@ void rxrpc_see_call(struct rxrpc_call *call)
|
||||
{
|
||||
const void *here = __builtin_return_address(0);
|
||||
if (call) {
|
||||
int n = atomic_read(&call->usage);
|
||||
int n = refcount_read(&call->ref);
|
||||
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_seen, n,
|
||||
here, NULL);
|
||||
@@ -488,11 +489,11 @@ void rxrpc_see_call(struct rxrpc_call *call)
|
||||
bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
|
||||
{
|
||||
const void *here = __builtin_return_address(0);
|
||||
int n = atomic_fetch_add_unless(&call->usage, 1, 0);
|
||||
int n;
|
||||
|
||||
if (n == 0)
|
||||
if (!__refcount_inc_not_zero(&call->ref, &n))
|
||||
return false;
|
||||
trace_rxrpc_call(call->debug_id, op, n, here, NULL);
|
||||
trace_rxrpc_call(call->debug_id, op, n + 1, here, NULL);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -502,9 +503,10 @@ bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
|
||||
void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
|
||||
{
|
||||
const void *here = __builtin_return_address(0);
|
||||
int n = atomic_inc_return(&call->usage);
|
||||
int n;
|
||||
|
||||
trace_rxrpc_call(call->debug_id, op, n, here, NULL);
|
||||
__refcount_inc(&call->ref, &n);
|
||||
trace_rxrpc_call(call->debug_id, op, n + 1, here, NULL);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -529,10 +531,10 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
|
||||
struct rxrpc_connection *conn = call->conn;
|
||||
bool put = false;
|
||||
|
||||
_enter("{%d,%d}", call->debug_id, atomic_read(&call->usage));
|
||||
_enter("{%d,%d}", call->debug_id, refcount_read(&call->ref));
|
||||
|
||||
trace_rxrpc_call(call->debug_id, rxrpc_call_release,
|
||||
atomic_read(&call->usage),
|
||||
refcount_read(&call->ref),
|
||||
here, (const void *)call->flags);
|
||||
|
||||
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
|
||||
@@ -621,14 +623,14 @@ void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
|
||||
struct rxrpc_net *rxnet = call->rxnet;
|
||||
const void *here = __builtin_return_address(0);
|
||||
unsigned int debug_id = call->debug_id;
|
||||
bool dead;
|
||||
int n;
|
||||
|
||||
ASSERT(call != NULL);
|
||||
|
||||
n = atomic_dec_return(&call->usage);
|
||||
dead = __refcount_dec_and_test(&call->ref, &n);
|
||||
trace_rxrpc_call(debug_id, op, n, here, NULL);
|
||||
ASSERTCMP(n, >=, 0);
|
||||
if (n == 0) {
|
||||
if (dead) {
|
||||
_debug("call %d dead", call->debug_id);
|
||||
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
|
||||
|
||||
@@ -718,7 +720,7 @@ void rxrpc_destroy_all_calls(struct rxrpc_net *rxnet)
|
||||
list_del_init(&call->link);
|
||||
|
||||
pr_err("Call %p still in use (%d,%s,%lx,%lx)!\n",
|
||||
call, atomic_read(&call->usage),
|
||||
call, refcount_read(&call->ref),
|
||||
rxrpc_call_states[call->state],
|
||||
call->flags, call->events);
|
||||
|
||||
|
Reference in New Issue
Block a user