|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC XEN PATCH 14/16] tools/libxl: add support to map files on pmem devices to guests
On Mon, Oct 10, 2016 at 08:32:33AM +0800, Haozhong Zhang wrote:
> We can map host pmem devices or files on pmem devices to guests. This
> patch adds support to map files on pmem devices. The implementation
> relies on the Linux pmem driver and kernel APIs, so it currently
May want to mention which CONFIG_ options are needed.
> functions only when libxl is compiled for Linux.
>
> Signed-off-by: Haozhong Zhang <haozhong.zhang@xxxxxxxxx>
> ---
> Cc: Ian Jackson <ian.jackson@xxxxxxxxxxxxx>
> Cc: Wei Liu <wei.liu2@xxxxxxxxxx>
> ---
> tools/libxl/libxl_nvdimm.c | 73
> +++++++++++++++++++++++++++++++++++++++++++++-
> 1 file changed, 72 insertions(+), 1 deletion(-)
>
> diff --git a/tools/libxl/libxl_nvdimm.c b/tools/libxl/libxl_nvdimm.c
> index 7bcbaaf..b3ba19a 100644
> --- a/tools/libxl/libxl_nvdimm.c
> +++ b/tools/libxl/libxl_nvdimm.c
> @@ -25,6 +25,9 @@
> #include <unistd.h>
> #include <errno.h>
> #include <stdint.h>
> +#include <sys/ioctl.h>
> +#include <linux/fs.h>
> +#include <linux/fiemap.h>
>
> #include "libxl_internal.h"
> #include "libxl_arch.h"
> @@ -97,10 +100,78 @@ static int add_pages(libxl__gc *gc, uint32_t domid,
> return ret;
> }
>
> +static uint64_t
> +get_file_extents(libxl__gc *gc, int fd, unsigned long length,
> + struct fiemap_extent **extents_r)
> +{
> + struct fiemap *fiemap;
> + uint64_t nr_extents = 0, extents_size;
> +
> + fiemap = libxl__zalloc(gc, sizeof(*fiemap));
> + if ( !fiemap )
> + goto out;
> +
> + fiemap->fm_length = length;
> + if ( ioctl(fd, FS_IOC_FIEMAP, fiemap) < 0 )
> + goto out;
> +
> + nr_extents = fiemap->fm_mapped_extents;
> + extents_size = sizeof(struct fiemap_extent) * nr_extents;
> + fiemap = libxl__realloc(gc, fiemap, sizeof(*fiemap) + extents_size);
> + if ( !fiemap )
> + goto out;
> +
> + memset(fiemap->fm_extents, 0, extents_size);
> + fiemap->fm_extent_count = nr_extents;
> + fiemap->fm_mapped_extents = 0;
> +
> + if ( ioctl(fd, FS_IOC_FIEMAP, fiemap) < 0 )
> + goto out;
> +
> + *extents_r = fiemap->fm_extents;
> +
> + out:
> + return nr_extents;
> +}
> +
> static int add_file(libxl__gc *gc, uint32_t domid, int fd,
> xen_pfn_t mfn, xen_pfn_t gpfn, unsigned long nr_mfns)
> {
> - return -EINVAL;
> + struct fiemap_extent *extents;
> + uint64_t nr_extents, i;
> + int ret = 0;
> +
> + nr_extents = get_file_extents(gc, fd, nr_mfns << XC_PAGE_SHIFT,
> &extents);
> + if ( !nr_extents )
> + return -EIO;
> +
> + for ( i = 0; i < nr_extents; i++ )
> + {
> + uint64_t p_offset = extents[i].fe_physical;
> + uint64_t l_offset = extents[i].fe_logical;
> + uint64_t length = extents[i].fe_length;
> +
> + if ( extents[i].fe_flags & ~FIEMAP_EXTENT_LAST )
> + {
> + ret = -EINVAL;
> + break;
> + }
> +
> + if ( (p_offset | l_offset | length) & ~XC_PAGE_MASK )
> + {
> + ret = -EINVAL;
> + break;
> + }
> +
> + ret = add_pages(gc, domid,
> + mfn + (p_offset >> XC_PAGE_SHIFT),
> + gpfn + (l_offset >> XC_PAGE_SHIFT),
> + length >> XC_PAGE_SHIFT);
> + if ( ret )
> + break;
> + }
> +
> + return ret;
> }
>
> int libxl_nvdimm_add_device(libxl__gc *gc,
> --
> 2.10.1
>
>
> _______________________________________________
> Xen-devel mailing list
> Xen-devel@xxxxxxxxxxxxx
> https://lists.xen.org/xen-devel
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |