From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Michal Privoznik" <mprivozn@redhat.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Daniel P . Berrangé" <berrange@redhat.com>,
"David Hildenbrand" <david@redhat.com>
Subject: [PULL v2 31/55] util/oslib-posix: Introduce and use MemsetContext for touch_all_pages()
Date: Fri, 7 Jan 2022 06:04:37 -0500 [thread overview]
Message-ID: <20220107102526.39238-32-mst@redhat.com> (raw)
In-Reply-To: <20220107102526.39238-1-mst@redhat.com>
From: David Hildenbrand <david@redhat.com>
Let's minimize the number of global variables to prepare for
os_mem_prealloc() getting called concurrently and make the code a bit
easier to read.
The only consumer that really needs a global variable is the sigbus
handler, which will require protection via a mutex in the future either way
as we cannot concurrently mess with the SIGBUS handler.
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-4-david@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
util/oslib-posix.c | 73 +++++++++++++++++++++++++++++-----------------
1 file changed, 47 insertions(+), 26 deletions(-)
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
index cb89e07770..cf2ead54ad 100644
--- a/util/oslib-posix.c
+++ b/util/oslib-posix.c
@@ -73,21 +73,30 @@
#define MAX_MEM_PREALLOC_THREAD_COUNT 16
+struct MemsetThread;
+
+typedef struct MemsetContext {
+ bool all_threads_created;
+ bool any_thread_failed;
+ struct MemsetThread *threads;
+ int num_threads;
+} MemsetContext;
+
struct MemsetThread {
char *addr;
size_t numpages;
size_t hpagesize;
QemuThread pgthread;
sigjmp_buf env;
+ MemsetContext *context;
};
typedef struct MemsetThread MemsetThread;
-static MemsetThread *memset_thread;
-static int memset_num_threads;
+/* used by sigbus_handler() */
+static MemsetContext *sigbus_memset_context;
static QemuMutex page_mutex;
static QemuCond page_cond;
-static bool threads_created_flag;
int qemu_get_thread_id(void)
{
@@ -438,10 +447,13 @@ const char *qemu_get_exec_dir(void)
static void sigbus_handler(int signal)
{
int i;
- if (memset_thread) {
- for (i = 0; i < memset_num_threads; i++) {
- if (qemu_thread_is_self(&memset_thread[i].pgthread)) {
- siglongjmp(memset_thread[i].env, 1);
+
+ if (sigbus_memset_context) {
+ for (i = 0; i < sigbus_memset_context->num_threads; i++) {
+ MemsetThread *thread = &sigbus_memset_context->threads[i];
+
+ if (qemu_thread_is_self(&thread->pgthread)) {
+ siglongjmp(thread->env, 1);
}
}
}
@@ -459,7 +471,7 @@ static void *do_touch_pages(void *arg)
* clearing until all threads have been created.
*/
qemu_mutex_lock(&page_mutex);
- while(!threads_created_flag){
+ while (!memset_args->context->all_threads_created) {
qemu_cond_wait(&page_cond, &page_mutex);
}
qemu_mutex_unlock(&page_mutex);
@@ -502,7 +514,7 @@ static void *do_madv_populate_write_pages(void *arg)
/* See do_touch_pages(). */
qemu_mutex_lock(&page_mutex);
- while (!threads_created_flag) {
+ while (!memset_args->context->all_threads_created) {
qemu_cond_wait(&page_cond, &page_mutex);
}
qemu_mutex_unlock(&page_mutex);
@@ -529,6 +541,9 @@ static int touch_all_pages(char *area, size_t hpagesize, size_t numpages,
int smp_cpus, bool use_madv_populate_write)
{
static gsize initialized = 0;
+ MemsetContext context = {
+ .num_threads = get_memset_num_threads(smp_cpus),
+ };
size_t numpages_per_thread, leftover;
void *(*touch_fn)(void *);
int ret = 0, i = 0;
@@ -546,35 +561,41 @@ static int touch_all_pages(char *area, size_t hpagesize, size_t numpages,
touch_fn = do_touch_pages;
}
- threads_created_flag = false;
- memset_num_threads = get_memset_num_threads(smp_cpus);
- memset_thread = g_new0(MemsetThread, memset_num_threads);
- numpages_per_thread = numpages / memset_num_threads;
- leftover = numpages % memset_num_threads;
- for (i = 0; i < memset_num_threads; i++) {
- memset_thread[i].addr = addr;
- memset_thread[i].numpages = numpages_per_thread + (i < leftover);
- memset_thread[i].hpagesize = hpagesize;
- qemu_thread_create(&memset_thread[i].pgthread, "touch_pages",
- touch_fn, &memset_thread[i],
+ context.threads = g_new0(MemsetThread, context.num_threads);
+ numpages_per_thread = numpages / context.num_threads;
+ leftover = numpages % context.num_threads;
+ for (i = 0; i < context.num_threads; i++) {
+ context.threads[i].addr = addr;
+ context.threads[i].numpages = numpages_per_thread + (i < leftover);
+ context.threads[i].hpagesize = hpagesize;
+ context.threads[i].context = &context;
+ qemu_thread_create(&context.threads[i].pgthread, "touch_pages",
+ touch_fn, &context.threads[i],
QEMU_THREAD_JOINABLE);
- addr += memset_thread[i].numpages * hpagesize;
+ addr += context.threads[i].numpages * hpagesize;
+ }
+
+ if (!use_madv_populate_write) {
+ sigbus_memset_context = &context;
}
qemu_mutex_lock(&page_mutex);
- threads_created_flag = true;
+ context.all_threads_created = true;
qemu_cond_broadcast(&page_cond);
qemu_mutex_unlock(&page_mutex);
- for (i = 0; i < memset_num_threads; i++) {
- int tmp = (uintptr_t)qemu_thread_join(&memset_thread[i].pgthread);
+ for (i = 0; i < context.num_threads; i++) {
+ int tmp = (uintptr_t)qemu_thread_join(&context.threads[i].pgthread);
if (tmp) {
ret = tmp;
}
}
- g_free(memset_thread);
- memset_thread = NULL;
+
+ if (!use_madv_populate_write) {
+ sigbus_memset_context = NULL;
+ }
+ g_free(context.threads);
return ret;
}
--
MST
next prev parent reply other threads:[~2022-01-07 11:53 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-07 11:03 [PULL v2 00/55] virtio,pci,pc: features,fixes,cleanups Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 01/55] virtio-mem: Don't skip alignment checks when warning about block size Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 02/55] acpi: validate hotplug selector on access Michael S. Tsirkin
2022-01-07 11:03 ` [Virtio-fs] [PULL v2 03/55] virtio: introduce macro IRTIO_CONFIG_IRQ_IDX Michael S. Tsirkin
2022-01-07 11:03 ` Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 04/55] virtio-pci: decouple notifier from interrupt process Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 05/55] virtio-pci: decouple the single vector from the " Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 06/55] vhost: introduce new VhostOps vhost_set_config_call Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 07/55] vhost-vdpa: add support for config interrupt Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 08/55] virtio: add support for configure interrupt Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 09/55] vhost: " Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 10/55] virtio-net: " Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 11/55] virtio-mmio: " Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 12/55] virtio-pci: " Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 13/55] trace-events,pci: unify trace events format Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 14/55] vhost-user-blk: reconnect on any error during realize Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 15/55] chardev/char-socket: tcp_chr_recv: don't clobber errno Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 16/55] chardev/char-socket: tcp_chr_sync_read: " Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 17/55] vhost-backend: avoid overflow on memslots_limit Michael S. Tsirkin
2022-01-07 11:03 ` [PULL v2 18/55] vhost-backend: stick to -errno error return convention Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 19/55] vhost-vdpa: " Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 20/55] vhost-user: " Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 21/55] vhost: " Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 22/55] vhost-user-blk: propagate error return from generic vhost Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 23/55] pci: Export the pci_intx() function Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 24/55] pcie_aer: Don't trigger a LSI if none are defined Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 25/55] smbios: Rename SMBIOS_ENTRY_POINT_* enums Michael S. Tsirkin
2022-01-07 11:04 ` Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 26/55] hw/smbios: Use qapi for SmbiosEntryPointType Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 27/55] hw/i386: expose a "smbios-entry-point-type" PC machine property Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 28/55] hw/vhost-user-blk: turn on VIRTIO_BLK_F_SIZE_MAX feature for virtio blk device Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 29/55] util/oslib-posix: Let touch_all_pages() return an error Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 30/55] util/oslib-posix: Support MADV_POPULATE_WRITE for os_mem_prealloc() Michael S. Tsirkin
2022-01-07 11:04 ` Michael S. Tsirkin [this message]
2022-01-07 11:04 ` [PULL v2 32/55] util/oslib-posix: Don't create too many threads with small memory or little pages Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 33/55] util/oslib-posix: Avoid creating a single thread with MADV_POPULATE_WRITE Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 34/55] util/oslib-posix: Support concurrent os_mem_prealloc() invocation Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 35/55] util/oslib-posix: Forward SIGBUS to MCE handler under Linux Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 36/55] virtio-mem: Support "prealloc=on" option Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 37/55] virtio: signal after wrapping packed used_idx Michael S. Tsirkin
2022-01-07 11:04 ` [PULL v2 38/55] MAINTAINERS: Add a separate entry for acpi/VIOT tables Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 39/55] linux-headers: sync VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 40/55] virtio-mem: Support VIRTIO_MEM_F_UNPLUGGED_INACCESSIBLE Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 41/55] virtio-mem: Set "unplugged-inaccessible=auto" for the 7.0 machine on x86 Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 42/55] intel-iommu: correctly check passthrough during translation Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 43/55] acpi: fix QEMU crash when started with SLIC table Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 44/55] tests: acpi: whitelist expected blobs before changing them Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 45/55] tests: acpi: add SLIC table test Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 46/55] tests: acpi: SLIC: update expected blobs Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 47/55] acpihp: simplify acpi_pcihp_disable_root_bus Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 48/55] hw/i386/pc: Add missing property descriptions Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 49/55] docs: reSTify virtio-balloon-stats documentation and move to docs/interop Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 50/55] hw/scsi/vhost-scsi: don't leak vqs on error Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 51/55] hw/scsi/vhost-scsi: don't double close vhostfd " Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 52/55] virtio/vhost-vsock: don't double close vhostfd, remove redundant cleanup Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 53/55] tests: acpi: prepare for updated TPM related tables Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 54/55] acpi: tpm: Add missing device identification objects Michael S. Tsirkin
2022-01-07 11:05 ` [PULL v2 55/55] tests: acpi: Add updated TPM related tables Michael S. Tsirkin
2022-01-07 19:38 ` [PULL v2 00/55] virtio,pci,pc: features,fixes,cleanups Richard Henderson
2022-01-08 0:34 ` Michael S. Tsirkin
2022-01-09 12:20 ` David Hildenbrand
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220107102526.39238-32-mst@redhat.com \
--to=mst@redhat.com \
--cc=berrange@redhat.com \
--cc=david@redhat.com \
--cc=mprivozn@redhat.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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.