From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752469AbdFOStB (ORCPT ); Thu, 15 Jun 2017 14:49:01 -0400 Received: from mail.kernel.org ([198.145.29.99]:49982 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751803AbdFOSsX (ORCPT ); Thu, 15 Jun 2017 14:48:23 -0400 DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org BD55E2399A Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=kernel.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=mcgrof@kernel.org From: "Luis R. Rodriguez" To: peterz@infradead.org, paulmck@linux.vnet.ibm.com, oleg@redhat.com, josh@joshtriplett.org, rostedt@goodmis.org, mathieu.desnoyers@efficios.com, jiangshanlai@gmail.com Cc: paul.gortmaker@windriver.com, ebiederm@xmission.com, dmitry.torokhov@gmail.com, linux-kernel@vger.kernel.org, "Luis R. Rodriguez" Subject: [RFC v2 1/2] swait: add idle variants which don't contribute to load average Date: Thu, 15 Jun 2017 11:48:19 -0700 Message-Id: <20170615184820.22994-2-mcgrof@kernel.org> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170615184820.22994-1-mcgrof@kernel.org> References: <87zid92ns2.fsf@xmission.com> <20170615184820.22994-1-mcgrof@kernel.org> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org There are cases where folks are using an interruptible swait when using kthreads. This is rather confusing given you'd expect interruptible waits to be -- interruptible, but kthreads are not interruptible ! The reason for such practice though is to avoid having these kthreads contribute to the system load average. When systems are idle some kthreads may spend a lot of time blocking if using swait_event_timeout(). This would contribute to the system load average. On systems without preemption this would mean the load average of an idle system is bumped to 2 instead of 0. On systems with PREEMPT=y this would mean the load average of an idle system is bumped to 3 instead of 0. This adds proper API using TASK_IDLE to make such goals explicit and avoid confusion. Suggested-by: "Eric W. Biederman" Signed-off-by: Luis R. Rodriguez --- include/linux/swait.h | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/include/linux/swait.h b/include/linux/swait.h index 2c700694d50a..105c70e23286 100644 --- a/include/linux/swait.h +++ b/include/linux/swait.h @@ -194,4 +194,29 @@ do { \ __ret; \ }) +#define __swait_event_idle(wq, condition) \ + ___swait_event(wq, condition, TASK_IDLE, 0, schedule()) + +#define swait_event_idle(wq, condition) \ +({ \ + int __ret = 0; \ + if (!(condition)) \ + __ret = __swait_event_idle(wq, condition); \ + __ret; \ +}) + +#define __swait_event_idle_timeout(wq, condition, timeout) \ + ___swait_event(wq, ___wait_cond_timeout(condition), \ + TASK_IDLE, timeout, \ + __ret = schedule_timeout(__ret)) + +#define swait_event_idle_timeout(wq, condition, timeout) \ +({ \ + long __ret = timeout; \ + if (!___wait_cond_timeout(condition)) \ + __ret = __swait_event_idle_timeout(wq, \ + condition, timeout); \ + __ret; \ +}) + #endif /* _LINUX_SWAIT_H */ -- 2.11.0