lkml.org 
[lkml]   [2019]   [Dec]   [3]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[PATCH v2 4/4] x86: introduce restart_block->arch_data to kill TS_COMPAT_RESTART
    With this patch x86 just saves current_thread_info()->status in the
    new restart_block->arch_data field, TS_COMPAT_RESTART can be removed.

    Rather than saving "status" we could shift the code from
    get_nr_restart_syscall() to arch_set_restart_data() and save the syscall
    number in ->arch_data.

    Signed-off-by: Oleg Nesterov <oleg@redhat.com>
    ---
    arch/x86/include/asm/thread_info.h | 12 ++----------
    arch/x86/kernel/signal.c | 2 +-
    include/linux/restart_block.h | 1 +
    3 files changed, 4 insertions(+), 11 deletions(-)

    diff --git a/arch/x86/include/asm/thread_info.h b/arch/x86/include/asm/thread_info.h
    index a4de7aa..75c4a0a 100644
    --- a/arch/x86/include/asm/thread_info.h
    +++ b/arch/x86/include/asm/thread_info.h
    @@ -233,18 +233,10 @@ static inline int arch_within_stack_frames(const void * const stack,
    #ifndef __ASSEMBLY__
    #ifdef CONFIG_COMPAT
    #define TS_I386_REGS_POKED 0x0004 /* regs poked by 32-bit ptracer */
    -#define TS_COMPAT_RESTART 0x0008

    -#define arch_set_restart_data arch_set_restart_data
    +#define arch_set_restart_data(restart) \
    + do { restart->arch_data = current_thread_info()->status; } while (0)

    -static inline void arch_set_restart_data(struct restart_block *restart)
    -{
    - struct thread_info *ti = current_thread_info();
    - if (ti->status & TS_COMPAT)
    - ti->status |= TS_COMPAT_RESTART;
    - else
    - ti->status &= ~TS_COMPAT_RESTART;
    -}
    #endif

    #ifdef CONFIG_X86_32
    diff --git a/arch/x86/kernel/signal.c b/arch/x86/kernel/signal.c
    index 2fdbf5e..2e52767 100644
    --- a/arch/x86/kernel/signal.c
    +++ b/arch/x86/kernel/signal.c
    @@ -771,7 +771,7 @@ handle_signal(struct ksignal *ksig, struct pt_regs *regs)
    static inline unsigned long get_nr_restart_syscall(const struct pt_regs *regs)
    {
    #ifdef CONFIG_IA32_EMULATION
    - if (current_thread_info()->status & TS_COMPAT_RESTART)
    + if (current->restart_block.arch_data & TS_COMPAT)
    return __NR_ia32_restart_syscall;
    #endif
    #ifdef CONFIG_X86_X32_ABI
    diff --git a/include/linux/restart_block.h b/include/linux/restart_block.h
    index bba2920..980a655 100644
    --- a/include/linux/restart_block.h
    +++ b/include/linux/restart_block.h
    @@ -23,6 +23,7 @@ enum timespec_type {
    * System call restart block.
    */
    struct restart_block {
    + unsigned long arch_data;
    long (*fn)(struct restart_block *);
    union {
    /* For futex_wait and futex_wait_requeue_pi */
    --
    2.5.0

    \
     
     \ /
      Last update: 2019-12-03 15:15    [W:4.357 / U:0.024 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site