[CRIU] [PATCH 06/11] pstree: make equal_pid handle sid comparison between nested pidnses
Kirill Tkhai
ktkhai at virtuozzo.com
Mon May 29 05:00:36 PDT 2017
On 29.05.2017 14:43, Pavel Tikhomirov wrote:
>
>
> On 05/29/2017 02:20 PM, Dmitry Safonov wrote:
>> 2017-05-26 20:02 GMT+03:00 Pavel Tikhomirov <ptikhomirov at virtuozzo.com>:
>>> If process belonging to some session is in different pidns than leader
>>> of these session, it will have zeroes on all aditional levels in sid,
>>> so though levels for these process and leader does not match - sids do.
>>>
>>> Signed-off-by: Pavel Tikhomirov <ptikhomirov at virtuozzo.com>
>>> ---
>>> criu/include/pid.h | 34 ++++++++++++++++++++--------------
>>> 1 file changed, 20 insertions(+), 14 deletions(-)
>>>
>>> diff --git a/criu/include/pid.h b/criu/include/pid.h
>>> index 72f3636..b25621a 100644
>>> --- a/criu/include/pid.h
>>> +++ b/criu/include/pid.h
>>> @@ -46,20 +46,26 @@ struct pid {
>>> } ns[1]; /* Must be at the end of struct pid */
>>> };
>>>
>>> -#define equal_pid(a, b) \
>>> -({ \
>>> - int ___i, ___ret = true; \
>>> - if (a->level == b->level) { \
>>> - for (___i = 0; ___i < a->level; ___i++) \
>>> - if (a->ns[___i].virt != b->ns[___i].virt) { \
>>> - ___ret = false; \
>>> - ___i = a->level; /* break */ \
>>> - } \
>>> - } else { \
>>> - pr_err("Wrong pid nesting level\n"); \
>>> - ___ret = false; \
>>> - } \
>>> - ___ret; \
>>> +#define equal_pid(a, b) \
>>> +({ \
>>> + int ___i, ___ret = true; \
>>> + struct pid *___a = a, *___b = b; \
>>> + if (a->level > b->level) { \
>>> + ___a = b; \
>>> + ___b = a; \
>>> + } \
>>> + for (___i = 0; ___i < ___b->level; ___i++) \
>>> + if (___i < ___a->level) { \
>>> + if (___a->ns[___i].virt != ___b->ns[___i].virt) { \
>>> + ___ret = false; \
>>> + ___i = ___b->level; /* break */ \
>>> + } \
>>> + } \
>>> + else if (___b->ns[___i].virt != 0) { \
>>> + ___ret = false; \
>>> + ___i = ___b->level; /* break */ \
>>> + } \
>>> + ___ret; \
>>> })
>>
>> I almost wish we hadn't gone down that macros-hole - and yet
>> and yet - it's rather curious, you know, this sort of life!
>>
>> Is there any reason for it not to be a static inline function?
>
> I can see any, I left it as a macros as it was the macros before :)
The reason is simple: there was a pr_err() used to print __LINE__.
So, a caller of equal_pid() does not need to use additional print
in error case.
Now you don't have, and it may be safely converted to function.
More information about the CRIU
mailing list