Lines Matching +full:num +full:- +full:rings
19 #include "hw/xen/xen-legacy-backend.h"
20 #include "hw/9pfs/xen-9pfs.h"
22 #include "qemu/config-file.h"
23 #include "qemu/main-loop.h"
26 #include "fsdev/qemu-fsdev.h"
65 Xen9pfsRing *rings; member
73 int *num, in xen_9pfs_in_sg() argument
79 cons = ring->intf->in_cons; in xen_9pfs_in_sg()
80 prod = ring->intf->in_prod; in xen_9pfs_in_sg()
82 masked_prod = xen_9pfs_mask(prod, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_in_sg()
83 masked_cons = xen_9pfs_mask(cons, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_in_sg()
86 in_sg[0].iov_base = ring->ring.in + masked_prod; in xen_9pfs_in_sg()
87 in_sg[0].iov_len = masked_cons - masked_prod; in xen_9pfs_in_sg()
88 *num = 1; in xen_9pfs_in_sg()
90 in_sg[0].iov_base = ring->ring.in + masked_prod; in xen_9pfs_in_sg()
91 in_sg[0].iov_len = XEN_FLEX_RING_SIZE(ring->ring_order) - masked_prod; in xen_9pfs_in_sg()
92 in_sg[1].iov_base = ring->ring.in; in xen_9pfs_in_sg()
94 *num = 2; in xen_9pfs_in_sg()
100 int *num, in xen_9pfs_out_sg() argument
105 cons = ring->intf->out_cons; in xen_9pfs_out_sg()
106 prod = ring->intf->out_prod; in xen_9pfs_out_sg()
108 masked_prod = xen_9pfs_mask(prod, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_out_sg()
109 masked_cons = xen_9pfs_mask(cons, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_out_sg()
112 out_sg[0].iov_base = ring->ring.out + masked_cons; in xen_9pfs_out_sg()
113 out_sg[0].iov_len = ring->out_size; in xen_9pfs_out_sg()
114 *num = 1; in xen_9pfs_out_sg()
116 if (ring->out_size > in xen_9pfs_out_sg()
117 (XEN_FLEX_RING_SIZE(ring->ring_order) - masked_cons)) { in xen_9pfs_out_sg()
118 out_sg[0].iov_base = ring->ring.out + masked_cons; in xen_9pfs_out_sg()
119 out_sg[0].iov_len = XEN_FLEX_RING_SIZE(ring->ring_order) - in xen_9pfs_out_sg()
121 out_sg[1].iov_base = ring->ring.out; in xen_9pfs_out_sg()
122 out_sg[1].iov_len = ring->out_size - in xen_9pfs_out_sg()
123 (XEN_FLEX_RING_SIZE(ring->ring_order) - in xen_9pfs_out_sg()
125 *num = 2; in xen_9pfs_out_sg()
127 out_sg[0].iov_base = ring->ring.out + masked_cons; in xen_9pfs_out_sg()
128 out_sg[0].iov_len = ring->out_size; in xen_9pfs_out_sg()
129 *num = 1; in xen_9pfs_out_sg()
139 Xen9pfsDev *xen_9pfs = container_of(pdu->s, Xen9pfsDev, state); in xen_9pfs_pdu_vmarshal()
141 int num; in xen_9pfs_pdu_vmarshal() local
144 xen_9pfs_in_sg(&xen_9pfs->rings[pdu->tag % xen_9pfs->num_rings], in xen_9pfs_pdu_vmarshal()
145 in_sg, &num, pdu->idx, ROUND_UP(offset + 128, 512)); in xen_9pfs_pdu_vmarshal()
147 ret = v9fs_iov_vmarshal(in_sg, num, offset, 0, fmt, ap); in xen_9pfs_pdu_vmarshal()
149 xen_pv_printf(&xen_9pfs->xendev, 0, in xen_9pfs_pdu_vmarshal()
151 pdu->id + 1); in xen_9pfs_pdu_vmarshal()
152 xen_be_set_state(&xen_9pfs->xendev, XenbusStateClosing); in xen_9pfs_pdu_vmarshal()
153 xen_9pfs_disconnect(&xen_9pfs->xendev); in xen_9pfs_pdu_vmarshal()
163 Xen9pfsDev *xen_9pfs = container_of(pdu->s, Xen9pfsDev, state); in xen_9pfs_pdu_vunmarshal()
165 int num; in xen_9pfs_pdu_vunmarshal() local
168 xen_9pfs_out_sg(&xen_9pfs->rings[pdu->tag % xen_9pfs->num_rings], in xen_9pfs_pdu_vunmarshal()
169 out_sg, &num, pdu->idx); in xen_9pfs_pdu_vunmarshal()
171 ret = v9fs_iov_vunmarshal(out_sg, num, offset, 0, fmt, ap); in xen_9pfs_pdu_vunmarshal()
173 xen_pv_printf(&xen_9pfs->xendev, 0, in xen_9pfs_pdu_vunmarshal()
174 "Failed to decode VirtFS request type %d\n", pdu->id); in xen_9pfs_pdu_vunmarshal()
175 xen_be_set_state(&xen_9pfs->xendev, XenbusStateClosing); in xen_9pfs_pdu_vunmarshal()
176 xen_9pfs_disconnect(&xen_9pfs->xendev); in xen_9pfs_pdu_vunmarshal()
186 Xen9pfsDev *xen_9pfs = container_of(pdu->s, Xen9pfsDev, state); in xen_9pfs_init_out_iov_from_pdu()
187 Xen9pfsRing *ring = &xen_9pfs->rings[pdu->tag % xen_9pfs->num_rings]; in xen_9pfs_init_out_iov_from_pdu()
188 int num; in xen_9pfs_init_out_iov_from_pdu() local
190 g_free(ring->sg); in xen_9pfs_init_out_iov_from_pdu()
192 ring->sg = g_new0(struct iovec, 2); in xen_9pfs_init_out_iov_from_pdu()
193 xen_9pfs_out_sg(ring, ring->sg, &num, pdu->idx); in xen_9pfs_init_out_iov_from_pdu()
194 *piov = ring->sg; in xen_9pfs_init_out_iov_from_pdu()
195 *pniov = num; in xen_9pfs_init_out_iov_from_pdu()
203 Xen9pfsDev *xen_9pfs = container_of(pdu->s, Xen9pfsDev, state); in xen_9pfs_init_in_iov_from_pdu()
204 Xen9pfsRing *ring = &xen_9pfs->rings[pdu->tag % xen_9pfs->num_rings]; in xen_9pfs_init_in_iov_from_pdu()
205 int num; in xen_9pfs_init_in_iov_from_pdu() local
208 g_free(ring->sg); in xen_9pfs_init_in_iov_from_pdu()
210 ring->sg = g_new0(struct iovec, 2); in xen_9pfs_init_in_iov_from_pdu()
211 ring->co = qemu_coroutine_self(); in xen_9pfs_init_in_iov_from_pdu()
212 /* make sure other threads see ring->co changes before continuing */ in xen_9pfs_init_in_iov_from_pdu()
216 xen_9pfs_in_sg(ring, ring->sg, &num, pdu->idx, size); in xen_9pfs_init_in_iov_from_pdu()
217 buf_size = iov_size(ring->sg, num); in xen_9pfs_init_in_iov_from_pdu()
222 ring->co = NULL; in xen_9pfs_init_in_iov_from_pdu()
223 /* make sure other threads see ring->co changes before continuing */ in xen_9pfs_init_in_iov_from_pdu()
226 *piov = ring->sg; in xen_9pfs_init_in_iov_from_pdu()
227 *pniov = num; in xen_9pfs_init_in_iov_from_pdu()
233 Xen9pfsDev *priv = container_of(pdu->s, Xen9pfsDev, state); in xen_9pfs_push_and_notify()
234 Xen9pfsRing *ring = &priv->rings[pdu->tag % priv->num_rings]; in xen_9pfs_push_and_notify()
236 g_free(ring->sg); in xen_9pfs_push_and_notify()
237 ring->sg = NULL; in xen_9pfs_push_and_notify()
239 ring->intf->out_cons = ring->out_cons; in xen_9pfs_push_and_notify()
242 prod = ring->intf->in_prod; in xen_9pfs_push_and_notify()
244 ring->intf->in_prod = prod + pdu->size; in xen_9pfs_push_and_notify()
247 ring->inprogress = false; in xen_9pfs_push_and_notify()
248 qemu_xen_evtchn_notify(ring->evtchndev, ring->local_port); in xen_9pfs_push_and_notify()
250 qemu_bh_schedule(ring->bh); in xen_9pfs_push_and_notify()
272 if (ring->inprogress) { in xen_9pfs_receive()
276 cons = ring->intf->out_cons; in xen_9pfs_receive()
277 prod = ring->intf->out_prod; in xen_9pfs_receive()
280 queued = xen_9pfs_queued(prod, cons, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_receive()
284 ring->inprogress = true; in xen_9pfs_receive()
286 masked_prod = xen_9pfs_mask(prod, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_receive()
287 masked_cons = xen_9pfs_mask(cons, XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_receive()
289 xen_9pfs_read_packet((uint8_t *) &h, ring->ring.out, sizeof(h), in xen_9pfs_receive()
291 XEN_FLEX_RING_SIZE(ring->ring_order)); in xen_9pfs_receive()
297 pdu = pdu_alloc(&ring->priv->state); in xen_9pfs_receive()
298 ring->out_size = le32_to_cpu(h.size_le); in xen_9pfs_receive()
299 ring->out_cons = cons + le32_to_cpu(h.size_le); in xen_9pfs_receive()
312 wait = ring->co != NULL && qemu_coroutine_entered(ring->co); in xen_9pfs_bh()
320 if (ring->co != NULL) { in xen_9pfs_bh()
321 qemu_coroutine_enter_if_inactive(ring->co); in xen_9pfs_bh()
331 port = qemu_xen_evtchn_pending(ring->evtchndev); in xen_9pfs_evtchn_event()
332 qemu_xen_evtchn_unmask(ring->evtchndev, port); in xen_9pfs_evtchn_event()
334 qemu_bh_schedule(ring->bh); in xen_9pfs_evtchn_event()
342 trace_xen_9pfs_disconnect(xendev->name); in xen_9pfs_disconnect()
344 for (i = 0; i < xen_9pdev->num_rings; i++) { in xen_9pfs_disconnect()
345 if (xen_9pdev->rings[i].evtchndev != NULL) { in xen_9pfs_disconnect()
346 qemu_set_fd_handler(qemu_xen_evtchn_fd(xen_9pdev->rings[i].evtchndev), in xen_9pfs_disconnect()
348 qemu_xen_evtchn_unbind(xen_9pdev->rings[i].evtchndev, in xen_9pfs_disconnect()
349 xen_9pdev->rings[i].local_port); in xen_9pfs_disconnect()
350 xen_9pdev->rings[i].evtchndev = NULL; in xen_9pfs_disconnect()
352 if (xen_9pdev->rings[i].data != NULL) { in xen_9pfs_disconnect()
353 xen_be_unmap_grant_refs(&xen_9pdev->xendev, in xen_9pfs_disconnect()
354 xen_9pdev->rings[i].data, in xen_9pfs_disconnect()
355 xen_9pdev->rings[i].intf->ref, in xen_9pfs_disconnect()
356 (1 << xen_9pdev->rings[i].ring_order)); in xen_9pfs_disconnect()
357 xen_9pdev->rings[i].data = NULL; in xen_9pfs_disconnect()
359 if (xen_9pdev->rings[i].intf != NULL) { in xen_9pfs_disconnect()
360 xen_be_unmap_grant_ref(&xen_9pdev->xendev, in xen_9pfs_disconnect()
361 xen_9pdev->rings[i].intf, in xen_9pfs_disconnect()
362 xen_9pdev->rings[i].ref); in xen_9pfs_disconnect()
363 xen_9pdev->rings[i].intf = NULL; in xen_9pfs_disconnect()
365 if (xen_9pdev->rings[i].bh != NULL) { in xen_9pfs_disconnect()
366 qemu_bh_delete(xen_9pdev->rings[i].bh); in xen_9pfs_disconnect()
367 xen_9pdev->rings[i].bh = NULL; in xen_9pfs_disconnect()
371 g_free(xen_9pdev->id); in xen_9pfs_disconnect()
372 xen_9pdev->id = NULL; in xen_9pfs_disconnect()
373 g_free(xen_9pdev->tag); in xen_9pfs_disconnect()
374 xen_9pdev->tag = NULL; in xen_9pfs_disconnect()
375 g_free(xen_9pdev->path); in xen_9pfs_disconnect()
376 xen_9pdev->path = NULL; in xen_9pfs_disconnect()
377 g_free(xen_9pdev->security_model); in xen_9pfs_disconnect()
378 xen_9pdev->security_model = NULL; in xen_9pfs_disconnect()
379 g_free(xen_9pdev->rings); in xen_9pfs_disconnect()
380 xen_9pdev->rings = NULL; in xen_9pfs_disconnect()
385 trace_xen_9pfs_free(xendev->name); in xen_9pfs_free()
395 V9fsState *s = &xen_9pdev->state; in xen_9pfs_connect()
398 trace_xen_9pfs_connect(xendev->name); in xen_9pfs_connect()
400 if (xenstore_read_fe_int(&xen_9pdev->xendev, "num-rings", in xen_9pfs_connect()
401 &xen_9pdev->num_rings) == -1 || in xen_9pfs_connect()
402 xen_9pdev->num_rings > MAX_RINGS || xen_9pdev->num_rings < 1) { in xen_9pfs_connect()
403 return -1; in xen_9pfs_connect()
406 xen_9pdev->rings = g_new0(Xen9pfsRing, xen_9pdev->num_rings); in xen_9pfs_connect()
407 for (i = 0; i < xen_9pdev->num_rings; i++) { in xen_9pfs_connect()
411 xen_9pdev->rings[i].priv = xen_9pdev; in xen_9pfs_connect()
412 xen_9pdev->rings[i].evtchn = -1; in xen_9pfs_connect()
413 xen_9pdev->rings[i].local_port = -1; in xen_9pfs_connect()
415 str = g_strdup_printf("ring-ref%u", i); in xen_9pfs_connect()
416 if (xenstore_read_fe_int(&xen_9pdev->xendev, str, in xen_9pfs_connect()
417 &xen_9pdev->rings[i].ref) == -1) { in xen_9pfs_connect()
422 str = g_strdup_printf("event-channel-%u", i); in xen_9pfs_connect()
423 if (xenstore_read_fe_int(&xen_9pdev->xendev, str, in xen_9pfs_connect()
424 &xen_9pdev->rings[i].evtchn) == -1) { in xen_9pfs_connect()
430 xen_9pdev->rings[i].intf = in xen_9pfs_connect()
431 xen_be_map_grant_ref(&xen_9pdev->xendev, in xen_9pfs_connect()
432 xen_9pdev->rings[i].ref, in xen_9pfs_connect()
434 if (!xen_9pdev->rings[i].intf) { in xen_9pfs_connect()
437 ring_order = xen_9pdev->rings[i].intf->ring_order; in xen_9pfs_connect()
441 xen_9pdev->rings[i].ring_order = ring_order; in xen_9pfs_connect()
442 xen_9pdev->rings[i].data = in xen_9pfs_connect()
443 xen_be_map_grant_refs(&xen_9pdev->xendev, in xen_9pfs_connect()
444 xen_9pdev->rings[i].intf->ref, in xen_9pfs_connect()
447 if (!xen_9pdev->rings[i].data) { in xen_9pfs_connect()
450 xen_9pdev->rings[i].ring.in = xen_9pdev->rings[i].data; in xen_9pfs_connect()
451 xen_9pdev->rings[i].ring.out = xen_9pdev->rings[i].data + in xen_9pfs_connect()
454 xen_9pdev->rings[i].bh = qemu_bh_new_guarded(xen_9pfs_bh, in xen_9pfs_connect()
455 &xen_9pdev->rings[i], in xen_9pfs_connect()
456 &xen_9pdev->mem_reentrancy_guard); in xen_9pfs_connect()
457 xen_9pdev->rings[i].out_cons = 0; in xen_9pfs_connect()
458 xen_9pdev->rings[i].out_size = 0; in xen_9pfs_connect()
459 xen_9pdev->rings[i].inprogress = false; in xen_9pfs_connect()
462 xen_9pdev->rings[i].evtchndev = qemu_xen_evtchn_open(); in xen_9pfs_connect()
463 if (xen_9pdev->rings[i].evtchndev == NULL) { in xen_9pfs_connect()
466 qemu_set_cloexec(qemu_xen_evtchn_fd(xen_9pdev->rings[i].evtchndev)); in xen_9pfs_connect()
467 xen_9pdev->rings[i].local_port = qemu_xen_evtchn_bind_interdomain in xen_9pfs_connect()
468 (xen_9pdev->rings[i].evtchndev, in xen_9pfs_connect()
469 xendev->dom, in xen_9pfs_connect()
470 xen_9pdev->rings[i].evtchn); in xen_9pfs_connect()
471 if (xen_9pdev->rings[i].local_port == -1) { in xen_9pfs_connect()
474 xen_9pdev->rings[i].evtchn); in xen_9pfs_connect()
477 xen_pv_printf(xendev, 2, "bind evtchn port %d\n", xendev->local_port); in xen_9pfs_connect()
478 qemu_set_fd_handler(qemu_xen_evtchn_fd(xen_9pdev->rings[i].evtchndev), in xen_9pfs_connect()
479 xen_9pfs_evtchn_event, NULL, &xen_9pdev->rings[i]); in xen_9pfs_connect()
482 xen_9pdev->security_model = xenstore_read_be_str(xendev, "security_model"); in xen_9pfs_connect()
483 xen_9pdev->path = xenstore_read_be_str(xendev, "path"); in xen_9pfs_connect()
484 xen_9pdev->id = s->fsconf.fsdev_id = in xen_9pfs_connect()
485 g_strdup_printf("xen9p%d", xendev->dev); in xen_9pfs_connect()
486 xen_9pdev->tag = s->fsconf.tag = xenstore_read_fe_str(xendev, "tag"); in xen_9pfs_connect()
488 s->fsconf.tag, in xen_9pfs_connect()
491 qemu_opt_set(fsdev, "path", xen_9pdev->path, NULL); in xen_9pfs_connect()
492 qemu_opt_set(fsdev, "security_model", xen_9pdev->security_model, NULL); in xen_9pfs_connect()
493 qemu_opts_set_id(fsdev, s->fsconf.fsdev_id); in xen_9pfs_connect()
504 return -1; in xen_9pfs_connect()
509 trace_xen_9pfs_alloc(xendev->name); in xen_9pfs_alloc()
512 xenstore_write_be_int(xendev, "max-rings", MAX_RINGS); in xen_9pfs_alloc()
513 xenstore_write_be_int(xendev, "max-ring-page-order", MAX_RING_ORDER); in xen_9pfs_alloc()