qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [RFC PATCH 2/4] nvdimm: add functions to initialize and


From: Igor Mammedov
Subject: Re: [Qemu-devel] [RFC PATCH 2/4] nvdimm: add functions to initialize and perform flush on back store
Date: Thu, 20 Apr 2017 15:12:23 +0200

On Fri, 31 Mar 2017 16:41:45 +0800
Haozhong Zhang <address@hidden> wrote:

> fsync() is used to persist modifications to the back store. If the
s/back/backing/

> host NVDIMM is used as the back store, fsync() on Linux will trigger
> the write to the host flush hint address.
> 
> Signed-off-by: Haozhong Zhang <address@hidden>
> ---
>  hw/mem/nvdimm.c         | 22 ++++++++++++++++++++++
>  include/hw/mem/nvdimm.h | 13 +++++++++++++
>  2 files changed, 35 insertions(+)
> 
> diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
> index db896b0..484ab8b 100644
> --- a/hw/mem/nvdimm.c
> +++ b/hw/mem/nvdimm.c
> @@ -78,6 +78,26 @@ static MemoryRegion *nvdimm_get_memory_region(PCDIMMDevice 
> *dimm)
>      return &nvdimm->nvdimm_mr;
>  }
>  
> +static void nvdimm_flush_init(NVDIMMDevice *nvdimm, MemoryRegion *hostmem_mr)
> +{
> +    if (nvdimm->flush_hint_enabled) {
> +        nvdimm->backend_fd = memory_region_get_fd(hostmem_mr);
> +    } else {
> +        nvdimm->backend_fd = -1;
> +    }
> +}
> +
> +void nvdimm_flush(NVDIMMDevice *nvdimm)
> +{
> +    if (nvdimm->backend_fd != -1) {
if backend isn't file and user asked for flush_hint, he/she silently won't get 
it.
maybe we should fail nvdimm_realize() if backend is not file.


> +        /*
> +         * If the backend store is a physical NVDIMM device, fsync()
> +         * will trigger the flush via the flush hint on the host device.
> +         */
> +        fsync(nvdimm->backend_fd);
> +    }
> +}
> +
>  static void nvdimm_realize(PCDIMMDevice *dimm, Error **errp)
>  {
>      MemoryRegion *mr = host_memory_backend_get_memory(dimm->hostmem, errp);
> @@ -105,6 +125,8 @@ static void nvdimm_realize(PCDIMMDevice *dimm, Error 
> **errp)
>      memory_region_init_alias(&nvdimm->nvdimm_mr, OBJECT(dimm),
>                               "nvdimm-memory", mr, 0, pmem_size);
>      nvdimm->nvdimm_mr.align = align;
> +
> +    nvdimm_flush_init(nvdimm, mr);
>  }
>  
>  /*
> diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
> index 03e1ff9..eb71f41 100644
> --- a/include/hw/mem/nvdimm.h
> +++ b/include/hw/mem/nvdimm.h
> @@ -71,6 +71,18 @@ struct NVDIMMDevice {
>       * guest via ACPI NFIT and _FIT method if NVDIMM hotplug is supported.
>       */
>      MemoryRegion nvdimm_mr;
> +
> +    /*
> +     * If true, a flush hint address structure will be built for this
> +     * NVDIMM device.
> +     */
> +    bool flush_hint_enabled;
> +    /*
> +     * File descriptor of the backend store, which is used in nvdimm
> +     * flush.  It's cached in NVDIMMDevice rather than being fetched
> +     * at each request in order to accelerate the flush a little bit.
> +     */
> +    int backend_fd;
>  };
>  typedef struct NVDIMMDevice NVDIMMDevice;
>  
> @@ -132,4 +144,5 @@ void nvdimm_build_acpi(GArray *table_offsets, GArray 
> *table_data,
>                         uint32_t ram_slots);
>  void nvdimm_plug(AcpiNVDIMMState *state);
>  void nvdimm_acpi_plug_cb(HotplugHandler *hotplug_dev, DeviceState *dev);
> +void nvdimm_flush(NVDIMMDevice *nvdimm);
>  #endif




reply via email to

[Prev in Thread] Current Thread [Next in Thread]