time: Add timens_offsets to be used for tasks in time namespace
Introduce offsets for time namespace. They will contain an adjustment needed to convert clocks to/from host's. A new namespace is created with the same offsets as the time namespace of the current process. Co-developed-by: Dmitry Safonov <dima@arista.com> Signed-off-by: Andrei Vagin <avagin@openvz.org> Signed-off-by: Dmitry Safonov <dima@arista.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Link: https://lore.kernel.org/r/20191112012724.250792-5-dima@arista.com
This commit is contained in:
parent
769071ac9f
commit
af993f58d6
|
@ -12,11 +12,17 @@
|
||||||
struct user_namespace;
|
struct user_namespace;
|
||||||
extern struct user_namespace init_user_ns;
|
extern struct user_namespace init_user_ns;
|
||||||
|
|
||||||
|
struct timens_offsets {
|
||||||
|
struct timespec64 monotonic;
|
||||||
|
struct timespec64 boottime;
|
||||||
|
};
|
||||||
|
|
||||||
struct time_namespace {
|
struct time_namespace {
|
||||||
struct kref kref;
|
struct kref kref;
|
||||||
struct user_namespace *user_ns;
|
struct user_namespace *user_ns;
|
||||||
struct ucounts *ucounts;
|
struct ucounts *ucounts;
|
||||||
struct ns_common ns;
|
struct ns_common ns;
|
||||||
|
struct timens_offsets offsets;
|
||||||
} __randomize_layout;
|
} __randomize_layout;
|
||||||
|
|
||||||
extern struct time_namespace init_time_ns;
|
extern struct time_namespace init_time_ns;
|
||||||
|
@ -39,6 +45,20 @@ static inline void put_time_ns(struct time_namespace *ns)
|
||||||
kref_put(&ns->kref, free_time_ns);
|
kref_put(&ns->kref, free_time_ns);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void timens_add_monotonic(struct timespec64 *ts)
|
||||||
|
{
|
||||||
|
struct timens_offsets *ns_offsets = ¤t->nsproxy->time_ns->offsets;
|
||||||
|
|
||||||
|
*ts = timespec64_add(*ts, ns_offsets->monotonic);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void timens_add_boottime(struct timespec64 *ts)
|
||||||
|
{
|
||||||
|
struct timens_offsets *ns_offsets = ¤t->nsproxy->time_ns->offsets;
|
||||||
|
|
||||||
|
*ts = timespec64_add(*ts, ns_offsets->boottime);
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
|
static inline struct time_namespace *get_time_ns(struct time_namespace *ns)
|
||||||
{
|
{
|
||||||
|
@ -66,6 +86,8 @@ static inline int timens_on_fork(struct nsproxy *nsproxy,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void timens_add_monotonic(struct timespec64 *ts) { }
|
||||||
|
static inline void timens_add_boottime(struct timespec64 *ts) { }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _LINUX_TIMENS_H */
|
#endif /* _LINUX_TIMENS_H */
|
||||||
|
|
|
@ -14,6 +14,7 @@
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/cred.h>
|
#include <linux/cred.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
static struct ucounts *inc_time_namespaces(struct user_namespace *ns)
|
static struct ucounts *inc_time_namespaces(struct user_namespace *ns)
|
||||||
{
|
{
|
||||||
|
@ -60,6 +61,7 @@ static struct time_namespace *clone_time_ns(struct user_namespace *user_ns,
|
||||||
ns->ucounts = ucounts;
|
ns->ucounts = ucounts;
|
||||||
ns->ns.ops = &timens_operations;
|
ns->ns.ops = &timens_operations;
|
||||||
ns->user_ns = get_user_ns(user_ns);
|
ns->user_ns = get_user_ns(user_ns);
|
||||||
|
ns->offsets = old_ns->offsets;
|
||||||
return ns;
|
return ns;
|
||||||
|
|
||||||
fail_free:
|
fail_free:
|
||||||
|
|
Loading…
Reference in New Issue