Message ID | 20220428082743.16593-19-jgross@suse.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | xen: simplify frontend side ring setup | expand |
On 28.04.22 11:27, Juergen Gross wrote: Hello Juergen, all > Simplify sndfront's ring creation and removal via xenbus_setup_ring() > and xenbus_teardown_ring(). > > Signed-off-by: Juergen Gross <jgross@suse.com> I am not familiar with SOUND bits of this driver, but a little bit familiar with Xen bits this patch only touches and I have environment to test. Xen specific changes looks good to me. Also I didn't see any issues when testing virtulized sound driver with current series except one I have already pointed out in PATCH v2 08/19. root@salvator-x-h3-4x2g-xt-domu:~# dmesg | grep vsnd [ 0.432181] Initialising Xen vsnd frontend driver root@salvator-x-h3-4x2g-xt-domu:~# aplay -l **** List of PLAYBACK Hardware Devices **** card 0: vsnd [], device 0: dev1 [Virtual card PCM] Subdevices: 1/1 Subdevice #0: subdevice #0 root@generic-armv8-xt-dom0:~# xenstore-ls -f | grep vsnd /local/domain/1/backend/vsnd = "" /local/domain/1/backend/vsnd/6 = "" /local/domain/1/backend/vsnd/6/0 = "" /local/domain/1/backend/vsnd/6/0/frontend = "/local/domain/6/device/vsnd/0" /local/domain/1/backend/vsnd/6/0/frontend-id = "6" /local/domain/1/backend/vsnd/6/0/online = "1" /local/domain/1/backend/vsnd/6/0/state = "4" /local/domain/6/device/vsnd = "" /local/domain/6/device/vsnd/0 = "" /local/domain/6/device/vsnd/0/backend = "/local/domain/1/backend/vsnd/6/0" /local/domain/6/device/vsnd/0/backend-id = "1" /local/domain/6/device/vsnd/0/state = "4" /local/domain/6/device/vsnd/0/long-name = "Virtual sound card" /local/domain/6/device/vsnd/0/short-name = "VCard" /local/domain/6/device/vsnd/0/sample-rates = "8000,11025,16000,22050,32000,44100,48000" /local/domain/6/device/vsnd/0/sample-formats = "s16_le" /local/domain/6/device/vsnd/0/buffer-size = "65536" /local/domain/6/device/vsnd/0/0 = "" /local/domain/6/device/vsnd/0/0/name = "dev1" /local/domain/6/device/vsnd/0/0/0 = "" /local/domain/6/device/vsnd/0/0/0/unique-id = "pulse" /local/domain/6/device/vsnd/0/0/0/type = "p" /local/domain/6/device/vsnd/0/0/0/ring-ref = "2070" /local/domain/6/device/vsnd/0/0/0/event-channel = "18" /local/domain/6/device/vsnd/0/0/0/evt-ring-ref = "2071" /local/domain/6/device/vsnd/0/0/0/evt-event-channel = "19" /libxl/6/device/vsnd = "" /libxl/6/device/vsnd/0 = "" /libxl/6/device/vsnd/0/frontend = "/local/domain/6/device/vsnd/0" /libxl/6/device/vsnd/0/backend = "/local/domain/1/backend/vsnd/6/0" /libxl/6/device/vsnd/0/frontend-id = "6" /libxl/6/device/vsnd/0/online = "1" /libxl/6/device/vsnd/0/state = "1" > --- > sound/xen/xen_snd_front_evtchnl.c | 44 +++++++------------------------ > 1 file changed, 10 insertions(+), 34 deletions(-) > > diff --git a/sound/xen/xen_snd_front_evtchnl.c b/sound/xen/xen_snd_front_evtchnl.c > index 3e21369c8216..26d1b3987887 100644 > --- a/sound/xen/xen_snd_front_evtchnl.c > +++ b/sound/xen/xen_snd_front_evtchnl.c > @@ -143,12 +143,12 @@ void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *channel) > static void evtchnl_free(struct xen_snd_front_info *front_info, > struct xen_snd_front_evtchnl *channel) > { > - unsigned long page = 0; > + void *page = NULL; > > if (channel->type == EVTCHNL_TYPE_REQ) > - page = (unsigned long)channel->u.req.ring.sring; > + page = channel->u.req.ring.sring; > else if (channel->type == EVTCHNL_TYPE_EVT) > - page = (unsigned long)channel->u.evt.page; > + page = channel->u.evt.page; > > if (!page) > return; > @@ -167,10 +167,7 @@ static void evtchnl_free(struct xen_snd_front_info *front_info, > xenbus_free_evtchn(front_info->xb_dev, channel->port); > > /* End access and free the page. */ > - if (channel->gref != INVALID_GRANT_REF) > - gnttab_end_foreign_access(channel->gref, page); > - else > - free_page(page); > + xenbus_teardown_ring(&page, 1, &channel->gref); > > memset(channel, 0, sizeof(*channel)); > } > @@ -196,8 +193,7 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, > enum xen_snd_front_evtchnl_type type) > { > struct xenbus_device *xb_dev = front_info->xb_dev; > - unsigned long page; > - grant_ref_t gref; > + void *page; > irq_handler_t handler; > char *handler_name = NULL; > int ret; > @@ -207,12 +203,9 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, > channel->index = index; > channel->front_info = front_info; > channel->state = EVTCHNL_STATE_DISCONNECTED; > - channel->gref = INVALID_GRANT_REF; > - page = get_zeroed_page(GFP_KERNEL); > - if (!page) { > - ret = -ENOMEM; > + ret = xenbus_setup_ring(xb_dev, GFP_KERNEL, &page, 1, &channel->gref); > + if (ret) > goto fail; > - } > > handler_name = kasprintf(GFP_KERNEL, "%s-%s", XENSND_DRIVER_NAME, > type == EVTCHNL_TYPE_REQ ? > @@ -226,33 +219,18 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, > mutex_init(&channel->ring_io_lock); > > if (type == EVTCHNL_TYPE_REQ) { > - struct xen_sndif_sring *sring = (struct xen_sndif_sring *)page; > + struct xen_sndif_sring *sring = page; > > init_completion(&channel->u.req.completion); > mutex_init(&channel->u.req.req_io_lock); > - SHARED_RING_INIT(sring); > - FRONT_RING_INIT(&channel->u.req.ring, sring, XEN_PAGE_SIZE); > - > - ret = xenbus_grant_ring(xb_dev, sring, 1, &gref); > - if (ret < 0) { > - channel->u.req.ring.sring = NULL; > - goto fail; > - } > + XEN_FRONT_RING_INIT(&channel->u.req.ring, sring, XEN_PAGE_SIZE); > > handler = evtchnl_interrupt_req; > } else { > - ret = gnttab_grant_foreign_access(xb_dev->otherend_id, > - virt_to_gfn((void *)page), 0); > - if (ret < 0) > - goto fail; > - > - channel->u.evt.page = (struct xensnd_event_page *)page; > - gref = ret; > + channel->u.evt.page = page; > handler = evtchnl_interrupt_evt; > } > > - channel->gref = gref; > - > ret = xenbus_alloc_evtchn(xb_dev, &channel->port); > if (ret < 0) > goto fail; > @@ -279,8 +257,6 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, > return 0; > > fail: > - if (page) > - free_page(page); > kfree(handler_name); > dev_err(&xb_dev->dev, "Failed to allocate ring: %d\n", ret); > return ret;
diff --git a/sound/xen/xen_snd_front_evtchnl.c b/sound/xen/xen_snd_front_evtchnl.c index 3e21369c8216..26d1b3987887 100644 --- a/sound/xen/xen_snd_front_evtchnl.c +++ b/sound/xen/xen_snd_front_evtchnl.c @@ -143,12 +143,12 @@ void xen_snd_front_evtchnl_flush(struct xen_snd_front_evtchnl *channel) static void evtchnl_free(struct xen_snd_front_info *front_info, struct xen_snd_front_evtchnl *channel) { - unsigned long page = 0; + void *page = NULL; if (channel->type == EVTCHNL_TYPE_REQ) - page = (unsigned long)channel->u.req.ring.sring; + page = channel->u.req.ring.sring; else if (channel->type == EVTCHNL_TYPE_EVT) - page = (unsigned long)channel->u.evt.page; + page = channel->u.evt.page; if (!page) return; @@ -167,10 +167,7 @@ static void evtchnl_free(struct xen_snd_front_info *front_info, xenbus_free_evtchn(front_info->xb_dev, channel->port); /* End access and free the page. */ - if (channel->gref != INVALID_GRANT_REF) - gnttab_end_foreign_access(channel->gref, page); - else - free_page(page); + xenbus_teardown_ring(&page, 1, &channel->gref); memset(channel, 0, sizeof(*channel)); } @@ -196,8 +193,7 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, enum xen_snd_front_evtchnl_type type) { struct xenbus_device *xb_dev = front_info->xb_dev; - unsigned long page; - grant_ref_t gref; + void *page; irq_handler_t handler; char *handler_name = NULL; int ret; @@ -207,12 +203,9 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, channel->index = index; channel->front_info = front_info; channel->state = EVTCHNL_STATE_DISCONNECTED; - channel->gref = INVALID_GRANT_REF; - page = get_zeroed_page(GFP_KERNEL); - if (!page) { - ret = -ENOMEM; + ret = xenbus_setup_ring(xb_dev, GFP_KERNEL, &page, 1, &channel->gref); + if (ret) goto fail; - } handler_name = kasprintf(GFP_KERNEL, "%s-%s", XENSND_DRIVER_NAME, type == EVTCHNL_TYPE_REQ ? @@ -226,33 +219,18 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, mutex_init(&channel->ring_io_lock); if (type == EVTCHNL_TYPE_REQ) { - struct xen_sndif_sring *sring = (struct xen_sndif_sring *)page; + struct xen_sndif_sring *sring = page; init_completion(&channel->u.req.completion); mutex_init(&channel->u.req.req_io_lock); - SHARED_RING_INIT(sring); - FRONT_RING_INIT(&channel->u.req.ring, sring, XEN_PAGE_SIZE); - - ret = xenbus_grant_ring(xb_dev, sring, 1, &gref); - if (ret < 0) { - channel->u.req.ring.sring = NULL; - goto fail; - } + XEN_FRONT_RING_INIT(&channel->u.req.ring, sring, XEN_PAGE_SIZE); handler = evtchnl_interrupt_req; } else { - ret = gnttab_grant_foreign_access(xb_dev->otherend_id, - virt_to_gfn((void *)page), 0); - if (ret < 0) - goto fail; - - channel->u.evt.page = (struct xensnd_event_page *)page; - gref = ret; + channel->u.evt.page = page; handler = evtchnl_interrupt_evt; } - channel->gref = gref; - ret = xenbus_alloc_evtchn(xb_dev, &channel->port); if (ret < 0) goto fail; @@ -279,8 +257,6 @@ static int evtchnl_alloc(struct xen_snd_front_info *front_info, int index, return 0; fail: - if (page) - free_page(page); kfree(handler_name); dev_err(&xb_dev->dev, "Failed to allocate ring: %d\n", ret); return ret;
Simplify sndfront's ring creation and removal via xenbus_setup_ring() and xenbus_teardown_ring(). Signed-off-by: Juergen Gross <jgross@suse.com> --- sound/xen/xen_snd_front_evtchnl.c | 44 +++++++------------------------ 1 file changed, 10 insertions(+), 34 deletions(-)