Commit 46a6e0cf authored by Dave Hansen's avatar Dave Hansen Committed by Ingo Molnar

x86/mpx: Clean up the code by not passing a task pointer around when unnecessary

The MPX code can only work on the current task.  You can not,
for instance, enable MPX management in another process or
thread. You can also not handle a fault for another process or
thread.

Despite this, we pass a task_struct around prolifically.  This
patch removes all of the task struct passing for code paths
where the code can not deal with another task (which turns out
to be all of them).

This has no functional changes.  It's just a cleanup.
Signed-off-by: default avatarDave Hansen <dave.hansen@linux.intel.com>
Reviewed-by: default avatarThomas Gleixner <tglx@linutronix.de>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Dave Hansen <dave@sr71.net>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Oleg Nesterov <oleg@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: bp@alien8.de
Link: http://lkml.kernel.org/r/20150607183702.6A81DA2C@viggo.jf.intel.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
parent a84eeaa9
...@@ -59,9 +59,8 @@ ...@@ -59,9 +59,8 @@
MPX_BT_ENTRY_MASK) << MPX_BT_ENTRY_SHIFT) MPX_BT_ENTRY_MASK) << MPX_BT_ENTRY_SHIFT)
#ifdef CONFIG_X86_INTEL_MPX #ifdef CONFIG_X86_INTEL_MPX
siginfo_t *mpx_generate_siginfo(struct pt_regs *regs, siginfo_t *mpx_generate_siginfo(struct pt_regs *regs);
struct task_struct *tsk); int mpx_handle_bd_fault(void);
int mpx_handle_bd_fault(struct task_struct *tsk);
static inline int kernel_managing_mpx_tables(struct mm_struct *mm) static inline int kernel_managing_mpx_tables(struct mm_struct *mm)
{ {
return (mm->bd_addr != MPX_INVALID_BOUNDS_DIR); return (mm->bd_addr != MPX_INVALID_BOUNDS_DIR);
...@@ -77,12 +76,11 @@ static inline void mpx_mm_init(struct mm_struct *mm) ...@@ -77,12 +76,11 @@ static inline void mpx_mm_init(struct mm_struct *mm)
void mpx_notify_unmap(struct mm_struct *mm, struct vm_area_struct *vma, void mpx_notify_unmap(struct mm_struct *mm, struct vm_area_struct *vma,
unsigned long start, unsigned long end); unsigned long start, unsigned long end);
#else #else
static inline siginfo_t *mpx_generate_siginfo(struct pt_regs *regs, static inline siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
struct task_struct *tsk)
{ {
return NULL; return NULL;
} }
static inline int mpx_handle_bd_fault(struct task_struct *tsk) static inline int mpx_handle_bd_fault(void)
{ {
return -EINVAL; return -EINVAL;
} }
......
...@@ -802,18 +802,18 @@ extern int get_tsc_mode(unsigned long adr); ...@@ -802,18 +802,18 @@ extern int get_tsc_mode(unsigned long adr);
extern int set_tsc_mode(unsigned int val); extern int set_tsc_mode(unsigned int val);
/* Register/unregister a process' MPX related resource */ /* Register/unregister a process' MPX related resource */
#define MPX_ENABLE_MANAGEMENT(tsk) mpx_enable_management((tsk)) #define MPX_ENABLE_MANAGEMENT() mpx_enable_management()
#define MPX_DISABLE_MANAGEMENT(tsk) mpx_disable_management((tsk)) #define MPX_DISABLE_MANAGEMENT() mpx_disable_management()
#ifdef CONFIG_X86_INTEL_MPX #ifdef CONFIG_X86_INTEL_MPX
extern int mpx_enable_management(struct task_struct *tsk); extern int mpx_enable_management(void);
extern int mpx_disable_management(struct task_struct *tsk); extern int mpx_disable_management(void);
#else #else
static inline int mpx_enable_management(struct task_struct *tsk) static inline int mpx_enable_management(void)
{ {
return -EINVAL; return -EINVAL;
} }
static inline int mpx_disable_management(struct task_struct *tsk) static inline int mpx_disable_management(void)
{ {
return -EINVAL; return -EINVAL;
} }
......
...@@ -371,7 +371,6 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) ...@@ -371,7 +371,6 @@ dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
dotraplinkage void do_bounds(struct pt_regs *regs, long error_code) dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
{ {
struct task_struct *tsk = current;
enum ctx_state prev_state; enum ctx_state prev_state;
const struct bndcsr *bndcsr; const struct bndcsr *bndcsr;
siginfo_t *info; siginfo_t *info;
...@@ -407,11 +406,11 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code) ...@@ -407,11 +406,11 @@ dotraplinkage void do_bounds(struct pt_regs *regs, long error_code)
*/ */
switch (bndcsr->bndstatus & MPX_BNDSTA_ERROR_CODE) { switch (bndcsr->bndstatus & MPX_BNDSTA_ERROR_CODE) {
case 2: /* Bound directory has invalid entry. */ case 2: /* Bound directory has invalid entry. */
if (mpx_handle_bd_fault(tsk)) if (mpx_handle_bd_fault())
goto exit_trap; goto exit_trap;
break; /* Success, it was handled */ break; /* Success, it was handled */
case 1: /* Bound violation. */ case 1: /* Bound violation. */
info = mpx_generate_siginfo(regs, tsk); info = mpx_generate_siginfo(regs);
if (IS_ERR(info)) { if (IS_ERR(info)) {
/* /*
* We failed to decode the MPX instruction. Act as if * We failed to decode the MPX instruction. Act as if
......
...@@ -271,8 +271,7 @@ static int mpx_insn_decode(struct insn *insn, ...@@ -271,8 +271,7 @@ static int mpx_insn_decode(struct insn *insn,
* *
* The caller is expected to kfree() the returned siginfo_t. * The caller is expected to kfree() the returned siginfo_t.
*/ */
siginfo_t *mpx_generate_siginfo(struct pt_regs *regs, siginfo_t *mpx_generate_siginfo(struct pt_regs *regs)
struct task_struct *tsk)
{ {
const struct bndreg *bndregs, *bndreg; const struct bndreg *bndregs, *bndreg;
siginfo_t *info = NULL; siginfo_t *info = NULL;
...@@ -340,7 +339,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs, ...@@ -340,7 +339,7 @@ siginfo_t *mpx_generate_siginfo(struct pt_regs *regs,
return ERR_PTR(err); return ERR_PTR(err);
} }
static __user void *task_get_bounds_dir(struct task_struct *tsk) static __user void *mpx_get_bounds_dir(void)
{ {
const struct bndcsr *bndcsr; const struct bndcsr *bndcsr;
...@@ -376,10 +375,10 @@ static __user void *task_get_bounds_dir(struct task_struct *tsk) ...@@ -376,10 +375,10 @@ static __user void *task_get_bounds_dir(struct task_struct *tsk)
(bndcsr->bndcfgu & MPX_BNDCFG_ADDR_MASK); (bndcsr->bndcfgu & MPX_BNDCFG_ADDR_MASK);
} }
int mpx_enable_management(struct task_struct *tsk) int mpx_enable_management(void)
{ {
void __user *bd_base = MPX_INVALID_BOUNDS_DIR; void __user *bd_base = MPX_INVALID_BOUNDS_DIR;
struct mm_struct *mm = tsk->mm; struct mm_struct *mm = current->mm;
int ret = 0; int ret = 0;
/* /*
...@@ -393,7 +392,7 @@ int mpx_enable_management(struct task_struct *tsk) ...@@ -393,7 +392,7 @@ int mpx_enable_management(struct task_struct *tsk)
* directory here means that we do not have to do xsave in the * directory here means that we do not have to do xsave in the
* unmap path; we can just use mm->bd_addr instead. * unmap path; we can just use mm->bd_addr instead.
*/ */
bd_base = task_get_bounds_dir(tsk); bd_base = mpx_get_bounds_dir();
down_write(&mm->mmap_sem); down_write(&mm->mmap_sem);
mm->bd_addr = bd_base; mm->bd_addr = bd_base;
if (mm->bd_addr == MPX_INVALID_BOUNDS_DIR) if (mm->bd_addr == MPX_INVALID_BOUNDS_DIR)
...@@ -403,7 +402,7 @@ int mpx_enable_management(struct task_struct *tsk) ...@@ -403,7 +402,7 @@ int mpx_enable_management(struct task_struct *tsk)
return ret; return ret;
} }
int mpx_disable_management(struct task_struct *tsk) int mpx_disable_management(void)
{ {
struct mm_struct *mm = current->mm; struct mm_struct *mm = current->mm;
...@@ -497,7 +496,7 @@ static int allocate_bt(long __user *bd_entry) ...@@ -497,7 +496,7 @@ static int allocate_bt(long __user *bd_entry)
* bound table is 16KB. With 64-bit mode, the size of BD is 2GB, * bound table is 16KB. With 64-bit mode, the size of BD is 2GB,
* and the size of each bound table is 4MB. * and the size of each bound table is 4MB.
*/ */
static int do_mpx_bt_fault(struct task_struct *tsk) static int do_mpx_bt_fault(void)
{ {
unsigned long bd_entry, bd_base; unsigned long bd_entry, bd_base;
const struct bndcsr *bndcsr; const struct bndcsr *bndcsr;
...@@ -525,7 +524,7 @@ static int do_mpx_bt_fault(struct task_struct *tsk) ...@@ -525,7 +524,7 @@ static int do_mpx_bt_fault(struct task_struct *tsk)
return allocate_bt((long __user *)bd_entry); return allocate_bt((long __user *)bd_entry);
} }
int mpx_handle_bd_fault(struct task_struct *tsk) int mpx_handle_bd_fault(void)
{ {
/* /*
* Userspace never asked us to manage the bounds tables, * Userspace never asked us to manage the bounds tables,
...@@ -534,7 +533,7 @@ int mpx_handle_bd_fault(struct task_struct *tsk) ...@@ -534,7 +533,7 @@ int mpx_handle_bd_fault(struct task_struct *tsk)
if (!kernel_managing_mpx_tables(current->mm)) if (!kernel_managing_mpx_tables(current->mm))
return -EINVAL; return -EINVAL;
if (do_mpx_bt_fault(tsk)) { if (do_mpx_bt_fault()) {
force_sig(SIGSEGV, current); force_sig(SIGSEGV, current);
/* /*
* The force_sig() is essentially "handling" this * The force_sig() is essentially "handling" this
......
...@@ -92,10 +92,10 @@ ...@@ -92,10 +92,10 @@
# define SET_TSC_CTL(a) (-EINVAL) # define SET_TSC_CTL(a) (-EINVAL)
#endif #endif
#ifndef MPX_ENABLE_MANAGEMENT #ifndef MPX_ENABLE_MANAGEMENT
# define MPX_ENABLE_MANAGEMENT(a) (-EINVAL) # define MPX_ENABLE_MANAGEMENT() (-EINVAL)
#endif #endif
#ifndef MPX_DISABLE_MANAGEMENT #ifndef MPX_DISABLE_MANAGEMENT
# define MPX_DISABLE_MANAGEMENT(a) (-EINVAL) # define MPX_DISABLE_MANAGEMENT() (-EINVAL)
#endif #endif
#ifndef GET_FP_MODE #ifndef GET_FP_MODE
# define GET_FP_MODE(a) (-EINVAL) # define GET_FP_MODE(a) (-EINVAL)
...@@ -2230,12 +2230,12 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3, ...@@ -2230,12 +2230,12 @@ SYSCALL_DEFINE5(prctl, int, option, unsigned long, arg2, unsigned long, arg3,
case PR_MPX_ENABLE_MANAGEMENT: case PR_MPX_ENABLE_MANAGEMENT:
if (arg2 || arg3 || arg4 || arg5) if (arg2 || arg3 || arg4 || arg5)
return -EINVAL; return -EINVAL;
error = MPX_ENABLE_MANAGEMENT(me); error = MPX_ENABLE_MANAGEMENT();
break; break;
case PR_MPX_DISABLE_MANAGEMENT: case PR_MPX_DISABLE_MANAGEMENT:
if (arg2 || arg3 || arg4 || arg5) if (arg2 || arg3 || arg4 || arg5)
return -EINVAL; return -EINVAL;
error = MPX_DISABLE_MANAGEMENT(me); error = MPX_DISABLE_MANAGEMENT();
break; break;
case PR_SET_FP_MODE: case PR_SET_FP_MODE:
error = SET_FP_MODE(me, arg2); error = SET_FP_MODE(me, arg2);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment