Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

xen/sndfront: use xenbus_setup_ring() and xenbus_teardown_ring()

Simplify sndfront's ring creation and removal via xenbus_setup_ring()
and xenbus_teardown_ring().

Signed-off-by: Juergen Gross <jgross@suse.com>
Reviewed-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com>
Tested-by: Oleksandr Tyshchenko <oleksandr_tyshchenko@epam.com> # Arm64 only
Signed-off-by: Juergen Gross <jgross@suse.com>

+10 -34
+10 -34
sound/xen/xen_snd_front_evtchnl.c
··· 143 143 static void evtchnl_free(struct xen_snd_front_info *front_info, 144 144 struct xen_snd_front_evtchnl *channel) 145 145 { 146 - unsigned long page = 0; 146 + void *page = NULL; 147 147 148 148 if (channel->type == EVTCHNL_TYPE_REQ) 149 - page = (unsigned long)channel->u.req.ring.sring; 149 + page = channel->u.req.ring.sring; 150 150 else if (channel->type == EVTCHNL_TYPE_EVT) 151 - page = (unsigned long)channel->u.evt.page; 151 + page = channel->u.evt.page; 152 152 153 153 if (!page) 154 154 return; ··· 167 167 xenbus_free_evtchn(front_info->xb_dev, channel->port); 168 168 169 169 /* End access and free the page. */ 170 - if (channel->gref != INVALID_GRANT_REF) 171 - gnttab_end_foreign_access(channel->gref, page); 172 - else 173 - free_page(page); 170 + xenbus_teardown_ring(&page, 1, &channel->gref); 174 171 175 172 memset(channel, 0, sizeof(*channel)); 176 173 } ··· 193 196 enum xen_snd_front_evtchnl_type type) 194 197 { 195 198 struct xenbus_device *xb_dev = front_info->xb_dev; 196 - unsigned long page; 197 - grant_ref_t gref; 199 + void *page; 198 200 irq_handler_t handler; 199 201 char *handler_name = NULL; 200 202 int ret; ··· 203 207 channel->index = index; 204 208 channel->front_info = front_info; 205 209 channel->state = EVTCHNL_STATE_DISCONNECTED; 206 - channel->gref = INVALID_GRANT_REF; 207 - page = get_zeroed_page(GFP_KERNEL); 208 - if (!page) { 209 - ret = -ENOMEM; 210 + ret = xenbus_setup_ring(xb_dev, GFP_KERNEL, &page, 1, &channel->gref); 211 + if (ret) 210 212 goto fail; 211 - } 212 213 213 214 handler_name = kasprintf(GFP_KERNEL, "%s-%s", XENSND_DRIVER_NAME, 214 215 type == EVTCHNL_TYPE_REQ ? ··· 219 226 mutex_init(&channel->ring_io_lock); 220 227 221 228 if (type == EVTCHNL_TYPE_REQ) { 222 - struct xen_sndif_sring *sring = (struct xen_sndif_sring *)page; 229 + struct xen_sndif_sring *sring = page; 223 230 224 231 init_completion(&channel->u.req.completion); 225 232 mutex_init(&channel->u.req.req_io_lock); 226 - SHARED_RING_INIT(sring); 227 - FRONT_RING_INIT(&channel->u.req.ring, sring, XEN_PAGE_SIZE); 228 - 229 - ret = xenbus_grant_ring(xb_dev, sring, 1, &gref); 230 - if (ret < 0) { 231 - channel->u.req.ring.sring = NULL; 232 - goto fail; 233 - } 233 + XEN_FRONT_RING_INIT(&channel->u.req.ring, sring, XEN_PAGE_SIZE); 234 234 235 235 handler = evtchnl_interrupt_req; 236 236 } else { 237 - ret = gnttab_grant_foreign_access(xb_dev->otherend_id, 238 - virt_to_gfn((void *)page), 0); 239 - if (ret < 0) 240 - goto fail; 241 - 242 - channel->u.evt.page = (struct xensnd_event_page *)page; 243 - gref = ret; 237 + channel->u.evt.page = page; 244 238 handler = evtchnl_interrupt_evt; 245 239 } 246 - 247 - channel->gref = gref; 248 240 249 241 ret = xenbus_alloc_evtchn(xb_dev, &channel->port); 250 242 if (ret < 0) ··· 257 279 return 0; 258 280 259 281 fail: 260 - if (page) 261 - free_page(page); 262 282 kfree(handler_name); 263 283 dev_err(&xb_dev->dev, "Failed to allocate ring: %d\n", ret); 264 284 return ret;