Lines Matching refs:call

65 	int (*deliver)(struct rxperf_call *call);
74 static int rxperf_deliver_param_block(struct rxperf_call *call);
75 static int rxperf_deliver_request(struct rxperf_call *call);
76 static int rxperf_process_call(struct rxperf_call *call);
82 static inline void rxperf_set_call_state(struct rxperf_call *call,
85 call->state = to;
88 static inline void rxperf_set_call_complete(struct rxperf_call *call,
91 if (call->state != RXPERF_CALL_COMPLETE) {
92 call->abort_code = remote_abort;
93 call->error = error;
94 call->state = RXPERF_CALL_COMPLETE;
110 static void rxperf_queue_call_work(struct rxperf_call *call)
112 queue_work(rxperf_workqueue, &call->work);
118 struct rxperf_call *call = (struct rxperf_call *)call_user_ID;
120 if (call->state != RXPERF_CALL_COMPLETE)
121 rxperf_queue_call_work(call);
126 struct rxperf_call *call = (struct rxperf_call *)user_call_ID;
128 call->rxcall = rxcall;
140 * Charge the incoming call preallocation.
144 struct rxperf_call *call;
147 call = kzalloc(sizeof(*call), GFP_KERNEL);
148 if (!call)
151 call->type = "unset";
152 call->debug_id = atomic_inc_return(&rxrpc_debug_id);
153 call->deliver = rxperf_deliver_param_block;
154 call->state = RXPERF_CALL_SV_AWAIT_PARAMS;
155 call->service_id = RX_PERF_SERVICE;
156 call->iov_len = sizeof(call->params);
157 call->kvec[0].iov_len = sizeof(call->params);
158 call->kvec[0].iov_base = &call->params;
159 iov_iter_kvec(&call->iter, READ, call->kvec, 1, call->iov_len);
160 INIT_WORK(&call->work, rxperf_deliver_to_call);
165 (unsigned long)call,
167 call->debug_id) < 0)
169 call = NULL;
172 kfree(call);
245 static void rxperf_log_error(struct rxperf_call *call, s32 remote_abort)
268 pr_info("Peer reported %s failure on %s\n", msg, call->type);
273 * deliver messages to a call
277 struct rxperf_call *call = container_of(work, struct rxperf_call, work);
282 if (call->state == RXPERF_CALL_COMPLETE)
285 while (state = call->state,
291 if (!rxrpc_kernel_check_life(rxperf_socket, call->rxcall))
296 ret = call->deliver(call);
298 ret = rxperf_process_call(call);
307 rxperf_log_error(call, call->abort_code);
311 rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
317 rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
323 call->debug_id, call->state);
330 rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
335 rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,
343 rxperf_set_call_complete(call, ret, remote_abort);
344 /* The call may have been requeued */
345 rxrpc_kernel_shutdown_call(rxperf_socket, call->rxcall);
346 rxrpc_kernel_put_call(rxperf_socket, call->rxcall);
347 cancel_work(&call->work);
348 kfree(call);
354 static int rxperf_extract_data(struct rxperf_call *call, bool want_more)
359 ret = rxrpc_kernel_recv_data(rxperf_socket, call->rxcall, &call->iter,
360 &call->iov_len, want_more, &remote_abort,
361 &call->service_id);
363 iov_iter_count(&call->iter), call->iov_len, want_more, ret);
368 switch (call->state) {
370 rxperf_set_call_state(call, RXPERF_CALL_SV_REPLYING);
373 pr_debug("premature completion %d", call->error);
374 return call->error;
381 rxperf_set_call_complete(call, ret, remote_abort);
386 * Grab the operation ID from an incoming manager call.
388 static int rxperf_deliver_param_block(struct rxperf_call *call)
394 ret = rxperf_extract_data(call, true);
398 version = ntohl(call->params.version);
399 call->operation_id = ntohl(call->params.type);
400 call->deliver = rxperf_deliver_request;
407 switch (call->operation_id) {
409 call->type = "send";
410 call->reply_len = 0;
411 call->iov_len = 4; /* Expect req size */
414 call->type = "recv";
415 call->req_len = 0;
416 call->iov_len = 4; /* Expect reply size */
419 call->type = "rpc";
420 call->iov_len = 8; /* Expect req size and reply size */
423 call->type = "file";
429 rxperf_set_call_state(call, RXPERF_CALL_SV_AWAIT_REQUEST);
430 return call->deliver(call);
436 static int rxperf_deliver_request(struct rxperf_call *call)
440 switch (call->unmarshal) {
442 call->kvec[0].iov_len = call->iov_len;
443 call->kvec[0].iov_base = call->tmp;
444 iov_iter_kvec(&call->iter, READ, call->kvec, 1, call->iov_len);
445 call->unmarshal++;
448 ret = rxperf_extract_data(call, true);
452 switch (call->operation_id) {
454 call->type = "send";
455 call->req_len = ntohl(call->tmp[0]);
456 call->reply_len = 0;
459 call->type = "recv";
460 call->req_len = 0;
461 call->reply_len = ntohl(call->tmp[0]);
464 call->type = "rpc";
465 call->req_len = ntohl(call->tmp[0]);
466 call->reply_len = ntohl(call->tmp[1]);
474 call->type, call->req_len, call->reply_len);
476 call->iov_len = call->req_len;
477 iov_iter_discard(&call->iter, READ, call->req_len);
478 call->unmarshal++;
481 ret = rxperf_extract_data(call, false);
484 call->unmarshal++;
492 * Process a call for which we've received the request.
494 static int rxperf_process_call(struct rxperf_call *call)
500 size_t reply_len = call->reply_len, len;
502 rxrpc_kernel_set_tx_length(rxperf_socket, call->rxcall,
510 n = rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg,
524 n = rxrpc_kernel_send_data(rxperf_socket, call->rxcall, &msg, len,
530 rxrpc_kernel_abort_call(rxperf_socket, call->rxcall,