Lines Matching refs:ring

47 #define XEN_9PFS_RING_SIZE(ring)  XEN_FLEX_RING_SIZE(ring->intf->ring_order)
57 /* One per ring, more than one per 9pfs share */
65 /* protect a ring from concurrent accesses */
127 static bool p9_xen_write_todo(struct xen_9pfs_dataring *ring, RING_IDX size)
131 cons = ring->intf->out_cons;
132 prod = ring->intf->out_prod;
135 return XEN_9PFS_RING_SIZE(ring) -
136 xen_9pfs_queued(prod, cons, XEN_9PFS_RING_SIZE(ring)) >= size;
145 struct xen_9pfs_dataring *ring;
158 ring = &priv->rings[num];
161 while (wait_event_killable(ring->wq,
162 p9_xen_write_todo(ring, size)) != 0)
165 spin_lock_irqsave(&ring->lock, flags);
166 cons = ring->intf->out_cons;
167 prod = ring->intf->out_prod;
170 if (XEN_9PFS_RING_SIZE(ring) -
171 xen_9pfs_queued(prod, cons, XEN_9PFS_RING_SIZE(ring)) < size) {
172 spin_unlock_irqrestore(&ring->lock, flags);
176 masked_prod = xen_9pfs_mask(prod, XEN_9PFS_RING_SIZE(ring));
177 masked_cons = xen_9pfs_mask(cons, XEN_9PFS_RING_SIZE(ring));
179 xen_9pfs_write_packet(ring->data.out, p9_req->tc.sdata, size,
181 XEN_9PFS_RING_SIZE(ring));
184 virt_wmb(); /* write ring before updating pointer */
186 ring->intf->out_prod = prod;
187 spin_unlock_irqrestore(&ring->lock, flags);
188 notify_remote_via_irq(ring->irq);
197 struct xen_9pfs_dataring *ring;
203 ring = container_of(work, struct xen_9pfs_dataring, work);
204 priv = ring->priv;
207 cons = ring->intf->in_cons;
208 prod = ring->intf->in_prod;
211 if (xen_9pfs_queued(prod, cons, XEN_9PFS_RING_SIZE(ring)) <
213 notify_remote_via_irq(ring->irq);
217 masked_prod = xen_9pfs_mask(prod, XEN_9PFS_RING_SIZE(ring));
218 masked_cons = xen_9pfs_mask(cons, XEN_9PFS_RING_SIZE(ring));
221 xen_9pfs_read_packet(&h, ring->data.in, sizeof(h),
223 XEN_9PFS_RING_SIZE(ring));
230 ring->intf->in_cons = cons;
245 masked_cons = xen_9pfs_mask(cons, XEN_9PFS_RING_SIZE(ring));
247 xen_9pfs_read_packet(req->rc.sdata, ring->data.in, h.size,
249 XEN_9PFS_RING_SIZE(ring));
254 ring->intf->in_cons = cons;
265 struct xen_9pfs_dataring *ring = r;
267 if (!ring || !ring->priv->client) {
272 wake_up_interruptible(&ring->wq);
273 schedule_work(&ring->work);
303 struct xen_9pfs_dataring *ring = &priv->rings[i];
305 cancel_work_sync(&ring->work);
342 struct xen_9pfs_dataring *ring,
349 init_waitqueue_head(&ring->wq);
350 spin_lock_init(&ring->lock);
351 INIT_WORK(&ring->work, p9_xen_response);
353 ring->intf = (struct xen_9pfs_data_intf *)get_zeroed_page(GFP_KERNEL);
354 if (!ring->intf)
357 virt_to_gfn(ring->intf), 0);
360 ring->ref = ret;
372 ring->intf->ref[i] = ret;
374 ring->intf->ring_order = order;
375 ring->data.in = bytes;
376 ring->data.out = bytes + XEN_FLEX_RING_SIZE(order);
378 ret = xenbus_alloc_evtchn(dev, &ring->evtchn);
381 ring->irq = bind_evtchn_to_irqhandler(ring->evtchn,
383 0, "xen_9pfs-frontend", ring);
384 if (ring->irq >= 0)
387 xenbus_free_evtchn(dev, ring->evtchn);
388 ret = ring->irq;
392 gnttab_end_foreign_access(ring->intf->ref[i], 0, 0);
395 gnttab_end_foreign_access(ring->ref, 0, 0);
396 free_page((unsigned long)ring->intf);
426 "max-ring-page-order", 0);
465 sprintf(str, "ring-ref%d", i);