[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCHv3] xen/gntdev: add ioctl for grant copy
On 30/11/15 21:39, Konrad Rzeszutek Wilk wrote: > On Fri, Nov 27, 2015 at 05:17:05PM +0000, David Vrabel wrote: >> Add IOCTL_GNTDEV_GRANT_COPY to allow applications to copy between user >> space buffers and grant references. >> >> This interface is similar to the GNTTABOP_copy hypercall ABI except >> the local buffers are provided using a virtual address (instead of a >> GFN and offset). To avoid userspace from having to page align its >> buffers the driver will use two or more ops if required. >> >> If the ioctl returns 0, the application must check the status of each >> segment with the segments status field. If the ioctl returns a -ve >> error code (EINVAL or EFAULT), the status of individual ops is >> undefined. > > Are there any test tools that could be used for this? To make sure that > regression wise this does not get broken? See attached. >> +static int gntdev_copy(struct gntdev_copy_batch *batch) >> +{ >> + unsigned int i; >> + >> + gnttab_batch_copy(batch->ops, batch->nr_ops); >> + gntdev_put_pages(batch); >> + >> + /* >> + * For each completed op, update the status if the op failed >> + * and a previous failure for the segment hasn't been >> + * recorded. > > How could an previous failure not be recorded? Could you mention that > in this nice comment please? All the negatives in this sentence are confusing so I'll reword. If we haven't recorded a failure for the previous op in the segment it's because it succeeded. The aim here is to record the first op failure for a segment. From the ioctl documentation: + * If the driver had to split a segment into two or more ops, @status + * includes the status of the first failed op for that segment (or + * GNTST_okay if all ops were successful). >> +static long gntdev_ioctl_grant_copy(struct gntdev_priv *priv, void __user >> *u) >> +{ >> + struct ioctl_gntdev_grant_copy copy; >> + struct gntdev_copy_batch batch = { .nr_ops = 0, .nr_pages = 0, }; >> + unsigned int i; >> + int ret = 0; >> + >> + if (copy_from_user(©, u, sizeof(copy))) >> + return -EFAULT; >> > + > > No check on the .nr_pages' ? What if it is 0xfffffffffffffffffffffffff? > > Ditto for .nr_ops? batch.nr_ops and batch.nr_pages are internal, not supplied by the user and are limited by the batch size. I guess you're really asking about the value of copy.count? This doesn't matter because we process the segments one by one and have a fixed batch size for the ops. There's also a cond_resched() every segment so submitting a single ioctl with a crazy number of segments is really no different from userspace calling the ioctl a crazy number of times. David p.s. Please trim your replies when reviewing. Attachment:
gntdev-copy.c _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |