CoreCLR рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдХреЗ рджреМрд░рд╛рди mlock
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрджрд┐ mlock
рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ $# EPERM
рдХреЗ рд╕рд╛рде рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИред
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдХрдИ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП systemd-nspawn
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣ рдПрдХ рдХреНрд░реЛрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдЬрд╣рд╛рдВ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдореЗрдВ рд╕реАрдорд┐рдд рдХреНрд╖рдорддрд╛рдПрдВ рд╣реЛрддреА рд╣реИрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрдирдХреЗ рдкрд╛рд╕ CAP_IPC_LOCK
рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рд╡реЗ mlock
рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм mlock
рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рддреЛ coreclr рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ рдореЗрдВ рд╡рд┐рдлрд▓ рд░рд╣рддрд╛ рд╣реИред рдпрд╣ strace
рдореЗрдВ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ:
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbd542bb000
mlock(0x7fbd542bb000, 4096) = -1 EPERM (Operation not permitted)
write(2, "Failed to initialize CoreCLR, HR"..., 49) = 49
рдирддреАрдЬрддрди, рдпрд╣ рдХреБрдЫ рд▓рд┐рдирдХреНрд╕ рд╡рд┐рддрд░рдг рдирд┐рд░реНрдорд╛рдг рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдХреЛрд░рдХреНрд▓рд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдирд╛ рдореВрд▓ рд░реВрдк рд╕реЗ рдЕрд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред
cc @tmds @alucryd
рджреЗрдЦреЗрдВ https://github.com/dotnet/source-build/issues/285#issuecomment -399949984 рдФрд░ https://github.com/rpm-software-management/mock/issues/186 рдХреБрдЫ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рдХреБрдЫ рд╣рд┐рдЯ рдХрд░ рд░рд╣рд╛ рд╣реИ рдмрдирд╛рддрд╛
FlushProcessWriteBuffers PAL рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП mlock
рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ GC рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░рдирдЯрд╛рдЗрдо рдирд┐рд▓рдВрдмрди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрд╛рд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098 рджреЗрдЦреЗрдВред
Linux 4.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░, рдПрдХ sys_membarrier
syscall рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо FlushProcessWriteBuffers рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╢реНрдпреВ рдбреЙрдЯрдиреЗрдЯ/рд░рдирдЯрд╛рдЗрдо#4501 рдЙрд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред @sdmaclea рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ ARM64 рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ ~11000 рдХреЛрд░рдХреНрд▓рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ 50% рдЕрдзрд┐рдХ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ ARM64 рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдпрд╛ рд╕рдордЧреНрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИред
рджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдореИрдВрдиреЗ sys_membarrier рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ: https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ syscall рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕рднреА рдереНрд░реЗрдб рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╕реЗ рди рдЧреБрдЬрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рджрд╕рд┐рдпреЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ 4.14 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдПрдХ рдирдпрд╛ рдзреНрд╡рдЬ рд╣реИ рдЬрд┐рд╕реЗ sys_membarrier syscall рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
FlushProcessWriteBuffers PAL рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЙрдЪрд┐рдд рд╡реНрдпрд╡рд╣рд╛рд░ рдХреЗ рд▓рд┐рдП
mlock
рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдЬреЛ GC рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реНрд╡рд╕рдиреАрдп рд░рдирдЯрд╛рдЗрдо рдирд┐рд▓рдВрдмрди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред рдХрд╛рд░рдг рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП https://github.com/dotnet/coreclr/blob/e6ebea25bea93eb4ec07cbd5003545c4805886a8/src/pal/src/thread/process.cpp#L3095 -L3098 рджреЗрдЦреЗрдВредLinux 4.3 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдкрд░, рдПрдХ
sys_membarrier
syscall рд╣реИ рдЬрд┐рд╕реЗ рд╣рдо FlushProcessWriteBuffers рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрдВрддреНрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╢реНрдпреВ рдбреЙрдЯрдиреЗрдЯ/рд░рдирдЯрд╛рдЗрдо#4501 рдЙрд╕реЗ рдЯреНрд░реИрдХ рдХрд░ рд░рд╣рд╛ рд╣реИред @sdmaclea рдиреЗ рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ ARM64 рдкрд░ рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ред рдЙрдиреНрд╣реЛрдВрдиреЗ рдкрд╛рдпрд╛ рд╣реИ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦрд░рд╛рдм рдерд╛ рдФрд░ рд╣рдорд╛рд░реЗ ~11000 рдХреЛрд░рдХреНрд▓рд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХрд╛ рдЪрд▓рдиреЗ рдХрд╛ рд╕рдордп рд▓рдЧрднрдЧ 50% рдЕрдзрд┐рдХ рдерд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдиреНрдп рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкрд░ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рдерд╛ рдХрд┐ рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛ ARM64 рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ рдпрд╛ рд╕рдордЧреНрд░ рд╕рдорд╕реНрдпрд╛ рд╣реИредрджрд┐рд▓рдЪрд╕реНрдк рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рдореИрдВрдиреЗ sys_membarrier рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдХреА рдЦреЛрдЬ рдХреА рд╣реИ: https://lttng.org/blog/2018/01/15/membarrier-system-call-performance-and-userspace-rcu/ред рдЗрд╕рдХрд╛ рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ syscall рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЪрд▓ рд░рд╣реЗ рд╕рднреА рдереНрд░реЗрдб рдПрдХ рд╕рдВрджрд░реНрдн рд╕реНрд╡рд┐рдЪ рд╕реЗ рди рдЧреБрдЬрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рджрд╕рд┐рдпреЛрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЗрд╕ рдЖрд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдЕрдЪреНрдЫреА рдЦрдмрд░ рдпрд╣ рд╣реИ рдХрд┐ рд▓рд┐рдирдХреНрд╕ 4.14 рд╕реЗ рд╢реБрд░реВ рд╣реЛрдХрд░, рдПрдХ рдирдпрд╛ рдзреНрд╡рдЬ рд╣реИ рдЬрд┐рд╕реЗ sys_membarrier syscall рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдпрд╣ рд╕реНрдореГрддрд┐ рдмрд╛рдзрд╛ рдЕрд░реНрдерд╢рд╛рд╕реНрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдИрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдпрд╣ рдмрд╣реБрдд рддреЗрдЬ рд╣реИред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдЗрд╕реЗ рдЖрдЬрдорд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред