Lines Matching +full:rpc +full:- +full:if
8 https://opensource.org/licenses/gpl-license.php.
20 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30 #if IS_ENABLED(CONFIG_SUNRPC_DEBUG)
47 return xprt->bc_alloc_count < xprt->bc_alloc_max; in xprt_need_to_requeue()
58 dprintk("RPC: free allocations for req= %p\n", req); in xprt_free_allocation()
59 WARN_ON_ONCE(test_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state)); in xprt_free_allocation()
60 xbufp = &req->rq_rcv_buf; in xprt_free_allocation()
61 free_page((unsigned long)xbufp->head[0].iov_base); in xprt_free_allocation()
62 xbufp = &req->rq_snd_buf; in xprt_free_allocation()
63 free_page((unsigned long)xbufp->head[0].iov_base); in xprt_free_allocation()
69 buf->head[0].iov_len = PAGE_SIZE; in xprt_bc_reinit_xdr_buf()
70 buf->tail[0].iov_len = 0; in xprt_bc_reinit_xdr_buf()
71 buf->pages = NULL; in xprt_bc_reinit_xdr_buf()
72 buf->page_len = 0; in xprt_bc_reinit_xdr_buf()
73 buf->flags = 0; in xprt_bc_reinit_xdr_buf()
74 buf->len = 0; in xprt_bc_reinit_xdr_buf()
75 buf->buflen = PAGE_SIZE; in xprt_bc_reinit_xdr_buf()
83 if (page == NULL) in xprt_alloc_xdr_buf()
84 return -ENOMEM; in xprt_alloc_xdr_buf()
94 /* Pre-allocate one backchannel rpc_rqst */ in xprt_alloc_bc_req()
96 if (req == NULL) in xprt_alloc_bc_req()
99 req->rq_xprt = xprt; in xprt_alloc_bc_req()
100 INIT_LIST_HEAD(&req->rq_bc_list); in xprt_alloc_bc_req()
103 if (xprt_alloc_xdr_buf(&req->rq_rcv_buf, gfp_flags) < 0) { in xprt_alloc_bc_req()
107 req->rq_rcv_buf.len = PAGE_SIZE; in xprt_alloc_bc_req()
110 if (xprt_alloc_xdr_buf(&req->rq_snd_buf, gfp_flags) < 0) { in xprt_alloc_bc_req()
140 if (!xprt->ops->bc_setup) in xprt_setup_backchannel()
142 return xprt->ops->bc_setup(xprt, min_reqs); in xprt_setup_backchannel()
152 dprintk("RPC: setup backchannel transport\n"); in xprt_setup_bc()
154 if (min_reqs > BC_MAX_SLOTS) in xprt_setup_bc()
167 /* Pre-allocate one backchannel rpc_rqst */ in xprt_setup_bc()
169 if (req == NULL) { in xprt_setup_bc()
175 dprintk("RPC: adding req= %p\n", req); in xprt_setup_bc()
176 list_add(&req->rq_bc_pa_list, &tmp_list); in xprt_setup_bc()
182 spin_lock(&xprt->bc_pa_lock); in xprt_setup_bc()
183 list_splice(&tmp_list, &xprt->bc_pa_list); in xprt_setup_bc()
184 xprt->bc_alloc_count += min_reqs; in xprt_setup_bc()
185 xprt->bc_alloc_max += min_reqs; in xprt_setup_bc()
186 atomic_add(min_reqs, &xprt->bc_slot_count); in xprt_setup_bc()
187 spin_unlock(&xprt->bc_pa_lock); in xprt_setup_bc()
189 dprintk("RPC: setup backchannel transport done\n"); in xprt_setup_bc()
200 list_del(&req->rq_bc_pa_list); in xprt_setup_bc()
204 dprintk("RPC: setup backchannel transport failed\n"); in xprt_setup_bc()
205 return -ENOMEM; in xprt_setup_bc()
209 * xprt_destroy_backchannel - Destroys the backchannel preallocated structures.
219 if (xprt->ops->bc_destroy) in xprt_destroy_backchannel()
220 xprt->ops->bc_destroy(xprt, max_reqs); in xprt_destroy_backchannel()
228 dprintk("RPC: destroy backchannel transport\n"); in xprt_destroy_bc()
230 if (max_reqs == 0) in xprt_destroy_bc()
233 spin_lock_bh(&xprt->bc_pa_lock); in xprt_destroy_bc()
234 xprt->bc_alloc_max -= min(max_reqs, xprt->bc_alloc_max); in xprt_destroy_bc()
235 list_for_each_entry_safe(req, tmp, &xprt->bc_pa_list, rq_bc_pa_list) { in xprt_destroy_bc()
236 dprintk("RPC: req=%p\n", req); in xprt_destroy_bc()
237 list_del(&req->rq_bc_pa_list); in xprt_destroy_bc()
239 xprt->bc_alloc_count--; in xprt_destroy_bc()
240 atomic_dec(&xprt->bc_slot_count); in xprt_destroy_bc()
241 if (--max_reqs == 0) in xprt_destroy_bc()
244 spin_unlock_bh(&xprt->bc_pa_lock); in xprt_destroy_bc()
247 dprintk("RPC: backchannel list empty= %s\n", in xprt_destroy_bc()
248 list_empty(&xprt->bc_pa_list) ? "true" : "false"); in xprt_destroy_bc()
256 dprintk("RPC: allocate a backchannel request\n"); in xprt_get_bc_request()
257 if (list_empty(&xprt->bc_pa_list)) { in xprt_get_bc_request()
258 if (!new) in xprt_get_bc_request()
260 if (atomic_read(&xprt->bc_slot_count) >= BC_MAX_SLOTS) in xprt_get_bc_request()
262 list_add_tail(&new->rq_bc_pa_list, &xprt->bc_pa_list); in xprt_get_bc_request()
263 xprt->bc_alloc_count++; in xprt_get_bc_request()
264 atomic_inc(&xprt->bc_slot_count); in xprt_get_bc_request()
266 req = list_first_entry(&xprt->bc_pa_list, struct rpc_rqst, in xprt_get_bc_request()
268 req->rq_reply_bytes_recvd = 0; in xprt_get_bc_request()
269 memcpy(&req->rq_private_buf, &req->rq_rcv_buf, in xprt_get_bc_request()
270 sizeof(req->rq_private_buf)); in xprt_get_bc_request()
271 req->rq_xid = xid; in xprt_get_bc_request()
272 req->rq_connect_cookie = xprt->connect_cookie; in xprt_get_bc_request()
273 dprintk("RPC: backchannel req=%p\n", req); in xprt_get_bc_request()
284 struct rpc_xprt *xprt = req->rq_xprt; in xprt_free_bc_request()
286 xprt->ops->bc_free_rqst(req); in xprt_free_bc_request()
291 struct rpc_xprt *xprt = req->rq_xprt; in xprt_free_bc_rqst()
293 dprintk("RPC: free backchannel req=%p\n", req); in xprt_free_bc_rqst()
295 req->rq_connect_cookie = xprt->connect_cookie - 1; in xprt_free_bc_rqst()
297 clear_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); in xprt_free_bc_rqst()
304 spin_lock_bh(&xprt->bc_pa_lock); in xprt_free_bc_rqst()
305 if (xprt_need_to_requeue(xprt)) { in xprt_free_bc_rqst()
306 xprt_bc_reinit_xdr_buf(&req->rq_snd_buf); in xprt_free_bc_rqst()
307 xprt_bc_reinit_xdr_buf(&req->rq_rcv_buf); in xprt_free_bc_rqst()
308 req->rq_rcv_buf.len = PAGE_SIZE; in xprt_free_bc_rqst()
309 list_add_tail(&req->rq_bc_pa_list, &xprt->bc_pa_list); in xprt_free_bc_rqst()
310 xprt->bc_alloc_count++; in xprt_free_bc_rqst()
311 atomic_inc(&xprt->bc_slot_count); in xprt_free_bc_rqst()
314 spin_unlock_bh(&xprt->bc_pa_lock); in xprt_free_bc_rqst()
315 if (req != NULL) { in xprt_free_bc_rqst()
322 dprintk("RPC: Last session removed req=%p\n", req); in xprt_free_bc_rqst()
337 * Return an available rpc_rqst, otherwise NULL if non are available.
344 spin_lock(&xprt->bc_pa_lock); in xprt_lookup_bc_request()
345 list_for_each_entry(req, &xprt->bc_pa_list, rq_bc_pa_list) { in xprt_lookup_bc_request()
346 if (req->rq_connect_cookie != xprt->connect_cookie) in xprt_lookup_bc_request()
348 if (req->rq_xid == xid) in xprt_lookup_bc_request()
353 spin_unlock(&xprt->bc_pa_lock); in xprt_lookup_bc_request()
354 if (new) { in xprt_lookup_bc_request()
355 if (req != new) in xprt_lookup_bc_request()
358 } else if (req) in xprt_lookup_bc_request()
373 struct rpc_xprt *xprt = req->rq_xprt; in xprt_complete_bc_request()
374 struct svc_serv *bc_serv = xprt->bc_serv; in xprt_complete_bc_request()
376 spin_lock(&xprt->bc_pa_lock); in xprt_complete_bc_request()
377 list_del(&req->rq_bc_pa_list); in xprt_complete_bc_request()
378 xprt->bc_alloc_count--; in xprt_complete_bc_request()
379 spin_unlock(&xprt->bc_pa_lock); in xprt_complete_bc_request()
381 req->rq_private_buf.len = copied; in xprt_complete_bc_request()
382 set_bit(RPC_BC_PA_IN_USE, &req->rq_bc_pa_state); in xprt_complete_bc_request()
384 dprintk("RPC: add callback request to list\n"); in xprt_complete_bc_request()
386 spin_lock(&bc_serv->sv_cb_lock); in xprt_complete_bc_request()
387 list_add(&req->rq_bc_list, &bc_serv->sv_cb_list); in xprt_complete_bc_request()
388 wake_up(&bc_serv->sv_cb_waitq); in xprt_complete_bc_request()
389 spin_unlock(&bc_serv->sv_cb_lock); in xprt_complete_bc_request()