Re: [PATCH] proc: move the adding option Ngid to the end of proc/PID/status

Alexey Dobriyan
2015-04-21T14:00:14Z

On Fri, Apr 17, 2015 at 11:12:59AM -0400, Tejun Heo wrote:
> On Fri, Apr 17, 2015 at 06:05:55PM +0300, Alexey Dobriyan wrote:
> > Moving Ngid to the end of file minimizes risk of breakage.
>
> Hmmm... how so?

Correctly written parser will be unaffected:

f = fopen("/proc/self/status", "r");
while (getline(&buf, &len, f) > 0) {
if (strncmp(buf, "TracerPid:", 10) != 0)
continue;
tracer_pid = ...
}

Incorrectly written parser

buf = strchr(buf, '\n');
buf = strchr(buf, '\n');
buf = strchr(buf, '\n');
buf = strchr(buf, '\n');
buf = strchr(buf, '\n');
tracer_pid = ...

will be broken.

Moving Ngid to the end will unbreak incorrect parser and all other
incorrect parsers. There are 3 fields before Ngid and 30+ after.
What are the odds?

The only thing moving Ngid to the end is going to break is _another_
incorrect parser expecting Ngid line to be #4.

> The only reason for changing the position is because
> there's this specific breakage. The goal should be working around
> that specific case while keeping the impact minimum on everyone else.

If there are TWO incorrect parsers, one for TracerPid, another for Ngid,
you CAN'T workaround it. And if you can't workaround you choose code
which was written first, namely, TracerPid one.

In ideal world, Ngid patch will be reverted and it would be up to numa guys
to re-add it so their parsers won't break.

I briefly checked numactl code, it seems to be written correctly
(fopen+readline+strncmp), so there is hope.

> It doesn't matter whether the initial change was good or bad, the
> kernel w/ the new layout is already out in the wild and it has been
> out there for a while. How is risking changing offsets on most of the
> fields on those kernels a good idea? Mimize the changes to work
> around the specific case.
>
> > Correctly written code doesn't care.
> > Code which hardcodes layout won't notice.
>
> Huh? Code which hardcodes layout since 1.5 years ago will definitely
> notice.