rxrpc.c (c56f9ec8b20f931014574b943590c4d830109380) | rxrpc.c (2757a4dc184997c66ef1de32636f73b9f21aac14) |
---|---|
1// SPDX-License-Identifier: GPL-2.0-or-later 2/* Maintain an RxRPC server socket to do AFS communications through 3 * 4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 */ 7 8#include <linux/slab.h> --- 138 unchanged lines hidden (view full) --- 147 call->debug_id = atomic_inc_return(&rxrpc_debug_id); 148 refcount_set(&call->ref, 1); 149 INIT_WORK(&call->async_work, afs_process_async_call); 150 init_waitqueue_head(&call->waitq); 151 spin_lock_init(&call->state_lock); 152 call->iter = &call->def_iter; 153 154 o = atomic_inc_return(&net->nr_outstanding_calls); | 1// SPDX-License-Identifier: GPL-2.0-or-later 2/* Maintain an RxRPC server socket to do AFS communications through 3 * 4 * Copyright (C) 2007 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 */ 7 8#include <linux/slab.h> --- 138 unchanged lines hidden (view full) --- 147 call->debug_id = atomic_inc_return(&rxrpc_debug_id); 148 refcount_set(&call->ref, 1); 149 INIT_WORK(&call->async_work, afs_process_async_call); 150 init_waitqueue_head(&call->waitq); 151 spin_lock_init(&call->state_lock); 152 call->iter = &call->def_iter; 153 154 o = atomic_inc_return(&net->nr_outstanding_calls); |
155 trace_afs_call(call, afs_call_trace_alloc, 1, o, | 155 trace_afs_call(call->debug_id, afs_call_trace_alloc, 1, o, |
156 __builtin_return_address(0)); 157 return call; 158} 159 160/* 161 * Dispose of a reference on a call. 162 */ 163void afs_put_call(struct afs_call *call) 164{ 165 struct afs_net *net = call->net; | 156 __builtin_return_address(0)); 157 return call; 158} 159 160/* 161 * Dispose of a reference on a call. 162 */ 163void afs_put_call(struct afs_call *call) 164{ 165 struct afs_net *net = call->net; |
166 unsigned int debug_id = call->debug_id; |
|
166 bool zero; 167 int r, o; 168 169 zero = __refcount_dec_and_test(&call->ref, &r); 170 o = atomic_read(&net->nr_outstanding_calls); | 167 bool zero; 168 int r, o; 169 170 zero = __refcount_dec_and_test(&call->ref, &r); 171 o = atomic_read(&net->nr_outstanding_calls); |
171 trace_afs_call(call, afs_call_trace_put, r - 1, o, | 172 trace_afs_call(debug_id, afs_call_trace_put, r - 1, o, |
172 __builtin_return_address(0)); 173 174 if (zero) { 175 ASSERT(!work_pending(&call->async_work)); 176 ASSERT(call->type->name != NULL); 177 178 if (call->rxcall) { 179 rxrpc_kernel_end_call(net->socket, call->rxcall); 180 call->rxcall = NULL; 181 } 182 if (call->type->destructor) 183 call->type->destructor(call); 184 185 afs_unuse_server_notime(call->net, call->server, afs_server_trace_put_call); 186 afs_put_addrlist(call->alist); 187 kfree(call->request); 188 | 173 __builtin_return_address(0)); 174 175 if (zero) { 176 ASSERT(!work_pending(&call->async_work)); 177 ASSERT(call->type->name != NULL); 178 179 if (call->rxcall) { 180 rxrpc_kernel_end_call(net->socket, call->rxcall); 181 call->rxcall = NULL; 182 } 183 if (call->type->destructor) 184 call->type->destructor(call); 185 186 afs_unuse_server_notime(call->net, call->server, afs_server_trace_put_call); 187 afs_put_addrlist(call->alist); 188 kfree(call->request); 189 |
189 trace_afs_call(call, afs_call_trace_free, 0, o, | 190 trace_afs_call(call->debug_id, afs_call_trace_free, 0, o, |
190 __builtin_return_address(0)); 191 kfree(call); 192 193 o = atomic_dec_return(&net->nr_outstanding_calls); 194 if (o == 0) 195 wake_up_var(&net->nr_outstanding_calls); 196 } 197} 198 199static struct afs_call *afs_get_call(struct afs_call *call, 200 enum afs_call_trace why) 201{ 202 int r; 203 204 __refcount_inc(&call->ref, &r); 205 | 191 __builtin_return_address(0)); 192 kfree(call); 193 194 o = atomic_dec_return(&net->nr_outstanding_calls); 195 if (o == 0) 196 wake_up_var(&net->nr_outstanding_calls); 197 } 198} 199 200static struct afs_call *afs_get_call(struct afs_call *call, 201 enum afs_call_trace why) 202{ 203 int r; 204 205 __refcount_inc(&call->ref, &r); 206 |
206 trace_afs_call(call, why, r + 1, | 207 trace_afs_call(call->debug_id, why, r + 1, |
207 atomic_read(&call->net->nr_outstanding_calls), 208 __builtin_return_address(0)); 209 return call; 210} 211 212/* 213 * Queue the call for actual work. 214 */ --- 457 unchanged lines hidden (view full) --- 672{ 673 struct afs_call *call = (struct afs_call *)call_user_ID; 674 int r; 675 676 trace_afs_notify_call(rxcall, call); 677 call->need_attention = true; 678 679 if (__refcount_inc_not_zero(&call->ref, &r)) { | 208 atomic_read(&call->net->nr_outstanding_calls), 209 __builtin_return_address(0)); 210 return call; 211} 212 213/* 214 * Queue the call for actual work. 215 */ --- 457 unchanged lines hidden (view full) --- 673{ 674 struct afs_call *call = (struct afs_call *)call_user_ID; 675 int r; 676 677 trace_afs_notify_call(rxcall, call); 678 call->need_attention = true; 679 680 if (__refcount_inc_not_zero(&call->ref, &r)) { |
680 trace_afs_call(call, afs_call_trace_wake, r + 1, | 681 trace_afs_call(call->debug_id, afs_call_trace_wake, r + 1, |
681 atomic_read(&call->net->nr_outstanding_calls), 682 __builtin_return_address(0)); 683 684 if (!queue_work(afs_async_calls, &call->async_work)) 685 afs_put_call(call); 686 } 687} 688 --- 254 unchanged lines hidden --- | 682 atomic_read(&call->net->nr_outstanding_calls), 683 __builtin_return_address(0)); 684 685 if (!queue_work(afs_async_calls, &call->async_work)) 686 afs_put_call(call); 687 } 688} 689 --- 254 unchanged lines hidden --- |