[CRIU] [PATCH 06/11] pstree: make equal_pid handle sid comparison between nested pidnses
Pavel Tikhomirov
ptikhomirov at virtuozzo.com
Mon May 29 04:43:39 PDT 2017
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 :)
>
>>
>> static inline pid_t last_level_pid(struct pid *pid)
>> --
>> 2.9.3
>>
>> _______________________________________________
>> CRIU mailing list
>> CRIU at openvz.org
>> https://lists.openvz.org/mailman/listinfo/criu
>
>
>
--
Best regards, Tikhomirov Pavel
Software Developer, Virtuozzo.
More information about the CRIU
mailing list