Re: [PULL v2 00/61] Misc patches for soft freeze

2020-03-17 Thread Philippe Mathieu-Daudé

On 3/17/20 3:47 PM, Paolo Bonzini wrote:

On 17/03/20 15:26, Stefan Hajnoczi wrote:

Yes, looks like the compiler can't figure out the control flow on
NetBSD.

We could drop the WITH_QEMU_LOCK_GUARD() macro and use this idiom
instead:

   {
   QEMU_LOCK_GUARD();
   ...
   }

But it's unusual for C code to create scopes without a statement (for,
if, while).


After staring at compiler dumps for a while I have just concluded that
this could actually be considered a bug in WITH_QEMU_LOCK_GUARD.

QEMU_MAKE_LOCKABLE returns NULL if passed a NULL argument.  This is the
root cause of the NetBSD failure, as the compiler doesn't figure out
that _list->active_timers_lock is non-NULL and therefore doesn't
simplify the qemu_make_lockable function.

But why does that cause an uninitialized variable warning?  Because if
WITH_QEMU_LOCK_GUARD were passed NULL, it would not execute its body!

So I'm going to squash the following in the series, mostly through a new
patch "lockable: introduce QEMU_MAKE_LOCKABLE_NONNULL":

diff --git a/include/qemu/lockable.h b/include/qemu/lockable.h
index 44b3f4b..1aeb2cb 100644
--- a/include/qemu/lockable.h
+++ b/include/qemu/lockable.h
@@ -67,7 +67,7 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
   * In C++ it would be different, but then C++ wouldn't need QemuLockable
   * either...
   */
-#define QEMU_MAKE_LOCKABLE_(x) qemu_make_lockable((x), &(QemuLockable) {\
+#define QEMU_MAKE_LOCKABLE_(x) (&(QemuLockable) {\
  .object = (x),   \
  .lock = QEMU_LOCK_FUNC(x),   \
  .unlock = QEMU_UNLOCK_FUNC(x),   \
@@ -75,14 +75,27 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
  
  /* QEMU_MAKE_LOCKABLE - Make a polymorphic QemuLockable

   *
- * @x: a lock object (currently one of QemuMutex, CoMutex, QemuSpin).
+ * @x: a lock object (currently one of QemuMutex, QemuRecMutex, CoMutex, 
QemuSpin).
   *
   * Returns a QemuLockable object that can be passed around
- * to a function that can operate with locks of any kind.
+ * to a function that can operate with locks of any kind, or
+ * NULL if @x is %NULL.
   */
  #define QEMU_MAKE_LOCKABLE(x)\
  QEMU_GENERIC(x,  \
   (QemuLockable *, (x)),  \
+ qemu_make_lockable((x), QEMU_MAKE_LOCKABLE_(x)))
+
+/* QEMU_MAKE_LOCKABLE_NONNULL - Make a polymorphic QemuLockable
+ *
+ * @x: a lock object (currently one of QemuMutex, QemuRecMutex, CoMutex, 
QemuSpin).
+ *
+ * Returns a QemuLockable object that can be passed around
+ * to a function that can operate with locks of any kind.
+ */
+#define QEMU_MAKE_LOCKABLE_NONNULL(x)\
+QEMU_GENERIC(x,  \
+ (QemuLockable *, (x)),  \
   QEMU_MAKE_LOCKABLE_(x))
  
  static inline void qemu_lockable_lock(QemuLockable *x)

@@ -112,7 +125,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(QemuLockable, 
qemu_lockable_auto_unlock)
  
  #define WITH_QEMU_LOCK_GUARD_(x, var) \

  for (g_autoptr(QemuLockable) var = \
-qemu_lockable_auto_lock(QEMU_MAKE_LOCKABLE((x))); \
+qemu_lockable_auto_lock(QEMU_MAKE_LOCKABLE_NONNULL((x))); \
   var; \
   qemu_lockable_auto_unlock(var), var = NULL)
  


So thank you NetBSD compiler, I guess. :P


Yep, new patch looks good.

Reviewed-by: Philippe Mathieu-Daudé 



Paolo






Re: [PULL v2 00/61] Misc patches for soft freeze

2020-03-17 Thread Paolo Bonzini
On 17/03/20 15:26, Stefan Hajnoczi wrote:
> Yes, looks like the compiler can't figure out the control flow on
> NetBSD.
> 
> We could drop the WITH_QEMU_LOCK_GUARD() macro and use this idiom
> instead:
> 
>   {
>   QEMU_LOCK_GUARD();
>   ...
>   }
> 
> But it's unusual for C code to create scopes without a statement (for,
> if, while).

After staring at compiler dumps for a while I have just concluded that 
this could actually be considered a bug in WITH_QEMU_LOCK_GUARD.

QEMU_MAKE_LOCKABLE returns NULL if passed a NULL argument.  This is the 
root cause of the NetBSD failure, as the compiler doesn't figure out 
that _list->active_timers_lock is non-NULL and therefore doesn't 
simplify the qemu_make_lockable function.

But why does that cause an uninitialized variable warning?  Because if 
WITH_QEMU_LOCK_GUARD were passed NULL, it would not execute its body!

So I'm going to squash the following in the series, mostly through a new
patch "lockable: introduce QEMU_MAKE_LOCKABLE_NONNULL":

diff --git a/include/qemu/lockable.h b/include/qemu/lockable.h
index 44b3f4b..1aeb2cb 100644
--- a/include/qemu/lockable.h
+++ b/include/qemu/lockable.h
@@ -67,7 +67,7 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
  * In C++ it would be different, but then C++ wouldn't need QemuLockable
  * either...
  */
-#define QEMU_MAKE_LOCKABLE_(x) qemu_make_lockable((x), &(QemuLockable) {\
+#define QEMU_MAKE_LOCKABLE_(x) (&(QemuLockable) {\
 .object = (x),   \
 .lock = QEMU_LOCK_FUNC(x),   \
 .unlock = QEMU_UNLOCK_FUNC(x),   \
@@ -75,14 +75,27 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
 
 /* QEMU_MAKE_LOCKABLE - Make a polymorphic QemuLockable
  *
- * @x: a lock object (currently one of QemuMutex, CoMutex, QemuSpin).
+ * @x: a lock object (currently one of QemuMutex, QemuRecMutex, CoMutex, 
QemuSpin).
  *
  * Returns a QemuLockable object that can be passed around
- * to a function that can operate with locks of any kind.
+ * to a function that can operate with locks of any kind, or
+ * NULL if @x is %NULL.
  */
 #define QEMU_MAKE_LOCKABLE(x)\
 QEMU_GENERIC(x,  \
  (QemuLockable *, (x)),  \
+ qemu_make_lockable((x), QEMU_MAKE_LOCKABLE_(x)))
+
+/* QEMU_MAKE_LOCKABLE_NONNULL - Make a polymorphic QemuLockable
+ *
+ * @x: a lock object (currently one of QemuMutex, QemuRecMutex, CoMutex, 
QemuSpin).
+ *
+ * Returns a QemuLockable object that can be passed around
+ * to a function that can operate with locks of any kind.
+ */
+#define QEMU_MAKE_LOCKABLE_NONNULL(x)\
+QEMU_GENERIC(x,  \
+ (QemuLockable *, (x)),  \
  QEMU_MAKE_LOCKABLE_(x))
 
 static inline void qemu_lockable_lock(QemuLockable *x)
@@ -112,7 +125,7 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(QemuLockable, 
qemu_lockable_auto_unlock)
 
 #define WITH_QEMU_LOCK_GUARD_(x, var) \
 for (g_autoptr(QemuLockable) var = \
-qemu_lockable_auto_lock(QEMU_MAKE_LOCKABLE((x))); \
+qemu_lockable_auto_lock(QEMU_MAKE_LOCKABLE_NONNULL((x))); \
  var; \
  qemu_lockable_auto_unlock(var), var = NULL)
 

So thank you NetBSD compiler, I guess. :P

Paolo



signature.asc
Description: OpenPGP digital signature


Re: [PULL v2 00/61] Misc patches for soft freeze

2020-03-17 Thread Stefan Hajnoczi
On Tue, Mar 17, 2020 at 01:02:48PM +0100, Philippe Mathieu-Daudé wrote:
> Cc'ing Stefan
> 
> On 3/17/20 12:03 PM, Peter Maydell wrote:
> > On Mon, 16 Mar 2020 at 22:07, Paolo Bonzini  wrote:
> > > 
> > > The following changes since commit 
> > > a98135f727595382e200d04c2996e868b7925a01:
> > > 
> > >Merge remote-tracking branch 
> > > 'remotes/kraxel/tags/vga-20200316-pull-request' into staging (2020-03-16 
> > > 14:55:59 +)
> > > 
> > > are available in the git repository at:
> > > 
> > > 
> > >git://github.com/bonzini/qemu.git tags/for-upstream
> > > 
> > > for you to fetch changes up to 9d04fea181318684a899fadd99cef7e04097456b:
> > > 
> > >hw/arm: Let devices own the MemoryRegion they create (2020-03-16 
> > > 23:02:30 +0100)
> > > 
> > > 
> > > * Bugfixes all over the place
> > > * get/set_uint cleanups (Felipe)
> > > * Lock guard support (Stefan)
> > > * MemoryRegion ownership cleanup (Philippe)
> > > * AVX512 optimization for buffer_is_zero (Robert)
> > 
> > Hi; this generates a new warning on netbsd:
> > 
> > /home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c: In function
> > 'timerlist_expired':
> > /home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c:197:12: warning:
> > 'expire_time' may be used uninitialized in this function
> > [-Wmaybe-uninitialized]
> >   return expire_time <= qemu_clock_get_ns(timer_list->clock->type);
> >  ^
> > /home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c: In function
> > 'timerlist_deadline_ns':
> > /home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c:235:11: warning:
> > 'expire_time' may be used uninitialized in this function
> > [-Wmaybe-uninitialized]
> >   delta = expire_time - qemu_clock_get_ns(timer_list->clock->type);
> > ^
> > 
> > This is probably just the compiler being not smart enough
> > to figure out that there's no code path where it's not
> > initialized.

Yes, looks like the compiler can't figure out the control flow on
NetBSD.

We could drop the WITH_QEMU_LOCK_GUARD() macro and use this idiom
instead:

  {
  QEMU_LOCK_GUARD();
  ...
  }

But it's unusual for C code to create scopes without a statement (for,
if, while).

Opinions?

Stefan


signature.asc
Description: PGP signature


Re: [PULL v2 00/61] Misc patches for soft freeze

2020-03-17 Thread Philippe Mathieu-Daudé

Cc'ing Stefan

On 3/17/20 12:03 PM, Peter Maydell wrote:

On Mon, 16 Mar 2020 at 22:07, Paolo Bonzini  wrote:


The following changes since commit a98135f727595382e200d04c2996e868b7925a01:

   Merge remote-tracking branch 'remotes/kraxel/tags/vga-20200316-pull-request' 
into staging (2020-03-16 14:55:59 +)

are available in the git repository at:


   git://github.com/bonzini/qemu.git tags/for-upstream

for you to fetch changes up to 9d04fea181318684a899fadd99cef7e04097456b:

   hw/arm: Let devices own the MemoryRegion they create (2020-03-16 23:02:30 
+0100)


* Bugfixes all over the place
* get/set_uint cleanups (Felipe)
* Lock guard support (Stefan)
* MemoryRegion ownership cleanup (Philippe)
* AVX512 optimization for buffer_is_zero (Robert)


Hi; this generates a new warning on netbsd:

/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c: In function
'timerlist_expired':
/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c:197:12: warning:
'expire_time' may be used uninitialized in this function
[-Wmaybe-uninitialized]
  return expire_time <= qemu_clock_get_ns(timer_list->clock->type);
 ^
/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c: In function
'timerlist_deadline_ns':
/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c:235:11: warning:
'expire_time' may be used uninitialized in this function
[-Wmaybe-uninitialized]
  delta = expire_time - qemu_clock_get_ns(timer_list->clock->type);
^

This is probably just the compiler being not smart enough
to figure out that there's no code path where it's not
initialized.

thanks
-- PMM






Re: [PULL v2 00/61] Misc patches for soft freeze

2020-03-17 Thread Peter Maydell
On Mon, 16 Mar 2020 at 22:07, Paolo Bonzini  wrote:
>
> The following changes since commit a98135f727595382e200d04c2996e868b7925a01:
>
>   Merge remote-tracking branch 
> 'remotes/kraxel/tags/vga-20200316-pull-request' into staging (2020-03-16 
> 14:55:59 +)
>
> are available in the git repository at:
>
>
>   git://github.com/bonzini/qemu.git tags/for-upstream
>
> for you to fetch changes up to 9d04fea181318684a899fadd99cef7e04097456b:
>
>   hw/arm: Let devices own the MemoryRegion they create (2020-03-16 23:02:30 
> +0100)
>
> 
> * Bugfixes all over the place
> * get/set_uint cleanups (Felipe)
> * Lock guard support (Stefan)
> * MemoryRegion ownership cleanup (Philippe)
> * AVX512 optimization for buffer_is_zero (Robert)

Hi; this generates a new warning on netbsd:

/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c: In function
'timerlist_expired':
/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c:197:12: warning:
'expire_time' may be used uninitialized in this function
[-Wmaybe-uninitialized]
 return expire_time <= qemu_clock_get_ns(timer_list->clock->type);
^
/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c: In function
'timerlist_deadline_ns':
/home/qemu/qemu-test.N42OXz/src/util/qemu-timer.c:235:11: warning:
'expire_time' may be used uninitialized in this function
[-Wmaybe-uninitialized]
 delta = expire_time - qemu_clock_get_ns(timer_list->clock->type);
   ^

This is probably just the compiler being not smart enough
to figure out that there's no code path where it's not
initialized.

thanks
-- PMM



[PULL v2 00/61] Misc patches for soft freeze

2020-03-16 Thread Paolo Bonzini
The following changes since commit a98135f727595382e200d04c2996e868b7925a01:

  Merge remote-tracking branch 'remotes/kraxel/tags/vga-20200316-pull-request' 
into staging (2020-03-16 14:55:59 +)

are available in the git repository at:


  git://github.com/bonzini/qemu.git tags/for-upstream

for you to fetch changes up to 9d04fea181318684a899fadd99cef7e04097456b:

  hw/arm: Let devices own the MemoryRegion they create (2020-03-16 23:02:30 
+0100)


* Bugfixes all over the place
* get/set_uint cleanups (Felipe)
* Lock guard support (Stefan)
* MemoryRegion ownership cleanup (Philippe)
* AVX512 optimization for buffer_is_zero (Robert)


v1->v2: fix for clang build

Christian Ehrhardt (1):
  modules: load modules from versioned /var/run dir

Christophe de Dinechin (1):
  scsi/qemu-pr-helper: Fix out-of-bounds access to trnptid_list[]

Colin Xu (1):
  MAINTAINERS: Add entry for Guest X86 HAXM CPUs

Dr. David Alan Gilbert (1):
  exec/rom_reset: Free rom data during inmigrate skip

Eduardo Habkost (1):
  Use -isystem for linux-headers dir

Felipe Franciosi (4):
  qom/object: enable setter for uint types
  ich9: fix getter type for sci_int property
  ich9: Simplify ich9_lpc_initfn
  qom/object: Use common get/set uint helpers

Jan Kiszka (1):
  hw/i386/intel_iommu: Fix out-of-bounds access on guest IRT

Joe Richey (1):
  optionrom/pvh: scan entire RSDP Area

Julio Faracco (1):
  i386: Fix GCC warning with snprintf when HAX is enabled

Kashyap Chamarthy (1):
  qemu-cpu-models.rst: Document -noTSX, mds-no, taa-no, and tsx-ctrl

Longpeng (Mike) (1):
  cpus: avoid pause_all_vcpus getting stuck due to race

Marc-André Lureau (1):
  build-sys: do not make qemu-ga link with pixman

Matt Borgerson (1):
  memory: Fix start offset for bitmap log_clear hook

Paolo Bonzini (1):
  oslib-posix: initialize mutex and condition variable

Peter Maydell (1):
  softmmu/vl.c: Handle '-cpu help' and '-device help' before 'no default 
machine'

Philippe Mathieu-Daudé (36):
  misc: Replace zero-length arrays with flexible array member (automatic)
  misc: Replace zero-length arrays with flexible array member (manual)
  configure: Fix building with SASL on Windows
  tests/docker: Install SASL library to extend code coverage on amd64
  Makefile: Align 'help' target output
  Makefile: Let the 'help' target list the tools targets
  hw/audio/fmopl: Move ENV_CURVE to .heap to save 32KiB of .bss
  hw/audio/intel-hda: Use memory region alias to reduce .rodata by 4.34MB
  hw/usb/quirks: Use smaller types to reduce .rodata by 10KiB
  ui/curses: Make control_characters[] array const
  ui/curses: Move arrays to .heap to save 74KiB of .bss
  memory: Correctly return alias region type
  memory: Simplify memory_region_init_rom_nomigrate() to ease review
  scripts/cocci: Rename memory-region-{init-ram -> housekeeping}
  scripts/cocci: Patch to replace memory_region_init_{ram,readonly -> rom}
  hw/arm: Use memory_region_init_rom() with read-only regions
  hw/display: Use memory_region_init_rom() with read-only regions
  hw/m68k: Use memory_region_init_rom() with read-only regions
  hw/net: Use memory_region_init_rom() with read-only regions
  hw/pci-host: Use memory_region_init_rom() with read-only regions
  hw/ppc: Use memory_region_init_rom() with read-only regions
  hw/riscv: Use memory_region_init_rom() with read-only regions
  hw/sh4: Use memory_region_init_rom() with read-only regions
  hw/sparc: Use memory_region_init_rom() with read-only regions
  scripts/cocci: Patch to detect potential use of memory_region_init_rom
  scripts/cocci: Patch to remove unnecessary memory_region_set_readonly()
  scripts/cocci: Patch to let devices own their MemoryRegions
  hw/core: Let devices own the MemoryRegion they create
  hw/display: Let devices own the MemoryRegion they create
  hw/dma: Let devices own the MemoryRegion they create
  hw/riscv: Let devices own the MemoryRegion they create
  hw/char: Let devices own the MemoryRegion they create
  hw/arm/stm32: Use memory_region_init_rom() with read-only regions
  hw/ppc/ppc405: Use memory_region_init_rom() with read-only regions
  hw/arm: Remove unnecessary memory_region_set_readonly() on ROM alias
  hw/arm: Let devices own the MemoryRegion they create

Robert Hoo (2):
  configure: add configure option avx512f_opt
  util: add util function buffer_zero_avx512()

Stefan Hajnoczi (2):
  lockable: add lock guards
  lockable: add QemuRecMutex support

Sunil Muthuswamy (3):
  WHPX: TSC get and set should be dependent on VM state
  WHPX: Use QEMU values for trapped CPUID
  WHPX: Use proper synchronization primitives while processing

 MAINTAINERS