mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
ipc: merge ipc_rcu and kern_ipc_perm
ipc has two management structures that exist for every id: - struct kern_ipc_perm, it contains e.g. the permissions. - struct ipc_rcu, it contains the rcu head for rcu handling and the refcount. The patch merges both structures. As a bonus, we may save one cacheline, because both structures are cacheline aligned. In addition, it reduces the number of casts, instead most codepaths can use container_of. To simplify code, the ipc_rcu_alloc initializes the allocation to 0. [[email protected]: really include the memset() into ipc_alloc_rcu()] Link: http://lkml.kernel.org/r/[email protected] Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Manfred Spraul <[email protected]> Cc: Davidlohr Bueso <[email protected]> Cc: Kees Cook <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
This commit is contained in:
parent
1a23395672
commit
dba4cdd39e
6 changed files with 66 additions and 61 deletions
18
ipc/shm.c
18
ipc/shm.c
|
|
@ -174,9 +174,10 @@ static inline void shm_lock_by_ptr(struct shmid_kernel *ipcp)
|
|||
|
||||
static void shm_rcu_free(struct rcu_head *head)
|
||||
{
|
||||
struct ipc_rcu *p = container_of(head, struct ipc_rcu, rcu);
|
||||
struct shmid_kernel *shp = ipc_rcu_to_struct(p);
|
||||
|
||||
struct kern_ipc_perm *ptr = container_of(head, struct kern_ipc_perm,
|
||||
rcu);
|
||||
struct shmid_kernel *shp = container_of(ptr, struct shmid_kernel,
|
||||
shm_perm);
|
||||
security_shm_free(shp);
|
||||
ipc_rcu_free(head);
|
||||
}
|
||||
|
|
@ -241,7 +242,7 @@ static void shm_destroy(struct ipc_namespace *ns, struct shmid_kernel *shp)
|
|||
user_shm_unlock(i_size_read(file_inode(shm_file)),
|
||||
shp->mlock_user);
|
||||
fput(shm_file);
|
||||
ipc_rcu_putref(shp, shm_rcu_free);
|
||||
ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
@ -542,7 +543,10 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
|
|||
ns->shm_tot + numpages > ns->shm_ctlall)
|
||||
return -ENOSPC;
|
||||
|
||||
shp = ipc_rcu_alloc(sizeof(*shp));
|
||||
BUILD_BUG_ON(offsetof(struct shmid_kernel, shm_perm) != 0);
|
||||
|
||||
shp = container_of(ipc_rcu_alloc(sizeof(*shp)), struct shmid_kernel,
|
||||
shm_perm);
|
||||
if (!shp)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
@ -553,7 +557,7 @@ static int newseg(struct ipc_namespace *ns, struct ipc_params *params)
|
|||
shp->shm_perm.security = NULL;
|
||||
error = security_shm_alloc(shp);
|
||||
if (error) {
|
||||
ipc_rcu_putref(shp, ipc_rcu_free);
|
||||
ipc_rcu_putref(&shp->shm_perm, ipc_rcu_free);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
@ -624,7 +628,7 @@ no_id:
|
|||
user_shm_unlock(size, shp->mlock_user);
|
||||
fput(file);
|
||||
no_file:
|
||||
ipc_rcu_putref(shp, shm_rcu_free);
|
||||
ipc_rcu_putref(&shp->shm_perm, shm_rcu_free);
|
||||
return error;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue