Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 261737
b: refs/heads/master
c: 5774ed0
h: refs/heads/master
i:
  261735: a007c98
v: v3
  • Loading branch information
Vasiliy Kulikov authored and Linus Torvalds committed Jul 30, 2011
1 parent cd3c715 commit a6ac5e0
Show file tree
Hide file tree
Showing 3 changed files with 24 additions and 8 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 6c6e3b828b2a13b923b9465fc4316c5bdc92291f
refs/heads/master: 5774ed014f02120db9a6945a1ecebeb97c2acccb
3 changes: 3 additions & 0 deletions trunk/include/linux/shm.h
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ struct shmid_kernel /* private to the kernel */
pid_t shm_cprid;
pid_t shm_lprid;
struct user_struct *mlock_user;

/* The task created the shm object. NULL if the task is dead. */
struct task_struct *shm_creator;
};

/* shm_mode upper byte flags */
Expand Down
27 changes: 20 additions & 7 deletions trunk/ipc/shm.c
Original file line number Diff line number Diff line change
Expand Up @@ -239,7 +239,23 @@ static int shm_try_destroy_current(int id, void *p, void *data)
if (IS_ERR(shp))
return 0;

if (shp->shm_cprid != task_tgid_vnr(current)) {
if (shp->shm_creator != current) {
shm_unlock(shp);
return 0;
}

/*
* Mark it as orphaned to destroy the segment when
* kernel.shm_rmid_forced is changed.
* It is noop if the following shm_may_destroy() returns true.
*/
shp->shm_creator = NULL;

/*
* Don't even try to destroy it. If shm_rmid_forced=0 and IPC_RMID
* is not set, it shouldn't be deleted here.
*/
if (!ns->shm_rmid_forced) {
shm_unlock(shp);
return 0;
}
Expand All @@ -255,19 +271,15 @@ static int shm_try_destroy_orphaned(int id, void *p, void *data)
{
struct ipc_namespace *ns = data;
struct shmid_kernel *shp = shm_lock(ns, id);
struct task_struct *task;

if (IS_ERR(shp))
return 0;

/*
* We want to destroy segments without users and with already
* exit'ed originating process.
*
* XXX: the originating process may exist in another pid namespace.
*/
task = find_task_by_vpid(shp->shm_cprid);
if (task != NULL) {
if (shp->shm_creator != NULL) {
shm_unlock(shp);
return 0;
}
Expand Down Expand Up @@ -295,7 +307,7 @@ void exit_shm(struct task_struct *task)
if (!nsp)
return;
ns = nsp->ipc_ns;
if (!ns || !ns->shm_rmid_forced)
if (!ns)
return;

/* Destroy all already created segments, but not mapped yet */
Expand Down Expand Up @@ -494,6 +506,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
shp->shm_segsz = size;
shp->shm_nattch = 0;
shp->shm_file = file;
shp->shm_creator = current;
/*
* shmid gets reported as "inode#" in /proc/pid/maps.
* proc-ps tools use this. Changing this will break them.
Expand Down

0 comments on commit a6ac5e0

Please sign in to comment.