All of lore.kernel.org
 help / color / mirror / Atom feed
* [RFC QEMU PATCH 0/7] Application Specific Tagged Memory Support in CXL Type 3 Devices
@ 2025-11-27 22:55 ` Alireza Sanaee via
  0 siblings, 0 replies; 30+ messages in thread
From: Alireza Sanaee @ 2025-11-27 22:55 UTC (permalink / raw)
  To: qemu-devel
  Cc: jonathan.cameron, linuxarm, eblake, armbru, berrange, pbonzini,
	mst, lizhijian, anisa.su, linux-cxl

Application may need memory for specific purposes. For example, a
database application may want to allocate memory that is optimized for
workloads involving large datasets and frequent read/write operations.
Or there might be a large read only dataset that can be mapped to a CXL
Type 3 device.

There must be a way to feed this memory into the VMs. This series
introduces a tagged memory backend object that allows tagging memory
regions with application specific tags. The tagged memory regions can
then be used as backing memory for CXL Type 3 devices.

This series includes the following changes:
 - A new tagged memory backend object is introduced that allows
   allocating and managing memory regions with specific tags.
 - The CXL Type 3 device implementation is modified to support using
   tagged memory regions as backing memory.
 - New QAPI commands and structures are added to facilitate the
   management of tagged memory regions and their association with CXL
   Type 3 devices.
 - The CXL extent management code is updated to handle tagged memory
   regions appropriately, including lazy loading and direct mapping
   optimizations.

# Assumptions:

1) Each extent must be mapped entirely to a single tagged memory
backend.
2) Punching holes in extents is not supported, and not allowed.

# Diagram that illustrates the design:

                  VM
                  |
                  | FMW.0
                  v
                +--------------------+
                |   CXL Type-3 dev   |
                |  +--------------+  |
                |  | extent0 T0   |----> backend0 (tag T0)
                |  | extent1 T1   |----> backend1 (tag T1)
                |  | extent2 T2   |----> backend2 (tag T2)
                |  +--------------+  |
                +--------------------+


# Tested scenario:

Created two different tagged memory backends with different tags at
runtime with QMP commands, and then added two different extents that
cover the whole memory backends specified by tags.

# Changes to the kernel:

UUID/tags must be allowed in the DCD patchset available online from
Ira which is series depends on [1].

# Commands used:

# First memory backend with tag 5be13bce-ae34-4a77-b6c3-16df975fcf1a:

{
    "execute": "object-add",
    "arguments": {
        "qom-type": "memory-backend-tagged",
        "id": "tm0",
        "size": 1073741824,
        "tag": "5be13bce-ae34-4a77-b6c3-16df975fcf1a"
    }
}

## Second memory backend with tag 6be13bce-ae34-4a77-b6c3-16df975fcf1a:

{

    "execute": "object-add",
    "arguments": {
        "qom-type": "memory-backend-tagged",
        "id": "tm1",
        "size": 1073741824,
        "tag": "6be13bce-ae34-4a77-b6c3-16df975fcf1a"
    }
}

## Add capacity extent with tag 5be13bce-ae34-4a77-b6c3-16df975fcf1a:

{
    "execute": "cxl-add-dynamic-capacity",
	"arguments": {
		"path": "/machine/peripheral/cxl-vmem0",
		"host-id": 0,
		"selection-policy": "prescriptive",
		"region": 0,
		"tag": "5be13bce-ae34-4a77-b6c3-16df975fcf1a",
		"extents": [
			{
				"offset": 0,
				"len": 1073741824
			}
		]
	}
}

## Add capacity extent with tag 6be13bce-ae34-4a77-b6c3-16df975fcf1a:

{
    "execute": "cxl-add-dynamic-capacity",
    "arguments": {
        "path": "/machine/peripheral/cxl-vmem0",
        "host-id": 0,
        "selection-policy": "prescriptive",
        "region": 0,
        "tag": "6be13bce-ae34-4a77-b6c3-16df975fcf1a",
        "extents": [
            {
                "offset": 1073741824,
                "len": 1073741824
            }
        ]
    }
}

## Release capacity extent with tag 5be13bce-ae34-4a77-b6c3-16df975fcf1a:

{ "execute": "cxl-release-dynamic-capacity",
	"arguments": {
		"path": "/machine/peripheral/cxl-vmem0",
		"host-id": 0,
		"removal-policy":"tag-based",
        	"tag": "5be13bce-ae34-4a77-b6c3-16df975fcf1a",
		"region": 0,
		"extents": [
		{
			"offset": 0,
			"len": 1073741824
		}
		]
	}
}

## Release capacity extent with tag 6be13bce-ae34-4a77-b6c3-16df975fcf1a:

{ "execute": "cxl-release-dynamic-capacity",
	"arguments": {
		"path": "/machine/peripheral/cxl-vmem0",
		"host-id": 0,
		"removal-policy":"tag-based",
        	"tag": "6be13bce-ae34-4a77-b6c3-16df975fcf1a",
		"region": 0,
		"extents": [
		{
			"offset": 1073741824,
			"len": 1073741824
		}
		]
	}
}

## Checking if capacity extents are removed successfully:

{
  "execute": "cxl-release-dynamic-capacity-status",
  "arguments": {
	"path": "/machine/peripheral/cxl-vmem0",
	"host-id": 0,
        "tag": "6be13bce-ae34-4a77-b6c3-16df975fcf1a",
	"region": 0
  }
}

Response:
{
    "return": {
        "status": "not-found"
    }
}

# QEMU Command:

$ qemu-system-x86_64 \
  -cpu max \
  -smp 8 \
  -drive file=debian12.qcow2,format=qcow2,if=none,id=mydrive0,index=0 \
  -device virtio-blk-pci,drive=mydrive0 \
  -kernel bzImage \
  -append "console=ttyS0,115200 TERM=linux root=/dev/vda1 nokaslr ignore_loglevel \
           fsck.mode=skip cxl_acpi.dyndbg=+fplm cxl_pci.dyndbg=+fplm cxl" \
  -nographic \
  -serial mon:stdio \
  -machine type=q35,accel=tcg \
  -virtfs local,path=hostshare/,mount_tag=hostshare,security_model=passthrough,id=hostshare \
  -qmp tcp:localhost:4444,server,wait=off \
  -netdev user,id=network0,hostfwd=tcp::2025-:22 \
  -device virtio-net,netdev=network0 \
  -m 12G,maxmem=20G,slots=10 \
  -object memory-backend-ram,id=vmem0,share=on,size=2G \
  -device pxb-cxl,numa_node=0,bus_nr=23,bus=pcie.0,id=cxl.1,hdm_for_passthrough=true \
  -device cxl-rp,port=0,bus=cxl.1,id=root_port13,chassis=0,slot=2 \
  -M cxl=on,cxl-fmw.0.targets.0=cxl.1,cxl-fmw.0.size=6G \
  -device cxl-type3,bus=root_port13,id=cxl-vmem0,num-dc-regions=1,dc-regions-total-size=4G

BASE: 2a3af116a78e1adceb24521d76199b97f08c0f1d

Depends-on:
https://lore.kernel.org/linux-cxl/20251013160151.000039dd.alireza.sanaee@huawei.com/

Depends-on:
https://lore.kernel.org/all/20250413-dcd-type2-upstream-v9-0-1d4911a0b365@intel.com/

[1] https://github.com/sarsanaee/linux/tree/allow_uuid_ira

Alireza Sanaee (7):
  hw/mem: Add tagged memory backend object
  hw/cxl: Allow initializing type3 device with no backing device
  hw/cxl: Change Extent add/remove APIs for lazy memory backend.
  hw/cxl: Map lazy memory backend after host acceptance
  hw/cxl: Add performant direct mapping for extents
  hw/cxl: Add remove alias functionality for extent direct mapping
  hw/cxl: Add tag-based removal functionality

 hw/cxl/cxl-host.c           |   6 +
 hw/cxl/cxl-mailbox-utils.c  | 190 +++++++++++++++++++--
 hw/mem/cxl_type3.c          | 326 ++++++++++++++++++++++++++++++------
 hw/mem/meson.build          |   1 +
 hw/mem/tagged_mem.c         | 116 +++++++++++++
 include/hw/cxl/cxl_device.h |  44 ++++-
 include/hw/mem/tagged_mem.h |  31 ++++
 qapi/cxl.json               |  46 +++++
 qapi/qom.json               |  15 ++
 9 files changed, 707 insertions(+), 68 deletions(-)
 create mode 100644 hw/mem/tagged_mem.c
 create mode 100644 include/hw/mem/tagged_mem.h

-- 
2.43.0


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

end of thread, other threads:[~2026-02-06 12:50 UTC | newest]

Thread overview: 30+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-11-27 22:55 [RFC QEMU PATCH 0/7] Application Specific Tagged Memory Support in CXL Type 3 Devices Alireza Sanaee
2025-11-27 22:55 ` Alireza Sanaee via
2025-11-27 22:55 ` [RFC PATCH 1/7] hw/mem: Add tagged memory backend object Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:16   ` Jonathan Cameron
2026-02-06 12:16     ` Jonathan Cameron via qemu development
2025-11-27 22:55 ` [RFC PATCH 2/7] hw/cxl: Allow initializing type3 device with no backing device Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:28   ` Jonathan Cameron
2026-02-06 12:28     ` Jonathan Cameron via qemu development
2025-11-27 22:55 ` [RFC PATCH 3/7] hw/cxl: Change Extent add/remove APIs for lazy memory backend Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:30   ` Jonathan Cameron
2026-02-06 12:30     ` Jonathan Cameron via qemu development
2025-11-27 22:55 ` [RFC PATCH 4/7] hw/cxl: Map lazy memory backend after host acceptance Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:33   ` Jonathan Cameron
2026-02-06 12:33     ` Jonathan Cameron via qemu development
2025-11-27 22:55 ` [RFC PATCH 5/7] hw/cxl: Add performant direct mapping for extents Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:41   ` Jonathan Cameron
2026-02-06 12:41     ` Jonathan Cameron via qemu development
2025-11-27 22:55 ` [RFC PATCH 6/7] hw/cxl: Add remove alias functionality for extent direct mapping Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:43   ` Jonathan Cameron
2026-02-06 12:43     ` Jonathan Cameron via qemu development
2025-11-27 22:55 ` [RFC PATCH 7/7] hw/cxl: Add tag-based removal functionality Alireza Sanaee
2025-11-27 22:55   ` Alireza Sanaee via
2026-02-06 12:49   ` Jonathan Cameron
2026-02-06 12:49     ` Jonathan Cameron via qemu development

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.