libgnttab is using implementation details of Mini-OS. Change that by
letting libgnttab use the new get_file_from_fd() function and the
generic dev pointer of struct file from Mini-OS.
Signed-off-by: Juergen Gross <jgross@suse.com>
---
tools/libs/gnttab/minios.c | 48 ++++++++++++++++++++++++++------------
1 file changed, 33 insertions(+), 15 deletions(-)
diff --git a/tools/libs/gnttab/minios.c b/tools/libs/gnttab/minios.c
index f78caadd30..64601db085 100644
--- a/tools/libs/gnttab/minios.c
+++ b/tools/libs/gnttab/minios.c
@@ -28,6 +28,7 @@
#include <sys/mman.h>
#include <errno.h>
+#include <malloc.h>
#include <unistd.h>
#include "private.h"
@@ -36,10 +37,25 @@ void minios_gnttab_close_fd(int 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;
+
+ gntmap = malloc(sizeof(*gntmap));
+ if ( !gntmap )
return -1;
- gntmap_init(&files[fd].gntmap);
+
+ fd = alloc_fd(FTYPE_GNTMAP);
+ 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 +70,11 @@ 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);
+
+ gntmap_fini(file->dev);
+ free(file->dev);
+ file->type = FTYPE_NONE;
}
void *osdep_gnttab_grant_map(xengnttab_handle *xgt,
@@ -64,16 +83,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 +100,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 +113,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
On 07/01/2022 10:35, Juergen Gross wrote:
> @@ -54,8 +70,11 @@ 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);
> +
> + gntmap_fini(file->dev);
> + free(file->dev);
file->dev = NULL ?
Particularly as this is a pointer in a global files[] array.
Otherwise, LGTM.
~Andrew
On 10.01.22 19:56, Andrew Cooper wrote:
> On 07/01/2022 10:35, Juergen Gross wrote:
>> @@ -54,8 +70,11 @@ 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);
>> +
>> + gntmap_fini(file->dev);
>> + free(file->dev);
>
> file->dev = NULL ?
>
> Particularly as this is a pointer in a global files[] array.
I'll reset all the struct file contents in close() for all file types.
Juergen
© 2016 - 2026 Red Hat, Inc.