lkml.org 
[lkml]   [2019]   [Jul]   [29]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCHv5 02/37] timens: Add timens_offsets
    Date
    From: Andrei Vagin <avagin@openvz.org>

    Introduce offsets for time namespace. They will contain an adjustment
    needed to convert clocks to/from host's.

    Allocate one page for each time namespace that will be premapped into
    userspace among vvar pages.

    Signed-off-by: Andrei Vagin <avagin@openvz.org>
    Co-developed-by: Dmitry Safonov <dima@arista.com>
    Signed-off-by: Dmitry Safonov <dima@arista.com>
    ---
    MAINTAINERS | 1 +
    include/linux/time_namespace.h | 1 +
    include/linux/timens_offsets.h | 8 ++++++++
    kernel/time_namespace.c | 14 ++++++++++++--
    4 files changed, 22 insertions(+), 2 deletions(-)
    create mode 100644 include/linux/timens_offsets.h

    diff --git a/MAINTAINERS b/MAINTAINERS
    index ce6ff88f7efd..b58c49d331eb 100644
    --- a/MAINTAINERS
    +++ b/MAINTAINERS
    @@ -12837,6 +12837,7 @@ S: Maintained
    F: fs/timerfd.c
    F: include/linux/timer*
    F: include/linux/time_namespace.h
    +F: include/linux/timens_offsets.h
    F: kernel/time_namespace.c
    F: kernel/time/*timer*

    diff --git a/include/linux/time_namespace.h b/include/linux/time_namespace.h
    index 9507ed7072fe..b6985aa87479 100644
    --- a/include/linux/time_namespace.h
    +++ b/include/linux/time_namespace.h
    @@ -8,6 +8,7 @@
    #include <linux/nsproxy.h>
    #include <linux/ns_common.h>
    #include <linux/err.h>
    +#include <linux/timens_offsets.h>

    struct user_namespace;
    extern struct user_namespace init_user_ns;
    diff --git a/include/linux/timens_offsets.h b/include/linux/timens_offsets.h
    new file mode 100644
    index 000000000000..7d7cb68ea778
    --- /dev/null
    +++ b/include/linux/timens_offsets.h
    @@ -0,0 +1,8 @@
    +/* SPDX-License-Identifier: GPL-2.0 */
    +#ifndef _LINUX_TIME_OFFSETS_H
    +#define _LINUX_TIME_OFFSETS_H
    +
    +struct timens_offsets {
    +};
    +
    +#endif
    diff --git a/kernel/time_namespace.c b/kernel/time_namespace.c
    index 7ee6be0647bc..f849c59f1108 100644
    --- a/kernel/time_namespace.c
    +++ b/kernel/time_namespace.c
    @@ -14,6 +14,7 @@
    #include <linux/slab.h>
    #include <linux/cred.h>
    #include <linux/err.h>
    +#include <linux/mm.h>

    static struct ucounts *inc_time_namespaces(struct user_namespace *ns)
    {
    @@ -47,6 +48,7 @@ static struct time_namespace *clone_time_ns(struct user_namespace *user_ns,
    {
    struct time_namespace *ns;
    struct ucounts *ucounts;
    + struct page *page;
    int err;

    err = -ENOSPC;
    @@ -59,15 +61,22 @@ static struct time_namespace *clone_time_ns(struct user_namespace *user_ns,
    if (!ns)
    goto fail_dec;

    + page = alloc_page(GFP_KERNEL | __GFP_ZERO);
    + if (!page)
    + goto fail_free;
    + ns->offsets = page_address(page);
    + BUILD_BUG_ON(sizeof(*ns->offsets) > PAGE_SIZE);
    +
    err = ns_alloc_inum(&ns->ns);
    if (err)
    - goto fail_free;
    + goto fail_page;

    ns->ucounts = ucounts;
    ns->ns.ops = &timens_operations;
    ns->user_ns = get_user_ns(user_ns);
    return ns;
    -
    +fail_page:
    + free_page((unsigned long)ns->offsets);
    fail_free:
    kfree(ns);
    fail_dec:
    @@ -95,6 +104,7 @@ void free_time_ns(struct kref *kref)
    struct time_namespace *ns;

    ns = container_of(kref, struct time_namespace, kref);
    + free_page((unsigned long)ns->offsets);
    dec_time_namespaces(ns->ucounts);
    put_user_ns(ns->user_ns);
    ns_free_inum(&ns->ns);
    --
    2.22.0
    \
     
     \ /
      Last update: 2019-07-30 00:09    [W:4.455 / U:0.652 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site