[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 34/52] util/oslib-posix: Support concurrent os_mem_prealloc() invo
From: |
Michael S. Tsirkin |
Subject: |
[PULL 34/52] util/oslib-posix: Support concurrent os_mem_prealloc() invocation |
Date: |
Thu, 6 Jan 2022 08:17:52 -0500 |
From: David Hildenbrand <david@redhat.com>
Add a mutex to protect the SIGBUS case, as we cannot mess concurrently
with the sigbus handler and we have to manage the global variable
sigbus_memset_context. The MADV_POPULATE_WRITE path can run
concurrently.
Note that page_mutex and page_cond are shared between concurrent
invocations, which shouldn't be a problem.
This is a preparation for future virtio-mem prealloc code, which will call
os_mem_prealloc() asynchronously from an iothread when handling guest
requests.
Reviewed-by: Pankaj Gupta <pankaj.gupta@ionos.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
Message-Id: <20211217134611.31172-7-david@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
util/oslib-posix.c | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index efa4f96d56..9829149e4b 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -95,6 +95,7 @@ typedef struct MemsetThread MemsetThread;
/* used by sigbus_handler() */
static MemsetContext *sigbus_memset_context;
+static QemuMutex sigbus_mutex;
static QemuMutex page_mutex;
static QemuCond page_cond;
@@ -625,6 +626,7 @@ static bool madv_populate_write_possible(char *area, size_t
pagesize)
void os_mem_prealloc(int fd, char *area, size_t memory, int smp_cpus,
Error **errp)
{
+ static gsize initialized;
int ret;
struct sigaction act, oldact;
size_t hpagesize = qemu_fd_getpagesize(fd);
@@ -638,6 +640,12 @@ void os_mem_prealloc(int fd, char *area, size_t memory,
int smp_cpus,
use_madv_populate_write = madv_populate_write_possible(area, hpagesize);
if (!use_madv_populate_write) {
+ if (g_once_init_enter(&initialized)) {
+ qemu_mutex_init(&sigbus_mutex);
+ g_once_init_leave(&initialized, 1);
+ }
+
+ qemu_mutex_lock(&sigbus_mutex);
memset(&act, 0, sizeof(act));
act.sa_handler = &sigbus_handler;
act.sa_flags = 0;
@@ -665,6 +673,7 @@ void os_mem_prealloc(int fd, char *area, size_t memory, int
smp_cpus,
perror("os_mem_prealloc: failed to reinstall signal handler");
exit(1);
}
+ qemu_mutex_unlock(&sigbus_mutex);
}
}
--
MST
- [PULL 26/52] hw/smbios: Use qapi for SmbiosEntryPointType, (continued)
- [PULL 26/52] hw/smbios: Use qapi for SmbiosEntryPointType, Michael S. Tsirkin, 2022/01/06
- [PULL 37/52] virtio: signal after wrapping packed used_idx, Michael S. Tsirkin, 2022/01/06
- [PULL 36/52] virtio-mem: Support "prealloc=on" option, Michael S. Tsirkin, 2022/01/06
- [PULL 28/52] hw/vhost-user-blk: turn on VIRTIO_BLK_F_SIZE_MAX feature for virtio blk device, Michael S. Tsirkin, 2022/01/06
- [PULL 33/52] util/oslib-posix: Avoid creating a single thread with MADV_POPULATE_WRITE, Michael S. Tsirkin, 2022/01/06
- [PULL 40/52] virtio-mem: Support VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE, Michael S. Tsirkin, 2022/01/06
- [PULL 27/52] hw/i386: expose a "smbios-entry-point-type" PC machine property, Michael S. Tsirkin, 2022/01/06
- [PULL 24/52] pcie_aer: Don't trigger a LSI if none are defined, Michael S. Tsirkin, 2022/01/06
- [PULL 29/52] util/oslib-posix: Let touch_all_pages() return an error, Michael S. Tsirkin, 2022/01/06
- [PULL 35/52] util/oslib-posix: Forward SIGBUS to MCE handler under Linux, Michael S. Tsirkin, 2022/01/06
- [PULL 34/52] util/oslib-posix: Support concurrent os_mem_prealloc() invocation,
Michael S. Tsirkin <=
- [PULL 46/52] tests: acpi: SLIC: update expected blobs, Michael S. Tsirkin, 2022/01/06
- [PULL 31/52] util/oslib-posix: Introduce and use MemsetContext for touch_all_pages(), Michael S. Tsirkin, 2022/01/06
- [PULL 39/52] linux-headers: sync VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE, Michael S. Tsirkin, 2022/01/06
- [PULL 41/52] virtio-mem: Set "unplugged-inaccessible=auto" for the 7.0 machine on x86, Michael S. Tsirkin, 2022/01/06
- [PULL 43/52] acpi: fix QEMU crash when started with SLIC table, Michael S. Tsirkin, 2022/01/06
- [PULL 42/52] intel-iommu: correctly check passthrough during translation, Michael S. Tsirkin, 2022/01/06
- [PULL 45/52] tests: acpi: add SLIC table test, Michael S. Tsirkin, 2022/01/06
- [PULL 47/52] acpihp: simplify acpi_pcihp_disable_root_bus, Michael S. Tsirkin, 2022/01/06
- [PULL 32/52] util/oslib-posix: Don't create too many threads with small memory or little pages, Michael S. Tsirkin, 2022/01/06
- [PULL 49/52] docs: reSTify virtio-balloon-stats documentation and move to docs/interop, Michael S. Tsirkin, 2022/01/06