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: 59+ 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 ` [PULL v2 03/55] virtio: introduce macro IRTIO_CONFIG_IRQ_IDX 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 ` [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).