[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH v3 12/13] xen/pvcalls: implement release command
On Tue, 15 Aug 2017, Boris Ostrovsky wrote: > On 07/31/2017 06:57 PM, Stefano Stabellini wrote: > > Send PVCALLS_RELEASE to the backend and wait for a reply. Take both > > in_mutex and out_mutex to avoid concurrent accesses. Then, free the > > socket. > > > > For passive sockets, check whether we have already pre-allocated an > > active socket for the purpose of being accepted. If so, free that as > > well. > > > > Signed-off-by: Stefano Stabellini <stefano@xxxxxxxxxxx> > > CC: boris.ostrovsky@xxxxxxxxxx > > CC: jgross@xxxxxxxx > > --- > > drivers/xen/pvcalls-front.c | 88 > > +++++++++++++++++++++++++++++++++++++++++++++ > > drivers/xen/pvcalls-front.h | 1 + > > 2 files changed, 89 insertions(+) > > > > diff --git a/drivers/xen/pvcalls-front.c b/drivers/xen/pvcalls-front.c > > index 1c975d6..775a6d2 100644 > > --- a/drivers/xen/pvcalls-front.c > > +++ b/drivers/xen/pvcalls-front.c > > @@ -192,6 +192,23 @@ static irqreturn_t pvcalls_front_conn_handler(int irq, > > void *sock_map) > > return IRQ_HANDLED; > > } > > > > +static void pvcalls_front_free_map(struct pvcalls_bedata *bedata, > > + struct sock_mapping *map) > > +{ > > + int i; > > + > > + spin_lock(&bedata->pvcallss_lock); > > + if (!list_empty(&map->list)) > > + list_del_init(&map->list); > > + spin_unlock(&bedata->pvcallss_lock); > > + > > + for (i = 0; i < (1 << map->active.ring->ring_order); i++) > > + gnttab_end_foreign_access(map->active.ring->ref[i], 0, 0); > > + gnttab_end_foreign_access(map->active.ref, 0, 0); > > + free_page((unsigned long)map->active.ring); > > + unbind_from_irqhandler(map->active.irq, map); > > Would it better to first unbind the handler? Any chance an interrupt > might come in? Fair enough, I'll do that. > > +} > > + > > int pvcalls_front_socket(struct socket *sock) > > { > > struct pvcalls_bedata *bedata; > > @@ -853,6 +870,77 @@ unsigned int pvcalls_front_poll(struct file *file, > > struct socket *sock, > > return pvcalls_front_poll_passive(file, bedata, map, wait); > > } > > > > +int pvcalls_front_release(struct socket *sock) > > +{ > > + struct pvcalls_bedata *bedata; > > + struct sock_mapping *map; > > + int req_id, notify, ret; > > + struct xen_pvcalls_request *req; > > + > > + if (!pvcalls_front_dev) > > + return -EIO; > > + bedata = dev_get_drvdata(&pvcalls_front_dev->dev); > > + > > + if (sock->sk == NULL) > > + return 0; > > This can go above bedata access. Yes, good idea. > (You are going to address locking here so I won't review the rest) Yes, I will. Thanks for the review! And sorry for taking so long to come back to you. _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx https://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |