All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v3 0/2] hw/nvme: support online resize
@ 2026-08-03  8:30 Alexander Mikhalitsyn
  2026-08-03  8:30 ` [PATCH v3 1/2] hw/nvme: initialize ns->subsys for n->namespace Alexander Mikhalitsyn
                   ` (2 more replies)
  0 siblings, 3 replies; 7+ messages in thread
From: Alexander Mikhalitsyn @ 2026-08-03  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stéphane Graber, Alexander Mikhalitsyn, Keith Busch,
	Klaus Jensen, qemu-block, Jesper Devantier, Alexander Mikhalitsyn

From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>

Dear friends,

This patchset is aimed to support online resize for NVMe emulated
device. My approach is simple - I just implement (BlockDevOps *)->resize_cb()
callback and ensure that AER notification is fired to all controllers using
a namespace that is being resized.

Testing.

I manually validated this with Debian 13 VM (a resized disk was a root disk) and
Windows Server 2022 (a resized disk was a secondary one).

Git tree:
https://gitlab.com/mihalicyn/qemu/-/commits/nvme-resize

Changelog for version 3:
- rebased

Changelog for version 2:
- checkpatch fixes
- rebased
- CI is green (https://gitlab.com/mihalicyn/qemu/-/pipelines/2602102750)

Kind regards,
Alex

Alexander Mikhalitsyn (2):
  hw/nvme: initialize ns->subsys for n->namespace
  hw/nvme: support online resize

 hw/nvme/ctrl.c | 10 ++++++++
 hw/nvme/ns.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/nvme/nvme.h |  2 ++
 3 files changed, 79 insertions(+), 1 deletion(-)

-- 
2.47.3



^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v3 1/2] hw/nvme: initialize ns->subsys for n->namespace
  2026-08-03  8:30 [PATCH v3 0/2] hw/nvme: support online resize Alexander Mikhalitsyn
@ 2026-08-03  8:30 ` Alexander Mikhalitsyn
  2026-08-03  8:30 ` [PATCH v3 2/2] hw/nvme: support online resize Alexander Mikhalitsyn
  2026-08-03 13:42 ` [PATCH v3 0/2] " Klaus Jensen
  2 siblings, 0 replies; 7+ messages in thread
From: Alexander Mikhalitsyn @ 2026-08-03  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stéphane Graber, Alexander Mikhalitsyn, Keith Busch,
	Klaus Jensen, qemu-block, Jesper Devantier, Alexander Mikhalitsyn

From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>

We must properly initialize n->namespace.subsys too.

Will be important in the following patches.

Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>
---
 hw/nvme/ctrl.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index bd6ad64b200..710c3e0d77d 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -9648,6 +9648,7 @@ static void nvme_realize(PCIDevice *pci_dev, Error **errp)
         ns = &n->namespace;
         ns->params.nsid = 1;
         ns->ctrl = n;
+        ns->subsys = n->subsys;
 
         if (nvme_ns_setup(ns, errp)) {
             return;
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v3 2/2] hw/nvme: support online resize
  2026-08-03  8:30 [PATCH v3 0/2] hw/nvme: support online resize Alexander Mikhalitsyn
  2026-08-03  8:30 ` [PATCH v3 1/2] hw/nvme: initialize ns->subsys for n->namespace Alexander Mikhalitsyn
@ 2026-08-03  8:30 ` Alexander Mikhalitsyn
  2026-08-03 13:42 ` [PATCH v3 0/2] " Klaus Jensen
  2 siblings, 0 replies; 7+ messages in thread
From: Alexander Mikhalitsyn @ 2026-08-03  8:30 UTC (permalink / raw)
  To: qemu-devel
  Cc: Stéphane Graber, Alexander Mikhalitsyn, Keith Busch,
	Klaus Jensen, qemu-block, Jesper Devantier, Alexander Mikhalitsyn

From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>

Implement (BlockDevOps *)->resize_cb() for NVMe namespace to enable
online resize support.

We must handle cases when multiple namespaces are attached to
a single controller, or namespace is shared across a few
different controllers by iterating over controllers attached to
a NvmeSubsystem and properly notify every controller about a size change.

Signed-off-by: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>
---
v3:
    - rebased
v2:
    - check-patch fixes
---
 hw/nvme/ctrl.c |  9 +++++++
 hw/nvme/ns.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-
 hw/nvme/nvme.h |  2 ++
 3 files changed, 78 insertions(+), 1 deletion(-)

diff --git a/hw/nvme/ctrl.c b/hw/nvme/ctrl.c
index 710c3e0d77d..d60b3e105a1 100644
--- a/hw/nvme/ctrl.c
+++ b/hw/nvme/ctrl.c
@@ -7009,6 +7009,15 @@ static uint16_t nvme_ns_attachment(NvmeCtrl *n, NvmeRequest *req)
     return NVME_SUCCESS;
 }
 
+void nvme_ctrl_notify_ns_resize(NvmeCtrl *ctrl, NvmeNamespace *ns)
+{
+    if (!test_and_set_bit(ns->params.nsid, ctrl->changed_nsids)) {
+        nvme_enqueue_event(ctrl, NVME_AER_TYPE_NOTICE,
+                           NVME_AER_INFO_NOTICE_NS_ATTR_CHANGED,
+                           NVME_LOG_CHANGED_NSLIST);
+    }
+}
+
 typedef struct NvmeFormatAIOCB {
     BlockAIOCB common;
     BlockAIOCB *aiocb;
diff --git a/hw/nvme/ns.c b/hw/nvme/ns.c
index 7f0f9ac7662..e2954fd91b3 100644
--- a/hw/nvme/ns.c
+++ b/hw/nvme/ns.c
@@ -163,6 +163,70 @@ lbaf_found:
     return 0;
 }
 
+static void nvme_ns_resize_cb(void *opaque)
+{
+    NvmeNamespace *ns = opaque;
+    int64_t size;
+    int cntlid, notified_ctrls;
+
+    size = blk_getlength(ns->blkconf.blk);
+    if (size < 0) {
+        error_report("can't get size of block device %s: %s",
+                     blk_name(ns->blkconf.blk), strerror(-size));
+        return;
+    }
+
+    ns->size = size;
+    nvme_ns_init_format(ns);
+
+    if (!ns->attached) {
+        return;
+    }
+
+    /*
+     * Okay, the namespace is attached so we need to notify all controllers
+     * about size change.
+     *
+     * Let's just take ns->subsys, iterate over all controllers and find
+     * to which of them our namespace is attached.
+     */
+
+    assert(ns->subsys);
+    assert(ns->subsys->ctrls);
+
+    notified_ctrls = 0;
+    for (cntlid = 0; cntlid < ARRAY_SIZE(ns->subsys->ctrls); cntlid++) {
+        NvmeCtrl *ctrl;
+
+        /* notified everyone? */
+        if (notified_ctrls == ns->attached) {
+            break;
+        }
+
+        ctrl = nvme_subsys_ctrl(ns->subsys, cntlid);
+        if (!ctrl) {
+            continue;
+        }
+
+        for (uint32_t nsid = 1; nsid <= NVME_MAX_NAMESPACES; nsid++) {
+            NvmeNamespace *ns_iter = ctrl->namespaces[nsid];
+
+            if (!ns_iter || ns_iter != ns) {
+                continue;
+            }
+
+            nvme_ctrl_notify_ns_resize(ctrl, ns);
+
+            notified_ctrls++;
+            break;
+        }
+    }
+}
+
+static const BlockDevOps nvme_ns_block_ops = {
+    .resize_cb     = nvme_ns_resize_cb,
+};
+
 static int nvme_ns_init_blk(NvmeNamespace *ns, Error **errp)
 {
     bool read_only;
@@ -172,10 +236,12 @@ static int nvme_ns_init_blk(NvmeNamespace *ns, Error **errp)
     }
 
     read_only = !blk_supports_write_perm(ns->blkconf.blk);
-    if (!blkconf_apply_backend_options(&ns->blkconf, read_only, false, errp)) {
+    if (!blkconf_apply_backend_options(&ns->blkconf, read_only, true, errp)) {
         return -1;
     }
 
+    blk_set_dev_ops(ns->blkconf.blk, &nvme_ns_block_ops, ns);
+
     if (ns->blkconf.discard_granularity == -1) {
         ns->blkconf.discard_granularity =
             MAX(ns->blkconf.logical_block_size, MIN_DISCARD_GRANULARITY);
diff --git a/hw/nvme/nvme.h b/hw/nvme/nvme.h
index 43e3c916f73..a4b2c01a2cc 100644
--- a/hw/nvme/nvme.h
+++ b/hw/nvme/nvme.h
@@ -764,6 +764,8 @@ void nvme_atomic_configure_max_write_size(bool dn, uint16_t awun,
 void nvme_ns_atomic_configure_boundary(bool dn, uint16_t nabsn,
                                        uint16_t nabspf, NvmeAtomic *atomic);
 
+void nvme_ctrl_notify_ns_resize(NvmeCtrl *ctrl, NvmeNamespace *ns);
+
 extern const VMStateDescription nvme_vmstate_atomic;
 extern const VMStateDescription nvme_vmstate_ns;
 
-- 
2.47.3



^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 0/2] hw/nvme: support online resize
  2026-08-03  8:30 [PATCH v3 0/2] hw/nvme: support online resize Alexander Mikhalitsyn
  2026-08-03  8:30 ` [PATCH v3 1/2] hw/nvme: initialize ns->subsys for n->namespace Alexander Mikhalitsyn
  2026-08-03  8:30 ` [PATCH v3 2/2] hw/nvme: support online resize Alexander Mikhalitsyn
@ 2026-08-03 13:42 ` Klaus Jensen
  2026-08-31  7:04   ` Alexander Mikhalitsyn
  2 siblings, 1 reply; 7+ messages in thread
From: Klaus Jensen @ 2026-08-03 13:42 UTC (permalink / raw)
  To: Alexander Mikhalitsyn
  Cc: qemu-devel, Stéphane Graber, Keith Busch, qemu-block,
	Jesper Devantier, Alexander Mikhalitsyn

[-- Attachment #1: Type: text/plain, Size: 1272 bytes --]

On Aug  3 10:30, Alexander Mikhalitsyn wrote:
> From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>
> 
> Dear friends,
> 
> This patchset is aimed to support online resize for NVMe emulated
> device. My approach is simple - I just implement (BlockDevOps *)->resize_cb()
> callback and ensure that AER notification is fired to all controllers using
> a namespace that is being resized.
> 
> Testing.
> 
> I manually validated this with Debian 13 VM (a resized disk was a root disk) and
> Windows Server 2022 (a resized disk was a secondary one).
> 
> Git tree:
> https://gitlab.com/mihalicyn/qemu/-/commits/nvme-resize
> 
> Changelog for version 3:
> - rebased
> 
> Changelog for version 2:
> - checkpatch fixes
> - rebased
> - CI is green (https://gitlab.com/mihalicyn/qemu/-/pipelines/2602102750)
> 
> Kind regards,
> Alex
> 
> Alexander Mikhalitsyn (2):
>   hw/nvme: initialize ns->subsys for n->namespace
>   hw/nvme: support online resize
> 
>  hw/nvme/ctrl.c | 10 ++++++++
>  hw/nvme/ns.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-
>  hw/nvme/nvme.h |  2 ++
>  3 files changed, 79 insertions(+), 1 deletion(-)
> 
> -- 
> 2.47.3
> 
> 

LGTM.

Reviewed-by: Klaus Jensen <k.jensen@samsung.com>

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 0/2] hw/nvme: support online resize
  2026-08-03 13:42 ` [PATCH v3 0/2] " Klaus Jensen
@ 2026-08-31  7:04   ` Alexander Mikhalitsyn
  2026-09-07  7:39     ` Klaus Jensen
  0 siblings, 1 reply; 7+ messages in thread
From: Alexander Mikhalitsyn @ 2026-08-31  7:04 UTC (permalink / raw)
  To: Klaus Jensen
  Cc: qemu-devel, Stéphane Graber, Keith Busch, qemu-block,
	Jesper Devantier, Alexander Mikhalitsyn

Am Mo., 3. Aug. 2026 um 15:42 Uhr schrieb Klaus Jensen <its@irrelevant.dk>:
>
> On Aug  3 10:30, Alexander Mikhalitsyn wrote:
> > From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>
> >
> > Dear friends,
> >
> > This patchset is aimed to support online resize for NVMe emulated
> > device. My approach is simple - I just implement (BlockDevOps *)->resize_cb()
> > callback and ensure that AER notification is fired to all controllers using
> > a namespace that is being resized.
> >
> > Testing.
> >
> > I manually validated this with Debian 13 VM (a resized disk was a root disk) and
> > Windows Server 2022 (a resized disk was a secondary one).
> >
> > Git tree:
> > https://gitlab.com/mihalicyn/qemu/-/commits/nvme-resize
> >
> > Changelog for version 3:
> > - rebased
> >
> > Changelog for version 2:
> > - checkpatch fixes
> > - rebased
> > - CI is green (https://gitlab.com/mihalicyn/qemu/-/pipelines/2602102750)
> >
> > Kind regards,
> > Alex
> >
> > Alexander Mikhalitsyn (2):
> >   hw/nvme: initialize ns->subsys for n->namespace
> >   hw/nvme: support online resize
> >
> >  hw/nvme/ctrl.c | 10 ++++++++
> >  hw/nvme/ns.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-
> >  hw/nvme/nvme.h |  2 ++
> >  3 files changed, 79 insertions(+), 1 deletion(-)
> >
> > --
> > 2.47.3
> >
> >

Hi Klaus,

>
> LGTM.
>
> Reviewed-by: Klaus Jensen <k.jensen@samsung.com>

Thank you, I wonder if you have a plan to take this into nvme.next soon?

Kind regards,
Alex


^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 0/2] hw/nvme: support online resize
  2026-08-31  7:04   ` Alexander Mikhalitsyn
@ 2026-09-07  7:39     ` Klaus Jensen
  2026-09-07  8:24       ` Alexander Mikhalitsyn
  0 siblings, 1 reply; 7+ messages in thread
From: Klaus Jensen @ 2026-09-07  7:39 UTC (permalink / raw)
  To: Alexander Mikhalitsyn
  Cc: qemu-devel, Stéphane Graber, Keith Busch, qemu-block,
	Jesper Devantier, Alexander Mikhalitsyn

[-- Attachment #1: Type: text/plain, Size: 1818 bytes --]

On Aug 31 09:04, Alexander Mikhalitsyn wrote:
> Am Mo., 3. Aug. 2026 um 15:42 Uhr schrieb Klaus Jensen <its@irrelevant.dk>:
> >
> > On Aug  3 10:30, Alexander Mikhalitsyn wrote:
> > > From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>
> > >
> > > Dear friends,
> > >
> > > This patchset is aimed to support online resize for NVMe emulated
> > > device. My approach is simple - I just implement (BlockDevOps *)->resize_cb()
> > > callback and ensure that AER notification is fired to all controllers using
> > > a namespace that is being resized.
> > >
> > > Testing.
> > >
> > > I manually validated this with Debian 13 VM (a resized disk was a root disk) and
> > > Windows Server 2022 (a resized disk was a secondary one).
> > >
> > > Git tree:
> > > https://gitlab.com/mihalicyn/qemu/-/commits/nvme-resize
> > >
> > > Changelog for version 3:
> > > - rebased
> > >
> > > Changelog for version 2:
> > > - checkpatch fixes
> > > - rebased
> > > - CI is green (https://gitlab.com/mihalicyn/qemu/-/pipelines/2602102750)
> > >
> > > Kind regards,
> > > Alex
> > >
> > > Alexander Mikhalitsyn (2):
> > >   hw/nvme: initialize ns->subsys for n->namespace
> > >   hw/nvme: support online resize
> > >
> > >  hw/nvme/ctrl.c | 10 ++++++++
> > >  hw/nvme/ns.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-
> > >  hw/nvme/nvme.h |  2 ++
> > >  3 files changed, 79 insertions(+), 1 deletion(-)
> > >
> > > --
> > > 2.47.3
> > >
> > >
> 
> Hi Klaus,
> 
> >
> > LGTM.
> >
> > Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
> 
> Thank you, I wonder if you have a plan to take this into nvme.next soon?
> 
> Kind regards,
> Alex
> 

Hi Alex,

Applied to nvme.next. Thanks!

I dropped the assert on ctrls (always true).


Thanks,
Klaus

[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 488 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v3 0/2] hw/nvme: support online resize
  2026-09-07  7:39     ` Klaus Jensen
@ 2026-09-07  8:24       ` Alexander Mikhalitsyn
  0 siblings, 0 replies; 7+ messages in thread
From: Alexander Mikhalitsyn @ 2026-09-07  8:24 UTC (permalink / raw)
  To: Klaus Jensen
  Cc: qemu-devel, Stéphane Graber, Keith Busch, qemu-block,
	Jesper Devantier, Alexander Mikhalitsyn

Am Mo., 7. Sept. 2026 um 09:39 Uhr schrieb Klaus Jensen <its@irrelevant.dk>:
>
> On Aug 31 09:04, Alexander Mikhalitsyn wrote:
> > Am Mo., 3. Aug. 2026 um 15:42 Uhr schrieb Klaus Jensen <its@irrelevant.dk>:
> > >
> > > On Aug  3 10:30, Alexander Mikhalitsyn wrote:
> > > > From: Alexander Mikhalitsyn <aleksandr.mikhalitsyn@futurfusion.io>
> > > >
> > > > Dear friends,
> > > >
> > > > This patchset is aimed to support online resize for NVMe emulated
> > > > device. My approach is simple - I just implement (BlockDevOps *)->resize_cb()
> > > > callback and ensure that AER notification is fired to all controllers using
> > > > a namespace that is being resized.
> > > >
> > > > Testing.
> > > >
> > > > I manually validated this with Debian 13 VM (a resized disk was a root disk) and
> > > > Windows Server 2022 (a resized disk was a secondary one).
> > > >
> > > > Git tree:
> > > > https://gitlab.com/mihalicyn/qemu/-/commits/nvme-resize
> > > >
> > > > Changelog for version 3:
> > > > - rebased
> > > >
> > > > Changelog for version 2:
> > > > - checkpatch fixes
> > > > - rebased
> > > > - CI is green (https://gitlab.com/mihalicyn/qemu/-/pipelines/2602102750)
> > > >
> > > > Kind regards,
> > > > Alex
> > > >
> > > > Alexander Mikhalitsyn (2):
> > > >   hw/nvme: initialize ns->subsys for n->namespace
> > > >   hw/nvme: support online resize
> > > >
> > > >  hw/nvme/ctrl.c | 10 ++++++++
> > > >  hw/nvme/ns.c   | 68 +++++++++++++++++++++++++++++++++++++++++++++++++-
> > > >  hw/nvme/nvme.h |  2 ++
> > > >  3 files changed, 79 insertions(+), 1 deletion(-)
> > > >
> > > > --
> > > > 2.47.3
> > > >
> > > >
> >
> > Hi Klaus,
> >
> > >
> > > LGTM.
> > >
> > > Reviewed-by: Klaus Jensen <k.jensen@samsung.com>
> >
> > Thank you, I wonder if you have a plan to take this into nvme.next soon?
> >
> > Kind regards,
> > Alex
> >
>
> Hi Alex,

Hi Klaus,

>
> Applied to nvme.next. Thanks!
>
> I dropped the assert on ctrls (always true).

Thank you ;-)

Kind regards,
Alex

>
>
> Thanks,
> Klaus


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-09-07  8:25 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-08-03  8:30 [PATCH v3 0/2] hw/nvme: support online resize Alexander Mikhalitsyn
2026-08-03  8:30 ` [PATCH v3 1/2] hw/nvme: initialize ns->subsys for n->namespace Alexander Mikhalitsyn
2026-08-03  8:30 ` [PATCH v3 2/2] hw/nvme: support online resize Alexander Mikhalitsyn
2026-08-03 13:42 ` [PATCH v3 0/2] " Klaus Jensen
2026-08-31  7:04   ` Alexander Mikhalitsyn
2026-09-07  7:39     ` Klaus Jensen
2026-09-07  8:24       ` Alexander Mikhalitsyn

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.