Received: by 2002:a05:6a10:6744:0:0:0:0 with SMTP id w4csp80804pxu; Wed, 14 Oct 2020 21:00:58 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwK2N3P4yFAU3TpmI3HvmaEus9nU8iXt6RLnlg/9G3XYAjRgY2vDuGDZXY2w9YfX4x2kadp X-Received: by 2002:a17:906:2bc5:: with SMTP id n5mr2358662ejg.476.1602734458188; Wed, 14 Oct 2020 21:00:58 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1602734458; cv=none; d=google.com; s=arc-20160816; b=Bemx3JJdlpDQJKHnq1XS2oC/zb0MS8eHhqz5Q1+kQSigxzzcJDi6GbfePXnyMU/PRf 7JnsVxYxZMPnCfPNfC9oLIA7HQvdFwi94z/XUUtL488W2RY3Z+ZLZdM6YdLiHSZlaZ5A F3BYOZVKY/PaHK9oZZeau8Xc7Gn221OaiZS6HPDRghNn5HGeYmTvosHWkbM2fH1d/8i6 zdVdS5N3azItGnn7Wbv70U9fqvPamYEY/i34wCyw1tpdkgvkA0eWzazOF7uYBhWDkTaV QeX/+sx92ZddhXu01xB8ZMvYwbzrprww7m5hllp5Hfqg7QKEuB646D2GZuox3G0EFFMM DL5g== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=6Cpm4zwuI2Kz/w2bD01ff6POODI8e6e/J5qHChNA/j0=; b=JGrUbUPJvbJwh+pas2RJKFw4SUkZoBOFxlykbER4DP7mrAk9u37W6P1/AlM+bLeLDW +ckOJnXmTwV3R/auyP+EGjrqRhYiMYMNLBTvRpwP63oKjcWduXpPdIUaFVKLElGL72uP RphLMcorHP5HPmSt0dGWjOP4yxj1v748HEYJ0Ewfv953a8TMngn9tbRaP0jG/HyRtoV0 1XfIE9A3f4mS8NfIMy/HOKWKw8+Z+syiY+m1su9XWDAup6lmsS3OPS+EHjQkJp45UiU3 LCGbSVeoU4vh67Y3CkeBWAUDrQNpgcdabznkScf42s9+PtuWaSfcX2qXAkvlPFdBFLek ARVQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=nduDNDxL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id r22si1308041eja.468.2020.10.14.21.00.35; Wed, 14 Oct 2020 21:00:58 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@joelfernandes.org header.s=google header.b=nduDNDxL; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2389051AbgJOBka (ORCPT + 99 others); Wed, 14 Oct 2020 21:40:30 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50616 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2389035AbgJOBjh (ORCPT ); Wed, 14 Oct 2020 21:39:37 -0400 Received: from mail-io1-xd43.google.com (mail-io1-xd43.google.com [IPv6:2607:f8b0:4864:20::d43]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 20F5BC0F26D7 for ; Wed, 14 Oct 2020 17:23:08 -0700 (PDT) Received: by mail-io1-xd43.google.com with SMTP id 67so2032400iob.8 for ; Wed, 14 Oct 2020 17:23:08 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=joelfernandes.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=6Cpm4zwuI2Kz/w2bD01ff6POODI8e6e/J5qHChNA/j0=; b=nduDNDxLkfykbr9ftb43hMHmJCot1ZZuhiPtqYpZRit7NEwzom0PlC7OC2r498nWrG wuqlzmNb584x+hGthmIqnrx+g2b432wqaqTotnnakmCyQAoGJRxhLWC72PMs+wg1FRTN 7sfmX1qk4AIWKO4keQ/XtJFVD9LdRZuzQgDPg= 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:in-reply-to :references:mime-version:content-transfer-encoding; bh=6Cpm4zwuI2Kz/w2bD01ff6POODI8e6e/J5qHChNA/j0=; b=JCOgkUEsbdIu7vUbtoBXjuIxDsuINOAzZGuiJ5QgrFalTyO8eOFfPpr3bZa8iz+lH6 tyTVmzmapVrhIIhQT/ilGeB7l7PISAJB8NptxMoD3gJBYx2/dg9a4wiDEzsdpTdyH9D/ NYYNy4sTtwiBxxAGU1yr+tUVN6g+iQzSni9yRgmUIpy0RiG5bEunMv2PduR4shS/Yr3f G0mmb4ZYvplp5MR6i5LhUcQTia9GH7cYwtGFCkhkdjGXVaPyB2pX9RrvMTHm4haQ0Why eMtpbOeJyyqOC47MUIdCq4ghsA4tM68qY9DsP5pvNEcTe5RENXgxW6sTJ1HXn/Zbor+C KUjg== X-Gm-Message-State: AOAM530aLoadb0iScK154c/NMDTBkPPwOqLhFl78WRY1DiPS0jF959rz ll6FHgwplCWK2TtnMZazZHYBwLmzZ8xhDA== X-Received: by 2002:a6b:fb0d:: with SMTP id h13mr1434794iog.12.1602721387263; Wed, 14 Oct 2020 17:23:07 -0700 (PDT) Received: from joelaf.cam.corp.google.com ([2620:15c:6:12:cad3:ffff:feb3:bd59]) by smtp.gmail.com with ESMTPSA id r4sm1075622ilc.32.2020.10.14.17.23.05 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 14 Oct 2020 17:23:06 -0700 (PDT) From: "Joel Fernandes (Google)" To: linux-kernel@vger.kernel.org Cc: "Joel Fernandes (Google)" , Frederic Weisbecker , Ingo Molnar , Josh Triplett , Lai Jiangshan , Marco Elver , Mathieu Desnoyers , "Paul E. McKenney" , rcu@vger.kernel.org, Steven Rostedt , "Uladzislau Rezki (Sony)" , fweisbec@gmail.com, neeraj.iitr10@gmail.com Subject: [PATCH v7 1/6] rcu/tree: Make rcu_do_batch count how many callbacks were executed Date: Wed, 14 Oct 2020 20:22:56 -0400 Message-Id: <20201015002301.101830-2-joel@joelfernandes.org> X-Mailer: git-send-email 2.28.0.1011.ga647a8990f-goog In-Reply-To: <20201015002301.101830-1-joel@joelfernandes.org> References: <20201015002301.101830-1-joel@joelfernandes.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Currently, rcu_do_batch() depends on the unsegmented callback list's len field to know how many CBs are executed. This fields counts down from 0 as CBs are dequeued. It is possible that all CBs could not be run because of reaching limits in which case the remaining unexecuted callbacks are requeued in the CPU's segcblist. The number of callbacks that were not requeued are then the negative count (how many CBs were run) stored in the rcl->len which has been counting down on every dequeue. This negative count is then added to the per-cpu segmented callback list's to correct its count. Such a design works against future efforts to track the length of each segment of the segmented callback list. The reason is because rcu_segcblist_extract_done_cbs() will be populating the unsegmented callback list's length field (rcl->len) during extraction. Also, the design of counting down from 0 is confusing and error-prone IMHO. This commit therefore explicitly counts how many callbacks were executed in rcu_do_batch() itself, and uses that to update the per-CPU segcb list's ->len field, without relying on the negativity of rcl->len. Signed-off-by: Joel Fernandes (Google) Reviewed-by: Frederic Weisbecker --- kernel/rcu/rcu_segcblist.c | 2 +- kernel/rcu/rcu_segcblist.h | 1 + kernel/rcu/tree.c | 11 +++++------ 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/kernel/rcu/rcu_segcblist.c b/kernel/rcu/rcu_segcblist.c index 2d2a6b6b9dfb..bb246d8c6ef1 100644 --- a/kernel/rcu/rcu_segcblist.c +++ b/kernel/rcu/rcu_segcblist.c @@ -95,7 +95,7 @@ static void rcu_segcblist_set_len(struct rcu_segcblist *rsclp, long v) * This increase is fully ordered with respect to the callers accesses * both before and after. */ -static void rcu_segcblist_add_len(struct rcu_segcblist *rsclp, long v) +void rcu_segcblist_add_len(struct rcu_segcblist *rsclp, long v) { #ifdef CONFIG_RCU_NOCB_CPU smp_mb__before_atomic(); /* Up to the caller! */ diff --git a/kernel/rcu/rcu_segcblist.h b/kernel/rcu/rcu_segcblist.h index 492262bcb591..1d2d61406463 100644 --- a/kernel/rcu/rcu_segcblist.h +++ b/kernel/rcu/rcu_segcblist.h @@ -76,6 +76,7 @@ static inline bool rcu_segcblist_restempty(struct rcu_segcblist *rsclp, int seg) } void rcu_segcblist_inc_len(struct rcu_segcblist *rsclp); +void rcu_segcblist_add_len(struct rcu_segcblist *rsclp, long v); void rcu_segcblist_init(struct rcu_segcblist *rsclp); void rcu_segcblist_disable(struct rcu_segcblist *rsclp); void rcu_segcblist_offload(struct rcu_segcblist *rsclp); diff --git a/kernel/rcu/tree.c b/kernel/rcu/tree.c index 286dc0a1b184..24c00020ab83 100644 --- a/kernel/rcu/tree.c +++ b/kernel/rcu/tree.c @@ -2429,7 +2429,7 @@ static void rcu_do_batch(struct rcu_data *rdp) const bool offloaded = rcu_segcblist_is_offloaded(&rdp->cblist); struct rcu_head *rhp; struct rcu_cblist rcl = RCU_CBLIST_INITIALIZER(rcl); - long bl, count; + long bl, count = 0; long pending, tlimit = 0; /* If no callbacks are ready, just return. */ @@ -2474,6 +2474,7 @@ static void rcu_do_batch(struct rcu_data *rdp) for (; rhp; rhp = rcu_cblist_dequeue(&rcl)) { rcu_callback_t f; + count++; debug_rcu_head_unqueue(rhp); rcu_lock_acquire(&rcu_callback_map); @@ -2487,15 +2488,14 @@ static void rcu_do_batch(struct rcu_data *rdp) /* * Stop only if limit reached and CPU has something to do. - * Note: The rcl structure counts down from zero. */ - if (-rcl.len >= bl && !offloaded && + if (count >= bl && !offloaded && (need_resched() || (!is_idle_task(current) && !rcu_is_callbacks_kthread()))) break; if (unlikely(tlimit)) { /* only call local_clock() every 32 callbacks */ - if (likely((-rcl.len & 31) || local_clock() < tlimit)) + if (likely((count & 31) || local_clock() < tlimit)) continue; /* Exceeded the time limit, so leave. */ break; @@ -2512,7 +2512,6 @@ static void rcu_do_batch(struct rcu_data *rdp) local_irq_save(flags); rcu_nocb_lock(rdp); - count = -rcl.len; rdp->n_cbs_invoked += count; trace_rcu_batch_end(rcu_state.name, count, !!rcl.head, need_resched(), is_idle_task(current), rcu_is_callbacks_kthread()); @@ -2520,7 +2519,7 @@ static void rcu_do_batch(struct rcu_data *rdp) /* Update counts and requeue any remaining callbacks. */ rcu_segcblist_insert_done_cbs(&rdp->cblist, &rcl); smp_mb(); /* List handling before counting for rcu_barrier(). */ - rcu_segcblist_insert_count(&rdp->cblist, &rcl); + rcu_segcblist_add_len(&rdp->cblist, -count); /* Reinstate batch limit if we have worked down the excess. */ count = rcu_segcblist_n_cbs(&rdp->cblist); -- 2.28.0.1011.ga647a8990f-goog