diff --git a/hw/acpi/nvdimm.c b/hw/acpi/nvdimm.c
index 838a57e..f69bb39 100644
--- a/hw/acpi/nvdimm.c
+++ b/hw/acpi/nvdimm.c
@@ -647,6 +647,13 @@ nvdimm_dsm_cmd_get_label_data(NVDIMMDevice *nvdimm, dsm_in *in, GArray *out)
     nvdimm_debug("Read Label Data: offset %#x length %#x.\n",
                  cmd_in->offset, cmd_in->length);
 
+    if (!nvdimm->reserve_label_data) {
+        nvdimm_debug("read label request on the device without "
+                     "label data reserved.\n");
+        status = DSM_STATUS_NOT_SUPPORTED;
+        goto exit;
+    }
+
     if (nvdimm->label_size < cmd_in->offset + cmd_in->length) {
         nvdimm_debug("position %#x is beyond label data (len = %#lx).\n",
                      cmd_in->offset + cmd_in->length, nvdimm->label_size);
@@ -687,6 +694,14 @@ nvdimm_dsm_cmd_set_label_data(NVDIMMDevice *nvdimm, dsm_in *in, GArray *out)
 
     nvdimm_debug("Write Label Data: offset %#x length %#x.\n",
                  cmd_in->offset, cmd_in->length);
+
+    if (!nvdimm->reserve_label_data) {
+        nvdimm_debug("write label request on the device without "
+                     "label data reserved.\n");
+        status = DSM_STATUS_NOT_SUPPORTED;
+        goto exit;
+    }
+
     if (nvdimm->label_size < cmd_in->offset + cmd_in->length) {
         nvdimm_debug("position %#x is beyond label data (len = %#lx).\n",
                      cmd_in->offset + cmd_in->length, nvdimm->label_size);
@@ -724,6 +739,12 @@ static void nvdimm_dsm_write_nvdimm(dsm_in *in, GArray *out)
     /* please refer to ACPI 6.0: 9.14.1 _DSM (Device Specific Method) */
     case DSM_FUN_IMPLEMENTED:
         cmd_list = cpu_to_le64(DIMM_SUPPORT_FUN);
+
+        /* no function support if the device does not have label data. */
+        if (!nvdimm->reserve_label_data) {
+            cmd_list = cpu_to_le64(0UL);
+        }
+
         g_array_append_vals(out, &cmd_list, sizeof(cmd_list));
         goto free;
     case DSM_DEV_FUN_NAMESPACE_LABEL_SIZE:
diff --git a/hw/mem/nvdimm.c b/hw/mem/nvdimm.c
index 2d121f6..cc69a3e 100644
--- a/hw/mem/nvdimm.c
+++ b/hw/mem/nvdimm.c
@@ -60,14 +60,15 @@ static void nvdimm_realize(DIMMDevice *dimm, Error **errp)
 {
     MemoryRegion *mr;
     NVDIMMDevice *nvdimm = NVDIMM(dimm);
-    uint64_t size;
+    uint64_t reserved_label_size, size;
 
     nvdimm->label_size = MIN_NAMESPACE_LABEL_SIZE;
+    reserved_label_size = nvdimm->reserve_label_data ? nvdimm->label_size : 0;
 
     mr = host_memory_backend_get_memory(dimm->hostmem, errp);
     size = memory_region_size(mr);
 
-    if (size <= nvdimm->label_size) {
+    if (size <= reserved_label_size) {
         char *path = object_get_canonical_path_component(OBJECT(dimm->hostmem));
         error_setg(errp, "the size of memdev %s (0x%" PRIx64 ") is too small"
                    " to contain nvdimm namespace label (0x%" PRIx64 ")", path,
@@ -76,9 +77,12 @@ static void nvdimm_realize(DIMMDevice *dimm, Error **errp)
     }
 
     memory_region_init_alias(&nvdimm->nvdimm_mr, OBJECT(dimm), "nvdimm-memory",
-                             mr, 0, size - nvdimm->label_size);
-    nvdimm->label_data = memory_region_get_ram_ptr(mr) +
-                         memory_region_size(&nvdimm->nvdimm_mr);
+                             mr, 0, size - reserved_label_size);
+
+    if (reserved_label_size) {
+        nvdimm->label_data = memory_region_get_ram_ptr(mr) +
+                             memory_region_size(&nvdimm->nvdimm_mr);
+    }
 }
 
 static void nvdimm_class_init(ObjectClass *oc, void *data)
@@ -93,10 +97,33 @@ static void nvdimm_class_init(ObjectClass *oc, void *data)
     ddc->get_memory_region = nvdimm_get_memory_region;
 }
 
+static bool nvdimm_get_reserve_label_data(Object *obj, Error **errp)
+{
+    NVDIMMDevice *nvdimm = NVDIMM(obj);
+
+    return nvdimm->reserve_label_data;
+}
+
+static void
+nvdimm_set_reserve_label_data(Object *obj, bool value, Error **errp)
+{
+    NVDIMMDevice *nvdimm = NVDIMM(obj);
+
+    nvdimm->reserve_label_data = value;
+}
+
+static void nvdimm_init(Object *obj)
+{
+    object_property_add_bool(obj, "reserve-label-data",
+                             nvdimm_get_reserve_label_data,
+                             nvdimm_set_reserve_label_data, NULL);
+}
+
 static TypeInfo nvdimm_info = {
     .name          = TYPE_NVDIMM,
     .parent        = TYPE_DIMM,
     .instance_size = sizeof(NVDIMMDevice),
+    .instance_init = nvdimm_init,
     .class_init    = nvdimm_class_init,
 };
 
diff --git a/include/hw/mem/nvdimm.h b/include/hw/mem/nvdimm.h
index c2dc635..10f85ec 100644
--- a/include/hw/mem/nvdimm.h
+++ b/include/hw/mem/nvdimm.h
@@ -55,6 +55,12 @@ struct NVDIMMDevice {
     /* public */
 
     /*
+     * if we need to reserve memory region for NVDIMM label data at
+     * the end of backend memory?
+     */
+    bool reserve_label_data;
+
+    /*
      * the size of label data in NVDIMM device which is presented to
      * guest via __DSM "Get Namespace Label Size" command.
      */
