1 /* 2 * Virtio MEM device 3 * 4 * Copyright (C) 2020 Red Hat, Inc. 5 * 6 * Authors: 7 * David Hildenbrand <david@redhat.com> 8 * 9 * This work is licensed under the terms of the GNU GPL, version 2. 10 * See the COPYING file in the top-level directory. 11 */ 12 13 #ifndef HW_VIRTIO_MEM_H 14 #define HW_VIRTIO_MEM_H 15 16 #include "standard-headers/linux/virtio_mem.h" 17 #include "hw/virtio/virtio.h" 18 #include "qapi/qapi-types-misc.h" 19 #include "sysemu/hostmem.h" 20 #include "qom/object.h" 21 22 #define TYPE_VIRTIO_MEM "virtio-mem" 23 24 OBJECT_DECLARE_TYPE(VirtIOMEM, VirtIOMEMClass, 25 VIRTIO_MEM) 26 27 #define VIRTIO_MEM_MEMDEV_PROP "memdev" 28 #define VIRTIO_MEM_NODE_PROP "node" 29 #define VIRTIO_MEM_SIZE_PROP "size" 30 #define VIRTIO_MEM_REQUESTED_SIZE_PROP "requested-size" 31 #define VIRTIO_MEM_BLOCK_SIZE_PROP "block-size" 32 #define VIRTIO_MEM_ADDR_PROP "memaddr" 33 #define VIRTIO_MEM_UNPLUGGED_INACCESSIBLE_PROP "unplugged-inaccessible" 34 #define VIRTIO_MEM_PREALLOC_PROP "prealloc" 35 36 struct VirtIOMEM { 37 VirtIODevice parent_obj; 38 39 /* guest -> host request queue */ 40 VirtQueue *vq; 41 42 /* bitmap used to track unplugged memory */ 43 int32_t bitmap_size; 44 unsigned long *bitmap; 45 46 /* assigned memory backend and memory region */ 47 HostMemoryBackend *memdev; 48 49 /* NUMA node */ 50 uint32_t node; 51 52 /* assigned address of the region in guest physical memory */ 53 uint64_t addr; 54 55 /* usable region size (<= region_size) */ 56 uint64_t usable_region_size; 57 58 /* actual size (how much the guest plugged) */ 59 uint64_t size; 60 61 /* requested size */ 62 uint64_t requested_size; 63 64 /* block size and alignment */ 65 uint64_t block_size; 66 67 /* 68 * Whether we indicate VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE to the guest. 69 * For !x86 targets this will always be "on" and consequently indicate 70 * VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE. 71 */ 72 OnOffAuto unplugged_inaccessible; 73 74 /* whether to prealloc memory when plugging new blocks */ 75 bool prealloc; 76 77 /* notifiers to notify when "size" changes */ 78 NotifierList size_change_notifiers; 79 80 /* listeners to notify on plug/unplug activity. */ 81 QLIST_HEAD(, RamDiscardListener) rdl_list; 82 }; 83 84 struct VirtIOMEMClass { 85 /* private */ 86 VirtIODevice parent; 87 88 /* public */ 89 void (*fill_device_info)(const VirtIOMEM *vmen, VirtioMEMDeviceInfo *vi); 90 MemoryRegion *(*get_memory_region)(VirtIOMEM *vmem, Error **errp); 91 void (*add_size_change_notifier)(VirtIOMEM *vmem, Notifier *notifier); 92 void (*remove_size_change_notifier)(VirtIOMEM *vmem, Notifier *notifier); 93 }; 94 95 #endif 96