Messages in this thread Patch in this message | | | Date | Tue, 27 Sep 2011 19:04:48 +0200 | From | Oleg Nesterov <> | Subject | Q: x86: add context tag to mark mm when running a task in 32-bit compatibility mode |
| |
commit c2ef45df3b98a027ec8f9081bd2a19dff520ef9d
This tag is intended to mirror the thread info TIF_IA32 flag.
OK, but
+#ifdef CONFIG_X86_64 + /* True if mm supports a task running in 32 bit compatibility mode. */ + unsigned short ia32_compat; +#endif
Stupid question, why we can't add a simple arch-independent MMF_COMPAT flag instead?
I am asking because we probably want to backport this change and this ia32_compat looks a bit annoying, why should we waste a word?
Sure, this is very minor, but perhaps the trivial patch below makes sense?
Oleg.
--- x/include/linux/sched.h +++ x/include/linux/sched.h @@ -436,6 +436,8 @@ extern int get_dumpable(struct mm_struct #define MMF_VM_MERGEABLE 16 /* KSM may merge identical pages */ #define MMF_VM_HUGEPAGE 17 /* set when VM_HUGEPAGE is set on vma */ +#define MMF_COMPAT 18 /* this task runs in compat mode. */ + #define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK) struct sighand_struct { --- x/arch/x86/include/asm/mmu.h +++ x/arch/x86/include/asm/mmu.h @@ -12,11 +12,6 @@ typedef struct { void *ldt; int size; -#ifdef CONFIG_X86_64 - /* True if mm supports a task running in 32 bit compatibility mode. */ - unsigned short ia32_compat; -#endif - struct mutex lock; void *vdso; } mm_context_t; --- x/arch/x86/kernel/process_64.c +++ x/arch/x86/kernel/process_64.c @@ -502,10 +502,6 @@ void set_personality_64bit(void) /* Make sure to be in 64bit mode */ clear_thread_flag(TIF_IA32); - /* Ensure the corresponding mm is not marked. */ - if (current->mm) - current->mm->context.ia32_compat = 0; - /* TBD: overwrites user setup. Should have two bits. But 64bit processes have always behaved this way, so it's not too bad. The main problem is just that @@ -522,8 +518,7 @@ void set_personality_ia32(void) current->personality |= force_personality32; /* Mark the associated mm as containing 32-bit tasks. */ - if (current->mm) - current->mm->context.ia32_compat = 1; + set_bit(MMF_COMPAT, ¤t->mm->flags); /* Prepare the first "return" to user space */ current_thread_info()->status |= TS_COMPAT; --- x/arch/x86/mm/init_64.c +++ x/arch/x86/mm/init_64.c @@ -860,7 +860,7 @@ static struct vm_area_struct gate_vma = struct vm_area_struct *get_gate_vma(struct mm_struct *mm) { #ifdef CONFIG_IA32_EMULATION - if (!mm || mm->context.ia32_compat) + if (!mm || test_bit(MMF_COMPAT, &mm->flags)) return NULL; #endif return &gate_vma; --- x/arch/x86/ia32/ia32_aout.c +++ x/arch/x86/ia32/ia32_aout.c @@ -298,7 +298,7 @@ static int load_aout_binary(struct linux /* OK, This is the point of no return */ set_personality(PER_LINUX); set_thread_flag(TIF_IA32); - current->mm->context.ia32_compat = 1; + set_bit(MMF_COMPAT, ¤t->mm->flags); setup_new_exec(bprm);
| |