Hello, On 3/26/21 10:50 AM, Christophe Leroy wrote: > > > Le 26/03/2021 à 11:46, Michael Ellerman a écrit : >> Laurent Dufour <lduf...@linux.ibm.com> writes: >>> Le 25/03/2021 à 17:56, Laurent Dufour a écrit : >>>> Le 25/03/2021 à 17:46, Christophe Leroy a écrit : >>>>> Le 25/03/2021 à 17:11, Laurent Dufour a écrit : >>>>>> Since v5.11 and the changes you made to the VDSO code, it no more >>>>>> exposing >>>>>> the ELF header at the beginning of the VDSO mapping in user space. >>>>>> >>>>>> This is confusing CRIU which is checking for this ELF header cookie >>>>>> (https://github.com/checkpoint-restore/criu/issues/1417). >>>>> >>>>> How does it do on other architectures ? >>>> >>>> Good question, I'll double check the CRIU code. >>> >>> On x86, there are 2 VDSO entries: >>> 7ffff7fcb000-7ffff7fce000 r--p 00000000 00:00 >>> 0 [vvar] >>> 7ffff7fce000-7ffff7fcf000 r-xp 00000000 00:00 >>> 0 [vdso] >>> >>> And the VDSO is starting with the ELF header. >>> >>>>>> I'm not an expert in loading and ELF part and reading the change >>>>>> you made, I >>>>>> can't identify how this could work now as I'm expecting the loader >>>>>> to need >>>>>> that ELF header to do the relocation. >>>>> >>>>> I think the loader is able to find it at the expected place. >>>> >>>> Actually, it seems the loader relies on the AUX vector >>>> AT_SYSINFO_EHDR. I guess >>>> CRIU should do the same. >>>> >>>>>> >>>>>> From my investigation it seems that the first bytes of the VDSO >>>>>> area are now >>>>>> the vdso_arch_data. >>>>>> >>>>>> Is the ELF header put somewhere else? >>>>>> How could the loader process the VDSO without that ELF header? >>>>>> >>>>> >>>>> Like most other architectures, we now have the data section as >>>>> first page and >>>>> the text section follows. So you will likely find the elf header on >>>>> the second >>>>> page. >>> >>> I'm wondering if the data section you're refering to is the vvar >>> section I can >>> see on x86. >> >> Many of the other architectures have separate vm_special_mapping's for >> the data page and the vdso binary, where the former is called "vvar". >> >> eg, s390: >> >> static struct vm_special_mapping vvar_mapping = { >> .name = "[vvar]", >> .fault = vvar_fault, >> }; >> >> static struct vm_special_mapping vdso_mapping = { >> .name = "[vdso]", >> .mremap = vdso_mremap, >> }; >> >> >> I guess we probably should be doing that too. >> > > Dmitry proposed the same, see > https://github.com/0x7f454c46/linux/commit/783c7a2532d2219edbcf555cc540eab05f698d2a > > > Discussion at https://github.com/checkpoint-restore/criu/issues/1417
Yeah, I didn't submit it officially to lkml because I couldn't test it yet (and I usually don't send untested patches). The VM I have fails to kexec and there's some difficulty to get serial console working, so I'd appreciate if someone could either pick it up, or add tested-by. Thanks, Dmitry