Lines Matching full:request

70 static int xen_block_send_response(XenBlockRequest *request);
72 static void reset_request(XenBlockRequest *request) in reset_request() argument
74 memset(&request->req, 0, sizeof(request->req)); in reset_request()
75 request->status = 0; in reset_request()
76 request->start = 0; in reset_request()
77 request->size = 0; in reset_request()
78 request->presync = 0; in reset_request()
80 request->aio_inflight = 0; in reset_request()
81 request->aio_errors = 0; in reset_request()
83 request->dataplane = NULL; in reset_request()
84 memset(&request->list, 0, sizeof(request->list)); in reset_request()
85 memset(&request->acct, 0, sizeof(request->acct)); in reset_request()
87 qemu_iovec_reset(&request->v); in reset_request()
92 XenBlockRequest *request = NULL; in xen_block_start_request() local
99 request = g_malloc0(sizeof(*request)); in xen_block_start_request()
100 request->dataplane = dataplane; in xen_block_start_request()
104 * xen_block_dataplane_destroy() when the request list is freed. in xen_block_start_request()
106 request->buf = qemu_memalign(XEN_PAGE_SIZE, in xen_block_start_request()
110 qemu_iovec_init(&request->v, 1); in xen_block_start_request()
113 request = QLIST_FIRST(&dataplane->freelist); in xen_block_start_request()
114 QLIST_REMOVE(request, list); in xen_block_start_request()
116 QLIST_INSERT_HEAD(&dataplane->inflight, request, list); in xen_block_start_request()
120 return request; in xen_block_start_request()
123 static void xen_block_complete_request(XenBlockRequest *request) in xen_block_complete_request() argument
125 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_complete_request()
127 if (xen_block_send_response(request)) { in xen_block_complete_request()
138 QLIST_REMOVE(request, list); in xen_block_complete_request()
140 reset_request(request); in xen_block_complete_request()
141 request->dataplane = dataplane; in xen_block_complete_request()
142 QLIST_INSERT_HEAD(&dataplane->freelist, request, list); in xen_block_complete_request()
146 * translate request into iovec + start offset
149 static int xen_block_parse_request(XenBlockRequest *request) in xen_block_parse_request() argument
151 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_parse_request()
155 switch (request->req.operation) { in xen_block_parse_request()
159 request->presync = 1; in xen_block_parse_request()
160 if (!request->req.nr_segments) { in xen_block_parse_request()
169 error_report("error: unknown operation (%d)", request->req.operation); in xen_block_parse_request()
173 if (request->req.operation != BLKIF_OP_READ && in xen_block_parse_request()
179 request->start = request->req.sector_number * dataplane->sector_size; in xen_block_parse_request()
180 for (i = 0; i < request->req.nr_segments; i++) { in xen_block_parse_request()
185 if (request->req.seg[i].first_sect > request->req.seg[i].last_sect) { in xen_block_parse_request()
189 if (request->req.seg[i].last_sect * dataplane->sector_size >= in xen_block_parse_request()
195 len = (request->req.seg[i].last_sect - in xen_block_parse_request()
196 request->req.seg[i].first_sect + 1) * dataplane->sector_size; in xen_block_parse_request()
197 request->size += len; in xen_block_parse_request()
199 if (request->start + request->size > blk_getlength(dataplane->blk)) { in xen_block_parse_request()
206 request->status = BLKIF_RSP_ERROR; in xen_block_parse_request()
210 static int xen_block_copy_request(XenBlockRequest *request) in xen_block_copy_request() argument
212 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_copy_request()
216 bool to_domain = (request->req.operation == BLKIF_OP_READ); in xen_block_copy_request()
217 void *virt = request->buf; in xen_block_copy_request()
220 if (request->req.nr_segments == 0) { in xen_block_copy_request()
224 count = request->req.nr_segments; in xen_block_copy_request()
228 segs[i].dest.foreign.ref = request->req.seg[i].gref; in xen_block_copy_request()
229 segs[i].dest.foreign.offset = request->req.seg[i].first_sect * in xen_block_copy_request()
233 segs[i].source.foreign.ref = request->req.seg[i].gref; in xen_block_copy_request()
234 segs[i].source.foreign.offset = request->req.seg[i].first_sect * in xen_block_copy_request()
238 segs[i].len = (request->req.seg[i].last_sect - in xen_block_copy_request()
239 request->req.seg[i].first_sect + 1) * in xen_block_copy_request()
249 request->aio_errors++; in xen_block_copy_request()
256 static int xen_block_do_aio(XenBlockRequest *request);
260 XenBlockRequest *request = opaque; in xen_block_complete_aio() local
261 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_complete_aio()
265 request->req.operation == BLKIF_OP_READ ? in xen_block_complete_aio()
267 request->aio_errors++; in xen_block_complete_aio()
270 request->aio_inflight--; in xen_block_complete_aio()
271 if (request->presync) { in xen_block_complete_aio()
272 request->presync = 0; in xen_block_complete_aio()
273 xen_block_do_aio(request); in xen_block_complete_aio()
276 if (request->aio_inflight > 0) { in xen_block_complete_aio()
280 switch (request->req.operation) { in xen_block_complete_aio()
282 /* in case of failure request->aio_errors is increased */ in xen_block_complete_aio()
284 xen_block_copy_request(request); in xen_block_complete_aio()
293 request->status = request->aio_errors ? BLKIF_RSP_ERROR : BLKIF_RSP_OKAY; in xen_block_complete_aio()
295 switch (request->req.operation) { in xen_block_complete_aio()
298 if (!request->req.nr_segments) { in xen_block_complete_aio()
303 if (request->status == BLKIF_RSP_OKAY) { in xen_block_complete_aio()
304 block_acct_done(blk_get_stats(dataplane->blk), &request->acct); in xen_block_complete_aio()
306 block_acct_failed(blk_get_stats(dataplane->blk), &request->acct); in xen_block_complete_aio()
314 xen_block_complete_request(request); in xen_block_complete_aio()
321 static bool xen_block_split_discard(XenBlockRequest *request, in xen_block_split_discard() argument
325 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_split_discard()
344 request->aio_inflight++; in xen_block_split_discard()
346 xen_block_complete_aio, request); in xen_block_split_discard()
354 static int xen_block_do_aio(XenBlockRequest *request) in xen_block_do_aio() argument
356 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_do_aio()
358 if (request->req.nr_segments && in xen_block_do_aio()
359 (request->req.operation == BLKIF_OP_WRITE || in xen_block_do_aio()
360 request->req.operation == BLKIF_OP_FLUSH_DISKCACHE) && in xen_block_do_aio()
361 xen_block_copy_request(request)) { in xen_block_do_aio()
365 request->aio_inflight++; in xen_block_do_aio()
366 if (request->presync) { in xen_block_do_aio()
367 blk_aio_flush(request->dataplane->blk, xen_block_complete_aio, in xen_block_do_aio()
368 request); in xen_block_do_aio()
372 switch (request->req.operation) { in xen_block_do_aio()
374 qemu_iovec_add(&request->v, request->buf, request->size); in xen_block_do_aio()
375 block_acct_start(blk_get_stats(dataplane->blk), &request->acct, in xen_block_do_aio()
376 request->v.size, BLOCK_ACCT_READ); in xen_block_do_aio()
377 request->aio_inflight++; in xen_block_do_aio()
378 blk_aio_preadv(dataplane->blk, request->start, &request->v, 0, in xen_block_do_aio()
379 xen_block_complete_aio, request); in xen_block_do_aio()
383 if (!request->req.nr_segments) { in xen_block_do_aio()
387 qemu_iovec_add(&request->v, request->buf, request->size); in xen_block_do_aio()
388 block_acct_start(blk_get_stats(dataplane->blk), &request->acct, in xen_block_do_aio()
389 request->v.size, in xen_block_do_aio()
390 request->req.operation == BLKIF_OP_WRITE ? in xen_block_do_aio()
392 request->aio_inflight++; in xen_block_do_aio()
393 blk_aio_pwritev(dataplane->blk, request->start, &request->v, 0, in xen_block_do_aio()
394 xen_block_complete_aio, request); in xen_block_do_aio()
398 struct blkif_request_discard *req = (void *)&request->req; in xen_block_do_aio()
399 if (!xen_block_split_discard(request, req->sector_number, in xen_block_do_aio()
410 xen_block_complete_aio(request, 0); in xen_block_do_aio()
415 request->status = BLKIF_RSP_ERROR; in xen_block_do_aio()
416 xen_block_complete_request(request); in xen_block_do_aio()
420 static int xen_block_send_response(XenBlockRequest *request) in xen_block_send_response() argument
422 XenBlockDataPlane *dataplane = request->dataplane; in xen_block_send_response()
448 resp->id = request->req.id; in xen_block_send_response()
449 resp->operation = request->req.operation; in xen_block_send_response()
450 resp->status = request->status; in xen_block_send_response()
476 XenBlockRequest *request, RING_IDX rc) in xen_block_get_request() argument
483 memcpy(&request->req, req, sizeof(request->req)); in xen_block_get_request()
490 blkif_get_x86_32_req(&request->req, req); in xen_block_get_request()
497 blkif_get_x86_64_req(&request->req, req); in xen_block_get_request()
515 XenBlockRequest *request; in xen_block_handle_requests() local
539 /* pull request from ring */ in xen_block_handle_requests()
543 request = xen_block_start_request(dataplane); in xen_block_handle_requests()
544 if (request == NULL) { in xen_block_handle_requests()
548 xen_block_get_request(dataplane, request, rc); in xen_block_handle_requests()
553 if (xen_block_parse_request(request) != 0) { in xen_block_handle_requests()
554 switch (request->req.operation) { in xen_block_handle_requests()
570 xen_block_complete_request(request); in xen_block_handle_requests()
578 xen_block_do_aio(request); in xen_block_handle_requests()
639 XenBlockRequest *request; in xen_block_dataplane_destroy() local
646 request = QLIST_FIRST(&dataplane->freelist); in xen_block_dataplane_destroy()
647 QLIST_REMOVE(request, list); in xen_block_dataplane_destroy()
648 qemu_iovec_destroy(&request->v); in xen_block_dataplane_destroy()
649 qemu_vfree(request->buf); in xen_block_dataplane_destroy()
650 g_free(request); in xen_block_dataplane_destroy()