Le 05/11/2021 à 00:36, Finn Thain a écrit :
On Thu, 4 Nov 2021, Christophe Leroy wrote:

Le 02/11/2021 à 03:20, Finn Thain a écrit :
Hi Christopher,

After many builds and tests, Stan and I were able to determine that this
regression only affects builds with CONFIG_USER_NS=y. That is,

d3ccc9781560  + CONFIG_USER_NS=y  -->  fail
d3ccc9781560  + CONFIG_USER_NS=n  -->  okay
d3ccc9781560~ + CONFIG_USER_NS=y  -->  okay
d3ccc9781560~ + CONFIG_USER_NS=n  -->  okay

Stan also tested a PowerMac G3 system and found that the regression is not
present there. Thus far, only PowerMac G4 systems are known to be affected
(Stan's Cube and Riccardo's PowerBook).

I asked Stan to try v5.15-rc after reverting commit d3ccc9781560.
Unexpectedly, this build had the same issue. So, it appears there are
multiple bad commits that produce this Xorg failure, of which d3ccc9781560
is just the first.

But there's no easy way to identify the other bad commits using bisection.
So I've addressed this message to you. Can you help fix this regression?


I'm wondering if this commit is really the cause of the problem.

Are you using GCC 11 ?

If yes, I think it could be a false positive, fixed by
https://github.com/linuxppc/linux/commit/7315e457d6bc

Can you try with GCC 10 or older ?


AFAIK, all of Stan's builds were made with gcc 10.

Can you cherry pick 7315e457d6bc ("powerpc/uaccess: Fix __get_user() with
CONFIG_CC_HAS_ASM_GOTO_OUTPUT") on top of d3ccc9781560 and see what happens ?


$ git checkout d3ccc9781560
$ git cherry-pick 7315e457d6bc
Auto-merging arch/powerpc/include/asm/uaccess.h
CONFLICT (content): Merge conflict in arch/powerpc/include/asm/uaccess.h
error: could not apply 7315e457d6bc... powerpc/uaccess: Fix __get_user() with 
CONFIG_CC_HAS_ASM_GOTO_OUTPUT

There is no __get_user_asm2_goto in this tree, and __get_user_asm2 already
has the "=&r" constraint:

#define __get_user_asm2(x, addr, err)                   \
         __asm__ __volatile__(                           \
                 "1:     lwz%X2 %1, %2\n"                        \
                 "2:     lwz%X2 %L1, %L2\n"              \
                 "3:\n"                                  \
                 ".section .fixup,\"ax\"\n"              \
                 "4:     li %0,%3\n"                     \
                 "       li %1,0\n"                      \
                 "       li %1+1,0\n"                    \
                 "       b 3b\n"                         \
                 ".previous\n"                           \
                 EX_TABLE(1b, 4b)                        \
                 EX_TABLE(2b, 4b)                        \
                 : "=r" (err), "=&r" (x)                 \
                 : "m" (*addr), "i" (-EFAULT), "0" (err))


You are right, __get_user_asm2_goto() was added later.

I think I found the issue.

__get_user_sigset() is wrong for 32 bits.

Could you change its content to return __get_user(*(u64*)&dst->sig[0], (u64 __user *)&src->sig[0]);

If it works, for the mainline also change unsafe_get_user_sigset()

Christophe

Reply via email to