mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
x86/vdso: Zap vvar pages when switching to a time namespace
The VVAR page layout depends on whether a task belongs to the root or non-root time namespace. Whenever a task changes its namespace, the VVAR page tables are cleared and then they will be re-faulted with a corresponding layout. Co-developed-by: Andrei Vagin <avagin@gmail.com> Signed-off-by: Andrei Vagin <avagin@gmail.com> Signed-off-by: Dmitry Safonov <dima@arista.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20191112012724.250792-27-dima@arista.com
This commit is contained in:
parent
e6b28ec65b
commit
70ddf65184
3 changed files with 46 additions and 0 deletions
|
@ -281,6 +281,7 @@ static void timens_put(struct ns_common *ns)
|
|||
static int timens_install(struct nsproxy *nsproxy, struct ns_common *new)
|
||||
{
|
||||
struct time_namespace *ns = to_time_ns(new);
|
||||
int err;
|
||||
|
||||
if (!current_is_single_threaded())
|
||||
return -EUSERS;
|
||||
|
@ -291,6 +292,10 @@ static int timens_install(struct nsproxy *nsproxy, struct ns_common *new)
|
|||
|
||||
timens_set_vvar_page(current, ns);
|
||||
|
||||
err = vdso_join_timens(current, ns);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
get_time_ns(ns);
|
||||
put_time_ns(nsproxy->time_ns);
|
||||
nsproxy->time_ns = ns;
|
||||
|
@ -305,6 +310,7 @@ int timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk)
|
|||
{
|
||||
struct ns_common *nsc = &nsproxy->time_ns_for_children->ns;
|
||||
struct time_namespace *ns = to_time_ns(nsc);
|
||||
int err;
|
||||
|
||||
/* create_new_namespaces() already incremented the ref counter */
|
||||
if (nsproxy->time_ns == nsproxy->time_ns_for_children)
|
||||
|
@ -312,6 +318,10 @@ int timens_on_fork(struct nsproxy *nsproxy, struct task_struct *tsk)
|
|||
|
||||
timens_set_vvar_page(tsk, ns);
|
||||
|
||||
err = vdso_join_timens(tsk, ns);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
get_time_ns(ns);
|
||||
put_time_ns(nsproxy->time_ns);
|
||||
nsproxy->time_ns = ns;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue