From: Joel Fernandes <joel@joelfernandes.org>
To: chris hyser <chris.hyser@oracle.com>
Cc: Nishanth Aravamudan <naravamudan@digitalocean.com>,
Julien Desfossez <jdesfossez@digitalocean.com>,
Peter Zijlstra <peterz@infradead.org>,
Tim Chen <tim.c.chen@linux.intel.com>,
Vineeth Pillai <viremana@linux.microsoft.com>,
Aaron Lu <aaron.lwe@gmail.com>,
Aubrey Li <aubrey.intel@gmail.com>,
tglx@linutronix.de, linux-kernel@vger.kernel.org,
mingo@kernel.org, torvalds@linux-foundation.org,
fweisbec@gmail.com, keescook@chromium.org, kerrnel@google.com,
Phil Auld <pauld@redhat.com>,
Valentin Schneider <valentin.schneider@arm.com>,
Mel Gorman <mgorman@techsingularity.net>,
Pawan Gupta <pawan.kumar.gupta@linux.intel.com>,
Paolo Bonzini <pbonzini@redhat.com>,
vineeth@bitbyteword.org, Chen Yu <yu.c.chen@intel.com>,
Christian Brauner <christian.brauner@ubuntu.com>,
Agata Gruza <agata.gruza@intel.com>,
Antonio Gomez Iglesias <antonio.gomez.iglesias@intel.com>,
graf@amazon.com, konrad.wilk@oracle.com, dfaggioli@suse.com,
pjt@google.com, rostedt@goodmis.org, derkling@google.com,
benbjiang@tencent.com,
Alexandre Chartre <alexandre.chartre@oracle.com>,
James.Bottomley@hansenpartnership.com, OWeisse@umich.edu,
Dhaval Giani <dhaval.giani@oracle.com>,
Junaid Shahid <junaids@google.com>,
jsbarnes@google.com, Aubrey Li <aubrey.li@linux.intel.com>,
"Paul E. McKenney" <paulmck@kernel.org>,
Tim Chen <tim.c.chen@intel.com>
Subject: Re: [PATCH v8 -tip 20/26] sched: Release references to the per-task cookie on exit
Date: Thu, 5 Nov 2020 10:46:53 -0500 [thread overview]
Message-ID: <20201105154653.GB2656962@google.com> (raw)
In-Reply-To: <bc98f399-c69a-20c9-10cc-18291723eff9@oracle.com>
On Wed, Nov 04, 2020 at 04:50:42PM -0500, chris hyser wrote:
> On 10/19/20 9:43 PM, Joel Fernandes (Google) wrote:
> > During exit, we have to free the references to a cookie that might be shared by
> > many tasks. This commit therefore ensures when the task_struct is released, any
> > references to cookies that it holds are also released.
> >
> > Tested-by: Julien Desfossez <jdesfossez@digitalocean.com>
> > Signed-off-by: Joel Fernandes (Google) <joel@joelfernandes.org>
> > ---
> > include/linux/sched.h | 2 ++
> > kernel/fork.c | 1 +
> > kernel/sched/core.c | 8 ++++++++
> > 3 files changed, 11 insertions(+)
> >
> > diff --git a/include/linux/sched.h b/include/linux/sched.h
> > index 4cb76575afa8..eabd96beff92 100644
> > --- a/include/linux/sched.h
> > +++ b/include/linux/sched.h
> > @@ -2079,12 +2079,14 @@ void sched_core_unsafe_exit(void);
> > bool sched_core_wait_till_safe(unsigned long ti_check);
> > bool sched_core_kernel_protected(void);
> > int sched_core_share_pid(pid_t pid);
> > +void sched_tsk_free(struct task_struct *tsk);
> > #else
> > #define sched_core_unsafe_enter(ignore) do { } while (0)
> > #define sched_core_unsafe_exit(ignore) do { } while (0)
> > #define sched_core_wait_till_safe(ignore) do { } while (0)
> > #define sched_core_kernel_protected(ignore) do { } while (0)
> > #define sched_core_share_pid(pid_t pid) do { } while (0)
> > +#define sched_tsk_free(tsk) do { } while (0)
> > #endif
> > #endif
> > diff --git a/kernel/fork.c b/kernel/fork.c
> > index b9c289d0f4ef..a39248a02fdd 100644
> > --- a/kernel/fork.c
> > +++ b/kernel/fork.c
> > @@ -736,6 +736,7 @@ void __put_task_struct(struct task_struct *tsk)
> > exit_creds(tsk);
> > delayacct_tsk_free(tsk);
> > put_signal_struct(tsk->signal);
> > + sched_tsk_free(tsk);
> > if (!profile_handoff_task(tsk))
> > free_task(tsk);
> > diff --git a/kernel/sched/core.c b/kernel/sched/core.c
> > index 42aa811eab14..61e1dcf11000 100644
> > --- a/kernel/sched/core.c
> > +++ b/kernel/sched/core.c
> > @@ -9631,6 +9631,14 @@ static int cpu_core_tag_color_write_u64(struct cgroup_subsys_state *css,
> > return 0;
> > }
> > +
> > +void sched_tsk_free(struct task_struct *tsk)
> > +{
> > + if (!tsk->core_task_cookie)
> > + return;
> > + sched_core_put_task_cookie(tsk->core_task_cookie);
> > + sched_core_put();
>
>
> sched_tsk_free() can be called under softirq. sched_core_put() is riddled with things that may want to sleep.
Right, that breaks. Can you try the diff I attached below and see if it does
not crash now?
> I tried a number of things like replacing the mutexes in put/get with spin_lock_bh() and just kept finding things like:
>
>
> [root@chyser-vm5 bin]# [ 1123.516209] BUG: sleeping function called from invalid context at include/linux/percpu-rwsem.h:49
Indeed, stop machine cannot be called from an atomic context, which is what
spin_lock_bh gives you.
---8<-----------------------
diff --git a/kernel/sched/coretag.c b/kernel/sched/coretag.c
index 6c008e5471d7..9967f37c5df0 100644
--- a/kernel/sched/coretag.c
+++ b/kernel/sched/coretag.c
@@ -16,6 +16,7 @@
*/
struct sched_core_cookie {
refcount_t refcnt;
+ struct work_struct work; /* to free in WQ context. */;
};
static DEFINE_MUTEX(sched_core_tasks_mutex);
@@ -54,21 +55,24 @@ void sched_core_tag_requeue(struct task_struct *p, unsigned long cookie, bool gr
}
/* Per-task interface: Used by fork(2) and prctl(2). */
+static void sched_core_put_cookie_work(struct work_struct *ws);
+
static unsigned long sched_core_alloc_task_cookie(void)
{
- struct sched_core_cookie *ptr =
+ struct sched_core_cookie *ck =
kmalloc(sizeof(struct sched_core_cookie), GFP_KERNEL);
- if (!ptr)
+ if (!ck)
return 0;
- refcount_set(&ptr->refcnt, 1);
+ refcount_set(&ck->refcnt, 1);
+ INIT_WORK(&ck->work, sched_core_put_cookie_work);
/*
* NOTE: sched_core_put() is not done by put_task_cookie(). Instead, it
* is done after the stopper runs.
*/
sched_core_get();
- return (unsigned long)ptr;
+ return (unsigned long)ck;
}
static bool sched_core_get_task_cookie(unsigned long cookie)
@@ -91,6 +95,15 @@ static void sched_core_put_task_cookie(unsigned long cookie)
kfree(ptr);
}
+static void sched_core_put_cookie_work(struct work_struct *ws)
+{
+ struct sched_core_cookie *ck =
+ container_of(ws, struct sched_core_cookie, work);
+
+ sched_core_put_task_cookie((unsigned long)ck);
+ sched_core_put();
+}
+
struct sched_core_task_write_tag {
struct task_struct *tasks[2];
unsigned long cookies[2];
@@ -461,8 +474,11 @@ int cpu_core_tag_color_write_u64(struct cgroup_subsys_state *css,
void sched_tsk_free(struct task_struct *tsk)
{
+ struct sched_core_cookie *ck;
+
if (!tsk->core_task_cookie)
return;
- sched_core_put_task_cookie(tsk->core_task_cookie);
- sched_core_put();
+
+ ck = (struct sched_core_cookie *)tsk->core_task_cookie;
+ queue_work(system_wq, &ck->work);
}
next prev parent reply other threads:[~2020-11-05 15:46 UTC|newest]
Thread overview: 98+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-10-20 1:43 [PATCH v8 -tip 00/26] Core scheduling Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 01/26] sched: Wrap rq::lock access Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 02/26] sched: Introduce sched_class::pick_task() Joel Fernandes (Google)
2020-10-22 7:59 ` Li, Aubrey
2020-10-22 15:25 ` Joel Fernandes
2020-10-23 5:25 ` Li, Aubrey
2020-10-23 21:47 ` Joel Fernandes
2020-10-24 2:48 ` Li, Aubrey
2020-10-24 11:10 ` Vineeth Pillai
2020-10-24 12:27 ` Vineeth Pillai
2020-10-24 23:48 ` Li, Aubrey
2020-10-26 9:01 ` Peter Zijlstra
2020-10-27 3:17 ` Li, Aubrey
2020-10-27 14:19 ` Joel Fernandes
2020-10-27 15:23 ` Joel Fernandes
2020-10-27 14:14 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 03/26] sched: Core-wide rq->lock Joel Fernandes (Google)
2020-10-26 11:59 ` Peter Zijlstra
2020-10-27 16:27 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 04/26] sched/fair: Add a few assertions Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 05/26] sched: Basic tracking of matching tasks Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 06/26] sched: Add core wide task selection and scheduling Joel Fernandes (Google)
2020-10-23 13:51 ` Peter Zijlstra
2020-10-23 13:54 ` Peter Zijlstra
2020-10-23 17:57 ` Joel Fernandes
2020-10-23 19:26 ` Peter Zijlstra
2020-10-23 21:31 ` Joel Fernandes
2020-10-26 8:28 ` Peter Zijlstra
2020-10-27 16:58 ` Joel Fernandes
2020-10-26 9:31 ` Peter Zijlstra
2020-11-05 18:50 ` Joel Fernandes
2020-11-05 22:07 ` Joel Fernandes
2020-10-23 15:05 ` Peter Zijlstra
2020-10-23 17:59 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 07/26] sched/fair: Fix forced idle sibling starvation corner case Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 08/26] sched/fair: Snapshot the min_vruntime of CPUs on force idle Joel Fernandes (Google)
2020-10-26 12:47 ` Peter Zijlstra
2020-10-28 15:29 ` Joel Fernandes
2020-10-28 18:39 ` Joel Fernandes
2020-10-29 16:59 ` Joel Fernandes
2020-10-29 18:24 ` Joel Fernandes
2020-10-29 18:59 ` Peter Zijlstra
2020-10-30 2:36 ` Joel Fernandes
2020-10-30 2:42 ` Joel Fernandes
2020-10-30 8:41 ` Peter Zijlstra
2020-10-31 21:41 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 09/26] sched: Trivial forced-newidle balancer Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 10/26] sched: migration changes for core scheduling Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 11/26] irq_work: Cleanup Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 12/26] arch/x86: Add a new TIF flag for untrusted tasks Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 13/26] kernel/entry: Add support for core-wide protection of kernel-mode Joel Fernandes (Google)
2020-10-20 3:41 ` Randy Dunlap
2020-11-03 0:20 ` Joel Fernandes
2020-10-22 5:48 ` Li, Aubrey
2020-11-03 0:50 ` Joel Fernandes
2020-10-30 10:29 ` Alexandre Chartre
2020-11-03 1:20 ` Joel Fernandes
2020-11-06 16:57 ` Alexandre Chartre
2020-11-06 17:43 ` Joel Fernandes
2020-11-06 18:07 ` Alexandre Chartre
2020-11-10 9:35 ` Alexandre Chartre
2020-11-10 22:42 ` Joel Fernandes
2020-11-16 10:08 ` Alexandre Chartre
2020-11-16 14:50 ` Joel Fernandes
2020-11-16 15:43 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 14/26] entry/idle: Enter and exit kernel protection during idle entry and exit Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 15/26] entry/kvm: Protect the kernel when entering from guest Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 16/26] sched: cgroup tagging interface for core scheduling Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 17/26] sched: Split the cookie and setup per-task cookie on fork Joel Fernandes (Google)
2020-11-04 22:30 ` chris hyser
2020-11-05 14:49 ` Joel Fernandes
2020-11-09 23:30 ` chris hyser
2020-10-20 1:43 ` [PATCH v8 -tip 18/26] sched: Add a per-thread core scheduling interface Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 19/26] sched: Add a second-level tag for nested CGroup usecase Joel Fernandes (Google)
2020-10-31 0:42 ` Josh Don
2020-11-03 2:54 ` Joel Fernandes
[not found] ` <6c07e70d-52f2-69ff-e1fa-690cd2c97f3d@linux.intel.com>
2020-11-05 15:52 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 20/26] sched: Release references to the per-task cookie on exit Joel Fernandes (Google)
2020-11-04 21:50 ` chris hyser
2020-11-05 15:46 ` Joel Fernandes [this message]
2020-10-20 1:43 ` [PATCH v8 -tip 21/26] sched: Handle task addition to CGroup Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 22/26] sched/debug: Add CGroup node for printing group cookie if SCHED_DEBUG Joel Fernandes (Google)
2020-10-20 1:43 ` [PATCH v8 -tip 23/26] kselftest: Add tests for core-sched interface Joel Fernandes (Google)
2020-10-30 22:20 ` [PATCH] sched: Change all 4 space tabs to actual tabs John B. Wyatt IV
2020-10-20 1:43 ` [PATCH v8 -tip 24/26] sched: Move core-scheduler interfacing code to a new file Joel Fernandes (Google)
2020-10-26 1:05 ` Li, Aubrey
2020-11-03 2:58 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 25/26] Documentation: Add core scheduling documentation Joel Fernandes (Google)
2020-10-20 3:36 ` Randy Dunlap
2020-11-12 16:11 ` Joel Fernandes
2020-10-20 1:43 ` [PATCH v8 -tip 26/26] sched: Debug bits Joel Fernandes (Google)
2020-10-30 13:26 ` [PATCH v8 -tip 00/26] Core scheduling Ning, Hongyu
2020-11-06 2:58 ` Li, Aubrey
2020-11-06 17:54 ` Joel Fernandes
2020-11-09 6:04 ` Li, Aubrey
2020-11-06 20:55 ` [RFT for v9] (Was Re: [PATCH v8 -tip 00/26] Core scheduling) Joel Fernandes
2020-11-13 9:22 ` Ning, Hongyu
2020-11-13 10:01 ` Ning, Hongyu
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=20201105154653.GB2656962@google.com \
--to=joel@joelfernandes.org \
--cc=James.Bottomley@hansenpartnership.com \
--cc=OWeisse@umich.edu \
--cc=aaron.lwe@gmail.com \
--cc=agata.gruza@intel.com \
--cc=alexandre.chartre@oracle.com \
--cc=antonio.gomez.iglesias@intel.com \
--cc=aubrey.intel@gmail.com \
--cc=aubrey.li@linux.intel.com \
--cc=benbjiang@tencent.com \
--cc=chris.hyser@oracle.com \
--cc=christian.brauner@ubuntu.com \
--cc=derkling@google.com \
--cc=dfaggioli@suse.com \
--cc=dhaval.giani@oracle.com \
--cc=fweisbec@gmail.com \
--cc=graf@amazon.com \
--cc=jdesfossez@digitalocean.com \
--cc=jsbarnes@google.com \
--cc=junaids@google.com \
--cc=keescook@chromium.org \
--cc=kerrnel@google.com \
--cc=konrad.wilk@oracle.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mgorman@techsingularity.net \
--cc=mingo@kernel.org \
--cc=naravamudan@digitalocean.com \
--cc=pauld@redhat.com \
--cc=paulmck@kernel.org \
--cc=pawan.kumar.gupta@linux.intel.com \
--cc=pbonzini@redhat.com \
--cc=peterz@infradead.org \
--cc=pjt@google.com \
--cc=rostedt@goodmis.org \
--cc=tglx@linutronix.de \
--cc=tim.c.chen@intel.com \
--cc=tim.c.chen@linux.intel.com \
--cc=torvalds@linux-foundation.org \
--cc=valentin.schneider@arm.com \
--cc=vineeth@bitbyteword.org \
--cc=viremana@linux.microsoft.com \
--cc=yu.c.chen@intel.com \
/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.