@@ -112,7 +112,7 @@ struct rxrpc_call *rxrpc_find_call_by_user_ID(struct rxrpc_sock *rx,
112112found_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 */
387387error_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,
442442bool 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)
459460bool __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)
486487bool 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)
500501void 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
0 commit comments