All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Eric Blake <eblake@redhat.com>
Cc: Paolo Bonzini <pbonzini@redhat.com>, qemu-devel@nongnu.org
Subject: Re: [PULL 25/31] osdep: Make MIN/MAX evaluate arguments only once
Date: Wed, 24 Jun 2020 13:21:52 +0100	[thread overview]
Message-ID: <20200624122152.GJ774096@redhat.com> (raw)
In-Reply-To: <1101afa3-7523-4408-8918-265b1f2dbc3b@redhat.com>

On Wed, Jun 24, 2020 at 07:13:17AM -0500, Eric Blake wrote:
> On 6/24/20 5:50 AM, Paolo Bonzini wrote:
> > From: Eric Blake <eblake@redhat.com>
> > 
> > I'm not aware of any immediate bugs in qemu where a second runtime
> > evalution of the arguments to MIN() or MAX() causes a problem, but
> 
> evaluation
> 
> > Update the MIN/MAX macros to only evaluate their argument once at
> > runtime;
> 
> > Use of MIN when MIN_CONST is needed:
> > 
> > In file included from /home/eblake/qemu/qemu-img.c:25:
> > /home/eblake/qemu/include/qemu/osdep.h:249:5: error: braced-group within expression allowed only inside a function
> >    249 |     ({                                                  \
> >        |     ^
> > /home/eblake/qemu/qemu-img.c:92:12: note: in expansion of macro ‘MIN’
> 
> UTF-8 mojibake in the commit message ;(
> 
> 
> > Signed-off-by: Eric Blake <eblake@redhat.com>
> > 
> > Message-Id: <20200604215236.2798244-1-eblake@redhat.com>
> > Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
> > ---
> 
> > +#define MIN_CONST(a, b)                                         \
> > +    __builtin_choose_expr(                                      \
> > +        __builtin_constant_p(a) && __builtin_constant_p(b),     \
> > +        (a) < (b) ? (a) : (b),                                  \
> > +        ((void)0))
> 
> This one is correct...
> 
> > +#undef MAX
> > +#define MAX(a, b)                                       \
> > +    ({                                                  \
> > +        typeof(1 ? (a) : (b)) _a = (a), _b = (b);       \
> > +        _a > _b ? _a : _b;                              \
> > +    })
> > +#define MAX_CONST(a, b)                                         \
> > +    __builtin_choose_expr(                                      \
> > +        __builtin_constant_p(a) && __builtin_constant_p(b),     \
> > +        (a) > (b) ? (a) : (b),                                  \
> > +        __builtin_unreachable())
> 
> ...but this one should also use ((void)0), to match the commit message.
> 
> > +
> > +/* Minimum function that returns zero only if both values are zero.
> >    * Intended for use with unsigned values only. */
> 
> And checkpatch complains about the formatting here.
> 
> Ah well.  I had all these things fixed in my tree, but failed to post a v5.
> Not worth holding up this pull request in isolation, but if there are any
> other build issues, I'll post a v5 of this patch, otherwise a followup.

FWIW, the current QEMU code defining MIN/MAX was a no-op, since they
were already defined by GLib in /usr/include/glib-2.0/glib/gmacros.h
which we get via glib.h

Now, the GLib impl shared the same theoretical flaw as the old QEMU
impl, but you said it wasn't a real problem right now.

So I'm wondering if the better option would be to remove the MIN/MAX
def from QEMU, and then submit a pull request to GLib to improve
their definition ?

Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|



  reply	other threads:[~2020-06-24 12:22 UTC|newest]

Thread overview: 39+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-06-24 10:48 [PULL 00/31] Misc patches for 2020-06-24 Paolo Bonzini
2020-06-24 10:50 ` [PULL 01/31] kvm: support to get/set dirty log initial-all-set capability Paolo Bonzini
2020-06-24 10:50 ` [PULL 02/31] util/getauxval: Porting to FreeBSD getauxval feature Paolo Bonzini
2020-06-24 10:50 ` [PULL 03/31] libqos: usb-hcd-ehci: use 32-bit write for config register Paolo Bonzini
2020-06-24 10:50 ` [PULL 04/31] libqos: pci-pc: use 32-bit write for EJ register Paolo Bonzini
2020-06-24 10:50 ` [PULL 05/31] memory: Revert "memory: accept mismatching sizes in memory_region_access_valid" Paolo Bonzini
2020-06-24 10:50 ` [PULL 06/31] replay: notify the main loop when there are no instructions Paolo Bonzini
2020-06-24 10:50 ` [PULL 07/31] replay: synchronize on every virtual timer callback Paolo Bonzini
2020-06-24 10:50 ` [PULL 08/31] configure: add libdaxctl support Paolo Bonzini
2020-06-24 10:50 ` [PULL 09/31] exec: fetch the alignment of Linux devdax pmem character device nodes Paolo Bonzini
2020-06-24 10:50 ` [PULL 10/31] docs/nvdimm: add description of alignment requirement of device dax Paolo Bonzini
2020-06-24 10:50 ` [PULL 11/31] hw/scsi/megasas: Fix possible out-of-bounds array access in tracepoints Paolo Bonzini
2020-06-24 10:50 ` [PULL 12/31] Makefile: Install qemu-[qmp/ga]-ref.* into the directory "interop" Paolo Bonzini
2020-06-24 10:50 ` [PULL 13/31] xen: Actually fix build without passthrough Paolo Bonzini
2020-06-24 10:50 ` [PULL 14/31] target/i386: reimplement f2xm1 using floatx80 operations Paolo Bonzini
2020-07-14 14:09   ` Laszlo Ersek
2020-06-24 10:50 ` [PULL 15/31] softfloat: merge floatx80_mod and floatx80_rem Paolo Bonzini
2020-06-24 10:50 ` [PULL 16/31] softfloat: fix floatx80 remainder pseudo-denormal check for zero Paolo Bonzini
2020-06-24 10:50 ` [PULL 17/31] softfloat: do not return pseudo-denormal from floatx80 remainder Paolo Bonzini
2020-06-24 10:50 ` [PULL 18/31] softfloat: do not set denominator high bit for " Paolo Bonzini
2020-06-24 10:50 ` [PULL 19/31] softfloat: return low bits of quotient from floatx80_modrem Paolo Bonzini
2020-06-24 10:50 ` [PULL 20/31] target/i386: reimplement fprem, fprem1 using floatx80 operations Paolo Bonzini
2020-06-24 10:50 ` [PULL 21/31] target/i386: reimplement fyl2xp1 " Paolo Bonzini
2020-06-24 10:50 ` [PULL 22/31] target/i386: reimplement fyl2x " Paolo Bonzini
2020-06-24 10:50 ` [PULL 23/31] target/i386: reimplement fpatan " Paolo Bonzini
2020-06-24 10:50 ` [PULL 24/31] target/i386: Add notes for versioned CPU models Paolo Bonzini
2020-06-24 10:50 ` [PULL 25/31] osdep: Make MIN/MAX evaluate arguments only once Paolo Bonzini
2020-06-24 12:13   ` Eric Blake
2020-06-24 12:21     ` Daniel P. Berrangé [this message]
2020-06-24 13:19     ` Philippe Mathieu-Daudé
2020-06-24 10:50 ` [PULL 26/31] numa: forbid '-numa node, mem' for 5.1 and newer machine types Paolo Bonzini
2020-06-24 10:50 ` [PULL 27/31] kvm: i386: allow TSC to differ by NTP correction bounds without TSC scaling Paolo Bonzini
2020-06-24 10:50 ` [PULL 28/31] hyperv: vmbus: Remove the 2nd IRQ Paolo Bonzini
2020-06-24 10:50 ` [PULL 29/31] vmport: move compat properties to hw_compat_5_0 Paolo Bonzini
2020-06-24 10:50 ` [PULL 30/31] ibex_uart: fix XOR-as-pow Paolo Bonzini
2020-06-24 10:50 ` [PULL 31/31] i386: Mask SVM features if nested SVM is disabled Paolo Bonzini
2020-06-24 11:29 ` [PULL 00/31] Misc patches for 2020-06-24 no-reply
2020-06-25 15:50 ` Peter Maydell
2020-06-25 16:33   ` Eric Blake

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=20200624122152.GJ774096@redhat.com \
    --to=berrange@redhat.com \
    --cc=eblake@redhat.com \
    --cc=pbonzini@redhat.com \
    --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.