From: Benjamin Marzinski <bmarzins@redhat.com>
To: mwilck@suse.com
Cc: dm-devel@redhat.com
Subject: Re: [dm-devel] [PATCH v3 38/38] libmultipath: avoid -Warray-bounds error in uatomic operations
Date: Thu, 14 Sep 2023 17:31:24 -0500 [thread overview]
Message-ID: <20230914223124.GN7412@octiron.msp.redhat.com> (raw)
In-Reply-To: <20230914145131.15165-4-mwilck@suse.com>
On Thu, Sep 14, 2023 at 04:51:31PM +0200, mwilck@suse.com wrote:
> From: Martin Wilck <mwilck@suse.com>
>
> The use of uatomic_xchg() in alias.c causes a -Warray-bounds error
> on distributions using gcc 12, such as Fedora 37. This is a similar
> error to 2534c4f ("libmultipath: avoid -Warray-bounds error with gcc
> 12 and musl libc"). This happens only with liburcu 0.13 and earlier,
> and only with certain gcc versions. See liburcu commit 835b9ab
> ("Fix: x86 and s390 uatomic: __hp() macro warning with gcc 11").
>
> Enhance the fix for 2534c4f by a adding a workaround for uatomic_xchg(),
> and introduce the macro URCU_VERSION (originally only used for multipathd)
> globally.
>
Reviewed-by: Benjamin Marzinski <bmarzins@redhat.com>
> Signed-off-by: Martin Wilck <mwilck@suse.com>
> ---
> Makefile.inc | 2 +-
> create-config.mk | 5 +++++
> libmultipath/alias.c | 5 +++--
> libmultipath/lock.h | 23 ++++++++++++++---------
> multipathd/Makefile | 2 --
> 5 files changed, 23 insertions(+), 14 deletions(-)
>
> diff --git a/Makefile.inc b/Makefile.inc
> index 6e384e6..04bfa56 100644
> --- a/Makefile.inc
> +++ b/Makefile.inc
> @@ -95,7 +95,7 @@ OPTFLAGS := -O2 -g $(STACKPROT) --param=ssp-buffer-size=4
> WARNFLAGS := -Werror -Wall -Wextra -Wformat=2 $(WFORMATOVERFLOW) -Werror=implicit-int \
> -Werror=implicit-function-declaration -Werror=format-security \
> $(WNOCLOBBERED) -Werror=cast-qual $(ERROR_DISCARDED_QUALIFIERS) $(W_URCU_TYPE_LIMITS)
> -CPPFLAGS := $(FORTIFY_OPT) $(CPPFLAGS) \
> +CPPFLAGS := $(FORTIFY_OPT) $(CPPFLAGS) $(D_URCU_VERSION) \
> -DBIN_DIR=\"$(bindir)\" -DMULTIPATH_DIR=\"$(plugindir)\" \
> -DRUNTIME_DIR=\"$(runtimedir)\" -DCONFIG_DIR=\"$(configdir)\" \
> -DDEFAULT_CONFIGFILE=\"$(configfile)\" -DSTATE_DIR=\"$(statedir)\" \
> diff --git a/create-config.mk b/create-config.mk
> index d125597..4d318b9 100644
> --- a/create-config.mk
> +++ b/create-config.mk
> @@ -73,6 +73,10 @@ TEST_URCU_TYPE_LIMITS = $(shell \
> $(CC) -c -Werror=type-limits -o /dev/null -xc - 2>/dev/null \
> || echo -Wno-type-limits )
>
> +URCU_VERSION = $(shell \
> + $(PKG_CONFIG) --modversion liburcu 2>/dev/null | \
> + awk -F. '{ printf("-DURCU_VERSION=0x%06x", 256 * ( 256 * $$1 + $$2) + $$3); }')
> +
> DEFINES :=
>
> ifneq ($(call check_func,dm_task_no_flush,$(devmapper_incdir)/libdevmapper.h),0)
> @@ -168,6 +172,7 @@ $(TOPDIR)/config.mk: $(multipathdir)/autoconfig.h
> @echo creating $@
> @echo "FPIN_SUPPORT := $(FPIN_SUPPORT)" >$@
> @echo "FORTIFY_OPT := $(FORTIFY_OPT)" >>$@
> + @echo "D_URCU_VERSION := $(call URCU_VERSION)" >>$@
> @echo "SYSTEMD := $(SYSTEMD)" >>$@
> @echo "ANA_SUPPORT := $(ANA_SUPPORT)" >>$@
> @echo "STACKPROT := $(call TEST_CC_OPTION,-fstack-protector-strong,-fstack-protector)" >>$@
> diff --git a/libmultipath/alias.c b/libmultipath/alias.c
> index e5d3f15..74431f3 100644
> --- a/libmultipath/alias.c
> +++ b/libmultipath/alias.c
> @@ -24,6 +24,7 @@
> #include "devmapper.h"
> #include "strbuf.h"
> #include "time-util.h"
> +#include "lock.h"
>
> /*
> * significant parts of this file were taken from iscsi-bindings.c of the
> @@ -300,7 +301,7 @@ void handle_bindings_file_inotify(const struct inotify_event *event)
> pthread_mutex_unlock(×tamp_mutex);
>
> if (changed) {
> - uatomic_xchg(&bindings_file_changed, 1);
> + uatomic_xchg_int(&bindings_file_changed, 1);
> condlog(3, "%s: bindings file must be re-read, new timestamp: %ld.%06ld",
> __func__, (long)ts.tv_sec, (long)ts.tv_nsec / 1000);
> } else
> @@ -775,7 +776,7 @@ static int _read_bindings_file(const struct config *conf, Bindings *bindings,
> int rc = 0, ret, fd;
> FILE *file;
> struct stat st;
> - int has_changed = uatomic_xchg(&bindings_file_changed, 0);
> + int has_changed = uatomic_xchg_int(&bindings_file_changed, 0);
>
> if (!force) {
> if (!has_changed) {
> diff --git a/libmultipath/lock.h b/libmultipath/lock.h
> index 9814be7..ac80d1d 100644
> --- a/libmultipath/lock.h
> +++ b/libmultipath/lock.h
> @@ -13,17 +13,22 @@ struct mutex_lock {
> int waiters; /* uatomic access only */
> };
>
> -#if !defined(__GLIBC__) && defined(__GNUC__) && __GNUC__ == 12
> -#pragma GCC diagnostic push
> -#pragma GCC diagnostic ignored "-Warray-bounds"
> -#endif
> -
> static inline void init_lock(struct mutex_lock *a)
> {
> pthread_mutex_init(&a->mutex, NULL);
> uatomic_set(&a->waiters, 0);
> }
>
> +#if defined(__GNUC__) && __GNUC__ == 12 && URCU_VERSION < 0xe00
> +#pragma GCC diagnostic push
> +#pragma GCC diagnostic ignored "-Warray-bounds"
> +#endif
> +
> +static inline int uatomic_xchg_int(int *ptr, int val)
> +{
> + return uatomic_xchg(ptr, val);
> +}
> +
> static inline void lock(struct mutex_lock *a)
> {
> uatomic_inc(&a->waiters);
> @@ -31,6 +36,10 @@ static inline void lock(struct mutex_lock *a)
> uatomic_dec(&a->waiters);
> }
>
> +#if defined(__GNUC__) && __GNUC__ == 12 && URCU_VERSION < 0xe00
> +#pragma GCC diagnostic pop
> +#endif
> +
> static inline int trylock(struct mutex_lock *a)
> {
> return pthread_mutex_trylock(&a->mutex);
> @@ -51,10 +60,6 @@ static inline bool lock_has_waiters(struct mutex_lock *a)
> return (uatomic_read(&a->waiters) > 0);
> }
>
> -#if !defined(__GLIBC__) && defined(__GNUC__) && __GNUC__ == 12
> -#pragma GCC diagnostic pop
> -#endif
> -
> #define lock_cleanup_pop(a) pthread_cleanup_pop(1)
>
> void cleanup_lock (void * data);
> diff --git a/multipathd/Makefile b/multipathd/Makefile
> index cdba3db..0ba6ecb 100644
> --- a/multipathd/Makefile
> +++ b/multipathd/Makefile
> @@ -5,8 +5,6 @@ CLI := multipathc
> MANPAGES := multipathd.8
>
> CPPFLAGS += -I$(multipathdir) -I$(mpathutildir) -I$(mpathpersistdir) -I$(mpathcmddir) -I$(thirdpartydir) \
> - $(shell $(PKG_CONFIG) --modversion liburcu 2>/dev/null | \
> - awk -F. '{ printf("-DURCU_VERSION=0x%06x", 256 * ( 256 * $$1 + $$2) + $$3); }') \
> -DBINDIR='"$(bindir)"' $(SYSTEMD_CPPFLAGS)
>
> #
> --
> 2.42.0
--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel
prev parent reply other threads:[~2023-09-14 22:31 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-09-14 14:51 [dm-devel] [PATCH v3 00/38] multipath-tools: user-friendly names rework mwilck
2023-09-14 14:51 ` [dm-devel] [PATCH v3 26/38] multipath-tools tests: add test for ordering of bindings mwilck
2023-09-14 21:25 ` Benjamin Marzinski
2023-09-14 14:51 ` [dm-devel] [PATCH v3 27/38] multipathd: watch bindings file with inotify + timestamp mwilck
2023-09-14 22:28 ` Benjamin Marzinski
2023-09-14 14:51 ` [dm-devel] [PATCH v3 38/38] libmultipath: avoid -Warray-bounds error in uatomic operations mwilck
2023-09-14 22:31 ` Benjamin Marzinski [this message]
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=20230914223124.GN7412@octiron.msp.redhat.com \
--to=bmarzins@redhat.com \
--cc=dm-devel@redhat.com \
--cc=mwilck@suse.com \
/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