From: Andy Lutomirski <luto@kernel.org>
To: Thomas Gleixner <tglx@linutronix.de>,
LKML <linux-kernel@vger.kernel.org>
Cc: x86@kernel.org, Stephen Hemminger <stephen@networkplumber.org>,
Willy Tarreau <w@1wt.eu>, Juergen Gross <jgross@suse.com>,
Sean Christopherson <sean.j.christopherson@intel.com>,
Linus Torvalds <torvalds@linux-foundation.org>,
"H. Peter Anvin" <hpa@zytor.com>
Subject: Re: [patch 2/9] x86/process: Unify copy_thread_tls()
Date: Fri, 8 Nov 2019 14:31:47 -0800 [thread overview]
Message-ID: <53a6f346-fca1-ac04-ee34-6d472a0d4408@kernel.org> (raw)
In-Reply-To: <20191106202805.948064985@linutronix.de>
On 11/6/19 11:35 AM, Thomas Gleixner wrote:
> While looking at the TSS io bitmap it turned out that any change in that
> area would require identical changes to copy_thread_tls(). The 32 and 64
> bit variants share sufficient code to consolidate them into a common
> function to avoid duplication of upcoming modifications.
>
> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
> ---
> arch/x86/include/asm/ptrace.h | 6 ++
> arch/x86/include/asm/switch_to.h | 10 ++++
> arch/x86/kernel/process.c | 94 +++++++++++++++++++++++++++++++++++++++
> arch/x86/kernel/process_32.c | 68 ----------------------------
> arch/x86/kernel/process_64.c | 75 -------------------------------
> 5 files changed, 110 insertions(+), 143 deletions(-)
>
> --- a/arch/x86/include/asm/ptrace.h
> +++ b/arch/x86/include/asm/ptrace.h
> @@ -361,5 +361,11 @@ extern int do_get_thread_area(struct tas
> extern int do_set_thread_area(struct task_struct *p, int idx,
> struct user_desc __user *info, int can_allocate);
>
> +#ifdef CONFIG_X86_64
> +# define do_set_thread_area_64(p, s, t) do_arch_prctl_64(p, s, t)
> +#else
> +# define do_set_thread_area_64(p, s, t) (0)
> +#endif
> +
> #endif /* !__ASSEMBLY__ */
> #endif /* _ASM_X86_PTRACE_H */
> --- a/arch/x86/include/asm/switch_to.h
> +++ b/arch/x86/include/asm/switch_to.h
> @@ -103,7 +103,17 @@ static inline void update_task_stack(str
> if (static_cpu_has(X86_FEATURE_XENPV))
> load_sp0(task_top_of_stack(task));
> #endif
> +}
>
> +static inline void kthread_frame_init(struct inactive_task_frame *frame,
> + unsigned long fun, unsigned long arg)
> +{
> + frame->bx = fun;
> +#ifdef CONFIG_X86_32
> + frame->di = arg;
> +#else
> + frame->r12 = arg;
> +#endif
> }
>
> #endif /* _ASM_X86_SWITCH_TO_H */
> --- a/arch/x86/kernel/process.c
> +++ b/arch/x86/kernel/process.c
> @@ -132,6 +132,100 @@ void exit_thread(struct task_struct *tsk
> fpu__drop(fpu);
> }
>
> +static int set_new_tls(struct task_struct *p, unsigned long tls)
> +{
> + struct user_desc __user *utls = (struct user_desc __user *)tls;
> +
> + if (in_ia32_syscall())
> + return do_set_thread_area(p, -1, utls, 0);
> + else
> + return do_set_thread_area_64(p, ARCH_SET_FS, tls);
> +}
> +
> +static inline int copy_io_bitmap(struct task_struct *tsk)
> +{
> + if (likely(!test_tsk_thread_flag(current, TIF_IO_BITMAP)))
> + return 0;
> +
> + tsk->thread.io_bitmap_ptr = kmemdup(current->thread.io_bitmap_ptr,
> + IO_BITMAP_BYTES, GFP_KERNEL);
tsk->thread.io_bitmap_max = current->thread.io_bitmap_max?
I realize you inherited this from the code you're refactoring, but it
does seem to be missing.
> + if (!tsk->thread.io_bitmap_ptr) {
> + tsk->thread.io_bitmap_max = 0;
> + return -ENOMEM;
> + }
> + set_tsk_thread_flag(tsk, TIF_IO_BITMAP);
> + return 0;
> +}
> +
> +static inline void free_io_bitmap(struct task_struct *tsk)
> +{
> + if (tsk->thread.io_bitmap_ptr) {
> + kfree(tsk->thread.io_bitmap_ptr);
> + tsk->thread.io_bitmap_ptr = NULL;
> + tsk->thread.io_bitmap_max = 0;
> + }
> +}
> +
> +int copy_thread_tls(unsigned long clone_flags, unsigned long sp,
> + unsigned long arg, struct task_struct *p, unsigned long tls)
> +{
> + struct inactive_task_frame *frame;
> + struct fork_frame *fork_frame;
> + struct pt_regs *childregs;
> + int ret;
> +
> + childregs = task_pt_regs(p);
> + fork_frame = container_of(childregs, struct fork_frame, regs);
> + frame = &fork_frame->frame;
> +
> + frame->bp = 0;
> + frame->ret_addr = (unsigned long) ret_from_fork;
> + p->thread.sp = (unsigned long) fork_frame;
> + p->thread.io_bitmap_ptr = NULL;
> + memset(p->thread.ptrace_bps, 0, sizeof(p->thread.ptrace_bps));
> +
> +#ifdef CONFIG_X86_64
> + savesegment(gs, p->thread.gsindex);
> + p->thread.gsbase = p->thread.gsindex ? 0 : current->thread.gsbase;
> + savesegment(fs, p->thread.fsindex);
> + p->thread.fsbase = p->thread.fsindex ? 0 : current->thread.fsbase;
> + savesegment(es, p->thread.es);
> + savesegment(ds, p->thread.ds);
> +#else
> + /* Clear all status flags including IF and set fixed bit. */
> + frame->flags = X86_EFLAGS_FIXED;
> +#endif
Want to do another commit to make the eflags fixup unconditional? I'm
wondering if we have a bug.
Other than these questions:
Acked-by: Andy Lutomirski <luto@kernel.org>
next prev parent reply other threads:[~2019-11-08 22:31 UTC|newest]
Thread overview: 62+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-06 19:34 [patch 0/9] x86/iopl: Prevent user space from using CLI/STI with iopl(3) Thomas Gleixner
2019-11-06 19:35 ` [patch 1/9] x86/ptrace: Prevent truncation of bitmap size Thomas Gleixner
2019-11-07 7:31 ` Ingo Molnar
2019-11-06 19:35 ` [patch 2/9] x86/process: Unify copy_thread_tls() Thomas Gleixner
2019-11-08 22:31 ` Andy Lutomirski [this message]
2019-11-08 23:43 ` Thomas Gleixner
2019-11-10 12:36 ` Thomas Gleixner
2019-11-10 16:56 ` Andy Lutomirski
2019-11-11 8:52 ` Peter Zijlstra
2019-11-06 19:35 ` [patch 3/9] x86/cpu: Unify cpu_init() Thomas Gleixner
2019-11-08 22:34 ` Andy Lutomirski
2019-11-06 19:35 ` [patch 4/9] x86/io: Speedup schedule out of I/O bitmap user Thomas Gleixner
2019-11-07 9:12 ` Peter Zijlstra
2019-11-07 14:04 ` Thomas Gleixner
2019-11-07 14:08 ` Thomas Gleixner
2019-11-08 22:41 ` Andy Lutomirski
2019-11-08 23:45 ` Thomas Gleixner
2019-11-09 3:32 ` Andy Lutomirski
2019-11-10 12:43 ` Thomas Gleixner
2019-11-09 0:24 ` Andy Lutomirski
2019-11-06 19:35 ` [patch 5/9] x86/ioport: Reduce ioperm impact for sane usage further Thomas Gleixner
2019-11-07 1:11 ` Linus Torvalds
2019-11-07 7:44 ` Thomas Gleixner
2019-11-07 8:25 ` Ingo Molnar
2019-11-07 9:17 ` Willy Tarreau
2019-11-07 10:00 ` Thomas Gleixner
2019-11-07 10:13 ` Willy Tarreau
2019-11-07 10:19 ` hpa
2019-11-07 10:27 ` Willy Tarreau
2019-11-07 10:50 ` hpa
2019-11-07 12:56 ` Willy Tarreau
2019-11-07 16:45 ` Eric W. Biederman
2019-11-07 16:53 ` Linus Torvalds
2019-11-07 16:57 ` Willy Tarreau
2019-11-10 17:17 ` Andy Lutomirski
2019-11-07 7:37 ` Ingo Molnar
2019-11-07 7:45 ` Thomas Gleixner
2019-11-07 8:16 ` Ingo Molnar
2019-11-07 18:02 ` Thomas Gleixner
2019-11-07 19:24 ` Brian Gerst
2019-11-07 19:54 ` Linus Torvalds
2019-11-07 21:00 ` Brian Gerst
2019-11-07 21:32 ` Thomas Gleixner
2019-11-07 23:20 ` hpa
2019-11-07 21:44 ` Linus Torvalds
2019-11-08 1:12 ` H. Peter Anvin
2019-11-08 2:12 ` Brian Gerst
2019-11-10 17:21 ` Andy Lutomirski
2019-11-06 19:35 ` [patch 6/9] x86/iopl: Fixup misleading comment Thomas Gleixner
2019-11-06 19:35 ` [patch 7/9] x86/iopl: Restrict iopl() permission scope Thomas Gleixner
2019-11-07 9:09 ` Peter Zijlstra
2019-11-10 17:26 ` Andy Lutomirski
2019-11-10 20:31 ` Thomas Gleixner
2019-11-10 21:05 ` Andy Lutomirski
2019-11-10 21:21 ` Thomas Gleixner
2019-11-06 19:35 ` [patch 8/9] x86/iopl: Remove legacy IOPL option Thomas Gleixner
2019-11-07 6:11 ` Jürgen Groß
2019-11-07 6:26 ` hpa
2019-11-07 16:44 ` Stephen Hemminger
2019-11-07 9:13 ` Peter Zijlstra
2019-11-06 19:35 ` [patch 9/9] selftests/x86/iopl: Verify that CLI/STI result in #GP Thomas Gleixner
2019-11-07 7:28 ` [patch] x86/iopl: Remove unused local variable, update comments in ksys_ioperm() Ingo Molnar
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=53a6f346-fca1-ac04-ee34-6d472a0d4408@kernel.org \
--to=luto@kernel.org \
--cc=hpa@zytor.com \
--cc=jgross@suse.com \
--cc=linux-kernel@vger.kernel.org \
--cc=sean.j.christopherson@intel.com \
--cc=stephen@networkplumber.org \
--cc=tglx@linutronix.de \
--cc=torvalds@linux-foundation.org \
--cc=w@1wt.eu \
--cc=x86@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®