From: Andy Shevchenko <andriy.shevchenko-VuQAYsv1563Yd54FQh9/CA@public.gmane.org>
To: Rasmus Villemoes
<linux-qQsb+v5E8BnlAoU/VqSP6n9LOBIZ5rWg@public.gmane.org>
Cc: David Rientjes <rientjes-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
Waiman Long <longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
Johannes Weiner <hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org>,
Michal Hocko <mhocko-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Vladimir Davydov
<vdavydov.dev-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>,
Andrew Morton
<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Petr Mladek <pmladek-IBi9RG/b67k@public.gmane.org>,
Steven Rostedt <rostedt-nx8X9YLhiw1AfugRpC6u6w@public.gmane.org>,
Sergey Senozhatsky
<senozhatsky-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>,
linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org,
Ira Weiny <ira.weiny-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
Rafael Aquini <aquini-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
Subject: Re: [PATCH v2 1/3] lib/vsprintf: Avoid redundant work with 0 size
Date: Mon, 31 Jan 2022 13:22:42 +0200 [thread overview]
Message-ID: <YffGgozjI4W2Vamp@smile.fi.intel.com> (raw)
In-Reply-To: <d44824d4-2dd1-a8ab-d3ee-ac67b749ca6f-qQsb+v5E8BnlAoU/VqSP6n9LOBIZ5rWg@public.gmane.org>
On Mon, Jan 31, 2022 at 12:02:29PM +0100, Rasmus Villemoes wrote:
> On 31/01/2022 11.34, Andy Shevchenko wrote:
> > On Mon, Jan 31, 2022 at 12:30:33PM +0200, Andy Shevchenko wrote:
> >> On Mon, Jan 31, 2022 at 12:25:09PM +0200, Andy Shevchenko wrote:
> >>> On Sun, Jan 30, 2022 at 12:49:37PM -0800, David Rientjes wrote:
> >>>> On Sat, 29 Jan 2022, Waiman Long wrote:
> >>>>
> >>>>> For *scnprintf(), vsnprintf() is always called even if the input size is
> >>>>> 0. That is a waste of time, so just return 0 in this case.
> >>>
> >>> Why do you think it's not legit?
> >>
> >> I have to elaborate.
> >>
> >> For *nprintf() the size=0 is quite useful to have.
> >> For *cnprintf() the size=0 makes less sense, but, if we read `man snprintf()`:
> >>
> >> The functions snprintf() and vsnprintf() do not write more than size bytes
> >> (including the terminating null byte ('\0')). If the output was truncated due
> >> to this limit, then the return value is the number of characters (excluding
> >> the terminating null byte) which would have been written to the final string
> >> if enough space had been available. Thus, a return value of size or more
> >> means that the output was truncated. (See also below under NOTES.)
> >>
> >> If an output error is encountered, a negative value is returned.
> >>
> >> Note the last sentence there. You need to answer to it in the commit message
> >> why your change is okay and it will show that you thought through all possible
> >> scenarios.
> >
> > Also it seems currently the kernel documentation is not aligned with the code
> >
> > "If @size is == 0 the function returns 0."
> >
> > It should mention the (theoretical?) possibility of getting negative value,
> > if vsnprintf() returns negative value.
> >
>
> The kernel's vsnprintf _will never_ return a negative value. There is
> way too much code which relies on that. It also has to work from any
> context, so we'll never do any memory allocation or anything else that
> could possibly force us to error out, and even if we encounter some
> impossible situation, we do not return a negative value, but just stop
> the output where we are.
Yep, I see the code. My comments more or less are related to the (better)
commit message which may include what you just said.
> So yes, micro-optimizing [v]scnprintf() is completely valid, but I've
> never bothered to send the patch because the use case for scnprintf() is
> primarily the
>
> ret += scnprintf(buf + ret, size - ret, ...);
>
> pattern, with ret starting out at 0 and size being some non-zero number.
> When given a non-zero size, scnprintf() is guaranteed to return
> something _strictly less_ than that value; that invariant guarantees
> that the size-ret expression never becomes 0. So if scnprintf() is
> properly used, I can't think of any situation where size will be 0,
> hence I see that patch as correct-but-mostly-pointless.
Good remark and again commit message probably should elaborate this as
well.
--
With Best Regards,
Andy Shevchenko
WARNING: multiple messages have this Message-ID (diff)
From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
To: Rasmus Villemoes <linux@rasmusvillemoes.dk>
Cc: David Rientjes <rientjes@google.com>,
Waiman Long <longman@redhat.com>,
Johannes Weiner <hannes@cmpxchg.org>,
Michal Hocko <mhocko@kernel.org>,
Vladimir Davydov <vdavydov.dev@gmail.com>,
Andrew Morton <akpm@linux-foundation.org>,
Petr Mladek <pmladek@suse.com>,
Steven Rostedt <rostedt@goodmis.org>,
Sergey Senozhatsky <senozhatsky@chromium.org>,
linux-kernel@vger.kernel.org, cgroups@vger.kernel.org,
linux-mm@kvack.org, Ira Weiny <ira.weiny@intel.com>,
Rafael Aquini <aquini@redhat.com>
Subject: Re: [PATCH v2 1/3] lib/vsprintf: Avoid redundant work with 0 size
Date: Mon, 31 Jan 2022 13:22:42 +0200 [thread overview]
Message-ID: <YffGgozjI4W2Vamp@smile.fi.intel.com> (raw)
In-Reply-To: <d44824d4-2dd1-a8ab-d3ee-ac67b749ca6f@rasmusvillemoes.dk>
On Mon, Jan 31, 2022 at 12:02:29PM +0100, Rasmus Villemoes wrote:
> On 31/01/2022 11.34, Andy Shevchenko wrote:
> > On Mon, Jan 31, 2022 at 12:30:33PM +0200, Andy Shevchenko wrote:
> >> On Mon, Jan 31, 2022 at 12:25:09PM +0200, Andy Shevchenko wrote:
> >>> On Sun, Jan 30, 2022 at 12:49:37PM -0800, David Rientjes wrote:
> >>>> On Sat, 29 Jan 2022, Waiman Long wrote:
> >>>>
> >>>>> For *scnprintf(), vsnprintf() is always called even if the input size is
> >>>>> 0. That is a waste of time, so just return 0 in this case.
> >>>
> >>> Why do you think it's not legit?
> >>
> >> I have to elaborate.
> >>
> >> For *nprintf() the size=0 is quite useful to have.
> >> For *cnprintf() the size=0 makes less sense, but, if we read `man snprintf()`:
> >>
> >> The functions snprintf() and vsnprintf() do not write more than size bytes
> >> (including the terminating null byte ('\0')). If the output was truncated due
> >> to this limit, then the return value is the number of characters (excluding
> >> the terminating null byte) which would have been written to the final string
> >> if enough space had been available. Thus, a return value of size or more
> >> means that the output was truncated. (See also below under NOTES.)
> >>
> >> If an output error is encountered, a negative value is returned.
> >>
> >> Note the last sentence there. You need to answer to it in the commit message
> >> why your change is okay and it will show that you thought through all possible
> >> scenarios.
> >
> > Also it seems currently the kernel documentation is not aligned with the code
> >
> > "If @size is == 0 the function returns 0."
> >
> > It should mention the (theoretical?) possibility of getting negative value,
> > if vsnprintf() returns negative value.
> >
>
> The kernel's vsnprintf _will never_ return a negative value. There is
> way too much code which relies on that. It also has to work from any
> context, so we'll never do any memory allocation or anything else that
> could possibly force us to error out, and even if we encounter some
> impossible situation, we do not return a negative value, but just stop
> the output where we are.
Yep, I see the code. My comments more or less are related to the (better)
commit message which may include what you just said.
> So yes, micro-optimizing [v]scnprintf() is completely valid, but I've
> never bothered to send the patch because the use case for scnprintf() is
> primarily the
>
> ret += scnprintf(buf + ret, size - ret, ...);
>
> pattern, with ret starting out at 0 and size being some non-zero number.
> When given a non-zero size, scnprintf() is guaranteed to return
> something _strictly less_ than that value; that invariant guarantees
> that the size-ret expression never becomes 0. So if scnprintf() is
> properly used, I can't think of any situation where size will be 0,
> hence I see that patch as correct-but-mostly-pointless.
Good remark and again commit message probably should elaborate this as
well.
--
With Best Regards,
Andy Shevchenko
next prev parent reply other threads:[~2022-01-31 11:22 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-29 20:53 [PATCH v2 0/3] mm/page_owner: Extend page_owner to show memcg information Waiman Long
2022-01-29 20:53 ` Waiman Long
[not found] ` <20220129205315.478628-1-longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-01-29 20:53 ` [PATCH v2 1/3] lib/vsprintf: Avoid redundant work with 0 size Waiman Long
2022-01-29 20:53 ` Waiman Long
[not found] ` <20220129205315.478628-2-longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-01-30 20:49 ` David Rientjes
2022-01-30 20:49 ` David Rientjes
[not found] ` <d99b3c4b-7b6e-529-6e4b-b91b65c92d81-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>
2022-01-30 20:57 ` Waiman Long
2022-01-30 20:57 ` Waiman Long
2022-01-31 10:25 ` Andy Shevchenko
2022-01-31 10:30 ` Andy Shevchenko
[not found] ` <Yfe6SfG4CqzWSaMM-XvqNBM/wLWRrdx17CPfAsdBPR1lH4CV8@public.gmane.org>
2022-01-31 10:34 ` Andy Shevchenko
2022-01-31 10:34 ` Andy Shevchenko
2022-01-31 11:02 ` Rasmus Villemoes
2022-01-31 11:02 ` Rasmus Villemoes
[not found] ` <d44824d4-2dd1-a8ab-d3ee-ac67b749ca6f-qQsb+v5E8BnlAoU/VqSP6n9LOBIZ5rWg@public.gmane.org>
2022-01-31 11:22 ` Andy Shevchenko [this message]
2022-01-31 11:22 ` Andy Shevchenko
2022-01-31 18:48 ` Waiman Long
2022-01-31 18:48 ` Waiman Long
[not found] ` <c33b6435-1b27-32af-b14c-0f3a0318dcca-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-02-01 7:12 ` Rasmus Villemoes
2022-02-01 7:12 ` Rasmus Villemoes
[not found] ` <f3bcf541-e77b-ca93-ef5c-862f4de99366-qQsb+v5E8BnlAoU/VqSP6n9LOBIZ5rWg@public.gmane.org>
2022-02-01 16:01 ` Waiman Long
2022-02-01 16:01 ` Waiman Long
2022-01-31 2:53 ` Sergey Senozhatsky
2022-01-31 2:53 ` Sergey Senozhatsky
2022-01-31 18:17 ` Roman Gushchin
2022-01-31 18:17 ` Roman Gushchin
2022-01-29 20:53 ` [PATCH v2 2/3] mm/page_owner: Use scnprintf() to avoid excessive buffer overrun check Waiman Long
2022-01-29 20:53 ` Waiman Long
[not found] ` <20220129205315.478628-3-longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-01-31 2:58 ` Sergey Senozhatsky
2022-01-31 2:58 ` Sergey Senozhatsky
2022-01-29 20:53 ` [PATCH v2 3/3] mm/page_owner: Dump memcg information Waiman Long
2022-01-29 20:53 ` Waiman Long
[not found] ` <20220129205315.478628-4-longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-01-30 6:33 ` Mike Rapoport
2022-01-30 6:33 ` Mike Rapoport
2022-01-30 18:22 ` Waiman Long
[not found] ` <82c99093-e44b-7fac-14ab-9e8392d107ea-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-01-30 20:51 ` David Rientjes
2022-01-30 20:51 ` David Rientjes
2022-01-31 9:38 ` Michal Hocko
2022-01-31 9:38 ` Michal Hocko
[not found] ` <YfeuK5j7cbgM+Oo+-2MMpYkNvuYDjFM9bn6wA6Q@public.gmane.org>
2022-01-31 16:53 ` Johannes Weiner
2022-01-31 16:53 ` Johannes Weiner
[not found] ` <YfgT/9tEREQNiiAN-druUgvl0LCNAfugRpC6u6w@public.gmane.org>
2022-01-31 18:15 ` Roman Gushchin
2022-01-31 18:15 ` Roman Gushchin
[not found] ` <YfgnUZQBRkqhrEIb-cx5fftMpWqeCjSd+JxjunQ2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2022-01-31 18:25 ` Michal Hocko
2022-01-31 18:25 ` Michal Hocko
[not found] ` <Yfgpknwr1tMnPkqh-2MMpYkNvuYDjFM9bn6wA6Q@public.gmane.org>
2022-01-31 18:38 ` Waiman Long
2022-01-31 18:38 ` Waiman Long
[not found] ` <12686956-612d-d89b-5641-470d5e913090-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-02-01 10:49 ` Michal Hocko
2022-02-01 10:49 ` Michal Hocko
2022-02-01 16:41 ` Waiman Long
[not found] ` <268a8bdf-4c70-b967-f34c-2293b54186f0-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2022-02-02 8:57 ` Michal Hocko
2022-02-02 8:57 ` Michal Hocko
[not found] ` <YfpHbtffFi2x1L4p-2MMpYkNvuYDjFM9bn6wA6Q@public.gmane.org>
2022-02-02 15:54 ` Roman Gushchin
2022-02-02 15:54 ` Roman Gushchin
2022-02-02 16:38 ` Michal Hocko
[not found] ` <YfqzbwAPKpshXSLK-2MMpYkNvuYDjFM9bn6wA6Q@public.gmane.org>
2022-02-02 17:51 ` Roman Gushchin
2022-02-02 17:51 ` Roman Gushchin
[not found] ` <YfrEpOGObnc0mYAW-cx5fftMpWqeCjSd+JxjunQ2O0Ztt9esIQQ4Iyu8u01E@public.gmane.org>
2022-02-02 17:56 ` Michal Hocko
2022-02-02 17:56 ` Michal Hocko
2022-02-02 16:29 ` Waiman Long
2022-02-02 16:29 ` Waiman Long
2022-01-31 19:01 ` Waiman Long
2022-01-31 19:01 ` Waiman Long
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=YffGgozjI4W2Vamp@smile.fi.intel.com \
--to=andriy.shevchenko-vuqaysv1563yd54fqh9/ca@public.gmane.org \
--cc=akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org \
--cc=aquini-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=cgroups-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=hannes-druUgvl0LCNAfugRpC6u6w@public.gmane.org \
--cc=ira.weiny-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
--cc=linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org \
--cc=linux-qQsb+v5E8BnlAoU/VqSP6n9LOBIZ5rWg@public.gmane.org \
--cc=longman-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org \
--cc=mhocko-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=pmladek-IBi9RG/b67k@public.gmane.org \
--cc=rientjes-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=rostedt-nx8X9YLhiw1AfugRpC6u6w@public.gmane.org \
--cc=senozhatsky-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org \
--cc=vdavydov.dev-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org \
/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.