From patchwork Mon Mar 5 23:15:07 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martin Wilck X-Patchwork-Id: 10260253 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 4F92C60134 for ; Mon, 5 Mar 2018 23:16:29 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 4236928A1D for ; Mon, 5 Mar 2018 23:16:29 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 371A028B76; Mon, 5 Mar 2018 23:16:29 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.9 required=2.0 tests=BAYES_00,RCVD_IN_DNSWL_HI autolearn=ham version=3.3.1 Received: from mx1.redhat.com (mx1.redhat.com [209.132.183.28]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id C372728A1D for ; Mon, 5 Mar 2018 23:16:28 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 17FD94DD49; Mon, 5 Mar 2018 23:16:28 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.21]) by smtp.corp.redhat.com (Postfix) with ESMTPS id CC9CD6062A; Mon, 5 Mar 2018 23:16:27 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id A05AC4A477; Mon, 5 Mar 2018 23:16:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx03.intmail.prod.int.phx2.redhat.com [10.5.11.13]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id w25NGKDJ017452 for ; Mon, 5 Mar 2018 18:16:20 -0500 Received: by smtp.corp.redhat.com (Postfix) id ECC0117F4A; Mon, 5 Mar 2018 23:16:20 +0000 (UTC) Delivered-To: dm-devel@redhat.com Received: from mx1.redhat.com (ext-mx09.extmail.prod.ext.phx2.redhat.com [10.5.110.38]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 12A9F17F49; Mon, 5 Mar 2018 23:16:18 +0000 (UTC) Received: from smtp.nue.novell.com (smtp.nue.novell.com [195.135.221.5]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6DD9D49012; Mon, 5 Mar 2018 23:16:16 +0000 (UTC) Received: from emea4-mta.ukb.novell.com ([10.120.13.87]) by smtp.nue.novell.com with ESMTP (TLS encrypted); Tue, 06 Mar 2018 00:16:14 +0100 Received: from apollon.suse.de.de (nwb-a10-snat.microfocus.com [10.120.13.202]) by emea4-mta.ukb.novell.com with ESMTP (TLS encrypted); Mon, 05 Mar 2018 23:15:43 +0000 From: Martin Wilck To: Christophe Varoqui Date: Tue, 6 Mar 2018 00:15:07 +0100 Message-Id: <20180305231507.10386-24-mwilck@suse.com> In-Reply-To: <20180305231507.10386-1-mwilck@suse.com> References: <20180305231507.10386-1-mwilck@suse.com> X-Greylist: Sender passed SPF test, Sender IP whitelisted by DNSRBL, ACL 207 matched, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 05 Mar 2018 23:16:17 +0000 (UTC) X-Greylist: inspected by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 05 Mar 2018 23:16:17 +0000 (UTC) for IP:'195.135.221.5' DOMAIN:'smtp.nue.novell.com' HELO:'smtp.nue.novell.com' FROM:'mwilck@suse.com' RCPT:'' X-RedHat-Spam-Score: -2.301 (RCVD_IN_DNSWL_MED, SPF_PASS) 195.135.221.5 smtp.nue.novell.com 195.135.221.5 smtp.nue.novell.com X-Scanned-By: MIMEDefang 2.78 on 10.5.110.38 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-loop: dm-devel@redhat.com Cc: dm-devel@redhat.com, Martin Wilck Subject: [dm-devel] [PATCH v2 23/23] multipathd: fix signal blocking logic X-BeenThere: dm-devel@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: device-mapper development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: dm-devel-bounces@redhat.com Errors-To: dm-devel-bounces@redhat.com X-Scanned-By: MIMEDefang 2.79 on 10.5.11.13 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.38]); Mon, 05 Mar 2018 23:16:28 +0000 (UTC) X-Virus-Scanned: ClamAV using ClamSMTP multipathd is supposed to block all signals in all threads, except the uxlsnr thread which handles termination and reconfiguration signals (SIGUSR1) in its ppoll() call, SIGUSR2 in the waiter thread and the marginal path checker thread, and occasional SIGALRM. The current logic does exactly the oppsite, it blocks termination signals in SIGPOLL and allows multipathd to be killed e.g. by SIGALRM. Fix that by inverting the logic. The argument to pthread_sigmask and ppoll is the set of *blocked* signals, not vice versa. The marginal paths code needs to unblock SIGUSR2 now explicity, as the dm-event waiter code already does. Doing this with pselect() avoids asynchronous cancellation. Fixes: 810082e "libmultipath, multipathd: Rework SIGPIPE handling" Fixes: 534ec4c "multipathd: Ensure that SIGINT, SIGTERM, SIGHUP and SIGUSR1 are delivered to the uxsock thread" Signed-off-by: Martin Wilck Reviewed-by: Hannes Reinecke Reviewed-by: Benjamin Marzinski --- libmultipath/io_err_stat.c | 17 ++++++++++++++++- multipathd/main.c | 7 +++++-- multipathd/uxlsnr.c | 10 +++++----- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/libmultipath/io_err_stat.c b/libmultipath/io_err_stat.c index 5b10f0372f9f..00bac9e0e755 100644 --- a/libmultipath/io_err_stat.c +++ b/libmultipath/io_err_stat.c @@ -21,6 +21,7 @@ #include #include #include +#include #include "vector.h" #include "memory.h" @@ -691,14 +692,28 @@ static void service_paths(void) static void *io_err_stat_loop(void *data) { + sigset_t set; + vecs = (struct vectors *)data; pthread_cleanup_push(rcu_unregister, NULL); rcu_register_thread(); + sigfillset(&set); + sigdelset(&set, SIGUSR2); + mlockall(MCL_CURRENT | MCL_FUTURE); while (1) { + struct timespec ts; + service_paths(); - usleep(100000); + + ts.tv_sec = 0; + ts.tv_nsec = 100 * 1000 * 1000; + /* + * pselect() with no fds, a timeout, and a sigmask: + * sleep for 100ms and react on SIGUSR2. + */ + pselect(1, NULL, NULL, NULL, &ts, &set); } pthread_cleanup_pop(1); diff --git a/multipathd/main.c b/multipathd/main.c index 4abdd8f071c3..68595836d723 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -2261,10 +2261,13 @@ signal_init(void) { sigset_t set; - sigemptyset(&set); - sigaddset(&set, SIGUSR2); + /* block all signals */ + sigfillset(&set); + /* SIGPIPE occurs if logging fails */ + sigdelset(&set, SIGPIPE); pthread_sigmask(SIG_SETMASK, &set, NULL); + /* Other signals will be unblocked in the uxlsnr thread */ signal_set(SIGHUP, sighup); signal_set(SIGUSR1, sigusr1); signal_set(SIGUSR2, sigusr2); diff --git a/multipathd/uxlsnr.c b/multipathd/uxlsnr.c index 98ac25a68c43..a2ca36ba1653 100644 --- a/multipathd/uxlsnr.c +++ b/multipathd/uxlsnr.c @@ -170,11 +170,11 @@ void * uxsock_listen(uxsock_trigger_fn uxsock_trigger, void * trigger_data) condlog(0, "uxsock: failed to allocate poll fds"); return NULL; } - sigemptyset(&mask); - sigaddset(&mask, SIGINT); - sigaddset(&mask, SIGTERM); - sigaddset(&mask, SIGHUP); - sigaddset(&mask, SIGUSR1); + sigfillset(&mask); + sigdelset(&mask, SIGINT); + sigdelset(&mask, SIGTERM); + sigdelset(&mask, SIGHUP); + sigdelset(&mask, SIGUSR1); while (1) { struct client *c, *tmp; int i, poll_count, num_clients;