Messages in this thread | | | From | Arnd Bergmann <> | Subject | Re: [PATCH 4/6] improve sys_personality for compat architectures | Date | Wed, 3 Feb 2010 18:06:27 +0100 |
| |
On Tuesday 02 February 2010 17:31:45 Christoph Hellwig wrote: > > On Tue, Feb 02, 2010 at 03:36:51PM +0100, Arnd Bergmann wrote: > > > - return (long)old; > > > + return (long)(old == PER_LINUX32 ? PER_LINUX : old); > > > } > > > > What does this do for a native 64 bit process setting PER_LINUX32? > > It looks to me like it could never set it back to the original > > value, or am I missing something here? > > > > It's what the arch specific code does already, but it seems a bit > > strange anyway. > > Indeed, this prevents a process from going back to 64bit. And while > the setarch tool in util-linux also allows going back to 64-bit the > typical use case seems to be going into 32-bit mode.
It appears that setarch can only go back into 64 bit mode on x86 because that does not wire up sys32_personality at all -- it always uses the regular sys_personality, which allows going both ways.
Your patch changes the behavior on x86 to also make the change to PER_LINUX32 permanent, which seems consistent but possibly not what people want. I still wonder if anything other than setarch actually calls personality() to set PER_LINUX32 and what the real intention of sys32_personality is. From what I can tell here, it may be best to kill the special handling of PER_LINUX32 entirely and make everyone use the existing sys_personality.
> But if the consensus is that we should fix this properly I can > replace the patch with one introducing a compat_sys_personality > which only gets used for compat tasks.
Right now, sparc64 and powerpc64 use sys32_personality for both native and compat tasks, x86 never uses it and all others use it only for compat tasks. That seems more sensible if we keep this function at all.
Arnd
| |