|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v3 2/3] tools/libs/gnttab: decouple more from mini-os
Juergen Gross, le dim. 16 janv. 2022 09:23:45 +0100, a ecrit:
> 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>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
> ---
> V2:
> - add alloc_file_type() support
> V3:
> - switch callback to use struct file * as a parameter (Andrew Cooper)
> - use __attribute__((constructor)) (Andrew Cooper)
> ---
> tools/libs/gnttab/minios.c | 67 +++++++++++++++++++++++++++++---------
> 1 file changed, 52 insertions(+), 15 deletions(-)
>
> diff --git a/tools/libs/gnttab/minios.c b/tools/libs/gnttab/minios.c
> index f78caadd30..f59fad3577 100644
> --- a/tools/libs/gnttab/minios.c
> +++ b/tools/libs/gnttab/minios.c
> @@ -28,18 +28,55 @@
> #include <sys/mman.h>
>
> #include <errno.h>
> +#include <malloc.h>
> #include <unistd.h>
>
> #include "private.h"
>
> void minios_gnttab_close_fd(int fd);
>
> +static int gnttab_close_fd(struct file *file)
> +{
> + gntmap_fini(file->dev);
> + free(file->dev);
> +
> + return 0;
> +}
> +
> +static const struct file_ops gnttab_ops = {
> + .name = "gnttab",
> + .close = gnttab_close_fd,
> +};
> +
> +static unsigned int ftype_gnttab;
> +
> +__attribute__((constructor))
> +static void gnttab_initialize(void)
> +{
> + ftype_gnttab = alloc_file_type(&gnttab_ops);
> +}
> +
> int osdep_gnttab_open(xengnttab_handle *xgt)
> {
> - int fd = alloc_fd(FTYPE_GNTMAP);
> - if ( fd == -1 )
> + int fd;
> + struct file *file;
> + struct gntmap *gntmap;
> +
> + gntmap = malloc(sizeof(*gntmap));
> + if ( !gntmap )
> return -1;
> - gntmap_init(&files[fd].gntmap);
> +
> + fd = alloc_fd(ftype_gnttab);
> + file = get_file_from_fd(fd);
> +
> + if ( !file )
> + {
> + free(gntmap);
> + return -1;
> + }
> +
> + file->dev = gntmap;
> + gntmap_init(gntmap);
> xgt->fd = fd;
> return 0;
> }
> @@ -54,8 +91,9 @@ int osdep_gnttab_close(xengnttab_handle *xgt)
>
> void minios_gnttab_close_fd(int fd)
> {
> - gntmap_fini(&files[fd].gntmap);
> - files[fd].type = FTYPE_NONE;
> + struct file *file = get_file_from_fd(fd);
> +
> + gnttab_close_fd(file);
> }
>
> void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
> @@ -64,16 +102,16 @@ void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
> 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 +119,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 +132,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
>
--
Samuel
"c'est pas nous qui sommes à la rue, c'est la rue qui est à nous"
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |