[CRIU] Re: [PATCH 10/10] files: Use sys_kcmp to find file
descriptor duplicates
Pavel Emelyanov
xemul at parallels.com
Mon Feb 27 08:54:59 EST 2012
>>> +
>>> + e = alloc_fd_id_entry(genid, pid, fd);
>>> + if (!e)
>>> + goto err;
>>
>> Here the subid will be INVALID. This is ... wrong.
>>
>>> + rb_link_node(&e->node, parent, new);
>>> + rb_insert_color(&e->node, &fd_id_root);
>>> +err:
>>> + return e;
>>> +}
>>> +
>
> No, it's OK, the only _subsequent_ subid become a numbers from global
> counter. Maybe I should simply rename FD_SUBID_INVALID to say FD_SUBID_FIRST
> to eliminate confusion?
Yes, some better name is OK. I assume that just 0 will work too.
>>> +struct fd_id_entry *fd_id_entry_collect(u64 genid, pid_t pid, int fd)
>>> +{
>>> + return lookup_alloc(genid, pid, fd);
>>
>> :\
>
> Heh ;) Sure I'll merge it.
>
>>
>>> +struct fd_id_entry {
>>> + struct rb_node node;
>>> +
>>> + struct rb_root subtree_root;
>>> + struct rb_node subtree_node;
>>> +
>>> + u64 genid; /* generic id, may have duplicates */
>>> + u64 subid; /* subid is always unique */
>>> +
>>> + pid_t pid;
>>> + int fd;
>>> +} __aligned(sizeof(long));
>>> +
>>> +/* Position in file is u64 so we can't shrink it */
>>> +#define MAKE_FD_GENID(dev, ino, pos) \
>>> + ((u64)(dev) ^ (u64)(ino) ^ (u64)(pos))
>>
>> Since genid is just a hint, we can make it 32bit and just trim the pos.
>> So can we make subid be 32 bit and ...
>>
>>> struct fdinfo_entry {
>>> u8 type;
>>> u8 len;
>>> u16 flags;
>>> u32 pos;
>>> u64 addr;
>>> - u8 id[FD_ID_SIZE];
>>> + u64 genid;
>>> + u64 subid;
>>
>> ... make this a single 64bit ID field.
>>
>>> u8 name[0];
>>> } __packed;
>>
>
> Sure we can do so but it potentially may increase the number
> of syscalls we need to yield if position is somewhere on top
> 32 bits.
This doesn't matter. I can imagine quite a few real-life usecases
when we have a container with plenty of files pointing to the
same dev:ino pair. We can even throw the pos out and it will still
work OK (remember, the sys_kcmp returns actual COMPARISON, not just
equals/notequals).
> Pavel, while you at it -- the main problem is the fact itself
> that we have two fields in image?
Yes. I want it to be just u64 ID and that's it.
> I could make it simply
> u64 id[2] then (it's still far better than u8 id[50] we've
> had before then (it's still far better than u8 id[50] we've
> had before :).
>
> Cyrill
> .
>
More information about the CRIU
mailing list