mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	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
					
				
					 2 changed files with 24 additions and 0 deletions
				
			
		| 
						 | 
					@ -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 a new issue