All of lore.kernel.org
 help / color / mirror / Atom feed
From: Barret Rhoden <brho@google.com>
To: Ingo Molnar <mingo@redhat.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Juri Lelli <juri.lelli@redhat.com>,
	Vincent Guittot <vincent.guittot@linaro.org>
Cc: Dietmar Eggemann <dietmar.eggemann@arm.com>,
	Steven Rostedt <rostedt@goodmis.org>,
	Ben Segall <bsegall@google.com>, Mel Gorman <mgorman@suse.de>,
	Daniel Bristot de Oliveira <bristot@redhat.com>,
	linux-kernel@vger.kernel.org
Subject: [PATCH v2] sched: allow resubmits to queue_balance_callback()
Date: Mon, 22 Mar 2021 14:43:24 -0400	[thread overview]
Message-ID: <20210322184324.437430-1-brho@google.com> (raw)
In-Reply-To: <YFh0QjnoGPmbykyE@hirez.programming.kicks-ass.net>

Prior to this commit, if you submitted the same callback_head twice, it
would be enqueued twice, but only if it was the last callback on the
list.  The first time it was submitted, rq->balance_callback was NULL,
so head->next is NULL.  That defeated the check in
queue_balance_callback().

This commit changes the callback list such that whenever an item is on
the list, its head->next is not NULL.  The last element (first inserted)
will point to itself.  This allows us to detect and ignore any attempt
to reenqueue a callback_head.

Signed-off-by: Barret Rhoden <brho@google.com>
---

sorry about the old version.  i updated to linus's branch, plus a minor
fix from v1.

this should work with the balance_push_callback stuff you added a few
months ago.  in this commit, head->next can equal null *or* head and it
will be treated as null.  (balance_push_callback's next == NULL).

thanks,
barret


 kernel/sched/core.c  | 3 ++-
 kernel/sched/sched.h | 6 +++++-
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/kernel/sched/core.c b/kernel/sched/core.c
index 98191218d891..c5a1a225d0b4 100644
--- a/kernel/sched/core.c
+++ b/kernel/sched/core.c
@@ -3986,7 +3986,8 @@ static void do_balance_callbacks(struct rq *rq, struct callback_head *head)
 
 	while (head) {
 		func = (void (*)(struct rq *))head->func;
-		next = head->next;
+		/* The last element pointed to itself */
+		next = head->next == head ? NULL : head->next;
 		head->next = NULL;
 		head = next;
 
diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h
index 10a1522b1e30..66e1a9e5a1af 100644
--- a/kernel/sched/sched.h
+++ b/kernel/sched/sched.h
@@ -1418,11 +1418,15 @@ queue_balance_callback(struct rq *rq,
 {
 	lockdep_assert_held(&rq->lock);
 
+	/*
+	 * The last element on the list points to itself, so we can always
+	 * detect if head is already enqueued.
+	 */
 	if (unlikely(head->next || rq->balance_callback == &balance_push_callback))
 		return;
 
 	head->func = (void (*)(struct callback_head *))func;
-	head->next = rq->balance_callback;
+	head->next = rq->balance_callback ?: head;
 	rq->balance_callback = head;
 }
 
-- 
2.31.0.rc2.261.g7f71774620-goog


      reply	other threads:[~2021-03-22 18:44 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-03-18 19:57 sched: allow resubmits to queue_balance_callback() Barret Rhoden
2021-03-22 10:41 ` Peter Zijlstra
2021-03-22 18:43   ` Barret Rhoden [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210322184324.437430-1-brho@google.com \
    --to=brho@google.com \
    --cc=bristot@redhat.com \
    --cc=bsegall@google.com \
    --cc=dietmar.eggemann@arm.com \
    --cc=juri.lelli@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mgorman@suse.de \
    --cc=mingo@redhat.com \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    --cc=vincent.guittot@linaro.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.