From patchwork Mon Sep 20 23:21:13 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 12506575 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 44BEAC433F5 for ; Mon, 20 Sep 2021 23:21:38 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E1CAB60ED8 for ; Mon, 20 Sep 2021 23:21:37 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org E1CAB60ED8 Authentication-Results: mail.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1632180096; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=AtFGtyqwDISIGxcfLhbhfuwiZ6cjonRdsBIPx6WIpYA=; b=Z25oP3arB8bMqMwxNgLNwgGS/xnwjz89kWkSCAhYgh972s2N9GltYwWWdwpw0ra1rfz7gi pc6fE4ZQvsl2BkzF2ZrNKnKM3TF5FKbwGBI4Nqk1hYVzT8EY+hTYhIFndD7PHLmojvyxpa zO+2a+2sXN0IW9XBillhnC+P8uQGNBE= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-260-WcRhNvNFMRCOduvF1CkPBA-1; Mon, 20 Sep 2021 19:21:35 -0400 X-MC-Unique: WcRhNvNFMRCOduvF1CkPBA-1 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id A3AAD1808305; Mon, 20 Sep 2021 23:21:30 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 506CD60C9F; Mon, 20 Sep 2021 23:21:30 +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 D3136180598A; Mon, 20 Sep 2021 23:21:27 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 18KNLPk3025899 for ; Mon, 20 Sep 2021 19:21:25 -0400 Received: by smtp.corp.redhat.com (Postfix) id 40AFD6B54D; Mon, 20 Sep 2021 23:21:25 +0000 (UTC) Received: from octiron.msp.redhat.com (unknown [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1A1136B54A; Mon, 20 Sep 2021 23:21:20 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 18KNLIww009336; Mon, 20 Sep 2021 18:21:18 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 18KNLI4H009335; Mon, 20 Sep 2021 18:21:18 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Mon, 20 Sep 2021 18:21:13 -0500 Message-Id: <1632180076-9294-2-git-send-email-bmarzins@redhat.com> In-Reply-To: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> References: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: dm-devel@redhat.com Cc: device-mapper development , Martin Wilck Subject: [dm-devel] [PATCH 1/4] multipathd: move delayed_reconfig out of struct config 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.12 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dm-devel-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com delayed_reconfig was inside the config struct, but it wasn't updated during an RCU write section, so there's no synchronization on it. Instead, pull it out of the config structure, and use the config_lock to synchronize it. Signed-off-by: Benjamin Marzinski Reviewed-by: Martin Wilck --- libmultipath/config.h | 1 - multipathd/main.c | 45 ++++++++++++++++++++++++++++--------------- 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/libmultipath/config.h b/libmultipath/config.h index 933fe0d1..c73389b5 100644 --- a/libmultipath/config.h +++ b/libmultipath/config.h @@ -178,7 +178,6 @@ struct config { int strict_timing; int retrigger_tries; int retrigger_delay; - int delayed_reconfig; int uev_wait_timeout; int skip_kpartx; int remove_retries; diff --git a/multipathd/main.c b/multipathd/main.c index 2b416af9..1ead0904 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -127,6 +127,8 @@ static int poll_dmevents = 1; #endif /* Don't access this variable without holding config_lock */ static volatile enum daemon_status running_state = DAEMON_INIT; +/* Don't access this variable without holding config_lock */ +static bool __delayed_reconfig; pid_t daemon_pid; static pthread_mutex_t config_lock = PTHREAD_MUTEX_INITIALIZER; static pthread_cond_t config_cond; @@ -150,6 +152,23 @@ int should_exit(void) return get_running_state() == DAEMON_SHUTDOWN; } +static bool get_delayed_reconfig(void) +{ + bool val; + + pthread_mutex_lock(&config_lock); + val = __delayed_reconfig; + pthread_mutex_unlock(&config_lock); + return val; +} + +static void set_delayed_reconfig(bool val) +{ + pthread_mutex_lock(&config_lock); + __delayed_reconfig = val; + pthread_mutex_unlock(&config_lock); +} + /* * global copy of vecs for use in sig handlers */ @@ -297,8 +316,10 @@ static void __post_config_state(enum daemon_status state) old_state = DAEMON_IDLE; state = DAEMON_CONFIGURE; } - if (reconfigure_pending && state == DAEMON_CONFIGURE) + if (state == DAEMON_CONFIGURE) { reconfigure_pending = false; + __delayed_reconfig = false; + } running_state = state; pthread_cond_broadcast(&config_cond); do_sd_notify(old_state, state); @@ -765,7 +786,7 @@ int ev_add_map (char * dev, const char * alias, struct vectors * vecs) { struct multipath * mpp; - int delayed_reconfig, reassign_maps; + int reassign_maps; struct config *conf; if (dm_is_mpath(alias) != 1) { @@ -784,12 +805,11 @@ ev_add_map (char * dev, const char * alias, struct vectors * vecs) return 1; } conf = get_multipath_config(); - delayed_reconfig = conf->delayed_reconfig; reassign_maps = conf->reassign_maps; put_multipath_config(conf); if (mpp->wait_for_udev) { mpp->wait_for_udev = 0; - if (delayed_reconfig && + if (get_delayed_reconfig() && !need_to_delay_reconfig(vecs)) { condlog(2, "reconfigure (delayed)"); schedule_reconfigure(); @@ -1791,8 +1811,7 @@ missing_uev_wait_tick(struct vectors *vecs) { struct multipath * mpp; unsigned int i; - int timed_out = 0, delayed_reconfig; - struct config *conf; + int timed_out = 0; vector_foreach_slot (vecs->mpvec, mpp, i) { if (mpp->wait_for_udev && --mpp->uev_wait_tick <= 0) { @@ -1808,10 +1827,7 @@ missing_uev_wait_tick(struct vectors *vecs) } } - conf = get_multipath_config(); - delayed_reconfig = conf->delayed_reconfig; - put_multipath_config(conf); - if (timed_out && delayed_reconfig && + if (timed_out && get_delayed_reconfig() && !need_to_delay_reconfig(vecs)) { condlog(2, "reconfigure (delayed)"); schedule_reconfigure(); @@ -3257,13 +3273,10 @@ child (__attribute__((unused)) void *param) pthread_cleanup_push(cleanup_lock, &vecs->lock); lock(&vecs->lock); pthread_testcancel(); - if (!need_to_delay_reconfig(vecs)) { + if (!need_to_delay_reconfig(vecs)) reconfigure(vecs); - } else { - conf = get_multipath_config(); - conf->delayed_reconfig = 1; - put_multipath_config(conf); - } + else + set_delayed_reconfig(true); lock_cleanup_pop(vecs->lock); post_config_state(DAEMON_IDLE); } From patchwork Mon Sep 20 23:21:14 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 12506579 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C022AC433FE for ; Mon, 20 Sep 2021 23:21:55 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 6BC4F60ED8 for ; Mon, 20 Sep 2021 23:21:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 6BC4F60ED8 Authentication-Results: mail.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1632180114; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=4Oux9j75xZoK+yhw2R6yXcd6RPVB2V7GhSDHBTgIsJM=; b=dBLyKaRsF8QplNqBHU5NWPgbBAA3sb8e2ydlk62WK8JQRTGvNoLTp7DBSz6ZVa82LGY373 pJCJ3io7EhZSp1oUQgdXD9mcvEqHOqIaeOuGWinAqsTFu+x/T1qiZp3KWcRkhr09DXSArQ +hvKKhFBwQZdnjJBcPuKpS5YJ9aYqRs= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-278-JHMwvxDjOMmxAtc2z_KJoQ-1; Mon, 20 Sep 2021 19:21:52 -0400 X-MC-Unique: JHMwvxDjOMmxAtc2z_KJoQ-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 60E4A1084686; Mon, 20 Sep 2021 23:21:48 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 360536D98B; Mon, 20 Sep 2021 23:21:48 +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 D7C971806D01; Mon, 20 Sep 2021 23:21:47 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 18KNLSFh025915 for ; Mon, 20 Sep 2021 19:21:28 -0400 Received: by smtp.corp.redhat.com (Postfix) id D1B0160C9F; Mon, 20 Sep 2021 23:21:28 +0000 (UTC) Received: from octiron.msp.redhat.com (unknown [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 05BDC60C7F; Mon, 20 Sep 2021 23:21:20 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 18KNLJaP009340; Mon, 20 Sep 2021 18:21:19 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 18KNLJAN009339; Mon, 20 Sep 2021 18:21:19 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Mon, 20 Sep 2021 18:21:14 -0500 Message-Id: <1632180076-9294-3-git-send-email-bmarzins@redhat.com> In-Reply-To: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> References: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.12 X-loop: dm-devel@redhat.com Cc: device-mapper development , Martin Wilck Subject: [dm-devel] [PATCH 2/4] multipathd: remove reconfigure from header file. 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.11 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dm-devel-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Only multipathd/main.c uses it. Signed-off-by: Benjamin Marzinski Reviewed-by: Martin Wilck --- multipathd/main.h | 1 - 1 file changed, 1 deletion(-) diff --git a/multipathd/main.h b/multipathd/main.h index 23ce919e..a1697a74 100644 --- a/multipathd/main.h +++ b/multipathd/main.h @@ -39,7 +39,6 @@ enum daemon_status wait_for_state_change_if(enum daemon_status oldstate, unsigned long ms); void schedule_reconfigure(void); int need_to_delay_reconfig (struct vectors *); -int reconfigure (struct vectors *); int ev_add_path (struct path *, struct vectors *, int); int ev_remove_path (struct path *, struct vectors *, int); int ev_add_map (char *, const char *, struct vectors *); From patchwork Mon Sep 20 23:21:15 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 12506581 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id EFCE8C433EF for ; Mon, 20 Sep 2021 23:21:55 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [216.205.24.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 7EA2061221 for ; Mon, 20 Sep 2021 23:21:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 7EA2061221 Authentication-Results: mail.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1632180114; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=qRe+gj7I/oDH20ssu0uHzcI6tu7S8Fbx+uP/p2Kpzjo=; b=PBaQvw2YI7eiinjumQHcsckOz8MSgSwbXh8gWlli763OZ3aQzXo2LWqsv8d9BxEtLBosiz 9PIBgRLLT7GEPntsAShFjCU5L441hJY8ktF8wppTxyE3eZfzQ6kJkt4ITvOxU4u+s/HBFC xomUbDkojfunndg62V/MrEhYJfldMLA= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-345-uQWzyhzDMUm2HGZn1Hr4mg-1; Mon, 20 Sep 2021 19:21:53 -0400 X-MC-Unique: uQWzyhzDMUm2HGZn1Hr4mg-1 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 mimecast-mx01.redhat.com (Postfix) with ESMTPS id 77C52802C89; Mon, 20 Sep 2021 23:21:48 +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 5049560C2B; Mon, 20 Sep 2021 23:21:48 +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 0F0BF4E9F4; Mon, 20 Sep 2021 23:21:48 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 18KNLVT2025935 for ; Mon, 20 Sep 2021 19:21:31 -0400 Received: by smtp.corp.redhat.com (Postfix) id 01C346D988; Mon, 20 Sep 2021 23:21:31 +0000 (UTC) Received: from octiron.msp.redhat.com (unknown [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id EB6BD6D985; Mon, 20 Sep 2021 23:21:21 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 18KNLK7N009344; Mon, 20 Sep 2021 18:21:20 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 18KNLKXD009343; Mon, 20 Sep 2021 18:21:20 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Mon, 20 Sep 2021 18:21:15 -0500 Message-Id: <1632180076-9294-4-git-send-email-bmarzins@redhat.com> In-Reply-To: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> References: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.11 X-loop: dm-devel@redhat.com Cc: device-mapper development , Martin Wilck Subject: [dm-devel] [PATCH 3/4] multipathd: pass in the type of reconfigure 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 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dm-devel-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com This code doesn't actually change how multipathd reconfigures. It still does a weak reconfigure at the start, and full reconfigures later. But now schedule_reconfigure() takes the type of reconfigure to do, and that gets passed down to reconfigure(). If a full reconfigure has already been requested but not started, weak reconfigure requests will be upgraded. A future patch will enable users to control what kind of reconfigures happen. Signed-off-by: Benjamin Marzinski --- libmultipath/configure.c | 2 +- multipathd/cli_handlers.c | 2 +- multipathd/main.c | 62 ++++++++++++++++++++------------------- multipathd/main.h | 2 +- 4 files changed, 35 insertions(+), 33 deletions(-) diff --git a/libmultipath/configure.c b/libmultipath/configure.c index 7edb355b..eb8ec1bd 100644 --- a/libmultipath/configure.c +++ b/libmultipath/configure.c @@ -1098,7 +1098,7 @@ out: * FORCE_RELOAD_NONE: existing maps aren't touched at all * FORCE_RELOAD_YES: all maps are rebuilt from scratch and (re)loaded in DM * FORCE_RELOAD_WEAK: existing maps are compared to the current conf and only - * reloaded in DM if there's a difference. This is useful during startup. + * reloaded in DM if there's a difference. This is normally sufficient. */ int coalesce_paths (struct vectors *vecs, vector mpvec, char *refwwid, int force_reload, enum mpath_cmds cmd) diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c index f59db3ab..b12a4e7e 100644 --- a/multipathd/cli_handlers.c +++ b/multipathd/cli_handlers.c @@ -1012,7 +1012,7 @@ cli_reconfigure(void * v, struct strbuf *reply, void * data) { condlog(2, "reconfigure (operator)"); - schedule_reconfigure(); + schedule_reconfigure(true); return 0; } diff --git a/multipathd/main.c b/multipathd/main.c index 1ead0904..5c831e8d 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -162,13 +162,6 @@ static bool get_delayed_reconfig(void) return val; } -static void set_delayed_reconfig(bool val) -{ - pthread_mutex_lock(&config_lock); - __delayed_reconfig = val; - pthread_mutex_unlock(&config_lock); -} - /* * global copy of vecs for use in sig handlers */ @@ -290,7 +283,18 @@ enum daemon_status wait_for_state_change_if(enum daemon_status oldstate, } /* Don't access this variable without holding config_lock */ -static bool reconfigure_pending; +static enum force_reload_types reconfigure_pending = FORCE_RELOAD_NONE; +/* Only set while changing to DAEMON_CONFIGURE, and only access while + * reconfiguring in DAEMON_CONFIGURE */ +static volatile enum force_reload_types reload_type = FORCE_RELOAD_NONE; + +static void enable_delayed_reconfig(enum force_reload_types type) +{ + pthread_mutex_lock(&config_lock); + reconfigure_pending = type; + __delayed_reconfig = true; + pthread_mutex_unlock(&config_lock); +} /* must be called with config_lock held */ static void __post_config_state(enum daemon_status state) @@ -305,7 +309,8 @@ static void __post_config_state(enum daemon_status state) * In either case, child() will see DAEMON_CONFIGURE * again and start another reconfigure cycle. */ - if (reconfigure_pending && state == DAEMON_IDLE && + if (reconfigure_pending != FORCE_RELOAD_NONE && + state == DAEMON_IDLE && (old_state == DAEMON_CONFIGURE || old_state == DAEMON_RUNNING)) { /* @@ -317,7 +322,8 @@ static void __post_config_state(enum daemon_status state) state = DAEMON_CONFIGURE; } if (state == DAEMON_CONFIGURE) { - reconfigure_pending = false; + reload_type = (reconfigure_pending == FORCE_RELOAD_YES) ? FORCE_RELOAD_YES : FORCE_RELOAD_WEAK; + reconfigure_pending = FORCE_RELOAD_NONE; __delayed_reconfig = false; } running_state = state; @@ -334,20 +340,25 @@ void post_config_state(enum daemon_status state) pthread_cleanup_pop(1); } -void schedule_reconfigure(void) +void schedule_reconfigure(bool force_reload_yes) { pthread_mutex_lock(&config_lock); pthread_cleanup_push(config_cleanup, NULL); + enum force_reload_types type; + + type = (reconfigure_pending == FORCE_RELOAD_YES || force_reload_yes) ? + FORCE_RELOAD_YES : FORCE_RELOAD_WEAK; switch (running_state) { case DAEMON_SHUTDOWN: break; case DAEMON_IDLE: + reconfigure_pending = type; __post_config_state(DAEMON_CONFIGURE); break; case DAEMON_CONFIGURE: case DAEMON_RUNNING: - reconfigure_pending = true; + reconfigure_pending = type; break; default: break; @@ -812,7 +823,7 @@ ev_add_map (char * dev, const char * alias, struct vectors * vecs) if (get_delayed_reconfig() && !need_to_delay_reconfig(vecs)) { condlog(2, "reconfigure (delayed)"); - schedule_reconfigure(); + schedule_reconfigure(false); return 0; } } @@ -1830,7 +1841,7 @@ missing_uev_wait_tick(struct vectors *vecs) if (timed_out && get_delayed_reconfig() && !need_to_delay_reconfig(vecs)) { condlog(2, "reconfigure (delayed)"); - schedule_reconfigure(); + schedule_reconfigure(false); } } @@ -2588,14 +2599,13 @@ checkerloop (void *ap) } int -configure (struct vectors * vecs) +configure (struct vectors * vecs, enum force_reload_types type) { struct multipath * mpp; struct path * pp; vector mpvec; int i, ret; struct config *conf; - static int force_reload = FORCE_RELOAD_WEAK; if (!vecs->pathvec && !(vecs->pathvec = vector_alloc())) { condlog(0, "couldn't allocate path vec in configure"); @@ -2643,15 +2653,7 @@ configure (struct vectors * vecs) if (should_exit()) goto fail; - /* - * create new set of maps & push changed ones into dm - * In the first call, use FORCE_RELOAD_WEAK to avoid making - * superfluous ACT_RELOAD ioctls. Later calls are done - * with FORCE_RELOAD_YES. - */ - ret = coalesce_paths(vecs, mpvec, NULL, force_reload, CMD_NONE); - if (force_reload == FORCE_RELOAD_WEAK) - force_reload = FORCE_RELOAD_YES; + ret = coalesce_paths(vecs, mpvec, NULL, type, CMD_NONE); if (ret != CP_OK) { condlog(0, "configure failed while coalescing paths"); goto fail; @@ -2729,7 +2731,7 @@ void rcu_free_config(struct rcu_head *head) } int -reconfigure (struct vectors * vecs) +reconfigure (struct vectors * vecs, enum force_reload_types type) { struct config * old, *conf; @@ -2763,7 +2765,7 @@ reconfigure (struct vectors * vecs) rcu_assign_pointer(multipath_conf, conf); call_rcu(&old->rcu, rcu_free_config); - configure(vecs); + configure(vecs, type); return 0; @@ -2815,7 +2817,7 @@ handle_signals(bool nonfatal) return; if (reconfig_sig) { condlog(2, "reconfigure (signal)"); - schedule_reconfigure(); + schedule_reconfigure(true); } if (log_reset_sig) { condlog(2, "reset log (signal)"); @@ -3274,9 +3276,9 @@ child (__attribute__((unused)) void *param) lock(&vecs->lock); pthread_testcancel(); if (!need_to_delay_reconfig(vecs)) - reconfigure(vecs); + reconfigure(vecs, reload_type); else - set_delayed_reconfig(true); + enable_delayed_reconfig(reload_type); lock_cleanup_pop(vecs->lock); post_config_state(DAEMON_IDLE); } diff --git a/multipathd/main.h b/multipathd/main.h index a1697a74..c8a1ce92 100644 --- a/multipathd/main.h +++ b/multipathd/main.h @@ -37,7 +37,7 @@ void exit_daemon(void); const char * daemon_status(void); enum daemon_status wait_for_state_change_if(enum daemon_status oldstate, unsigned long ms); -void schedule_reconfigure(void); +void schedule_reconfigure(bool reconfig_all); int need_to_delay_reconfig (struct vectors *); int ev_add_path (struct path *, struct vectors *, int); int ev_remove_path (struct path *, struct vectors *, int); From patchwork Mon Sep 20 23:21:16 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Benjamin Marzinski X-Patchwork-Id: 12506583 X-Patchwork-Delegate: christophe.varoqui@free.fr Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-17.2 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_CR_TRAILER,INCLUDES_PATCH,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 61928C433EF for ; Mon, 20 Sep 2021 23:21:58 +0000 (UTC) Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 0ED0D61211 for ; Mon, 20 Sep 2021 23:21:57 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.4.1 mail.kernel.org 0ED0D61211 Authentication-Results: mail.kernel.org; dmarc=pass (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1632180117; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=g3mxnOc9Pa3C+0E3uQxQa0ZTCltT8nbn9uIujuSEWss=; b=Jv0vmMpCsEoZkZssZMAyU2Mzgw+zhpr3cbnEY4wx204VJU4AVnadyB2+g+fRZoEvBnBrOZ qsangtLPrLAQMCIITvQh70Lav9QS8hyTI1R8+FlRE5+EdME9kHEujsXxNX1qHFpyhQorBI 4pAq+ghh0iUgctiY0SmnifnJlOY+U+w= Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-496-KWhZIJfGPUunLfNIqxrR-A-1; Mon, 20 Sep 2021 19:21:55 -0400 X-MC-Unique: KWhZIJfGPUunLfNIqxrR-A-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.phx2.redhat.com [10.5.11.16]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 3B74F1006AA6; Mon, 20 Sep 2021 23:21:50 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1D1B97621C; Mon, 20 Sep 2021 23:21:50 +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 DB86B1806D03; Mon, 20 Sep 2021 23:21:49 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 18KNLTd7025921 for ; Mon, 20 Sep 2021 19:21:29 -0400 Received: by smtp.corp.redhat.com (Postfix) id 5CDF217B5B; Mon, 20 Sep 2021 23:21:29 +0000 (UTC) Received: from octiron.msp.redhat.com (unknown [10.15.80.209]) by smtp.corp.redhat.com (Postfix) with ESMTPS id D64C85DF26; Mon, 20 Sep 2021 23:21:22 +0000 (UTC) Received: from octiron.msp.redhat.com (localhost.localdomain [127.0.0.1]) by octiron.msp.redhat.com (8.14.9/8.14.9) with ESMTP id 18KNLLAW009348; Mon, 20 Sep 2021 18:21:21 -0500 Received: (from bmarzins@localhost) by octiron.msp.redhat.com (8.14.9/8.14.9/Submit) id 18KNLLMI009347; Mon, 20 Sep 2021 18:21:21 -0500 From: Benjamin Marzinski To: Christophe Varoqui Date: Mon, 20 Sep 2021 18:21:16 -0500 Message-Id: <1632180076-9294-5-git-send-email-bmarzins@redhat.com> In-Reply-To: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> References: <1632180076-9294-1-git-send-email-bmarzins@redhat.com> X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-loop: dm-devel@redhat.com Cc: device-mapper development , Martin Wilck Subject: [dm-devel] [PATCH 4/4] multipathd: add "reconfigure all" command. 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.16 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=dm-devel-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com With this commit, multipathd no longer defaults to full reconfigures for the "reconfigure" command and the HUP signal. The default is a weak reconfigure. A new command, "reconfigure all", has been added to do a full reconfigure. Signed-off-by: Benjamin Marzinski Reviewed-by: Martin Wilck --- multipath/main.c | 2 +- multipathd/cli.c | 1 + multipathd/cli.h | 2 ++ multipathd/cli_handlers.c | 10 ++++++++++ multipathd/main.c | 2 +- 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/multipath/main.c b/multipath/main.c index 65ece830..7b9797ec 100644 --- a/multipath/main.c +++ b/multipath/main.c @@ -759,7 +759,7 @@ int delegate_to_multipathd(enum mpath_cmds cmd, return NOT_DELEGATED; if (cmd == CMD_CREATE && conf->force_reload == FORCE_RELOAD_YES) { - p += snprintf(p, n, "reconfigure"); + p += snprintf(p, n, "reconfigure all"); } else if (cmd == CMD_FLUSH_ONE && dev && dev_type == DEV_DEVMAP) { p += snprintf(p, n, "del map %s", dev); diff --git a/multipathd/cli.c b/multipathd/cli.c index 414f6608..d9308bdf 100644 --- a/multipathd/cli.c +++ b/multipathd/cli.c @@ -212,6 +212,7 @@ load_keys (void) r += add_key(keys, "local", LOCAL, 0); r += add_key(keys, "setmarginal", SETMARGINAL, 0); r += add_key(keys, "unsetmarginal", UNSETMARGINAL, 0); + r += add_key(keys, "all", ALL, 0); if (r) { diff --git a/multipathd/cli.h b/multipathd/cli.h index fcb6af00..bba705e8 100644 --- a/multipathd/cli.h +++ b/multipathd/cli.h @@ -47,6 +47,7 @@ enum { __LOCAL, /* 40 */ __SETMARGINAL, __UNSETMARGINAL, + __ALL, }; #define LIST (1ULL << __LIST) @@ -93,6 +94,7 @@ enum { #define LOCAL (1ULL << __LOCAL) #define SETMARGINAL (1ULL << __SETMARGINAL) #define UNSETMARGINAL (1ULL << __UNSETMARGINAL) +#define ALL (1ULL << __ALL) #define INITIAL_REPLY_LEN 1200 diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c index b12a4e7e..58b9916c 100644 --- a/multipathd/cli_handlers.c +++ b/multipathd/cli_handlers.c @@ -1012,6 +1012,15 @@ cli_reconfigure(void * v, struct strbuf *reply, void * data) { condlog(2, "reconfigure (operator)"); + schedule_reconfigure(false); + return 0; +} + +int +cli_reconfigure_all(void * v, struct strbuf *reply, void * data) +{ + condlog(2, "reconfigure all (operator)"); + schedule_reconfigure(true); return 0; } @@ -1497,6 +1506,7 @@ void init_handler_callbacks(void) set_handler_callback(DEL+MAPS, cli_del_maps); set_handler_callback(SWITCH+MAP+GROUP, cli_switch_group); set_unlocked_handler_callback(RECONFIGURE, cli_reconfigure); + set_unlocked_handler_callback(RECONFIGURE+ALL, cli_reconfigure_all); set_handler_callback(SUSPEND+MAP, cli_suspend); set_handler_callback(RESUME+MAP, cli_resume); set_handler_callback(RESIZE+MAP, cli_resize); diff --git a/multipathd/main.c b/multipathd/main.c index 5c831e8d..cc4a4a5d 100644 --- a/multipathd/main.c +++ b/multipathd/main.c @@ -2817,7 +2817,7 @@ handle_signals(bool nonfatal) return; if (reconfig_sig) { condlog(2, "reconfigure (signal)"); - schedule_reconfigure(true); + schedule_reconfigure(false); } if (log_reset_sig) { condlog(2, "reset log (signal)");