OpenVZ Forum


Home » Mailing lists » Devel » Playing with namespaces and bloat-o-meeter
Re: Playing with namespaces and bloat-o-meeter [message #20819 is a reply to message #20811] Wed, 26 September 2007 14:08 Go to previous messageGo to previous message
Pavel Emelianov is currently offline  Pavel Emelianov
Messages: 1149
Registered: September 2006
Senior Member
Cedric Le Goater wrote:
> Pavel Emelyanov wrote:
>> Hi, guys!
>>
>> I've noticed that compiling out all the core related to
>> cloning and cleaning the new namespace saves us more than
>> a Kbyte (!) from the vmlinux.
> 
> cool. 
> 
> but compared to the 5KB pid ns is adding, it's not much. I guess
> anything that can be saved is good to save when you run on a cell. 

Yup, but I've already sent 3 patches to Andrew that save 1.5 KB
so we have already managed to get a half for cell users ;)

>> add/remove: 19/0 grow/shrink: 6/6 up/down: 1532/-336 (1196)
>> function                                     old     new   delta
>> copy_user_ns                                   -     181    +181
>> copy_ipcs                                      -     149    +149
>> copy_utsname                                   -     120    +120
>> shm_exit_ns                                    -     106    +106
>> sem_exit_ns                                    -     106    +106
>> msg_exit_ns                                    -     106    +106
>> freeary                                        -     100    +100
>> release_uids                                   -      95     +95
>> freeque                                        -      92     +92
>> free_nsproxy                                  48      99     +51
>> __sem_init_ns                                  -      45     +45
>> shm_init_ns                                    -      42     +42
>> sem_init_ns                                    -      42     +42
>> msg_init_ns                                    -      42     +42
>> __shm_init_ns                                  -      38     +38
>> create_new_namespaces                        300     335     +35
>> __msg_init_ns                                  -      31     +31
>> sysvipc_proc_release                           5      35     +30
>> free_ipc_ns                                    -      30     +30
>> do_shm_rmid                                    -      29     +29
>> shm_release                                   18      39     +21
>> free_user_ns                                   -      16     +16
>> sysvipc_proc_open                            100     111     +11
>> do_shmat                                     778     787      +9
>> free_uts_ns                                    -       5      +5
>> sys_shmctl                                  1934    1907     -27
>> msg_init                                      82      47     -35
>> shm_init                                      92      47     -45
>> sem_init                                      99      44     -55
>> sys_msgctl                                  1394    1311     -83
>> sys_semctl                                  2123    2032     -91
>>
>> Since there already were some questions like "do I need it
>> on my cellphone?" in reply to pid namespaces patches and 
>> so on, why don't we make ALL the namespaces cloning code 
>> under the config option to make those people happy?
>>
>> Here's the proposed patch.
> 
> I think I'm ok with it but it would be easier to review if you 
> could split it in little patchlets, at least one for each 
> namespace.  diffstats are welcome also :)
> 
>> Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
>>
>> ---
>>
>> diff --git a/include/linux/ipc.h b/include/linux/ipc.h
>> index 96988d1..b882610 100644
>> --- a/include/linux/ipc.h
>> +++ b/include/linux/ipc.h
>> @@ -100,56 +100,6 @@ struct kern_ipc_perm
>>  	void		*security;
>>  };
>>
>> -struct ipc_ids;
>> -struct ipc_namespace {
>> -	struct kref	kref;
>> -	struct ipc_ids	*ids[3];
>> -
>> -	int		sem_ctls[4];
>> -	int		used_sems;
>> -
>> -	int		msg_ctlmax;
>> -	int		msg_ctlmnb;
>> -	int		msg_ctlmni;
>> -
>> -	size_t		shm_ctlmax;
>> -	size_t		shm_ctlall;
>> -	int		shm_ctlmni;
>> -	int		shm_tot;
>> -};
>> -
>> -extern struct ipc_namespace init_ipc_ns;
>> -
>> -#ifdef CONFIG_SYSVIPC
>> -#define INIT_IPC_NS(ns)		.ns		= &init_ipc_ns,
>> -extern void free_ipc_ns(struct kref *kref);
>> -extern struct ipc_namespace *copy_ipcs(unsigned long flags,
>> -						struct ipc_namespace *ns);
>> -#else
>> -#define INIT_IPC_NS(ns)
>> -static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
>> -						struct ipc_namespace *ns)
>> -{
>> -	return ns;
>> -}
>> -#endif
>> -
>> -static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
>> -{
>> -#ifdef CONFIG_SYSVIPC
>> -	if (ns)
>> -		kref_get(&ns->kref);
>> -#endif
>> -	return ns;
>> -}
>> -
>> -static inline void put_ipc_ns(struct ipc_namespace *ns)
>> -{
>> -#ifdef CONFIG_SYSVIPC
>> -	kref_put(&ns->kref, free_ipc_ns);
>> -#endif
>> -}
>> -
>>  #endif /* __KERNEL__ */
>>
>>  #endif /* _LINUX_IPC_H */
>> diff --git a/include/linux/ipc_namespace.h b/include/linux/ipc_namespace.h
>> new file mode 100644
>> index 0000000..89f51f8
>> --- /dev/null
>> +++ b/include/linux/ipc_namespace.h
> 
> that's something i wanted to do. thanks. 
> 
>> @@ -0,0 +1,67 @@
>> +#ifndef __IPC_NAMESPACE_H__
>> +#define __IPC_NAMESPACE_H__
>> +
>> +#include <linux/err.h>
>> +
>> +struct ipc_ids;
>> +struct ipc_namespace {
>> +	struct kref	kref;
>> +	struct ipc_ids	*ids[3];
>> +
>> +	int		sem_ctls[4];
>> +	int		used_sems;
>> +
>> +	int		msg_ctlmax;
>> +	int		msg_ctlmnb;
>> +	int		msg_ctlmni;
>> +
>> +	size_t		shm_ctlmax;
>> +	size_t		shm_ctlall;
>> +	int		shm_ctlmni;
>> +	int		shm_tot;
>> +};
>> +
>> +extern struct ipc_namespace init_ipc_ns;
>> +
>> +#ifdef CONFIG_SYSVIPC
>> +#define INIT_IPC_NS(ns)		.ns		= &init_ipc_ns,
>> +#else
>> +#define INIT_IPC_NS(ns)
>> +#endif
>> +
>> +#ifdef CONFIG_NS_IPC
> 
> ok so you're readding that flag. please check ipc/ipc_sysctl.c there might
> be some surprises.
> 
> check the compile with CONFIG_SYSCTL=n
> 
>> +extern void free_ipc_ns(struct kref *kref);
>> +extern struct ipc_namespace *copy_ipcs(unsigned long flags,
>> +						struct ipc_namespace *ns);
>> +
>> +static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
>> +{
>> +	if (ns)
>> +		kref_get(&ns->kref);
>> +	return ns;
>> +}
>> +
>> +static inline void put_ipc_ns(struct ipc_namespace *ns)
>> +{
>> +	kref_put(&ns->kref, free_ipc_ns);
>> +}
>> +#else
>> +static inline struct ipc_namespace *copy_ipcs(unsigned long flags,
>> +		struct ipc_namespace *ns)
>> +{
>> +	if (flags & CLONE_NEWIPC)
>> +		return ERR_PTR(-EINVAL);
>> +
>> +	return ns;
>> +}
>> +
>> +static inline struct ipc_namespace *get_ipc_ns(struct ipc_namespace *ns)
>> +{
>> +	return ns;
>> +}
>> +
>> +static inline void put_ipc_ns(struct ipc_namespace *ns)
>> +{
>> +}
>> +#endif
>> +#endif
>> diff --git a/include/linux/nsproxy.h b/include/linux/nsproxy.h
>> diff --git a/include/linux/pid.h b/include/linux/pid.h
>> index 4817c66..ac1b47f 100644
>> --- a/include/linux/pid.h
>> +++ b/include/linux/pid.h
>> @@ -122,7 +122,6 @@ extern struct pid *find_ge_pid(int nr, s
>>
>>  extern struct pid *alloc_pid(struct pid_namespace *ns);
>>  extern void FASTCALL(free_pid(struct pid *pid));
>> -extern void zap_pid_ns_processes(struct pid_namespace *pid_ns);
>>
>>  /*
>>   * the helpers to get the pid's id seen from different namespaces
>> diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
>> index 0135c76..1f5f915 100644
>> --- a/include/linux/pid_namespace.h
>> +++ b/include/linux/pid_namespace.h
>> @@ -6,6 +6,7 @@
>>  #include <linux/threads.h>
>>  #include <linux/nsproxy.h>
>>  #include <linux/kref.h>
>> +#include <linux/err.h>
>>
>>  struct pidmap {
>>         atomic_t nr_free;
>> @@ -29,6 +30,7 @@ struct pid_namespace {
>>
>>  extern struct pid_namespace init_pid_ns;
>>
>> +#ifdef CONFIG_NS_PID
>>  static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns)
>>  {
>>  	if (ns != &init_pid_ns)
>> @@ -38,12 +40,37 @@ static inline struct pid_namespace *get_
>>
>>  extern struct pid_namespace *copy_pid_ns(unsigned long flags, struct pid_namespace *ns);
>>  extern void free_pid_ns(struct kref *kref);
>> +extern void zap_pid_ns_processes(struct pid_namespace *pid_ns);
>>
>>  static inline void put_pid_ns(struct pid_namespace *ns)
>>  {
>>  	if (ns != &init_pid_ns)
>>  		kref_put(&ns->kref, free_pid_ns);
>>  }
>> +#else
>> +static inline struct pid_namespace *get_pid_ns(struct pid_namespace *ns)
>> +{
>> +	return ns;
>> +}
>> +
>> +static inline void put_pid_ns(struct pid_namespace *ns)
>> +{
>> +}
>> +
>> +static inline struct pid_namespace *copy_pid_ns(unsigned long flags,
>> +		struct pid_namespace
...

 
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Read Message
Previous Topic: [PATCH] Use KMEM_CACHE macro to create the nsproxy cache
Next Topic: Unable to remove control groups on 2.6.23-rc8-mm1
Goto Forum:
  


Current Time: Sun Aug 03 21:04:32 GMT 2025

Total time taken to generate the page: 0.81385 seconds