From c55510b72218a2d0b263eda006fd7aac1496b694 Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Thu, 30 Aug 2018 16:59:01 +0200 Subject: [PATCH 1/4] qemu-error: add {error, warn}_report_once_cond Add two functions to print an error/warning report once depending on a passed-in condition variable and flip it if printed. This is useful if you want to print a message not once-globally, but e.g. once-per-device. Inspired by warn_once() in hw/vfio/ccw.c, which has been replaced with warn_report_once_cond(). Signed-off-by: Cornelia Huck Message-Id: <20180830145902.27376-2-cohuck@redhat.com> Reviewed-by: Markus Armbruster [Function comments reworded] Signed-off-by: Markus Armbruster --- hw/vfio/ccw.c | 18 +++-------------- include/qemu/error-report.h | 5 +++++ util/qemu-error.c | 40 +++++++++++++++++++++++++++++++++++++ 3 files changed, 48 insertions(+), 15 deletions(-) diff --git a/hw/vfio/ccw.c b/hw/vfio/ccw.c index e96bbdc78b..9246729a75 100644 --- a/hw/vfio/ccw.c +++ b/hw/vfio/ccw.c @@ -37,24 +37,12 @@ typedef struct VFIOCCWDevice { bool warned_orb_pfch; } VFIOCCWDevice; -static inline void warn_once(bool *warned, const char *fmt, ...) -{ - va_list ap; - - if (!warned || *warned) { - return; - } - *warned = true; - va_start(ap, fmt); - warn_vreport(fmt, ap); - va_end(ap); -} - static inline void warn_once_pfch(VFIOCCWDevice *vcdev, SubchDev *sch, const char *msg) { - warn_once(&vcdev->warned_orb_pfch, "vfio-ccw (devno %x.%x.%04x): %s", - sch->cssid, sch->ssid, sch->devno, msg); + warn_report_once_cond(&vcdev->warned_orb_pfch, + "vfio-ccw (devno %x.%x.%04x): %s", + sch->cssid, sch->ssid, sch->devno, msg); } static void vfio_ccw_compute_needs_reset(VFIODevice *vdev) diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h index 72fab2b031..e415128ac4 100644 --- a/include/qemu/error-report.h +++ b/include/qemu/error-report.h @@ -44,6 +44,11 @@ void error_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2); void warn_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2); void info_report(const char *fmt, ...) GCC_FMT_ATTR(1, 2); +bool error_report_once_cond(bool *printed, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); +bool warn_report_once_cond(bool *printed, const char *fmt, ...) + GCC_FMT_ATTR(2, 3); + /* * Similar to error_report(), except it prints the message just once. * Return true when it prints, false otherwise. diff --git a/util/qemu-error.c b/util/qemu-error.c index a25d3b94c6..4ab428f7e4 100644 --- a/util/qemu-error.c +++ b/util/qemu-error.c @@ -310,3 +310,43 @@ void info_report(const char *fmt, ...) vreport(REPORT_TYPE_INFO, fmt, ap); va_end(ap); } + +/* + * Like error_report(), except print just once. + * If *printed is false, print the message, and flip *printed to true. + * Return whether the message was printed. + */ +bool error_report_once_cond(bool *printed, const char *fmt, ...) +{ + va_list ap; + + assert(printed); + if (*printed) { + return false; + } + *printed = true; + va_start(ap, fmt); + vreport(REPORT_TYPE_ERROR, fmt, ap); + va_end(ap); + return true; +} + +/* + * Like warn_report(), except print just once. + * If *printed is false, print the message, and flip *printed to true. + * Return whether the message was printed. + */ +bool warn_report_once_cond(bool *printed, const char *fmt, ...) +{ + va_list ap; + + assert(printed); + if (*printed) { + return false; + } + *printed = true; + va_start(ap, fmt); + vreport(REPORT_TYPE_WARNING, fmt, ap); + va_end(ap); + return true; +} From c6c594596eabc80f6e54d96c56f01f8531d389b5 Mon Sep 17 00:00:00 2001 From: Cornelia Huck Date: Thu, 30 Aug 2018 16:59:02 +0200 Subject: [PATCH 2/4] qemu-error: make use of {error, warn}_report_once_cond {error,warn}_report_once() are a special case of the new functions and can simply switch to them. Signed-off-by: Cornelia Huck Message-Id: <20180830145902.27376-3-cohuck@redhat.com> Reviewed-by: Markus Armbruster [Dispense with unlikely() to keep the macros as simple as possible] Signed-off-by: Markus Armbruster --- include/qemu/error-report.h | 30 ++++++++++-------------------- 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/include/qemu/error-report.h b/include/qemu/error-report.h index e415128ac4..0a8d9cc9ea 100644 --- a/include/qemu/error-report.h +++ b/include/qemu/error-report.h @@ -53,32 +53,22 @@ bool warn_report_once_cond(bool *printed, const char *fmt, ...) * Similar to error_report(), except it prints the message just once. * Return true when it prints, false otherwise. */ -#define error_report_once(fmt, ...) \ - ({ \ - static bool print_once_; \ - bool ret_print_once_ = !print_once_; \ - \ - if (!print_once_) { \ - print_once_ = true; \ - error_report(fmt, ##__VA_ARGS__); \ - } \ - unlikely(ret_print_once_); \ +#define error_report_once(fmt, ...) \ + ({ \ + static bool print_once_; \ + error_report_once_cond(&print_once_, \ + fmt, ##__VA_ARGS__); \ }) /* * Similar to warn_report(), except it prints the message just once. * Return true when it prints, false otherwise. */ -#define warn_report_once(fmt, ...) \ - ({ \ - static bool print_once_; \ - bool ret_print_once_ = !print_once_; \ - \ - if (!print_once_) { \ - print_once_ = true; \ - warn_report(fmt, ##__VA_ARGS__); \ - } \ - unlikely(ret_print_once_); \ +#define warn_report_once(fmt, ...) \ + ({ \ + static bool print_once_; \ + warn_report_once_cond(&print_once_, \ + fmt, ##__VA_ARGS__); \ }) const char *error_get_progname(void); From 371b74e2215fde31cc22d23dfa710e11bb906038 Mon Sep 17 00:00:00 2001 From: Mao Zhongyi Date: Thu, 20 Sep 2018 22:05:30 -0400 Subject: [PATCH 3/4] Drop "qemu:" prefix from error_report() arguments error_report and friends already add a "qemu-system-xxx" prefix to the string, so a "qemu:" prefix is redundant in the string. Just drop it. Reported-by: Thomas Huth Signed-off-by: Mao Zhongyi Reviewed-by: Eduardo Habkost Message-Id: <1537495530-580-1-git-send-email-maozhongyi@cmss.chinamobile.com> Acked-by: David Gibson Signed-off-by: Markus Armbruster --- hw/i386/multiboot.c | 8 ++++---- hw/ppc/e500.c | 4 ++-- hw/ppc/sam460ex.c | 8 ++++---- hw/riscv/sifive_e.c | 2 +- hw/riscv/sifive_u.c | 2 +- hw/riscv/spike.c | 2 +- hw/riscv/virt.c | 4 ++-- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/hw/i386/multiboot.c b/hw/i386/multiboot.c index d519e206c5..1a4344f5fc 100644 --- a/hw/i386/multiboot.c +++ b/hw/i386/multiboot.c @@ -181,12 +181,12 @@ int load_multiboot(FWCfgState *fw_cfg, if (!is_multiboot) return 0; /* no multiboot */ - mb_debug("qemu: I believe we found a multiboot image!"); + mb_debug("I believe we found a multiboot image!"); memset(bootinfo, 0, sizeof(bootinfo)); memset(&mbs, 0, sizeof(mbs)); if (flags & 0x00000004) { /* MULTIBOOT_HEADER_HAS_VBE */ - error_report("qemu: multiboot knows VBE. we don't."); + error_report("multiboot knows VBE. we don't"); } if (!(flags & 0x00010000)) { /* MULTIBOOT_HEADER_HAS_ADDR */ uint64_t elf_entry; @@ -216,7 +216,7 @@ int load_multiboot(FWCfgState *fw_cfg, exit(1); } - mb_debug("qemu: loading multiboot-elf kernel " + mb_debug("loading multiboot-elf kernel " "(%#x bytes) with entry %#zx", mb_kernel_size, (size_t)mh_entry_addr); } else { @@ -270,7 +270,7 @@ int load_multiboot(FWCfgState *fw_cfg, mb_debug("multiboot: load_addr = %#x", mh_load_addr); mb_debug("multiboot: load_end_addr = %#x", mh_load_end_addr); mb_debug("multiboot: bss_end_addr = %#x", mh_bss_end_addr); - mb_debug("qemu: loading multiboot kernel (%#x bytes) at %#x", + mb_debug("loading multiboot kernel (%#x bytes) at %#x", mb_load_size, mh_load_addr); mbs.mb_buf = g_malloc(mb_kernel_size); diff --git a/hw/ppc/e500.c b/hw/ppc/e500.c index 7d19b1498c..e6747fce28 100644 --- a/hw/ppc/e500.c +++ b/hw/ppc/e500.c @@ -1000,7 +1000,7 @@ void ppce500_init(MachineState *machine) payload_size = load_uimage(filename, &bios_entry, &loadaddr, NULL, NULL, NULL); if (payload_size < 0) { - error_report("qemu: could not load firmware '%s'", filename); + error_report("could not load firmware '%s'", filename); exit(1); } } @@ -1056,7 +1056,7 @@ void ppce500_init(MachineState *machine) */ dt_base = (loadaddr + payload_size + DTC_LOAD_PAD) & ~DTC_PAD_MASK; if (dt_base + DTB_MAX_SIZE > ram_size) { - error_report("qemu: not enough memory for device tree"); + error_report("not enough memory for device tree"); exit(1); } diff --git a/hw/ppc/sam460ex.c b/hw/ppc/sam460ex.c index 9c77183006..9b6f534532 100644 --- a/hw/ppc/sam460ex.c +++ b/hw/ppc/sam460ex.c @@ -234,7 +234,7 @@ static int sam460ex_load_uboot(void) if (!pflash_cfi01_register(base, NULL, "sam460ex.flash", bios_size, blk, 64 * KiB, fl_sectors, 1, 0x89, 0x18, 0x0000, 0x0, 1)) { - error_report("qemu: Error registering flash memory."); + error_report("Error registering flash memory"); /* XXX: return an error instead? */ exit(1); } @@ -552,7 +552,7 @@ static void sam460ex_init(MachineState *machine) if (!machine->kernel_filename) { success = sam460ex_load_uboot(); if (success < 0) { - error_report("qemu: could not load firmware"); + error_report("could not load firmware"); exit(1); } } @@ -571,7 +571,7 @@ static void sam460ex_init(MachineState *machine) } /* XXX try again as binary */ if (success < 0) { - error_report("qemu: could not load kernel '%s'", + error_report("could not load kernel '%s'", machine->kernel_filename); exit(1); } @@ -583,7 +583,7 @@ static void sam460ex_init(MachineState *machine) RAMDISK_ADDR, machine->ram_size - RAMDISK_ADDR); if (initrd_size < 0) { - error_report("qemu: could not load ram disk '%s' at %x", + error_report("could not load ram disk '%s' at %x", machine->initrd_filename, RAMDISK_ADDR); exit(1); } diff --git a/hw/riscv/sifive_e.c b/hw/riscv/sifive_e.c index 4577d72037..cb513cc3bb 100644 --- a/hw/riscv/sifive_e.c +++ b/hw/riscv/sifive_e.c @@ -81,7 +81,7 @@ static uint64_t load_kernel(const char *kernel_filename) if (load_elf(kernel_filename, NULL, NULL, &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) < 0) { - error_report("qemu: could not load kernel '%s'", kernel_filename); + error_report("could not load kernel '%s'", kernel_filename); exit(1); } return kernel_entry; diff --git a/hw/riscv/sifive_u.c b/hw/riscv/sifive_u.c index 59ae1ce24a..862f8ff5f7 100644 --- a/hw/riscv/sifive_u.c +++ b/hw/riscv/sifive_u.c @@ -72,7 +72,7 @@ static uint64_t load_kernel(const char *kernel_filename) if (load_elf(kernel_filename, NULL, NULL, &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) < 0) { - error_report("qemu: could not load kernel '%s'", kernel_filename); + error_report("could not load kernel '%s'", kernel_filename); exit(1); } return kernel_entry; diff --git a/hw/riscv/spike.c b/hw/riscv/spike.c index c8c056c50b..f0bf0d5d67 100644 --- a/hw/riscv/spike.c +++ b/hw/riscv/spike.c @@ -60,7 +60,7 @@ static uint64_t load_kernel(const char *kernel_filename) if (load_elf_ram_sym(kernel_filename, NULL, NULL, &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0, NULL, true, htif_symbol_callback) < 0) { - error_report("qemu: could not load kernel '%s'", kernel_filename); + error_report("could not load kernel '%s'", kernel_filename); exit(1); } return kernel_entry; diff --git a/hw/riscv/virt.c b/hw/riscv/virt.c index 248bbdffd3..818a537844 100644 --- a/hw/riscv/virt.c +++ b/hw/riscv/virt.c @@ -64,7 +64,7 @@ static uint64_t load_kernel(const char *kernel_filename) if (load_elf(kernel_filename, NULL, NULL, &kernel_entry, NULL, &kernel_high, 0, EM_RISCV, 1, 0) < 0) { - error_report("qemu: could not load kernel '%s'", kernel_filename); + error_report("could not load kernel '%s'", kernel_filename); exit(1); } return kernel_entry; @@ -91,7 +91,7 @@ static hwaddr load_initrd(const char *filename, uint64_t mem_size, if (size == -1) { size = load_image_targphys(filename, *start, mem_size - *start); if (size == -1) { - error_report("qemu: could not load ramdisk '%s'", filename); + error_report("could not load ramdisk '%s'", filename); exit(1); } } From c468e368e102e8bb93cbbf1c3daa0c04d361d3c4 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Fri, 10 Aug 2018 13:55:53 +0200 Subject: [PATCH 4/4] MAINTAINERS: Fix F: patterns that don't match anything Commit ba51ef25571 moved hw/dma/sun4m_iommu.c to hw/sparc/sun4m_iommu.c without updating MAINTAINERS. Commit f5980f757c0 deleted include/hw/sparc/sun4m.h without updating MAINTAINERS. Commit 0bcc8e5bd8d fat-fingered tests/check-block-qdict.c. Commit 33e9e9bd62d fat-fingered include/qemu/job.h. Commit eb815e248f5 moved qapi-schema.json to qapi/ without updating MAINTAINERS. Commit 2e3c8f8dbdd converted docs/devel/migration.txt to docs/devel/migration.rst without updating MAINTAINERS. Offenders tracked down with the following shell loop: shopt -s nullglob for i in `sed -n 's/^F: //p' Message-Id: <20180810115553.32604-1-armbru@redhat.com> Reviewed-by: Eric Blake Reviewed-by: Thomas Huth --- MAINTAINERS | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/MAINTAINERS b/MAINTAINERS index aa1dd76dc2..c8480e8640 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -889,12 +889,11 @@ Sun4m M: Mark Cave-Ayland S: Maintained F: hw/sparc/sun4m.c +F: hw/sparc/sun4m_iommu.c F: hw/dma/sparc32_dma.c -F: hw/dma/sun4m_iommu.c F: hw/misc/eccmemctl.c F: hw/misc/slavio_misc.c F: include/hw/sparc/sparc32_dma.h -F: include/hw/sparc/sun4m.h F: pc-bios/openbios-sparc32 Sun4u @@ -1422,7 +1421,7 @@ F: qemu-io* F: tests/qemu-iotests/ F: util/qemu-progress.c F: qobject/block-qdict.c -F: test/check-block-qdict.c +F: tests/check-block-qdict.c T: git git://repo.or.cz/qemu/kevin.git block Block I/O path @@ -1455,7 +1454,7 @@ F: blockjob.c F: include/block/blockjob.h F: job.c F: job-qmp.c -F: include/block/job.h +F: include/qemu/job.h F: block/backup.c F: block/commit.c F: block/stream.c @@ -1671,7 +1670,6 @@ QAPI Schema M: Eric Blake M: Markus Armbruster S: Supported -F: qapi-schema.json F: qapi/*.json T: git git://repo.or.cz/qemu/armbru.git qapi-next @@ -1790,7 +1788,7 @@ F: migration/ F: scripts/vmstate-static-checker.py F: tests/vmstate-static-checker-data/ F: tests/migration-test.c -F: docs/devel/migration.txt +F: docs/devel/migration.rst F: qapi/migration.json Seccomp