All of lore.kernel.org
 help / color / mirror / Atom feed
From: Benjamin Marzinski <bmarzins@redhat.com>
To: Martin Wilck <martin.wilck@suse.com>
Cc: "dm-devel@redhat.com" <dm-devel@redhat.com>
Subject: Re: [dm-devel] [PATCH 3/4] libmultipath: use regular array for field widths
Date: Fri, 21 Oct 2022 12:51:51 -0500	[thread overview]
Message-ID: <20221021175150.GD19568@octiron.msp.redhat.com> (raw)
In-Reply-To: <306b876895770fc11229ea43418e3766282ee4e5.camel@suse.com>

On Fri, Oct 21, 2022 at 07:04:55AM +0000, Martin Wilck wrote:
> On Tue, 2022-10-11 at 16:53 -0500, Benjamin Marzinski wrote:
> > We know the size of these arrays, so we can just allocate them on the
> > stack. Also, show_path() doesn't use the width, so don't initialize
> > it
> > in the first place.
> > 
> > Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
> 
> This isn't wrong, but I'm not sure what it actually achieves except a
> few less NULL checks (I'm sure you're aware that this doesn't mean
> better protection against out-of-memory situations). It comes at the
> cost of an ABI change. I understand that the intention is to eliminate
> __attribute__((cleanup())). But if we agree we don't want to do that
> everywhere, I see no particular reason to do it in this code path.
> 
> I'm not totally against it, but I'm not enthusiastic, either.

That's fine. How about I send a patch to just fix show_path().

-Ben

> 
> Regards,
> Martin
> 
> 
> 
> > ---
> >  libmultipath/foreign.c            |  5 ++--
> >  libmultipath/libmultipath.version |  4 +--
> >  libmultipath/print.c              | 32 +++++++++++-------------
> >  libmultipath/print.h              |  4 +--
> >  multipath/main.c                  |  5 ++--
> >  multipathd/cli_handlers.c         | 41 ++++++++++++-----------------
> > --
> >  6 files changed, 38 insertions(+), 53 deletions(-)
> > 
> > diff --git a/libmultipath/foreign.c b/libmultipath/foreign.c
> > index 8981ff58..4cc2a8e3 100644
> > --- a/libmultipath/foreign.c
> > +++ b/libmultipath/foreign.c
> > @@ -550,10 +550,9 @@ void print_foreign_topology(int verbosity)
> >         struct strbuf buf = STRBUF_INIT;
> >         struct foreign *fgn;
> >         int i;
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[path_layout_size()];
> >  
> > -       if ((width = alloc_path_layout()) == NULL)
> > -               return;
> > +       memset(width, 0, sizeof(width));
> >         rdlock_foreigns();
> >         if (foreigns == NULL) {
> >                 unlock_foreigns(NULL);
> > diff --git a/libmultipath/libmultipath.version
> > b/libmultipath/libmultipath.version
> > index 8a447f7f..af7c5ed2 100644
> > --- a/libmultipath/libmultipath.version
> > +++ b/libmultipath/libmultipath.version
> > @@ -38,9 +38,7 @@ global:
> >         add_map_with_path;
> >         adopt_paths;
> >         alloc_multipath;
> > -       alloc_multipath_layout;
> >         alloc_path;
> > -       alloc_path_layout;
> >         alloc_path_with_pathinfo;
> >         change_foreign;
> >         check_alias_settings;
> > @@ -126,6 +124,7 @@ global:
> >         libmultipath_exit;
> >         libmultipath_init;
> >         load_config;
> > +       multipath_layout_size;
> >         need_io_err_check;
> >         orphan_path;
> >         parse_prkey_flags;
> > @@ -133,6 +132,7 @@ global:
> >         path_discovery;
> >         path_get_tpgs;
> >         pathinfo;
> > +       path_layout_size;
> >         path_offline;
> >         print_all_paths;
> >         print_foreign_topology;
> > diff --git a/libmultipath/print.c b/libmultipath/print.c
> > index 97f9a177..87d6a329 100644
> > --- a/libmultipath/print.c
> > +++ b/libmultipath/print.c
> > @@ -805,6 +805,12 @@ static const struct multipath_data mpd[] = {
> >         {'g', "vpd page data", snprint_multipath_vpd_data},
> >  };
> >  
> > +
> > +int multipath_layout_size(void)
> > +{
> > +       return ARRAY_SIZE(mpd);
> > +}
> > +
> >  static const struct path_data pd[] = {
> >         {'w', "uuid",          snprint_path_uuid},
> >         {'i', "hcil",          snprint_hcil},
> > @@ -834,6 +840,11 @@ static const struct path_data pd[] = {
> >         {'L', "LUN hex",       snprint_path_lunhex},
> >  };
> >  
> > +int path_layout_size(void)
> > +{
> > +       return ARRAY_SIZE(pd);
> > +}
> > +
> >  static const struct pathgroup_data pgd[] = {
> >         {'s', "selector",      snprint_pg_selector},
> >         {'p', "pri",           snprint_pg_pri},
> > @@ -871,10 +882,6 @@ int snprint_wildcards(struct strbuf *buff)
> >         return get_strbuf_len(buff) - initial_len;
> >  }
> >  
> > -fieldwidth_t *alloc_path_layout(void) {
> > -       return calloc(ARRAY_SIZE(pd), sizeof(fieldwidth_t));
> > -}
> > -
> >  void get_path_layout(vector pathvec, int header, fieldwidth_t
> > *width)
> >  {
> >         vector gpvec = vector_convert(NULL, pathvec, struct path,
> > @@ -929,11 +936,6 @@ void _get_path_layout (const struct _vector
> > *gpvec, enum layout_reset reset,
> >         }
> >  }
> >  
> > -fieldwidth_t *alloc_multipath_layout(void) {
> > -
> > -       return calloc(ARRAY_SIZE(mpd), sizeof(fieldwidth_t));
> > -}
> > -
> >  void get_multipath_layout (vector mpvec, int header, fieldwidth_t
> > *width) {
> >         vector gmvec = vector_convert(NULL, mpvec, struct multipath,
> >                                       dm_multipath_to_gen);
> > @@ -1187,12 +1189,11 @@ int _snprint_pathgroup(const struct
> > gen_pathgroup *ggp, struct strbuf *line,
> >  void _print_multipath_topology(const struct gen_multipath *gmp, int
> > verbosity)
> >  {
> >         struct strbuf buff = STRBUF_INIT;
> > -       fieldwidth_t *p_width
> > __attribute__((cleanup(cleanup_ucharp))) = NULL;
> > +       fieldwidth_t p_width[ARRAY_SIZE(pd)] = {0};
> >         const struct gen_pathgroup *gpg;
> >         const struct _vector *pgvec, *pathvec;
> >         int j;
> >  
> > -       p_width = alloc_path_layout();
> >         pgvec = gmp->ops->get_pathgroups(gmp);
> >  
> >         if (pgvec != NULL) {
> > @@ -1236,14 +1237,11 @@ int _snprint_multipath_topology(const struct
> > gen_multipath *gmp,
> >         const struct gen_pathgroup *gpg;
> >         struct strbuf style = STRBUF_INIT;
> >         size_t initial_len = get_strbuf_len(buff);
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[ARRAY_SIZE(mpd)] = {0};
> >  
> >         if (verbosity <= 0)
> >                 return 0;
> >  
> > -       if ((width = alloc_multipath_layout()) == NULL)
> > -               return -ENOMEM;
> > -
> >         if (verbosity == 1)
> >                 return _snprint_multipath(gmp, buff, "%n", width);
> >  
> > @@ -2027,7 +2025,7 @@ static void print_all_paths_custo(vector
> > pathvec, int banner, const char *fmt)
> >         int i;
> >         struct path * pp;
> >         struct strbuf line = STRBUF_INIT;
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[ARRAY_SIZE(pd)] = {0};
> >  
> >         if (!VECTOR_SIZE(pathvec)) {
> >                 if (banner)
> > @@ -2035,8 +2033,6 @@ static void print_all_paths_custo(vector
> > pathvec, int banner, const char *fmt)
> >                 return;
> >         }
> >  
> > -       if ((width = alloc_path_layout()) == NULL)
> > -               return;
> >         get_path_layout(pathvec, 1, width);
> >  
> >         pthread_cleanup_push_cast(reset_strbuf, &line);
> > diff --git a/libmultipath/print.h b/libmultipath/print.h
> > index 52f5b256..4e50827d 100644
> > --- a/libmultipath/print.h
> > +++ b/libmultipath/print.h
> > @@ -16,11 +16,11 @@ enum layout_reset {
> >  };
> >  
> >  /* fieldwidth_t is defined in generic.h */
> > -fieldwidth_t *alloc_path_layout(void);
> > +int multipath_layout_size(void);
> > +int path_layout_size(void);
> >  void _get_path_layout (const struct _vector *gpvec, enum
> > layout_reset,
> >                        fieldwidth_t *width);
> >  void get_path_layout (vector pathvec, int header, fieldwidth_t
> > *width);
> > -fieldwidth_t *alloc_multipath_layout(void);
> >  void _get_multipath_layout (const struct _vector *gmvec, enum
> > layout_reset,
> >                             fieldwidth_t *width);
> >  void get_multipath_layout (vector mpvec, int header, fieldwidth_t
> > *width);
> > diff --git a/multipath/main.c b/multipath/main.c
> > index 7b69a3ce..f4c85409 100644
> > --- a/multipath/main.c
> > +++ b/multipath/main.c
> > @@ -457,7 +457,7 @@ configure (struct config *conf, enum mpath_cmds
> > cmd,
> >         int di_flag = 0;
> >         char * refwwid = NULL;
> >         char * dev = NULL;
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[path_layout_size()];
> >  
> >         /*
> >          * allocate core vectors to store paths and multipaths
> > @@ -544,8 +544,7 @@ configure (struct config *conf, enum mpath_cmds
> > cmd,
> >         if (libmp_verbosity > 2)
> >                 print_all_paths(pathvec, 1);
> >  
> > -       if ((width = alloc_path_layout()) == NULL)
> > -               goto out;
> > +       memset(width, 0, sizeof(width));
> >         get_path_layout(pathvec, 0, width);
> >         foreign_path_layout(width);
> >  
> > diff --git a/multipathd/cli_handlers.c b/multipathd/cli_handlers.c
> > index 5b8f647b..ddc807a1 100644
> > --- a/multipathd/cli_handlers.c
> > +++ b/multipathd/cli_handlers.c
> > @@ -38,11 +38,10 @@ show_paths (struct strbuf *reply, struct vectors
> > *vecs, char *style, int pretty)
> >         int i;
> >         struct path * pp;
> >         int hdr_len = 0;
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[path_layout_size()];
> >  
> > +       memset(width, 0, sizeof(width));
> >         if (pretty) {
> > -               if ((width = alloc_path_layout()) == NULL)
> > -                       return 1;
> >                 get_path_layout(vecs->pathvec, 1, width);
> >                 foreign_path_layout(width);
> >         }
> > @@ -50,10 +49,10 @@ show_paths (struct strbuf *reply, struct vectors
> > *vecs, char *style, int pretty)
> >                 return 1;
> >  
> >         vector_foreach_slot(vecs->pathvec, pp, i) {
> > -               if (snprint_path(reply, style, pp, width) < 0)
> > +               if (snprint_path(reply, style, pp, pretty? width :
> > NULL) < 0)
> >                         return 1;
> >         }
> > -       if (snprint_foreign_paths(reply, style, width) < 0)
> > +       if (snprint_foreign_paths(reply, style, pretty? width : NULL)
> > < 0)
> >                 return 1;
> >  
> >         if (pretty && get_strbuf_len(reply) == (size_t)hdr_len)
> > @@ -67,12 +66,7 @@ static int
> >  show_path (struct strbuf *reply, struct vectors *vecs, struct path
> > *pp,
> >            char *style)
> >  {
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > -
> > -       if ((width = alloc_path_layout()) == NULL)
> > -               return 1;
> > -       get_path_layout(vecs->pathvec, 1, width);
> > -       if (snprint_path(reply, style, pp, 0) < 0)
> > +       if (snprint_path(reply, style, pp, NULL) < 0)
> >                 return 1;
> >         return 0;
> >  }
> > @@ -95,10 +89,9 @@ show_maps_topology (struct strbuf *reply, struct
> > vectors * vecs)
> >  {
> >         int i;
> >         struct multipath * mpp;
> > -       fieldwidth_t *p_width
> > __attribute__((cleanup(cleanup_ucharp))) = NULL;
> > +       fieldwidth_t p_width[path_layout_size()];
> >  
> > -       if ((p_width = alloc_path_layout()) == NULL)
> > -               return 1;
> > +       memset(p_width, 0, sizeof(p_width));
> >         get_path_layout(vecs->pathvec, 0, p_width);
> >         foreign_path_layout(p_width);
> >  
> > @@ -258,10 +251,9 @@ cli_list_map_topology (void *v, struct strbuf
> > *reply, void *data)
> >         struct multipath * mpp;
> >         struct vectors * vecs = (struct vectors *)data;
> >         char * param = get_keyparam(v, MAP);
> > -       fieldwidth_t *p_width
> > __attribute__((cleanup(cleanup_ucharp))) = NULL;
> > +       fieldwidth_t p_width[path_layout_size()];
> >  
> > -       if ((p_width = alloc_path_layout()) == NULL)
> > -               return 1;
> > +       memset(p_width, 0, sizeof(p_width));
> >         get_path_layout(vecs->pathvec, 0, p_width);
> >         param = convert_dev(param, 0);
> >         mpp = find_mp_by_str(vecs->mpvec, param);
> > @@ -357,11 +349,10 @@ show_maps (struct strbuf *reply, struct vectors
> > *vecs, char *style,
> >         int i;
> >         struct multipath * mpp;
> >         int hdr_len = 0;
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[multipath_layout_size()];
> >  
> > +       memset(width, 0, sizeof(width));
> >         if (pretty) {
> > -               if ((width = alloc_multipath_layout()) == NULL)
> > -                       return 1;
> >                 get_multipath_layout(vecs->mpvec, 1, width);
> >                 foreign_multipath_layout(width);
> >         }
> > @@ -374,10 +365,11 @@ show_maps (struct strbuf *reply, struct vectors
> > *vecs, char *style,
> >                         i--;
> >                         continue;
> >                 }
> > -               if (snprint_multipath(reply, style, mpp, width) < 0)
> > +               if (snprint_multipath(reply, style, mpp,
> > +                                     pretty? width : NULL) < 0)
> >                         return 1;
> >         }
> > -       if (snprint_foreign_multipaths(reply, style, width) < 0)
> > +       if (snprint_foreign_multipaths(reply, style, pretty? width :
> > NULL) < 0)
> >                 return 1;
> >  
> >         if (pretty && get_strbuf_len(reply) == (size_t)hdr_len)
> > @@ -416,10 +408,9 @@ cli_list_map_fmt (void *v, struct strbuf *reply,
> > void *data)
> >         struct vectors * vecs = (struct vectors *)data;
> >         char * param = get_keyparam(v, MAP);
> >         char * fmt = get_keyparam(v, FMT);
> > -       fieldwidth_t *width __attribute__((cleanup(cleanup_ucharp)))
> > = NULL;
> > +       fieldwidth_t width[multipath_layout_size()];
> >  
> > -       if ((width = alloc_multipath_layout()) == NULL)
> > -               return 1;
> > +       memset(width, 0, sizeof(width));
> >         get_multipath_layout(vecs->mpvec, 1, width);
> >         param = convert_dev(param, 0);
> >         mpp = find_mp_by_str(vecs->mpvec, param);
--
dm-devel mailing list
dm-devel@redhat.com
https://listman.redhat.com/mailman/listinfo/dm-devel


  reply	other threads:[~2022-10-21 17:52 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-10-11 21:52 [dm-devel] [PATCH 0/4] remove dangerous cleanup __attribute__ uses Benjamin Marzinski
2022-10-11 21:53 ` [dm-devel] [PATCH 1/4] libmultipath: don't print garbage keywords Benjamin Marzinski
2022-10-21  7:05   ` Martin Wilck
2022-10-11 21:53 ` [dm-devel] [PATCH 2/4] libmultipath: avoid STRBUF_ON_STACK with cancellation points Benjamin Marzinski
2022-10-11 21:53 ` [dm-devel] [PATCH 3/4] libmultipath: use regular array for field widths Benjamin Marzinski
2022-10-21  7:04   ` Martin Wilck
2022-10-21 17:51     ` Benjamin Marzinski [this message]
2022-10-21 20:12       ` Martin Wilck
2022-10-11 21:53 ` [dm-devel] [PATCH 4/4] libmultipath: avoid cleanup __attribute__ with cancellation points Benjamin Marzinski
2022-10-20 16:03 ` [dm-devel] [PATCH 0/4] remove dangerous cleanup __attribute__ uses Martin Wilck
2022-10-20 22:57   ` Benjamin Marzinski

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=20221021175150.GD19568@octiron.msp.redhat.com \
    --to=bmarzins@redhat.com \
    --cc=dm-devel@redhat.com \
    --cc=martin.wilck@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 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.