* Re: [RFC][PATCH] mm: ifdef out VM_BUG_ON check on PREEMPT_RT_FULL [not found] ` <20150708154432.GA31345@linutronix.de> @ 2015-07-09 15:07 ` Thomas Gleixner 2015-07-09 16:00 ` Johannes Weiner 0 siblings, 1 reply; 3+ messages in thread From: Thomas Gleixner @ 2015-07-09 15:07 UTC (permalink / raw) To: Sebastian Andrzej Siewior Cc: Johannes Weiner, Clark Williams, Andrew Morton, Thomas Gleixner, linux-mm, RT, Fernando Lopez-Lezcano, Steven Rostedt, LKML, Peter Zijlstra, Paul E. McKenney On Wed, 8 Jul 2015, Sebastian Andrzej Siewior wrote: > * Johannes Weiner | 2015-06-19 14:00:02 [-0400]: > > >> This depends on the point of view. You expect interrupts to be disabled > >> while taking a lock. This is not how the function is defined. > >> The function ensures that the lock can be taken from process context while > >> it may also be taken by another caller from interrupt context. The fact > >> that it disables interrupts on vanilla to achieve its goal is an > >> implementation detail. Same goes for spin_lock_bh() btw. Based on this > >> semantic it works on vanilla and -RT. It does not disable interrupts on > >> -RT because there is no need for it: the interrupt handler runs in thread > >> context. The function delivers what it is expected to deliver from API > >> point of view: "take the lock from process context which can also be > >> taken in interrupt context". > > > >Uhm, that's really distorting reality to fit your requirements. This > >helper has been defined to mean local_irq_disable() + spin_lock() for > >ages, it's been documented in books on Linux programming. And people > >expect it to prevent interrupt handlers from executing, which it does. > > After all it documents the current implementation and the semantic > requirement. Actually its worse. Most books describe the implementation and pretend that the implementation defines the semantics, which is the fundamentally wrong approach. The sad news is, that a lot of kernel developers tend to believe that as well. The result is, that local_irq_disable / preempt_disable have become per CPU BKLs. And they have the same problem as the BKL: The protection scope of these constructs is global and completely non-obvious. So its really hard to figure out what is protected against what. Like the old BKL its an all or nothing approach. And we all know, or should know, how well that worked. This all or nothing protection is a real show stopper for RT, so we try to identify what needs protection against what and then we annotate those sections with proper scope markers, which turn into RT friendly constructs at compile time. The name of the marker in question (event_lock) might not be the best choice, but that does not invalidate the general usefulness of fine granular protection scope markers. We certainly need to revisit the names which we slapped on the particular bits and pieces, and discuss with the subsystem experts the correctness of the scope markers, but that's a completely different story. > > Seriously, just fix irqs_disabled() to mean "interrupt > > handlers can't run", which is the expectation in pretty much all > > callsites that currently use it, except for maybe irq code itself. And that solves the RT problem in which way? NOT AT ALL. It just preserves the BKL nature of irq_disable. Great solution, NOT. Why? Because it just preserves the status quo of mainline and exposes everything to the same latency behaviour which mainline has. So we add lots of mechanisms to avoid that behaviour just to bring it back by switching the irq disabled BKL on again, which means we are back to square one. Thanks, tglx ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFC][PATCH] mm: ifdef out VM_BUG_ON check on PREEMPT_RT_FULL 2015-07-09 15:07 ` [RFC][PATCH] mm: ifdef out VM_BUG_ON check on PREEMPT_RT_FULL Thomas Gleixner @ 2015-07-09 16:00 ` Johannes Weiner 2015-07-09 16:43 ` Thomas Gleixner 0 siblings, 1 reply; 3+ messages in thread From: Johannes Weiner @ 2015-07-09 16:00 UTC (permalink / raw) To: Thomas Gleixner Cc: Sebastian Andrzej Siewior, Clark Williams, Andrew Morton, Thomas Gleixner, linux-mm, RT, Fernando Lopez-Lezcano, Steven Rostedt, LKML, Peter Zijlstra, Paul E. McKenney On Thu, Jul 09, 2015 at 05:07:42PM +0200, Thomas Gleixner wrote: > This all or nothing protection is a real show stopper for RT, so we > try to identify what needs protection against what and then we > annotate those sections with proper scope markers, which turn into RT > friendly constructs at compile time. > > The name of the marker in question (event_lock) might not be the best > choice, but that does not invalidate the general usefulness of fine > granular protection scope markers. We certainly need to revisit the > names which we slapped on the particular bits and pieces, and discuss > with the subsystem experts the correctness of the scope markers, but > that's a completely different story. Actually, I think there was a misunderstanding. Sebastian's patch did not include any definition of event_lock, so it looked like this is a global lock defined by -rt that is simply explicit about being global, rather than a lock that specifically protects memcg event statistics. Yeah that doesn't make a lot of sense, thinking more about it. Sorry. So localizing these locks for -rt is reasonable, I can see that. That being said, does it make sense to have such locking in mainline code? Is there a concrete plan for process-context interrupt handlers in mainline? Because it'd be annoying to maintain fine-grained locking schemes with explicit lock names in a source tree where it never amounts to anything more than anonymous cli/sti or preempt toggling. Maybe I still don't understand what you were proposing for mainline and what you were proposing as the -rt solution. ^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [RFC][PATCH] mm: ifdef out VM_BUG_ON check on PREEMPT_RT_FULL 2015-07-09 16:00 ` Johannes Weiner @ 2015-07-09 16:43 ` Thomas Gleixner 0 siblings, 0 replies; 3+ messages in thread From: Thomas Gleixner @ 2015-07-09 16:43 UTC (permalink / raw) To: Johannes Weiner Cc: Sebastian Andrzej Siewior, Clark Williams, Andrew Morton, Thomas Gleixner, linux-mm, RT, Fernando Lopez-Lezcano, Steven Rostedt, LKML, Peter Zijlstra, Paul E. McKenney On Thu, 9 Jul 2015, Johannes Weiner wrote: > On Thu, Jul 09, 2015 at 05:07:42PM +0200, Thomas Gleixner wrote: > > This all or nothing protection is a real show stopper for RT, so we > > try to identify what needs protection against what and then we > > annotate those sections with proper scope markers, which turn into RT > > friendly constructs at compile time. > > > > The name of the marker in question (event_lock) might not be the best > > choice, but that does not invalidate the general usefulness of fine > > granular protection scope markers. We certainly need to revisit the > > names which we slapped on the particular bits and pieces, and discuss > > with the subsystem experts the correctness of the scope markers, but > > that's a completely different story. > > Actually, I think there was a misunderstanding. Sebastian's patch did > not include any definition of event_lock, so it looked like this is a > global lock defined by -rt that is simply explicit about being global, > rather than a lock that specifically protects memcg event statistics. > > Yeah that doesn't make a lot of sense, thinking more about it. Sorry. > > So localizing these locks for -rt is reasonable, I can see that. That > being said, does it make sense to have such locking in mainline code? > Is there a concrete plan for process-context interrupt handlers in > mainline? They exist today. Though they are opt-in while on rt we enforce them. > Because it'd be annoying to maintain fine-grained locking > schemes with explicit lock names in a source tree where it never > amounts to anything more than anonymous cli/sti or preempt toggling. > > Maybe I still don't understand what you were proposing for mainline > and what you were proposing as the -rt solution. For the time being it's RT only, but as we are trying to come up with a way to merge RT into mainline, we start to figure out how to break that per cpu BKL style protection into understandable bits and pieces. We are still debating how that final annotation mechanism will look like, but something like the local lock mechanism might come out of it. That said, even w/o RT it makes a lot of sense to document explicitely in the code WHICH resource needs to be protected against WHAT. In that very case, you do not care about interrupt handlers per se, you only care about interrupt handlers which might recurse into that code, right? So the protection scope annotation should be able to express that independent of the underlying implementation details. protect_irq_concurrency(protected_resource) fiddle_with_resource() unprotect_irq_concurrency(protected_resource) Gives a very clear picture, about what you care and what needs to be protected. The ideal outcome of such annotations would be, that tools (runtime or static analysis) are able to find violations of this. i.e. if some other place just fiddles with resource w/o having the protection scope annotation in place, then tools can yell at you, like we do today with lockdep and other mechanisms. Thanks, tglx ^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2015-07-09 16:44 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
[not found] <20150529104815.2d2e880c@sluggy>
[not found] ` <20150529142614.37792b9ff867626dcf5e0f08@linux-foundation.org>
[not found] ` <20150601131452.3e04f10a@sluggy>
[not found] ` <20150601190047.GA5879@cmpxchg.org>
[not found] ` <20150611114042.GC16115@linutronix.de>
[not found] ` <20150619180002.GB11492@cmpxchg.org>
[not found] ` <20150708154432.GA31345@linutronix.de>
2015-07-09 15:07 ` [RFC][PATCH] mm: ifdef out VM_BUG_ON check on PREEMPT_RT_FULL Thomas Gleixner
2015-07-09 16:00 ` Johannes Weiner
2015-07-09 16:43 ` Thomas Gleixner
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox