public inbox for [email protected]
 help / color / mirror / Atom feed
* Re: d28296d248:  stress-ng.sigsegv.ops_per_sec -82.7% regression
       [not found] ` <[email protected]>
@ 2021-02-24 18:38   ` Alexey Gladkov
  2021-02-24 18:50     ` Eric W. Biederman
  2021-02-24 19:10     ` Linus Torvalds
  0 siblings, 2 replies; 5+ messages in thread
From: Alexey Gladkov @ 2021-02-24 18:38 UTC (permalink / raw)
  To: Eric W. Biederman
  Cc: kernel test robot, 0day robot, LKML, lkp, ying.huang, feng.tang,
	zhengjun.xing, io-uring, Kernel Hardening, Linux Containers,
	linux-mm, Andrew Morton, Christian Brauner, Jann Horn, Jens Axboe,
	Kees Cook, Linus Torvalds, Oleg Nesterov

On Wed, Feb 24, 2021 at 10:54:17AM -0600, Eric W. Biederman wrote:
> kernel test robot <[email protected]> writes:
> 
> > Greeting,
> >
> > FYI, we noticed a -82.7% regression of stress-ng.sigsegv.ops_per_sec due to commit:
> >
> >
> > commit: d28296d2484fa11e94dff65e93eb25802a443d47 ("[PATCH v7 5/7] Reimplement RLIMIT_SIGPENDING on top of ucounts")
> > url: https://github.com/0day-ci/linux/commits/Alexey-Gladkov/Count-rlimits-in-each-user-namespace/20210222-175836
> > base: https://git.kernel.org/cgit/linux/kernel/git/shuah/linux-kselftest.git next
> >
> > in testcase: stress-ng
> > on test machine: 48 threads Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz with 112G memory
> > with following parameters:
> >
> > 	nr_threads: 100%
> > 	disk: 1HDD
> > 	testtime: 60s
> > 	class: interrupt
> > 	test: sigsegv
> > 	cpufreq_governor: performance
> > 	ucode: 0x42e
> >
> >
> > In addition to that, the commit also has significant impact on the
> > following tests:
> 
> Thank you.  Now we have a sense of where we need to test the performance
> of these changes carefully.

One of the reasons for this is that I rolled back the patch that changed
the ucounts.count type to atomic_t. Now get_ucounts() is forced to use a
spin_lock to increase the reference count.

-- 
Rgrds, legion


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: d28296d248:  stress-ng.sigsegv.ops_per_sec -82.7% regression
  2021-02-24 18:38   ` d28296d248: stress-ng.sigsegv.ops_per_sec -82.7% regression Alexey Gladkov
@ 2021-02-24 18:50     ` Eric W. Biederman
  2021-02-25 20:36       ` Alexey Gladkov
  2021-02-24 19:10     ` Linus Torvalds
  1 sibling, 1 reply; 5+ messages in thread
From: Eric W. Biederman @ 2021-02-24 18:50 UTC (permalink / raw)
  To: Alexey Gladkov
  Cc: kernel test robot, 0day robot, LKML, lkp, ying.huang, feng.tang,
	zhengjun.xing, io-uring, Kernel Hardening, Linux Containers,
	linux-mm, Andrew Morton, Christian Brauner, Jann Horn, Jens Axboe,
	Kees Cook, Linus Torvalds, Oleg Nesterov

Alexey Gladkov <[email protected]> writes:

> On Wed, Feb 24, 2021 at 10:54:17AM -0600, Eric W. Biederman wrote:
>> kernel test robot <[email protected]> writes:
>> 
>> > Greeting,
>> >
>> > FYI, we noticed a -82.7% regression of stress-ng.sigsegv.ops_per_sec due to commit:
>> >
>> >
>> > commit: d28296d2484fa11e94dff65e93eb25802a443d47 ("[PATCH v7 5/7] Reimplement RLIMIT_SIGPENDING on top of ucounts")
>> > url: https://github.com/0day-ci/linux/commits/Alexey-Gladkov/Count-rlimits-in-each-user-namespace/20210222-175836
>> > base: https://git.kernel.org/cgit/linux/kernel/git/shuah/linux-kselftest.git next
>> >
>> > in testcase: stress-ng
>> > on test machine: 48 threads Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz with 112G memory
>> > with following parameters:
>> >
>> > 	nr_threads: 100%
>> > 	disk: 1HDD
>> > 	testtime: 60s
>> > 	class: interrupt
>> > 	test: sigsegv
>> > 	cpufreq_governor: performance
>> > 	ucode: 0x42e
>> >
>> >
>> > In addition to that, the commit also has significant impact on the
>> > following tests:
>> 
>> Thank you.  Now we have a sense of where we need to test the performance
>> of these changes carefully.
>
> One of the reasons for this is that I rolled back the patch that changed
> the ucounts.count type to atomic_t. Now get_ucounts() is forced to use a
> spin_lock to increase the reference count.

Which given the hickups with getting a working version seems justified.

Now we can add incremental patches on top to improve the performance.


Eric


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: d28296d248: stress-ng.sigsegv.ops_per_sec -82.7% regression
  2021-02-24 18:38   ` d28296d248: stress-ng.sigsegv.ops_per_sec -82.7% regression Alexey Gladkov
  2021-02-24 18:50     ` Eric W. Biederman
@ 2021-02-24 19:10     ` Linus Torvalds
  1 sibling, 0 replies; 5+ messages in thread
From: Linus Torvalds @ 2021-02-24 19:10 UTC (permalink / raw)
  To: Alexey Gladkov
  Cc: Eric W. Biederman, kernel test robot, 0day robot, LKML, lkp,
	Huang, Ying, Feng Tang, zhengjun.xing, io-uring, Kernel Hardening,
	Linux Containers, Linux-MM, Andrew Morton, Christian Brauner,
	Jann Horn, Jens Axboe, Kees Cook, Oleg Nesterov

On Wed, Feb 24, 2021 at 10:38 AM Alexey Gladkov
<[email protected]> wrote:
>
> One of the reasons for this is that I rolled back the patch that changed
> the ucounts.count type to atomic_t. Now get_ucounts() is forced to use a
> spin_lock to increase the reference count.

Yeah, that definitely should be an atomic type, since the extended use
of ucounts clearly puts way too much pressure on that ucount lock.

I remember complaining about one version of that patch, but my
complaint wasabout it changing semantics of the saturation logic (and
I think it was also wrong because it still kept the spinlock for
get_ucounts(), so it didn't even take advantage of the atomic
refcount).

Side note: I don't think a refcount_t" is necessarily the right thing
to do, since the ucount reference counter does its own saturation
logic, and the refcount_t version is imho not great.

So it probably just needs to use an atomic_t, and do the saturation
thing manually.

Side note: look at try_get_page(). That one actually does refcounting
with overflow protection better than refcount_t, in my opinion. But I
am obviously biased, since I wrote it ;)

See commits

    88b1a17dfc3e mm: add 'try_get_page()' helper function
    f958d7b528b1 mm: make page ref count overflow check tighter and
more explicit

with that "page->_recount" being just a regular atomic_t.

            Linus

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: d28296d248:  stress-ng.sigsegv.ops_per_sec -82.7% regression
  2021-02-24 18:50     ` Eric W. Biederman
@ 2021-02-25 20:36       ` Alexey Gladkov
  2021-03-05 17:56         ` Eric W. Biederman
  0 siblings, 1 reply; 5+ messages in thread
From: Alexey Gladkov @ 2021-02-25 20:36 UTC (permalink / raw)
  To: Eric W. Biederman
  Cc: kernel test robot, 0day robot, LKML, lkp, ying.huang, feng.tang,
	zhengjun.xing, io-uring, Kernel Hardening, Linux Containers,
	linux-mm, Andrew Morton, Christian Brauner, Jann Horn, Jens Axboe,
	Kees Cook, Linus Torvalds, Oleg Nesterov

On Wed, Feb 24, 2021 at 12:50:21PM -0600, Eric W. Biederman wrote:
> Alexey Gladkov <[email protected]> writes:
> 
> > On Wed, Feb 24, 2021 at 10:54:17AM -0600, Eric W. Biederman wrote:
> >> kernel test robot <[email protected]> writes:
> >> 
> >> > Greeting,
> >> >
> >> > FYI, we noticed a -82.7% regression of stress-ng.sigsegv.ops_per_sec due to commit:
> >> >
> >> >
> >> > commit: d28296d2484fa11e94dff65e93eb25802a443d47 ("[PATCH v7 5/7] Reimplement RLIMIT_SIGPENDING on top of ucounts")
> >> > url: https://github.com/0day-ci/linux/commits/Alexey-Gladkov/Count-rlimits-in-each-user-namespace/20210222-175836
> >> > base: https://git.kernel.org/cgit/linux/kernel/git/shuah/linux-kselftest.git next
> >> >
> >> > in testcase: stress-ng
> >> > on test machine: 48 threads Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz with 112G memory
> >> > with following parameters:
> >> >
> >> > 	nr_threads: 100%
> >> > 	disk: 1HDD
> >> > 	testtime: 60s
> >> > 	class: interrupt
> >> > 	test: sigsegv
> >> > 	cpufreq_governor: performance
> >> > 	ucode: 0x42e
> >> >
> >> >
> >> > In addition to that, the commit also has significant impact on the
> >> > following tests:
> >> 
> >> Thank you.  Now we have a sense of where we need to test the performance
> >> of these changes carefully.
> >
> > One of the reasons for this is that I rolled back the patch that changed
> > the ucounts.count type to atomic_t. Now get_ucounts() is forced to use a
> > spin_lock to increase the reference count.
> 
> Which given the hickups with getting a working version seems justified.
> 
> Now we can add incremental patches on top to improve the performance.

I'm not sure that get_ucounts() should be used in __sigqueue_alloc() [1].
I tried removing it and running KASAN tests that were failing before. So
far, I have not found any problems.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/legion/linux.git/tree/kernel/signal.c?h=patchset/per-userspace-rlimit/v7.1&id=2d4a2e2be7db42c95acb98abfc2a9b370ddd0604#n428

-- 
Rgrds, legion


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: d28296d248:  stress-ng.sigsegv.ops_per_sec -82.7% regression
  2021-02-25 20:36       ` Alexey Gladkov
@ 2021-03-05 17:56         ` Eric W. Biederman
  0 siblings, 0 replies; 5+ messages in thread
From: Eric W. Biederman @ 2021-03-05 17:56 UTC (permalink / raw)
  To: Alexey Gladkov
  Cc: kernel test robot, 0day robot, LKML, lkp, ying.huang, feng.tang,
	zhengjun.xing, io-uring, Kernel Hardening, Linux Containers,
	linux-mm, Andrew Morton, Christian Brauner, Jann Horn, Jens Axboe,
	Kees Cook, Linus Torvalds, Oleg Nesterov

Alexey Gladkov <[email protected]> writes:

> On Wed, Feb 24, 2021 at 12:50:21PM -0600, Eric W. Biederman wrote:
>> Alexey Gladkov <[email protected]> writes:
>> 
>> > On Wed, Feb 24, 2021 at 10:54:17AM -0600, Eric W. Biederman wrote:
>> >> kernel test robot <[email protected]> writes:
>> >> 
>> >> > Greeting,
>> >> >
>> >> > FYI, we noticed a -82.7% regression of stress-ng.sigsegv.ops_per_sec due to commit:
>> >> >
>> >> >
>> >> > commit: d28296d2484fa11e94dff65e93eb25802a443d47 ("[PATCH v7 5/7] Reimplement RLIMIT_SIGPENDING on top of ucounts")
>> >> > url: https://github.com/0day-ci/linux/commits/Alexey-Gladkov/Count-rlimits-in-each-user-namespace/20210222-175836
>> >> > base: https://git.kernel.org/cgit/linux/kernel/git/shuah/linux-kselftest.git next
>> >> >
>> >> > in testcase: stress-ng
>> >> > on test machine: 48 threads Intel(R) Xeon(R) CPU E5-2697 v2 @ 2.70GHz with 112G memory
>> >> > with following parameters:
>> >> >
>> >> > 	nr_threads: 100%
>> >> > 	disk: 1HDD
>> >> > 	testtime: 60s
>> >> > 	class: interrupt
>> >> > 	test: sigsegv
>> >> > 	cpufreq_governor: performance
>> >> > 	ucode: 0x42e
>> >> >
>> >> >
>> >> > In addition to that, the commit also has significant impact on the
>> >> > following tests:
>> >> 
>> >> Thank you.  Now we have a sense of where we need to test the performance
>> >> of these changes carefully.
>> >
>> > One of the reasons for this is that I rolled back the patch that changed
>> > the ucounts.count type to atomic_t. Now get_ucounts() is forced to use a
>> > spin_lock to increase the reference count.
>> 
>> Which given the hickups with getting a working version seems justified.
>> 
>> Now we can add incremental patches on top to improve the performance.
>
> I'm not sure that get_ucounts() should be used in __sigqueue_alloc() [1].
> I tried removing it and running KASAN tests that were failing before. So
> far, I have not found any problems.
>
> [1]
> https://git.kernel.org/pub/scm/linux/kernel/git/legion/linux.git/tree/kernel/signal.c?h=patchset/per-userspace-rlimit/v7.1&id=2d4a2e2be7db42c95acb98abfc2a9b370ddd0604#n428

Hmm.  The code you posted still seems to include the get_ucounts.

I like the idea of not needing to increment and decrement the ucount
reference count every time a signal is sent, unfortunately there is a
problem.  The way we have implemented setresuid allows different threads
in a threaded application to have different cred->user values.

That is actually an extension of what posix supports and pthreads will
keep the creds of a process in sync.  Still I recall looking into this a
few years ago and there were a few applications that take advantage of
the linux behavior.

In principle I think it is possible to hold a ucount reference in
somewhere such as task->signal.  In practice there are enough
complicating factors I don't immediately see how to implement that.

If the creds were stored in signal_struct instead of in task_struct
we could simply move the sigpending counts in set_user, when the uid
of a process changed.

With the current state I don't know how to pick which is the real user.

Eric

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2021-03-05 17:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20210224051845.GB6114@xsang-OptiPlex-9020>
     [not found] ` <[email protected]>
2021-02-24 18:38   ` d28296d248: stress-ng.sigsegv.ops_per_sec -82.7% regression Alexey Gladkov
2021-02-24 18:50     ` Eric W. Biederman
2021-02-25 20:36       ` Alexey Gladkov
2021-03-05 17:56         ` Eric W. Biederman
2021-02-24 19:10     ` Linus Torvalds

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox