[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v2 2/3] tools/libs/gnttab: decouple more from mini-os
libgnttab is using implementation details of Mini-OS. Change that by letting libgnttab use the new alloc_file_type() and get_file_from_fd() functions and the generic dev pointer of struct file from Mini-OS. Signed-off-by: Juergen Gross <jgross@xxxxxxxx> --- V2: - add alloc_file_type() support --- tools/libs/gnttab/minios.c | 68 +++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 20 deletions(-) diff --git a/tools/libs/gnttab/minios.c b/tools/libs/gnttab/minios.c index f78caadd30..c19f339c8c 100644 --- a/tools/libs/gnttab/minios.c +++ b/tools/libs/gnttab/minios.c @@ -28,18 +28,53 @@ #include <sys/mman.h> #include <errno.h> +#include <malloc.h> #include <unistd.h> #include "private.h" -void minios_gnttab_close_fd(int fd); +int minios_gnttab_close_fd(int fd); + +int minios_gnttab_close_fd(int fd) +{ + struct file *file = get_file_from_fd(fd); + + gntmap_fini(file->dev); + free(file->dev); + + return 0; +} + +static struct file_ops gnttab_ops = { + .name = "gnttab", + .close = minios_gnttab_close_fd, +}; int osdep_gnttab_open(xengnttab_handle *xgt) { - int fd = alloc_fd(FTYPE_GNTMAP); - if ( fd == -1 ) + int fd; + struct file *file; + struct gntmap *gntmap; + static unsigned int ftype_gnttab; + + if ( !ftype_gnttab ) + ftype_gnttab = alloc_file_type(&gnttab_ops); + + gntmap = malloc(sizeof(*gntmap)); + if ( !gntmap ) + return -1; + + fd = alloc_fd(ftype_gnttab); + file = get_file_from_fd(fd); + + if ( !file ) + { + free(gntmap); return -1; - gntmap_init(&files[fd].gntmap); + } + + file->dev = gntmap; + gntmap_init(gntmap); xgt->fd = fd; return 0; } @@ -52,28 +87,22 @@ int osdep_gnttab_close(xengnttab_handle *xgt) return close(xgt->fd); } -void minios_gnttab_close_fd(int fd) -{ - gntmap_fini(&files[fd].gntmap); - files[fd].type = FTYPE_NONE; -} - void *osdep_gnttab_grant_map(xengnttab_handle *xgt, uint32_t count, int flags, int prot, uint32_t *domids, uint32_t *refs, uint32_t notify_offset, evtchn_port_t notify_port) { - int fd = xgt->fd; + struct file *file = get_file_from_fd(xgt->fd); int stride = 1; + if (flags & XENGNTTAB_GRANT_MAP_SINGLE_DOMAIN) stride = 0; if (notify_offset != -1 || notify_port != -1) { errno = ENOSYS; return NULL; } - return gntmap_map_grant_refs(&files[fd].gntmap, - count, domids, stride, + return gntmap_map_grant_refs(file->dev, count, domids, stride, refs, prot & PROT_WRITE); } @@ -81,11 +110,10 @@ int osdep_gnttab_unmap(xengnttab_handle *xgt, void *start_address, uint32_t count) { - int fd = xgt->fd; + struct file *file = get_file_from_fd(xgt->fd); int ret; - ret = gntmap_munmap(&files[fd].gntmap, - (unsigned long) start_address, - count); + + ret = gntmap_munmap(file->dev, (unsigned long) start_address, count); if (ret < 0) { errno = -ret; return -1; @@ -95,10 +123,10 @@ int osdep_gnttab_unmap(xengnttab_handle *xgt, int osdep_gnttab_set_max_grants(xengnttab_handle *xgt, uint32_t count) { - int fd = xgt->fd; + struct file *file = get_file_from_fd(xgt->fd); int ret; - ret = gntmap_set_max_grants(&files[fd].gntmap, - count); + + ret = gntmap_set_max_grants(file->dev, count); if (ret < 0) { errno = -ret; return -1; -- 2.26.2
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |