All of lore.kernel.org
 help / color / mirror / Atom feed
From: Martin Wilck <martin.wilck@suse.com>
To: "bmarzins@redhat.com" <bmarzins@redhat.com>,
	"christophe.varoqui@opensvc.com" <christophe.varoqui@opensvc.com>
Cc: "dm-devel@redhat.com" <dm-devel@redhat.com>
Subject: Re: [dm-devel] [PATCH 3/4] multipathd: pass in the type of reconfigure
Date: Mon, 15 Nov 2021 16:23:54 +0000	[thread overview]
Message-ID: <0b1c32c80fb5263df6263570f26b60247576f1b5.camel@suse.com> (raw)
In-Reply-To: <1632180076-9294-4-git-send-email-bmarzins@redhat.com>

On Mon, 2021-09-20 at 18:21 -0500, Benjamin Marzinski wrote:
> This code doesn't actually change how multipathd reconfigures. It still
> does a weak reconfigure at the start, and full reconfigures later.

AFAICS it does change this, at least for the cases where reconfigure()
is called from ev_add_map() and missing_uev_wait_tick, where you call
schedule_reconfigure(false). The old code was using a static variable
and thus always doing a hard reconfigure when called more than once.

I'm find with this change (the old behavior was arguably wrong), but
the commit message should be clarified in this respect.

> 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 <bmarzins@redhat.com>
> ---
>  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);


Can we please rename this variable from "type" to "reload_type" here,
for the sake of readability? Likewise, in reconfigure()?

>         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);

For consistency, please consider using an "enum force_reload_types" as
argument to schedule_reconfigure() rather than a boolean.

Otherwise, the patch looks good.

Cheers
Martin


--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  reply	other threads:[~2021-11-15 16:27 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-20 23:21 [dm-devel] [PATCH 0/4] Add "reconfigure all" multipath command Benjamin Marzinski
2021-09-20 23:21 ` [dm-devel] [PATCH 1/4] multipathd: move delayed_reconfig out of struct config Benjamin Marzinski
2021-11-15 16:10   ` Martin Wilck
2021-11-15 16:27     ` Martin Wilck
2021-11-15 23:45       ` Benjamin Marzinski
2021-09-20 23:21 ` [dm-devel] [PATCH 2/4] multipathd: remove reconfigure from header file Benjamin Marzinski
2021-11-15 16:10   ` Martin Wilck
2021-09-20 23:21 ` [dm-devel] [PATCH 3/4] multipathd: pass in the type of reconfigure Benjamin Marzinski
2021-11-15 16:23   ` Martin Wilck [this message]
2021-11-15 23:46     ` Benjamin Marzinski
2021-09-20 23:21 ` [dm-devel] [PATCH 4/4] multipathd: add "reconfigure all" command Benjamin Marzinski
2021-11-15 16:30   ` Martin Wilck
2021-09-24 20:44 ` [dm-devel] [PATCH 0/4] Add "reconfigure all" multipath command Xose Vazquez Perez
2021-09-27 15:11   ` Benjamin Marzinski
2021-09-28  8:25     ` Martin Wilck

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=0b1c32c80fb5263df6263570f26b60247576f1b5.camel@suse.com \
    --to=martin.wilck@suse.com \
    --cc=bmarzins@redhat.com \
    --cc=christophe.varoqui@opensvc.com \
    --cc=dm-devel@redhat.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 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.