mirror of
https://github.com/Fishwaldo/linux-bl808.git
synced 2025-06-17 20:25:19 +00:00
ipc/sem.c: rewrite undo list locking
The attached patch: - reverses the locking order of ulp->lock and sem_lock: Previously, it was first ulp->lock, then inside sem_lock. Now it's the other way around. - converts the undo structure to rcu. Benefits: - With the old locking order, IPC_RMID could not kfree the undo structures. The stale entries remained in the linked lists and were released later. - The patch fixes a a race in semtimedop(): if both IPC_RMID and a semget() that recreates exactly the same id happen between find_alloc_undo() and sem_lock, then semtimedop() would access already kfree'd memory. [akpm@linux-foundation.org: coding-style fixes] Signed-off-by: Manfred Spraul <manfred@colorfullife.com> Reviewed-by: Nadia Derbey <Nadia.Derbey@bull.net> Cc: Pierre Peiffer <peifferp@gmail.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
a1193f8ec0
commit
380af1b33b
2 changed files with 99 additions and 56 deletions
|
@ -78,6 +78,7 @@ struct seminfo {
|
|||
|
||||
#ifdef __KERNEL__
|
||||
#include <asm/atomic.h>
|
||||
#include <linux/rcupdate.h>
|
||||
|
||||
struct task_struct;
|
||||
|
||||
|
@ -114,7 +115,10 @@ struct sem_queue {
|
|||
* when the process exits.
|
||||
*/
|
||||
struct sem_undo {
|
||||
struct list_head list_proc; /* per-process list: all undos from one process */
|
||||
struct list_head list_proc; /* per-process list: all undos from one process. */
|
||||
/* rcu protected */
|
||||
struct rcu_head rcu; /* rcu struct for sem_undo() */
|
||||
struct sem_undo_list *ulp; /* sem_undo_list for the process */
|
||||
struct list_head list_id; /* per semaphore array list: all undos for one array */
|
||||
int semid; /* semaphore set identifier */
|
||||
short * semadj; /* array of adjustments, one per semaphore */
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue