Skip to content

Commit 10ddcc8

Browse files
committed
rxrpc: Use refcount_t rather than atomic_t
jira LE-1907 Rebuild_History Non-Buildable kernel-5.14.0-284.30.1.el9_2 commit-author David Howells <[email protected]> commit a057542 Move to using refcount_t rather than atomic_t for refcounts in rxrpc. Signed-off-by: David Howells <[email protected]> cc: Marc Dionne <[email protected]> cc: [email protected] Signed-off-by: David S. Miller <[email protected]> (cherry picked from commit a057542) Signed-off-by: Jonathan Maple <[email protected]>
1 parent eb5ce84 commit 10ddcc8

13 files changed

+119
-122
lines changed

include/trace/events/rxrpc.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -583,7 +583,7 @@ TRACE_EVENT(rxrpc_client,
583583
TP_fast_assign(
584584
__entry->conn = conn ? conn->debug_id : 0;
585585
__entry->channel = channel;
586-
__entry->usage = conn ? atomic_read(&conn->usage) : -2;
586+
__entry->usage = conn ? refcount_read(&conn->ref) : -2;
587587
__entry->op = op;
588588
__entry->cid = conn ? conn->proto.cid : 0;
589589
),

net/rxrpc/af_rxrpc.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ static void rxrpc_dummy_notify_rx(struct sock *sk, struct rxrpc_call *rxcall,
351351
*/
352352
void rxrpc_kernel_end_call(struct socket *sock, struct rxrpc_call *call)
353353
{
354-
_enter("%d{%d}", call->debug_id, atomic_read(&call->usage));
354+
_enter("%d{%d}", call->debug_id, refcount_read(&call->ref));
355355

356356
mutex_lock(&call->user_mutex);
357357
rxrpc_release_call(rxrpc_sk(sock->sk), call);

net/rxrpc/ar-internal.h

+5-13
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,6 @@
1515
#include <keys/rxrpc-type.h>
1616
#include "protocol.h"
1717

18-
#if 0
19-
#define CHECK_SLAB_OKAY(X) \
20-
BUG_ON(atomic_read((X)) >> (sizeof(atomic_t) - 2) == \
21-
(POISON_FREE << 8 | POISON_FREE))
22-
#else
23-
#define CHECK_SLAB_OKAY(X) do {} while (0)
24-
#endif
25-
2618
#define FCRYPT_BSIZE 8
2719
struct rxrpc_crypt {
2820
union {
@@ -279,7 +271,7 @@ struct rxrpc_security {
279271
struct rxrpc_local {
280272
struct rcu_head rcu;
281273
atomic_t active_users; /* Number of users of the local endpoint */
282-
atomic_t usage; /* Number of references to the structure */
274+
refcount_t ref; /* Number of references to the structure */
283275
struct rxrpc_net *rxnet; /* The network ns in which this resides */
284276
struct hlist_node link;
285277
struct socket *socket; /* my UDP socket */
@@ -304,7 +296,7 @@ struct rxrpc_local {
304296
*/
305297
struct rxrpc_peer {
306298
struct rcu_head rcu; /* This must be first */
307-
atomic_t usage;
299+
refcount_t ref;
308300
unsigned long hash_key;
309301
struct hlist_node hash_link;
310302
struct rxrpc_local *local;
@@ -406,7 +398,7 @@ enum rxrpc_conn_proto_state {
406398
*/
407399
struct rxrpc_bundle {
408400
struct rxrpc_conn_parameters params;
409-
atomic_t usage;
401+
refcount_t ref;
410402
unsigned int debug_id;
411403
bool try_upgrade; /* True if the bundle is attempting upgrade */
412404
bool alloc_conn; /* True if someone's getting a conn */
@@ -427,7 +419,7 @@ struct rxrpc_connection {
427419
struct rxrpc_conn_proto proto;
428420
struct rxrpc_conn_parameters params;
429421

430-
atomic_t usage;
422+
refcount_t ref;
431423
struct rcu_head rcu;
432424
struct list_head cache_link;
433425

@@ -609,7 +601,7 @@ struct rxrpc_call {
609601
int error; /* Local error incurred */
610602
enum rxrpc_call_state state; /* current state of call */
611603
enum rxrpc_call_completion completion; /* Call completion condition */
612-
atomic_t usage;
604+
refcount_t ref;
613605
u16 service_id; /* service ID */
614606
u8 security_ix; /* Security type */
615607
enum rxrpc_interruptibility interruptibility; /* At what point call may be interrupted */

net/rxrpc/call_accept.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx,
9191
(head + 1) & (size - 1));
9292

9393
trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_service,
94-
atomic_read(&conn->usage), here);
94+
refcount_read(&conn->ref), here);
9595
}
9696

9797
/* Now it gets complicated, because calls get registered with the
@@ -104,7 +104,7 @@ static int rxrpc_service_prealloc_one(struct rxrpc_sock *rx,
104104
call->state = RXRPC_CALL_SERVER_PREALLOC;
105105

106106
trace_rxrpc_call(call->debug_id, rxrpc_call_new_service,
107-
atomic_read(&call->usage),
107+
refcount_read(&call->ref),
108108
here, (const void *)user_call_ID);
109109

110110
write_lock(&rx->call_lock);

net/rxrpc/call_object.c

+23-21
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
112112
found_extant_call:
113113
rxrpc_get_call(call, rxrpc_call_got);
114114
read_unlock(&rx->call_lock);
115-
_leave(" = %p [%d]", call, atomic_read(&call->usage));
115+
_leave(" = %p [%d]", call, refcount_read(&call->ref));
116116
return call;
117117
}
118118

@@ -160,7 +160,7 @@ struct rxrpc_call *rxrpc_alloc_call(struct rxrpc_sock *rx, gfp_t gfp,
160160
spin_lock_init(&call->notify_lock);
161161
spin_lock_init(&call->input_lock);
162162
rwlock_init(&call->state_lock);
163-
atomic_set(&call->usage, 1);
163+
refcount_set(&call->ref, 1);
164164
call->debug_id = debug_id;
165165
call->tx_total_len = -1;
166166
call->next_rx_timo = 20 * HZ;
@@ -299,7 +299,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
299299
call->interruptibility = p->interruptibility;
300300
call->tx_total_len = p->tx_total_len;
301301
trace_rxrpc_call(call->debug_id, rxrpc_call_new_client,
302-
atomic_read(&call->usage),
302+
refcount_read(&call->ref),
303303
here, (const void *)p->user_call_ID);
304304
if (p->kernel)
305305
__set_bit(RXRPC_CALL_KERNEL, &call->flags);
@@ -352,7 +352,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
352352
goto error_attached_to_socket;
353353

354354
trace_rxrpc_call(call->debug_id, rxrpc_call_connected,
355-
atomic_read(&call->usage), here, NULL);
355+
refcount_read(&call->ref), here, NULL);
356356

357357
rxrpc_start_call_timer(call);
358358

@@ -372,7 +372,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
372372
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
373373
RX_CALL_DEAD, -EEXIST);
374374
trace_rxrpc_call(call->debug_id, rxrpc_call_error,
375-
atomic_read(&call->usage), here, ERR_PTR(-EEXIST));
375+
refcount_read(&call->ref), here, ERR_PTR(-EEXIST));
376376
rxrpc_release_call(rx, call);
377377
mutex_unlock(&call->user_mutex);
378378
rxrpc_put_call(call, rxrpc_call_put);
@@ -386,7 +386,7 @@ struct rxrpc_call *rxrpc_new_client_call(struct rxrpc_sock *rx,
386386
*/
387387
error_attached_to_socket:
388388
trace_rxrpc_call(call->debug_id, rxrpc_call_error,
389-
atomic_read(&call->usage), here, ERR_PTR(ret));
389+
refcount_read(&call->ref), here, ERR_PTR(ret));
390390
set_bit(RXRPC_CALL_DISCONNECTED, &call->flags);
391391
__rxrpc_set_call_completion(call, RXRPC_CALL_LOCAL_ERROR,
392392
RX_CALL_DEAD, ret);
@@ -442,8 +442,9 @@ void rxrpc_incoming_call(struct rxrpc_sock *rx,
442442
bool rxrpc_queue_call(struct rxrpc_call *call)
443443
{
444444
const void *here = __builtin_return_address(0);
445-
int n = atomic_fetch_add_unless(&call->usage, 1, 0);
446-
if (n == 0)
445+
int n;
446+
447+
if (!__refcount_inc_not_zero(&call->ref, &n))
447448
return false;
448449
if (rxrpc_queue_work(&call->processor))
449450
trace_rxrpc_call(call->debug_id, rxrpc_call_queued, n + 1,
@@ -459,7 +460,7 @@ bool rxrpc_queue_call(struct rxrpc_call *call)
459460
bool __rxrpc_queue_call(struct rxrpc_call *call)
460461
{
461462
const void *here = __builtin_return_address(0);
462-
int n = atomic_read(&call->usage);
463+
int n = refcount_read(&call->ref);
463464
ASSERTCMP(n, >=, 1);
464465
if (rxrpc_queue_work(&call->processor))
465466
trace_rxrpc_call(call->debug_id, rxrpc_call_queued_ref, n,
@@ -476,7 +477,7 @@ void rxrpc_see_call(struct rxrpc_call *call)
476477
{
477478
const void *here = __builtin_return_address(0);
478479
if (call) {
479-
int n = atomic_read(&call->usage);
480+
int n = refcount_read(&call->ref);
480481

481482
trace_rxrpc_call(call->debug_id, rxrpc_call_seen, n,
482483
here, NULL);
@@ -486,11 +487,11 @@ void rxrpc_see_call(struct rxrpc_call *call)
486487
bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
487488
{
488489
const void *here = __builtin_return_address(0);
489-
int n = atomic_fetch_add_unless(&call->usage, 1, 0);
490+
int n;
490491

491-
if (n == 0)
492+
if (!__refcount_inc_not_zero(&call->ref, &n))
492493
return false;
493-
trace_rxrpc_call(call->debug_id, op, n, here, NULL);
494+
trace_rxrpc_call(call->debug_id, op, n + 1, here, NULL);
494495
return true;
495496
}
496497

@@ -500,9 +501,10 @@ bool rxrpc_try_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
500501
void rxrpc_get_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
501502
{
502503
const void *here = __builtin_return_address(0);
503-
int n = atomic_inc_return(&call->usage);
504+
int n;
504505

505-
trace_rxrpc_call(call->debug_id, op, n, here, NULL);
506+
__refcount_inc(&call->ref, &n);
507+
trace_rxrpc_call(call->debug_id, op, n + 1, here, NULL);
506508
}
507509

508510
/*
@@ -527,10 +529,10 @@ void rxrpc_release_call(struct rxrpc_sock *rx, struct rxrpc_call *call)
527529
struct rxrpc_connection *conn = call->conn;
528530
bool put = false;
529531

530-
_enter("{%d,%d}", call->debug_id, atomic_read(&call->usage));
532+
_enter("{%d,%d}", call->debug_id, refcount_read(&call->ref));
531533

532534
trace_rxrpc_call(call->debug_id, rxrpc_call_release,
533-
atomic_read(&call->usage),
535+
refcount_read(&call->ref),
534536
here, (const void *)call->flags);
535537

536538
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
@@ -619,14 +621,14 @@ void rxrpc_put_call(struct rxrpc_call *call, enum rxrpc_call_trace op)
619621
struct rxrpc_net *rxnet = call->rxnet;
620622
const void *here = __builtin_return_address(0);
621623
unsigned int debug_id = call->debug_id;
624+
bool dead;
622625
int n;
623626

624627
ASSERT(call != NULL);
625628

626-
n = atomic_dec_return(&call->usage);
629+
dead = __refcount_dec_and_test(&call->ref, &n);
627630
trace_rxrpc_call(debug_id, op, n, here, NULL);
628-
ASSERTCMP(n, >=, 0);
629-
if (n == 0) {
631+
if (dead) {
630632
_debug("call %d dead", call->debug_id);
631633
ASSERTCMP(call->state, ==, RXRPC_CALL_COMPLETE);
632634

@@ -716,7 +718,7 @@ void rxrpc_destroy_all_calls(struct rxrpc_net *rxnet)
716718
list_del_init(&call->link);
717719

718720
pr_err("Call %p still in use (%d,%s,%lx,%lx)!\n",
719-
call, atomic_read(&call->usage),
721+
call, refcount_read(&call->ref),
720722
rxrpc_call_states[call->state],
721723
call->flags, call->events);
722724

net/rxrpc/conn_client.c

+16-14
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ void rxrpc_destroy_client_conn_ids(void)
102102
if (!idr_is_empty(&rxrpc_client_conn_ids)) {
103103
idr_for_each_entry(&rxrpc_client_conn_ids, conn, id) {
104104
pr_err("AF_RXRPC: Leaked client conn %p {%d}\n",
105-
conn, atomic_read(&conn->usage));
105+
conn, refcount_read(&conn->ref));
106106
}
107107
BUG();
108108
}
@@ -122,7 +122,7 @@ static struct rxrpc_bundle *rxrpc_alloc_bundle(struct rxrpc_conn_parameters *cp,
122122
if (bundle) {
123123
bundle->params = *cp;
124124
rxrpc_get_peer(bundle->params.peer);
125-
atomic_set(&bundle->usage, 1);
125+
refcount_set(&bundle->ref, 1);
126126
spin_lock_init(&bundle->channel_lock);
127127
INIT_LIST_HEAD(&bundle->waiting_calls);
128128
}
@@ -131,7 +131,7 @@ static struct rxrpc_bundle *rxrpc_alloc_bundle(struct rxrpc_conn_parameters *cp,
131131

132132
struct rxrpc_bundle *rxrpc_get_bundle(struct rxrpc_bundle *bundle)
133133
{
134-
atomic_inc(&bundle->usage);
134+
refcount_inc(&bundle->ref);
135135
return bundle;
136136
}
137137

@@ -144,10 +144,13 @@ static void rxrpc_free_bundle(struct rxrpc_bundle *bundle)
144144
void rxrpc_put_bundle(struct rxrpc_bundle *bundle)
145145
{
146146
unsigned int d = bundle->debug_id;
147-
unsigned int u = atomic_dec_return(&bundle->usage);
147+
bool dead;
148+
int r;
148149

149-
_debug("PUT B=%x %u", d, u);
150-
if (u == 0)
150+
dead = __refcount_dec_and_test(&bundle->ref, &r);
151+
152+
_debug("PUT B=%x %d", d, r);
153+
if (dead)
151154
rxrpc_free_bundle(bundle);
152155
}
153156

@@ -169,7 +172,7 @@ rxrpc_alloc_client_connection(struct rxrpc_bundle *bundle, gfp_t gfp)
169172
return ERR_PTR(-ENOMEM);
170173
}
171174

172-
atomic_set(&conn->usage, 1);
175+
refcount_set(&conn->ref, 1);
173176
conn->bundle = bundle;
174177
conn->params = bundle->params;
175178
conn->out_clientflag = RXRPC_CLIENT_INITIATED;
@@ -195,7 +198,7 @@ rxrpc_alloc_client_connection(struct rxrpc_bundle *bundle, gfp_t gfp)
195198
key_get(conn->params.key);
196199

197200
trace_rxrpc_conn(conn->debug_id, rxrpc_conn_new_client,
198-
atomic_read(&conn->usage),
201+
refcount_read(&conn->ref),
199202
__builtin_return_address(0));
200203

201204
atomic_inc(&rxnet->nr_client_conns);
@@ -966,14 +969,13 @@ void rxrpc_put_client_conn(struct rxrpc_connection *conn)
966969
{
967970
const void *here = __builtin_return_address(0);
968971
unsigned int debug_id = conn->debug_id;
969-
int n;
972+
bool dead;
973+
int r;
970974

971-
n = atomic_dec_return(&conn->usage);
972-
trace_rxrpc_conn(debug_id, rxrpc_conn_put_client, n, here);
973-
if (n <= 0) {
974-
ASSERTCMP(n, >=, 0);
975+
dead = __refcount_dec_and_test(&conn->ref, &r);
976+
trace_rxrpc_conn(debug_id, rxrpc_conn_put_client, r - 1, here);
977+
if (dead)
975978
rxrpc_kill_client_conn(conn);
976-
}
977979
}
978980

979981
/*

0 commit comments

Comments
 (0)