From mboxrd@z Thu Jan 1 00:00:00 1970 From: Thomas Gleixner Subject: Re: yield() in i2c non-happy paths hits BUG under -rt patch Date: Thu, 19 Nov 2009 14:11:18 +0100 (CET) Message-ID: References: <20091107210147.3e754278@hyperion.delvare> <4AF7148C.9090706@thebigcorporation.com> <20091112211255.09cd884a@hyperion.delvare> <20091116155606.GC29479@sirena.org.uk> <20091118010520.4cd397d4@lxorguk.ukuu.org.uk> <20091118175202.490989d8@hyperion.delvare> <20091119130526.23a69b85@hyperion.delvare> Mime-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Cc: Leon Woestenberg , Alan Cox , Mark Brown , Sven-Thorsten Dietrich , linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, rt-users , "Ben Dooks (embedded platforms)" , Peter Zijlstra , LKML To: Jean Delvare Return-path: In-Reply-To: <20091119130526.23a69b85-ig7AzVSIIG7kN2dkZ6Wm7A@public.gmane.org> Sender: linux-i2c-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org List-Id: linux-rt-users.vger.kernel.org On Thu, 19 Nov 2009, Jean Delvare wrote: > > That still does not explain why yield() is necessary _between_ the > > transaction attempts. > > It is not _necessary_. We are just trying to be fair to other kernel > threads, because bit-banging is expensive and this is the only case > where we know we can tolerate a delay. > > Just to clarify things... does (or did) yield() have anything to do > with CONFIG_PREEMPT_VOLUNTARY? No. > > That code is fully preemptible, otherwise you could not call > > yield(). > > How does one know what code is preemtible and what code is not? The > rest of the i2c-algo-bit code should definitely _not_ be preemtible, as > it is highly timing sensitive. Code is preemptible when preempt_count() == 0 and interrupts are enabled. spin_lock() implicitely disables preemption. > > And as I said before nobody even noticed that the yield() > > default implementation was changed to a NOOP by default in the > > scheduler. > > Well, I guess only people monitoring system latency would notice, as > this is the only thing yield() was supposed to help with in the first > place. > > You say "NOOP by default", does this imply there is a way to change > this? There is a sysctl: sysctl_sched_compat_yield > Was yield() turned into NOOP by design, or was it a bug? By design. The semantics of yield and the fairness approach of CFS are not really working well together. Also yield() for SCHED_OTHER is not really specified. Thanks, tglx