diff mbox series

[3/3] nvdimm: honor -object memory-backend-file, readonly=on option

Message ID 20200804101244.1283503-4-stefanha@redhat.com
State New
Headers show
Series nvdimm: read-only file support | expand

Commit Message

Stefan Hajnoczi Aug. 4, 2020, 10:12 a.m. UTC
Make it possible to present read-only files to the guest as "unarmed"
NVDIMMs. The Linux NVDIMM device (/dev/pmemX) is read-only.

Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
---
 docs/nvdimm.txt | 8 +++++++-
 hw/mem/nvdimm.c | 4 ++++
 2 files changed, 11 insertions(+), 1 deletion(-)

Comments

Philippe Mathieu-Daudé Aug. 21, 2020, 1:03 p.m. UTC | #1
On 8/4/20 12:12 PM, Stefan Hajnoczi wrote:
> Make it possible to present read-only files to the guest as "unarmed"
> NVDIMMs. The Linux NVDIMM device (/dev/pmemX) is read-only.
> 
> Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> ---
>  docs/nvdimm.txt | 8 +++++++-
>  hw/mem/nvdimm.c | 4 ++++
>  2 files changed, 11 insertions(+), 1 deletion(-)
> 
> diff --git a/docs/nvdimm.txt b/docs/nvdimm.txt
> index c2c6e441b3..c0b52de111 100644
> --- a/docs/nvdimm.txt
> +++ b/docs/nvdimm.txt
> @@ -17,7 +17,7 @@ following command line options:
>  
>   -machine pc,nvdimm
>   -m $RAM_SIZE,slots=$N,maxmem=$MAX_SIZE
> - -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE
> + -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE,readonly=off
>   -device nvdimm,id=nvdimm1,memdev=mem1
>  
>  Where,
> @@ -42,6 +42,12 @@ Where,
>     "share=off", then guest writes won't be applied to the backend
>     file and thus will be invisible to other guests.
>  
> +   "readonly=on/off" controls whether the the file $PATH is opened read-only or

Double "the the".

> +   read/write (default). "readonly=on" sets the ACPI NFIT NVDIMM Region Mapping

NFIT acronym for 'NVDIMM Firmware Interface Table', "NVDIMM" sounds
redundant but makes it easier to understand, so OK.

> +   Structure "NVDIMM State Flags" Bit 3 indicating that the device is "unarmed"
> +   and cannot accept persistent writes. Linux guest drivers set the device to
> +   read-only when this bit is present.
> +
>   - "device nvdimm,id=nvdimm1,memdev=mem1" creates a virtual NVDIMM
>     device whose storage is provided by above memory backend device.
>  
> diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
> index e1574bc07c..694223450e 100644
> --- a/hw/mem/nvdimm.c
> +++ b/hw/mem/nvdimm.c
> @@ -151,6 +151,10 @@ static void nvdimm_prepare_memory_region(NVDIMMDevice *nvdimm, Error **errp)
>                               "nvdimm-memory", mr, 0, pmem_size);
>      memory_region_set_nonvolatile(nvdimm->nvdimm_mr, true);
>      nvdimm->nvdimm_mr->align = align;
> +
> +    if (memory_region_is_rom(mr)) {
> +        nvdimm->unarmed = true; /* this device is read-only */
> +    }

Can you move this hunk before the alias creation?
(Just before nvdimm->nvdimm_mr = ...).

>  }
>  
>  static MemoryRegion *nvdimm_md_get_memory_region(MemoryDeviceState *md,

I don't understand why MemoryDeviceClass::get_memory_region() implicitly
calls DeviceClass::realize()...
Anyway unrelated to this patch.

With the comments addressed:
Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Stefan Hajnoczi Sept. 16, 2020, 9:39 a.m. UTC | #2
On Fri, Aug 21, 2020 at 03:03:50PM +0200, Philippe Mathieu-Daudé wrote:
> On 8/4/20 12:12 PM, Stefan Hajnoczi wrote:
> > Make it possible to present read-only files to the guest as "unarmed"
> > NVDIMMs. The Linux NVDIMM device (/dev/pmemX) is read-only.
> > 
> > Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
> > ---
> >  docs/nvdimm.txt | 8 +++++++-
> >  hw/mem/nvdimm.c | 4 ++++
> >  2 files changed, 11 insertions(+), 1 deletion(-)
> > 
> > diff --git a/docs/nvdimm.txt b/docs/nvdimm.txt
> > index c2c6e441b3..c0b52de111 100644
> > --- a/docs/nvdimm.txt
> > +++ b/docs/nvdimm.txt
> > @@ -17,7 +17,7 @@ following command line options:
> >  
> >   -machine pc,nvdimm
> >   -m $RAM_SIZE,slots=$N,maxmem=$MAX_SIZE
> > - -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE
> > + -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE,readonly=off
> >   -device nvdimm,id=nvdimm1,memdev=mem1
> >  
> >  Where,
> > @@ -42,6 +42,12 @@ Where,
> >     "share=off", then guest writes won't be applied to the backend
> >     file and thus will be invisible to other guests.
> >  
> > +   "readonly=on/off" controls whether the the file $PATH is opened read-only or
> 
> Double "the the".

Will fix.

> > diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
> > index e1574bc07c..694223450e 100644
> > --- a/hw/mem/nvdimm.c
> > +++ b/hw/mem/nvdimm.c
> > @@ -151,6 +151,10 @@ static void nvdimm_prepare_memory_region(NVDIMMDevice *nvdimm, Error **errp)
> >                               "nvdimm-memory", mr, 0, pmem_size);
> >      memory_region_set_nonvolatile(nvdimm->nvdimm_mr, true);
> >      nvdimm->nvdimm_mr->align = align;
> > +
> > +    if (memory_region_is_rom(mr)) {
> > +        nvdimm->unarmed = true; /* this device is read-only */
> > +    }
> 
> Can you move this hunk before the alias creation?
> (Just before nvdimm->nvdimm_mr = ...).

Will fix.
diff mbox series

Patch

diff --git a/docs/nvdimm.txt b/docs/nvdimm.txt
index c2c6e441b3..c0b52de111 100644
--- a/docs/nvdimm.txt
+++ b/docs/nvdimm.txt
@@ -17,7 +17,7 @@  following command line options:
 
  -machine pc,nvdimm
  -m $RAM_SIZE,slots=$N,maxmem=$MAX_SIZE
- -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE
+ -object memory-backend-file,id=mem1,share=on,mem-path=$PATH,size=$NVDIMM_SIZE,readonly=off
  -device nvdimm,id=nvdimm1,memdev=mem1
 
 Where,
@@ -42,6 +42,12 @@  Where,
    "share=off", then guest writes won't be applied to the backend
    file and thus will be invisible to other guests.
 
+   "readonly=on/off" controls whether the the file $PATH is opened read-only or
+   read/write (default). "readonly=on" sets the ACPI NFIT NVDIMM Region Mapping
+   Structure "NVDIMM State Flags" Bit 3 indicating that the device is "unarmed"
+   and cannot accept persistent writes. Linux guest drivers set the device to
+   read-only when this bit is present.
+
  - "device nvdimm,id=nvdimm1,memdev=mem1" creates a virtual NVDIMM
    device whose storage is provided by above memory backend device.
 
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index e1574bc07c..694223450e 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -151,6 +151,10 @@  static void nvdimm_prepare_memory_region(NVDIMMDevice *nvdimm, Error **errp)
                              "nvdimm-memory", mr, 0, pmem_size);
     memory_region_set_nonvolatile(nvdimm->nvdimm_mr, true);
     nvdimm->nvdimm_mr->align = align;
+
+    if (memory_region_is_rom(mr)) {
+        nvdimm->unarmed = true; /* this device is read-only */
+    }
 }
 
 static MemoryRegion *nvdimm_md_get_memory_region(MemoryDeviceState *md,