[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH RESEND 1/4] libs, gnttab, libxc: Interface for grant copy operation




On 31/05/2016 05:44, Paulina Szubarczyk wrote:
> Implentation of interface to grant copy operation called through
> libxc. An ioctl(gntdev, IOCTL_GNTDEV_GRANT_COPY, ..) system call is
> invoked for linux. In the mini-os the operation is yet not
> implemented.
> 
> * In the file "tools/include/xen-sys/Linux/gntdev.h" added
>   - 'struct ioctl_gntdev_grant_copy_segment'
>     The structure is analogous to 'struct gntdev_grant_copy_segment'
>     defined in linux code include/uapi/xen/gntdev.h. Typdefs are
>     replaced by they original types:
>       typedef uint16_t domid_t;
>       typedef uint32_t grant_ref_t;
>     That leads to defining domids array with type uint16_t in libs,
>     differently then in other functions concerning grant table
>     operations in that library.
> 
> ` - macro #define IOCTL_GNTDEV_GRANT_COPY
> 
>   - 'struct ioctl_gntdev_grant_copy'
>     taken from linux code as higher. Structure aggregating
>     'struct gntdev_grant_copy_segment'
> 
> * In the file libs/gnttab/linux.c
>   - function int osdep_gnttab_grant_copy(xengnttab_handle *xgt,
>                               uint32_t count,
>                               uint16_t *domids, uint32_t *refs, void
>                               **bufs, uint32_t *offset, uint32_t *len,
>                               int type, uint32_t notify_offset,
>                               evtchn_port_t notify_port)
> 
>     It is a function used to perform grant copy opertion. It allocats
>     'ioctl_gntdev_grant_copy' and 'ioctl_gntdev_grant_copy_segment'.
>     Segments are filled from the passed values.
> 
>     When @type is different then zero the source to copy from are guest
>     domain grant pages addressed by @refs and the destination is local
>     memory accessed from @bufs, the operation flag is then set to
>     'GNTCOPY_source_gref', contrarily for @type equal zero.
> 
>     @offset is the offset on the page
>     @len is the amount of data to copy,
>     @offset[i] + @len[i] should not exceed XEN_PAGE_SIZE
>         - the condition is checked in gntdev device.
> 
>     Notification is yet not implemented.

I'm not sure what you mean by "notifcation" here.

> index caf6fb4..0ca07c9 100644
> --- a/tools/include/xen-sys/Linux/gntdev.h
> +++ b/tools/include/xen-sys/Linux/gntdev.h
> @@ -147,4 +147,25 @@ struct ioctl_gntdev_unmap_notify {
>  /* Send an interrupt on the indicated event channel */
>  #define UNMAP_NOTIFY_SEND_EVENT 0x2
>  
> +struct ioctl_gntdev_grant_copy_segment {
> +    union {
> +        void *virt;
> +        struct {
> +            uint32_t ref;
> +            uint16_t offset;
> +            uint16_t domid;
> +        } foreign;
> +    } source, dest;
> +    uint16_t len;
> +    uint16_t flags;
> +    int16_t status;
> +};
> +
> +#define IOCTL_GNTDEV_GRANT_COPY \
> +_IOC(_IOC_NONE, 'G', 8, sizeof(struct ioctl_gntdev_grant_copy))
> +struct ioctl_gntdev_grant_copy {
> +    unsigned int count;
> +    struct ioctl_gntdev_grant_copy_segment *segments;
> +};
> +
>  #endif /* __LINUX_PUBLIC_GNTDEV_H__ */
> diff --git a/tools/libs/gnttab/gnttab_core.c b/tools/libs/gnttab/gnttab_core.c
> index 5d0474d..1e014f8 100644
> --- a/tools/libs/gnttab/gnttab_core.c
> +++ b/tools/libs/gnttab/gnttab_core.c
> @@ -113,6 +113,18 @@ int xengnttab_unmap(xengnttab_handle *xgt, void 
> *start_address, uint32_t count)
>      return osdep_gnttab_unmap(xgt, start_address, count);
>  }
>  
> +int xengnttab_copy_grant(xengnttab_handle *xgt,
> +                         uint32_t count,
> +                         uint16_t *domids,
> +                         uint32_t *refs,
> +                         void **bufs,
> +                         uint32_t *offset, 
> +                         uint32_t *len,
> +                         int type)

This interface should match the ioctl which matches the hypercall.  In
particular the ioctl (and hypercall) allows copies to and from grant
references in the same call and returns a per-op status.

Using the same structure in libxc would also allow you to a) remove the
memory allocations; and b) avoid having to fill in a different structure.

I would suggest:

int xengnttab_copy_grant(xengnttab_handle *xgt,
        unsigned int count,
        xengnttab_copy_segment_t *segs);

With:

typedef struct ioctl_gntdev_copy_segment xengnttab_copy_segment_t;

You should put the required struct ioctl_gntdev_grant_copy on the stack
since it is small.

David

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.