Commit 081e4c8a authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Linus Torvalds

bsdacct: rename acct_gbls to bsd_acct_struct

After I fixed access to task->tgid in kernel/acct.c, Oleg pointed out some
bad side effects with this accounting vs pid namespaces interaction.  I.e.
 when some task in pid namespace sets this accounting up, this blocks all
the others from doing the same.  Restricting this to init namespace only
could help, but didn't look a graceful solution.

So here is the approach to make this accounting work with pid namespaces
properly.

The idea is simple - when a task dies it accounts itself in each namespace
it is visible from and which set the accounting up.

For example here are the commands run and the output of lastcomm from init
and sub namespaces:

init_ns# accton pacct
 sub_ns# accton pacct (this is a different file - sub ns is run in
                       a chroot-ed environment)
init_ns# cat /dev/null
 sub_ns# ls /dev/null
init_ns# accton
 sub_ns# accton

 sub_ns#  lastcomm -f pacct
ls                      0        [136,0]    0.00 secs Thu May 15 10:30
accton                  0        [136,0]    0.00 secs Thu May 15 10:30

init_ns# lastcomm -f pacct
accton                  root     pts/0      0.00 secs Thu May 15 14:30 << got from sub
cat                     root     pts/1      0.00 secs Thu May 15 14:30
ls                      root     pts/0      0.00 secs Thu May 15 14:30 << got from sub
accton                  root     pts/1      0.00 secs Thu May 15 14:30

That was the summary, the details are in patches.

This patch:

It will be visible in pid_namespace.h file, so fix its name to look better
outside the acct.c file.
Signed-off-by: default avatarPavel Emelyanov <xemul@openvz.org>
Cc: Balbir Singh <balbir@in.ibm.com>
Cc: "Eric W. Biederman" <ebiederm@xmission.com>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 49b5cf34
...@@ -82,7 +82,7 @@ static void do_acct_process(struct pid_namespace *ns, struct file *); ...@@ -82,7 +82,7 @@ static void do_acct_process(struct pid_namespace *ns, struct file *);
* can be placed in the same cache line as the lock. This primes * can be placed in the same cache line as the lock. This primes
* the cache line to have the data after getting the lock. * the cache line to have the data after getting the lock.
*/ */
struct acct_glbs { struct bsd_acct_struct {
spinlock_t lock; spinlock_t lock;
volatile int active; volatile int active;
volatile int needcheck; volatile int needcheck;
...@@ -91,7 +91,7 @@ struct acct_glbs { ...@@ -91,7 +91,7 @@ struct acct_glbs {
struct timer_list timer; struct timer_list timer;
}; };
static struct acct_glbs acct_globals __cacheline_aligned = static struct bsd_acct_struct acct_globals __cacheline_aligned =
{__SPIN_LOCK_UNLOCKED(acct_globals.lock)}; {__SPIN_LOCK_UNLOCKED(acct_globals.lock)};
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment