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 ---