From: Ingo Molnar <mingo@kernel.org>
To: Pavel Machek <pavel@ucw.cz>
Cc: Colin Cross <ccross@android.com>, Andrew Morton <akpm@osdl.org>,
lkml <linux-kernel@vger.kernel.org>,
Trond Myklebust <Trond.Myklebust@netapp.com>,
Len Brown <len.brown@intel.com>,
"Rafael J. Wysocki" <rjw@sisk.pl>,
Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
"J. Bruce Fields" <bfields@fieldses.org>,
"David S. Miller" <davem@davemloft.net>,
Andrew Morton <akpm@linux-foundation.org>,
Mandeep Singh Baines <msb@chromium.org>,
Paul Walmsley <paul@pwsan.com>, Al Viro <viro@zeniv.linux.org.uk>,
"Eric W. Biederman" <ebiederm@xmission.com>,
Oleg Nesterov <oleg@redhat.com>,
linux-nfs@vger.kernel.org,
Linux PM list <linux-pm@vger.kernel.org>,
netdev <netdev@vger.kernel.org>,
Linus Torvalds <torvalds@linux-foundation.org>,
Tejun Heo <tj@kernel.org>, Ben Chan <benchan@chromium.org>
Subject: Re: [PATCH 2/2] lockdep: check that no locks held at freeze time
Date: Sun, 5 May 2013 11:18:44 +0200 [thread overview]
Message-ID: <20130505091844.GC22239@gmail.com> (raw)
In-Reply-To: <20130505000528.GA25454@amd.pavel.ucw.cz>
* Pavel Machek <pavel@ucw.cz> wrote:
> Hi!
>
> > >> >> --- a/kernel/exit.c
> > >> >> +++ b/kernel/exit.c
> > >> >> @@ -835,7 +835,7 @@ void do_exit(long code)
> > >> >> /*
> > >> >> * Make sure we are holding no locks:
> > >> >> */
> > >> >> - debug_check_no_locks_held(tsk);
> > >> >> + debug_check_no_locks_held();
> > >> >
> > >> > Is task guaranteed == current?
> > >>
> > >> Yes, the first line of do_exit is:
> > >> struct task_struct *tsk = current;
> > >
> > > Aha, I understand it now.
> > >
> > > Accessing current is slower than local variable. So your "new" code
> > > will work but will be slower. Please revert this part.
> >
> > Using current instead of passing in tsk was done at Andrew Morton's
> > suggestion, and makes no difference from the freezer's perspective
> > since it would have to use current to get the task to pass in, so I'm
> > going to leave it as is.
>
> Well, current is:
>
> static inline struct thread_info *current_thread_info(void)
> {
> register unsigned long sp asm ("sp");
> return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
> }
That's the old 32-bit x86 trick to compute 'current' from the kernel stack
pointer.
It can be done better - for example on platforms with optimized percpu
variables (x86-64) it looks like this:
static inline struct thread_info *current_thread_info(void)
{
struct thread_info *ti;
ti = (void *)(this_cpu_read_stable(kernel_stack) +
KERNEL_STACK_OFFSET - THREAD_SIZE);
return ti;
}
Which turns the computation of 'current' into a single instruction. For
example, to access current->pid [which fields is at offset 0x2a4], we get:
3ad0: 65 48 8b 04 25 00 00 mov %gs:0x0,%rax
3ad7: 00 00
3ad9: 8b 80 a4 02 00 00 mov 0x2a4(%rax),%eax
I also agree with the removal of the 'tsk' parameter because the function
itself internally assumes that tsk == current.
[ We could perhaps rename the function to
debug_check_no_locks_held_curr(), to make it clear it operates on the
current task. ]
Thanks,
Ingo
WARNING: multiple messages have this Message-ID (diff)
From: Ingo Molnar <mingo-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>
To: Pavel Machek <pavel-+ZI9xUNit7I@public.gmane.org>
Cc: Colin Cross <ccross-z5hGa2qSFaRBDgjK7y7TUQ@public.gmane.org>,
Andrew Morton <akpm-3NddpPZAyC0@public.gmane.org>,
lkml <linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Trond Myklebust
<Trond.Myklebust-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>,
Len Brown <len.brown-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>,
"Rafael J. Wysocki" <rjw-KKrjLPT3xs0@public.gmane.org>,
Peter Zijlstra <peterz-wEGCiKHe2LqWVfeAwA7xHQ@public.gmane.org>,
Ingo Molnar <mingo-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
"J. Bruce Fields"
<bfields-uC3wQj2KruNg9hUCZPvPmw@public.gmane.org>,
"David S. Miller" <davem-fT/PcQaiUtIeIZ0/mPfg9Q@public.gmane.org>,
Andrew Morton
<akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Mandeep Singh Baines
<msb-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>,
Paul Walmsley <paul-DWxLp4Yu+b8AvxtiuMwx3w@public.gmane.org>,
Al Viro <viro-RmSDqhL/yNMiFSDQTTA3OLVCufUGDwFn@public.gmane.org>,
"Eric W. Biederman"
<ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org>,
Oleg Nesterov <oleg-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>,
linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
Linux PM list <linux-pm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
netdev <netdev-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>,
Linus Torvalds
<torvalds-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org>,
Tejun Heo <tj-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org>,
Ben Chan <benchan-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org>
Subject: Re: [PATCH 2/2] lockdep: check that no locks held at freeze time
Date: Sun, 5 May 2013 11:18:44 +0200 [thread overview]
Message-ID: <20130505091844.GC22239@gmail.com> (raw)
In-Reply-To: <20130505000528.GA25454-tWAi6jLit6GreWDznjuHag@public.gmane.org>
* Pavel Machek <pavel-+ZI9xUNit7I@public.gmane.org> wrote:
> Hi!
>
> > >> >> --- a/kernel/exit.c
> > >> >> +++ b/kernel/exit.c
> > >> >> @@ -835,7 +835,7 @@ void do_exit(long code)
> > >> >> /*
> > >> >> * Make sure we are holding no locks:
> > >> >> */
> > >> >> - debug_check_no_locks_held(tsk);
> > >> >> + debug_check_no_locks_held();
> > >> >
> > >> > Is task guaranteed == current?
> > >>
> > >> Yes, the first line of do_exit is:
> > >> struct task_struct *tsk = current;
> > >
> > > Aha, I understand it now.
> > >
> > > Accessing current is slower than local variable. So your "new" code
> > > will work but will be slower. Please revert this part.
> >
> > Using current instead of passing in tsk was done at Andrew Morton's
> > suggestion, and makes no difference from the freezer's perspective
> > since it would have to use current to get the task to pass in, so I'm
> > going to leave it as is.
>
> Well, current is:
>
> static inline struct thread_info *current_thread_info(void)
> {
> register unsigned long sp asm ("sp");
> return (struct thread_info *)(sp & ~(THREAD_SIZE - 1));
> }
That's the old 32-bit x86 trick to compute 'current' from the kernel stack
pointer.
It can be done better - for example on platforms with optimized percpu
variables (x86-64) it looks like this:
static inline struct thread_info *current_thread_info(void)
{
struct thread_info *ti;
ti = (void *)(this_cpu_read_stable(kernel_stack) +
KERNEL_STACK_OFFSET - THREAD_SIZE);
return ti;
}
Which turns the computation of 'current' into a single instruction. For
example, to access current->pid [which fields is at offset 0x2a4], we get:
3ad0: 65 48 8b 04 25 00 00 mov %gs:0x0,%rax
3ad7: 00 00
3ad9: 8b 80 a4 02 00 00 mov 0x2a4(%rax),%eax
I also agree with the removal of the 'tsk' parameter because the function
itself internally assumes that tsk == current.
[ We could perhaps rename the function to
debug_check_no_locks_held_curr(), to make it clear it operates on the
current task. ]
Thanks,
Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2013-05-05 9:18 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-05-03 21:04 [PATCH 1/2] freezer: add unsafe versions of freezable helpers Colin Cross
2013-05-03 21:04 ` [PATCH 2/2] lockdep: check that no locks held at freeze time Colin Cross
2013-05-04 13:04 ` Pavel Machek
2013-05-04 13:04 ` Pavel Machek
2013-05-04 20:27 ` Colin Cross
2013-05-04 22:57 ` Pavel Machek
2013-05-04 23:49 ` Colin Cross
2013-05-04 23:49 ` Colin Cross
2013-05-05 0:05 ` Pavel Machek
2013-05-05 0:23 ` Colin Cross
2013-05-05 0:23 ` Colin Cross
2013-05-05 1:13 ` Pavel Machek
2013-05-05 1:13 ` Pavel Machek
2013-05-05 9:18 ` Ingo Molnar [this message]
2013-05-05 9:18 ` Ingo Molnar
2013-05-06 8:55 ` Peter Zijlstra
2013-05-06 8:55 ` Peter Zijlstra
2013-05-06 12:11 ` Pavel Machek
2013-05-06 14:33 ` Linus Torvalds
2013-05-06 14:42 ` Peter Zijlstra
2013-05-06 19:01 ` Tejun Heo
2013-05-06 19:01 ` Tejun Heo
2013-05-06 19:30 ` Colin Cross
2013-05-06 19:33 ` Tejun Heo
2013-05-06 20:06 ` Rafael J. Wysocki
2013-05-04 13:00 ` [PATCH 1/2] freezer: add unsafe versions of freezable helpers Pavel Machek
2013-05-04 20:23 ` Colin Cross
2013-05-04 22:55 ` Pavel Machek
2013-05-04 22:55 ` Pavel Machek
2013-05-05 9:23 ` Ingo Molnar
2013-05-05 22:12 ` Pavel Machek
2013-05-05 22:12 ` Pavel Machek
2013-05-06 8:50 ` Peter Zijlstra
2013-05-06 8:50 ` Peter Zijlstra
2013-05-06 10:58 ` Jeff Layton
2013-05-06 10:56 ` Jeff Layton
2013-05-06 19:57 ` Colin Cross
2013-05-06 21:43 ` Jeff Layton
2013-05-06 21:43 ` Jeff Layton
2013-05-06 21:54 ` Colin Cross
2013-05-06 21:54 ` Colin Cross
2013-05-06 21:58 ` Linus Torvalds
2013-05-06 22:05 ` Jeff Layton
2013-05-06 22:11 ` Colin Cross
2013-05-06 22:14 ` Tejun Heo
2013-05-06 21:59 ` Jeff Layton
2013-05-06 18:55 ` Tejun Heo
2013-05-06 18:55 ` Tejun Heo
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=20130505091844.GC22239@gmail.com \
--to=mingo@kernel.org \
--cc=Trond.Myklebust@netapp.com \
--cc=akpm@linux-foundation.org \
--cc=akpm@osdl.org \
--cc=benchan@chromium.org \
--cc=bfields@fieldses.org \
--cc=ccross@android.com \
--cc=davem@davemloft.net \
--cc=ebiederm@xmission.com \
--cc=len.brown@intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-nfs@vger.kernel.org \
--cc=linux-pm@vger.kernel.org \
--cc=mingo@redhat.com \
--cc=msb@chromium.org \
--cc=netdev@vger.kernel.org \
--cc=oleg@redhat.com \
--cc=paul@pwsan.com \
--cc=pavel@ucw.cz \
--cc=peterz@infradead.org \
--cc=rjw@sisk.pl \
--cc=tj@kernel.org \
--cc=torvalds@linux-foundation.org \
--cc=viro@zeniv.linux.org.uk \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.