Received: by 10.192.165.156 with SMTP id m28csp2672344imm; Sun, 15 Apr 2018 06:33:22 -0700 (PDT) X-Google-Smtp-Source: AIpwx49L7T+j68RfUumbFFbxXyT66e5ebEYvMzUX56CjwBeyYpreZZhHL7gatqtSKHrOExOeFSwg X-Received: by 10.98.133.28 with SMTP id u28mr18393428pfd.190.1523799201989; Sun, 15 Apr 2018 06:33:21 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1523799201; cv=none; d=google.com; s=arc-20160816; b=LuNWFsIhuE73DYRw9ITWkuhnbMYnfoOZY3dSSE6VVcsI4Lh6RQWsBypS9d7YBIAGIN G+oiDOhZ1+biSlfh34568IQfu7Qnat6yN5tMLXkHahc1xXB/bVoDM8NvcAIKwvSRDcLj VblfyH3ti7CyrK7a2aVLnFclyl5Bo5ywsKB4tJxFdbsL0iowR+0sPWDXqkixZEe1TSLp ea7sNUyTVZtGC0AeWN2ha+L1W/msaWWipVTSy4A0QJT4G1GGIatYKxBJdSGYTQCGK2k8 VUXGoMnhxdgPL8jvJiLbt0Js6eiz4YwMdVxVnT9cKOSI512nYazodFW2WYYB7QWXlLIF 5Dhw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:cc:to:from :dkim-signature:arc-authentication-results; bh=xcSvK5p/JGGae0HXTSTvxa5wrqZWBzHf51w49kJHbec=; b=ZNcTSbtav3ZQ1Og9xkKk+NX5/GfX/OGBzxgXnI04fZV+orsS+vW393i0jWL3ERmz03 xOaAwqWxTVeErAMZWrZFdfEQ/4XjzeFyCZ8nAqC+grWv3tHDK0JL0nBsjOm9WJ6wgIho otnbXo4kETxsdVnjgRxcqE49wOFgnSwFYlCpueVjwWu95So/BELYdBAFVhB653EEfK/c I/sXzdlHT55MLn04FFeb4rCdOgHponslvwPM5dYB99ydXV9amtdCbRZaFFuPcxumZ/rS DiCCXU0Q3cLRmTVxuobnyxCHSrT0mKuGEwxoRvN0JWr08+NaavvYUQMtIAhIUWVQbq0X ZEZQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=EVsjBDVW; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a62-v6si9965925pla.185.2018.04.15.06.33.08; Sun, 15 Apr 2018 06:33:21 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=EVsjBDVW; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752403AbeDONcC (ORCPT + 99 others); Sun, 15 Apr 2018 09:32:02 -0400 Received: from mail-pl0-f54.google.com ([209.85.160.54]:41458 "EHLO mail-pl0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751380AbeDONcB (ORCPT ); Sun, 15 Apr 2018 09:32:01 -0400 Received: by mail-pl0-f54.google.com with SMTP id bj1-v6so8557280plb.8 for ; Sun, 15 Apr 2018 06:32:01 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id; bh=xcSvK5p/JGGae0HXTSTvxa5wrqZWBzHf51w49kJHbec=; b=EVsjBDVW/erJcmhk5/i9pZu8Fky8sv83Ohm6injsJvXMotLRcWL60SOeMm1LZKDi3A q1fU5viRAXeJNueZNeoshSk5FXpUvHmKRtdHKCehiMJbaBd2ZsYi76XzpnTf0XFB0TZ1 QhUsbI6ra/eCktKOXW/bGg/4BMEJPtOqC/v6pw8B7AVj6d+tS6bFMxf38vUX10cKr4Ap rbHHsFvg/vmtxs5//ff/b8Y+7otXRPwHd4+G1waLcZbl+imIsc68pEOaM+bnAUEw0Ynd JDZ5apZhvAOrRQFZd6ToLz9jBN22GBLpqPdDZzrmpNrMCR/96filVjTReZlJTsFSPlUI kqGw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=xcSvK5p/JGGae0HXTSTvxa5wrqZWBzHf51w49kJHbec=; b=X7jtmIBymNeX6dtZ5VYhnAKNdQMIN0i3Tn2Wu/GZxBRD6jPIVdjLHmILcSVm3d7sjU h4fJC6vV0Zu9bLQTfWN6SMDrf2Yn7B2lBoh77ouQi/Hw4yJDvf+wq0W6UVTC+tyMZOIb x5EvVbjfkeGdPZu6o6lrycr/o6lphvVVKeeD4vBXEn2pAxyutct+l6Lf5SKiFzY2LMyX EJKPE4/4tn27LVcyTqW3l0FoRPeHUksDfCnEYhceXgX6Oas2u0n7PTU86hJI9yP9Y/nA JxE9YwLdFOG9qbKChJbHBZ/hI5OW442GnAj1dv3mLKzBpHjJlOVRtkX1B3iIrfi7WsPf RFug== X-Gm-Message-State: ALQs6tDS8XV/RYPIKte1Sp3Sqh6b+ZvjcSl6zEUFThJ8WcEMskn0QX4A 7eZ1h/8jLjyFZivdf5Cje5f74Q== X-Received: by 2002:a17:902:6c07:: with SMTP id q7-v6mr12130809plk.67.1523799120464; Sun, 15 Apr 2018 06:32:00 -0700 (PDT) Received: from roar.au.ibm.com (59-102-70-78.tpgi.com.au. [59.102.70.78]) by smtp.gmail.com with ESMTPSA id g127sm16800045pgc.6.2018.04.15.06.31.56 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sun, 15 Apr 2018 06:31:59 -0700 (PDT) From: Nicholas Piggin To: linux-kernel@vger.kernel.org Cc: Nicholas Piggin , Ingo Molnar , Peter Zijlstra , "Rafael J. Wysocki" , "Paul E . McKenney" Subject: [RFC PATCH] kernel/sched/core: busy wait before going idle Date: Sun, 15 Apr 2018 23:31:49 +1000 Message-Id: <20180415133149.24112-1-npiggin@gmail.com> X-Mailer: git-send-email 2.17.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This is a quick hack for comments, but I've always wondered -- if we have a short term polling idle states in cpuidle for performance -- why not skip the context switch and entry into all the idle states, and just wait for a bit to see if something wakes up again. It's not uncommon to see various going-to-idle work in kernel profiles. This might be a way to reduce that (and just the cost of switching registers and kernel stack to idle thread). This can be an important path for single thread request-response throughput. tbench bandwidth seems to be improved (the numbers aren't too stable but they pretty consistently show some gain). 10-20% would be a pretty nice gain for such workloads clients 1 2 4 8 16 128 vanilla 232 467 823 1819 3218 9065 patched 310 503 962 2465 3743 9820 --- kernel/sched/core.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/kernel/sched/core.c b/kernel/sched/core.c index e8afd6086f23..30a0b13edfa5 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -3404,6 +3404,7 @@ static void __sched notrace __schedule(bool preempt) struct rq_flags rf; struct rq *rq; int cpu; + bool do_idle_spin = true; cpu = smp_processor_id(); rq = cpu_rq(cpu); @@ -3428,6 +3429,7 @@ static void __sched notrace __schedule(bool preempt) rq_lock(rq, &rf); smp_mb__after_spinlock(); +idle_spin_end: /* Promote REQ to ACT */ rq->clock_update_flags <<= 1; update_rq_clock(rq); @@ -3437,6 +3439,32 @@ static void __sched notrace __schedule(bool preempt) if (unlikely(signal_pending_state(prev->state, prev))) { prev->state = TASK_RUNNING; } else { + /* + * Busy wait before switching to idle thread. This + * is marked unlikely because we're idle so jumping + * out of line doesn't matter too much. + */ + if (unlikely(do_idle_spin && rq->nr_running == 1)) { + u64 start; + + do_idle_spin = false; + + rq->clock_update_flags &= ~(RQCF_ACT_SKIP|RQCF_REQ_SKIP); + rq_unlock_irq(rq, &rf); + + spin_begin(); + start = local_clock(); + while (!need_resched() && prev->state && + !signal_pending_state(prev->state, prev)) { + spin_cpu_relax(); + if (local_clock() - start > 1000000) + break; + } + spin_end(); + + rq_lock_irq(rq, &rf); + goto idle_spin_end; + } deactivate_task(rq, prev, DEQUEUE_SLEEP | DEQUEUE_NOCLOCK); prev->on_rq = 0; -- 2.17.0