[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv4 11/14] xen/gntdev: safely unmap grants in case they are still in use
On Mon, 26 Jan 2015, David Vrabel wrote: > From: Jennifer Herbert <jennifer.herbert@xxxxxxxxxx> > > Use gnttab_unmap_refs_async() to wait until the mapped pages are no > longer in use before unmapping them. > > This allows userspace programs to safely use Direct I/O and AIO to a > network filesystem which may retain refs to pages in queued skbs after > the filesystem I/O has completed. > > Signed-off-by: Jennifer Herbert <jennifer.herbert@xxxxxxxxxx> > Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> Reviewed-by: Stefano Stabellini <stefano.stabellini@xxxxxxxxxxxxx> > drivers/xen/gntdev.c | 36 +++++++++++++++++++++++++++++++----- > 1 file changed, 31 insertions(+), 5 deletions(-) > > diff --git a/drivers/xen/gntdev.c b/drivers/xen/gntdev.c > index c1a03fa..494bd06 100644 > --- a/drivers/xen/gntdev.c > +++ b/drivers/xen/gntdev.c > @@ -311,9 +311,30 @@ static int map_grant_pages(struct grant_map *map) > return err; > } > > +struct unmap_grant_pages_callback_data > +{ > + struct completion completion; > + int result; > +}; > + > +static void unmap_grant_callback(int result, > + struct gntab_unmap_queue_data *data) > +{ > + struct unmap_grant_pages_callback_data* d = data->data; > + > + d->result = result; > + complete(&d->completion); > +} > + > static int __unmap_grant_pages(struct grant_map *map, int offset, int pages) > { > int i, err = 0; > + struct gntab_unmap_queue_data unmap_data; > + struct unmap_grant_pages_callback_data data; > + > + init_completion(&data.completion); > + unmap_data.data = &data; > + unmap_data.done= &unmap_grant_callback; > > if (map->notify.flags & UNMAP_NOTIFY_CLEAR_BYTE) { > int pgno = (map->notify.addr >> PAGE_SHIFT); > @@ -325,11 +346,16 @@ static int __unmap_grant_pages(struct grant_map *map, > int offset, int pages) > } > } > > - err = gnttab_unmap_refs(map->unmap_ops + offset, > - use_ptemod ? map->kunmap_ops + offset : NULL, > map->pages + offset, > - pages); > - if (err) > - return err; > + unmap_data.unmap_ops = map->unmap_ops + offset; > + unmap_data.kunmap_ops = use_ptemod ? map->kunmap_ops + offset : NULL; > + unmap_data.pages = map->pages + offset; > + unmap_data.count = pages; > + > + gnttab_unmap_refs_async(&unmap_data); > + > + wait_for_completion(&data.completion); > + if (data.result) > + return data.result; > > for (i = 0; i < pages; i++) { > if (map->unmap_ops[offset+i].status) > -- > 1.7.10.4 > > > _______________________________________________ > Xen-devel mailing list > Xen-devel@xxxxxxxxxxxxx > http://lists.xen.org/xen-devel > _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |