|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH RESEND 1/4] libs, gnttab, libxc: Interface for grant copy operation
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.
---
tools/include/xen-sys/Linux/gntdev.h | 21 ++++++++++
tools/libs/gnttab/gnttab_core.c | 12 ++++++
tools/libs/gnttab/include/xengnttab.h | 18 +++++++++
tools/libs/gnttab/libxengnttab.map | 2 +
tools/libs/gnttab/linux.c | 72 +++++++++++++++++++++++++++++++++++
tools/libs/gnttab/minios.c | 8 ++++
tools/libs/gnttab/private.h | 6 +++
tools/libxc/include/xenctrl_compat.h | 8 ++++
tools/libxc/xc_gnttab_compat.c | 12 ++++++
9 files changed, 159 insertions(+)
diff --git a/tools/include/xen-sys/Linux/gntdev.h
b/tools/include/xen-sys/Linux/gntdev.h
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)
+{
+ return osdep_gnttab_grant_copy(xgt, count, domids, refs, bufs, offset,
len,
+ type, -1, -1);
+}
/*
* Local variables:
* mode: C
diff --git a/tools/libs/gnttab/include/xengnttab.h
b/tools/libs/gnttab/include/xengnttab.h
index 0431dcf..923e022 100644
--- a/tools/libs/gnttab/include/xengnttab.h
+++ b/tools/libs/gnttab/include/xengnttab.h
@@ -258,6 +258,24 @@ int xengnttab_unmap(xengnttab_handle *xgt, void
*start_address, uint32_t count);
int xengnttab_set_max_grants(xengnttab_handle *xgt,
uint32_t nr_grants);
+/**
+ * Copy memory from or to the domains defined in domids array.
+ * When @type is different then zero data is copied from grant pages addressed
+ * by @refs to @bufs, and 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
+ */
+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);
+
/*
* Grant Sharing Interface (allocating and granting pages to others)
*/
diff --git a/tools/libs/gnttab/libxengnttab.map
b/tools/libs/gnttab/libxengnttab.map
index dc737ac..6a94102 100644
--- a/tools/libs/gnttab/libxengnttab.map
+++ b/tools/libs/gnttab/libxengnttab.map
@@ -12,6 +12,8 @@ VERS_1.0 {
xengnttab_unmap;
+ xengnttab_copy_grant;
+
xengntshr_open;
xengntshr_close;
diff --git a/tools/libs/gnttab/linux.c b/tools/libs/gnttab/linux.c
index 7b0fba4..2b21a9f 100644
--- a/tools/libs/gnttab/linux.c
+++ b/tools/libs/gnttab/linux.c
@@ -235,6 +235,78 @@ int osdep_gnttab_unmap(xengnttab_handle *xgt,
return 0;
}
+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)
+{
+ int fd = xgt->fd;
+ struct ioctl_gntdev_grant_copy *copy = NULL;
+ struct ioctl_gntdev_grant_copy_segment *seg = NULL;
+ int i, r = 0;
+
+ copy = malloc(sizeof(struct ioctl_gntdev_grant_copy));
+ if(!copy) {
+ r = -1; goto out;
+ }
+
+ seg = calloc(count, sizeof(struct ioctl_gntdev_grant_copy_segment));
+ if(!seg) {
+ r = -1; goto out;
+ }
+
+ copy->segments = seg;
+ copy->count = count;
+
+ for (i = 0; i < count; i++)
+ {
+ seg[i].len = len[i];
+ seg[i].status = 0;
+
+ if(type)
+ {
+ seg[i].flags = GNTCOPY_source_gref;
+
+ seg[i].source.foreign.domid = domids[i];
+ seg[i].source.foreign.ref = refs[i];
+ seg[i].source.foreign.offset = offset[i];
+ seg[i].dest.virt = bufs[i];
+ }
+ else
+ {
+ seg[i].flags = GNTCOPY_dest_gref;
+
+ seg[i].dest.foreign.domid = domids[i];
+ seg[i].dest.foreign.ref = refs[i];
+ seg[i].dest.foreign.offset = offset[i];
+ seg[i].source.virt = bufs[i];
+ }
+ }
+
+ if (ioctl(fd, IOCTL_GNTDEV_GRANT_COPY, copy)) {
+ GTERROR(xgt->logger, "ioctl GRANT COPY failed %d ", errno);
+ r = -1; goto out;
+ }
+
+ for (i = 0; i < count; i++) {
+ if(seg[i].status != GNTST_okay) {
+ GTERROR(xgt->logger, "GRANT COPY failed for segment %d, "
+ "with status %d\n", i, seg[i].status);
+ }
+ }
+
+ r = 0;
+out:
+ if(seg)
+ free(seg);
+
+ if(copy)
+ free(copy);
+
+ return r;
+}
+
int osdep_gntshr_open(xengntshr_handle *xgs)
{
int fd = open(DEVXEN "gntalloc", O_RDWR);
diff --git a/tools/libs/gnttab/minios.c b/tools/libs/gnttab/minios.c
index 7e04174..8c90227 100644
--- a/tools/libs/gnttab/minios.c
+++ b/tools/libs/gnttab/minios.c
@@ -106,6 +106,14 @@ int osdep_gnttab_set_max_grants(xengnttab_handle *xgt,
uint32_t count)
return ret;
}
+int osdep_gnttab_grant_copy(xengnttab_handle *xgt,
+ uint32_t count,
+ uint16_t *domids, uint32_t *refs, void **bufs,
+ uint32_t *mem, uint32_t *len, int type,
+ uint32_t notify_offset, evtchn_port_t notify_port)
+{
+ return -1;
+}
/*
* Local variables:
* mode: C
diff --git a/tools/libs/gnttab/private.h b/tools/libs/gnttab/private.h
index d286c86..098de8b 100644
--- a/tools/libs/gnttab/private.h
+++ b/tools/libs/gnttab/private.h
@@ -23,6 +23,12 @@ void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
int osdep_gnttab_unmap(xengnttab_handle *xgt,
void *start_address,
uint32_t count);
+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);
+
int osdep_gntshr_open(xengntshr_handle *xgs);
int osdep_gntshr_close(xengntshr_handle *xgs);
diff --git a/tools/libxc/include/xenctrl_compat.h
b/tools/libxc/include/xenctrl_compat.h
index 93ccadb..871d48d 100644
--- a/tools/libxc/include/xenctrl_compat.h
+++ b/tools/libxc/include/xenctrl_compat.h
@@ -104,6 +104,14 @@ int xc_gnttab_munmap(xc_gnttab *xcg,
uint32_t count);
int xc_gnttab_set_max_grants(xc_gnttab *xcg,
uint32_t count);
+int xc_gnttab_copy_grant(xc_gnttab *xcg,
+ uint32_t count,
+ uint16_t *domids,
+ uint32_t *refs,
+ void **bufs,
+ uint32_t *mem,
+ uint32_t *len,
+ int type);
typedef struct xengntdev_handle xc_gntshr;
diff --git a/tools/libxc/xc_gnttab_compat.c b/tools/libxc/xc_gnttab_compat.c
index 6f036d8..888cfc3 100644
--- a/tools/libxc/xc_gnttab_compat.c
+++ b/tools/libxc/xc_gnttab_compat.c
@@ -69,6 +69,18 @@ int xc_gnttab_set_max_grants(xc_gnttab *xcg,
return xengnttab_set_max_grants(xcg, count);
}
+int xc_gnttab_copy_grant(xc_gnttab *xcg,
+ uint32_t count,
+ uint16_t *domids,
+ uint32_t *refs,
+ void **bufs,
+ uint32_t *mem,
+ uint32_t *len,
+ int type)
+{
+ return xengnttab_copy_grant(xcg, count, domids, refs, bufs, mem, len,
type);
+}
+
xc_gntshr *xc_gntshr_open(xentoollog_logger *logger,
unsigned open_flags)
{
--
1.9.1
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |