فهرست منبع

[PATCH] use smp_mb/wmb/rmb where possible

Replace a number of memory barriers with smp_ variants.  This means we won't
take the unnecessary hit on UP machines.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
akpm@osdl.org 20 سال پیش
والد
کامیت
d59dd4620f
11فایلهای تغییر یافته به همراه31 افزوده شده و 31 حذف شده
  1. 3 3
      fs/buffer.c
  2. 2 2
      ipc/mqueue.c
  3. 1 1
      kernel/kthread.c
  4. 1 1
      kernel/profile.c
  5. 1 1
      kernel/ptrace.c
  6. 5 5
      kernel/stop_machine.c
  7. 10 10
      kernel/sys.c
  8. 1 1
      kernel/timer.c
  9. 3 3
      lib/rwsem-spinlock.c
  10. 2 2
      lib/rwsem.c
  11. 2 2
      mm/mempool.c

+ 3 - 3
fs/buffer.c

@@ -218,7 +218,7 @@ struct super_block *freeze_bdev(struct block_device *bdev)
 	sb = get_super(bdev);
 	sb = get_super(bdev);
 	if (sb && !(sb->s_flags & MS_RDONLY)) {
 	if (sb && !(sb->s_flags & MS_RDONLY)) {
 		sb->s_frozen = SB_FREEZE_WRITE;
 		sb->s_frozen = SB_FREEZE_WRITE;
-		wmb();
+		smp_wmb();
 
 
 		sync_inodes_sb(sb, 0);
 		sync_inodes_sb(sb, 0);
 		DQUOT_SYNC(sb);
 		DQUOT_SYNC(sb);
@@ -235,7 +235,7 @@ struct super_block *freeze_bdev(struct block_device *bdev)
 		sync_inodes_sb(sb, 1);
 		sync_inodes_sb(sb, 1);
 
 
 		sb->s_frozen = SB_FREEZE_TRANS;
 		sb->s_frozen = SB_FREEZE_TRANS;
-		wmb();
+		smp_wmb();
 
 
 		sync_blockdev(sb->s_bdev);
 		sync_blockdev(sb->s_bdev);
 
 
@@ -263,7 +263,7 @@ void thaw_bdev(struct block_device *bdev, struct super_block *sb)
 		if (sb->s_op->unlockfs)
 		if (sb->s_op->unlockfs)
 			sb->s_op->unlockfs(sb);
 			sb->s_op->unlockfs(sb);
 		sb->s_frozen = SB_UNFROZEN;
 		sb->s_frozen = SB_UNFROZEN;
-		wmb();
+		smp_wmb();
 		wake_up(&sb->s_wait_unfrozen);
 		wake_up(&sb->s_wait_unfrozen);
 		drop_super(sb);
 		drop_super(sb);
 	}
 	}

+ 2 - 2
ipc/mqueue.c

@@ -767,7 +767,7 @@ static inline void pipelined_send(struct mqueue_inode_info *info,
 	list_del(&receiver->list);
 	list_del(&receiver->list);
 	receiver->state = STATE_PENDING;
 	receiver->state = STATE_PENDING;
 	wake_up_process(receiver->task);
 	wake_up_process(receiver->task);
-	wmb();
+	smp_wmb();
 	receiver->state = STATE_READY;
 	receiver->state = STATE_READY;
 }
 }
 
 
@@ -786,7 +786,7 @@ static inline void pipelined_receive(struct mqueue_inode_info *info)
 	list_del(&sender->list);
 	list_del(&sender->list);
 	sender->state = STATE_PENDING;
 	sender->state = STATE_PENDING;
 	wake_up_process(sender->task);
 	wake_up_process(sender->task);
-	wmb();
+	smp_wmb();
 	sender->state = STATE_READY;
 	sender->state = STATE_READY;
 }
 }
 
 

+ 1 - 1
kernel/kthread.c

@@ -174,7 +174,7 @@ int kthread_stop(struct task_struct *k)
 
 
 	/* Must init completion *before* thread sees kthread_stop_info.k */
 	/* Must init completion *before* thread sees kthread_stop_info.k */
 	init_completion(&kthread_stop_info.done);
 	init_completion(&kthread_stop_info.done);
-	wmb();
+	smp_wmb();
 
 
 	/* Now set kthread_should_stop() to true, and wake it up. */
 	/* Now set kthread_should_stop() to true, and wake it up. */
 	kthread_stop_info.k = k;
 	kthread_stop_info.k = k;

+ 1 - 1
kernel/profile.c

@@ -522,7 +522,7 @@ static int __init create_hash_tables(void)
 	return 0;
 	return 0;
 out_cleanup:
 out_cleanup:
 	prof_on = 0;
 	prof_on = 0;
-	mb();
+	smp_mb();
 	on_each_cpu(profile_nop, NULL, 0, 1);
 	on_each_cpu(profile_nop, NULL, 0, 1);
 	for_each_online_cpu(cpu) {
 	for_each_online_cpu(cpu) {
 		struct page *page;
 		struct page *page;

+ 1 - 1
kernel/ptrace.c

@@ -135,7 +135,7 @@ int ptrace_attach(struct task_struct *task)
  	    (current->gid != task->sgid) ||
  	    (current->gid != task->sgid) ||
  	    (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
  	    (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
 		goto bad;
 		goto bad;
-	rmb();
+	smp_rmb();
 	if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
 	if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
 		goto bad;
 		goto bad;
 	/* the same process cannot be attached many times */
 	/* the same process cannot be attached many times */

+ 5 - 5
kernel/stop_machine.c

@@ -33,7 +33,7 @@ static int stopmachine(void *cpu)
 	set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu));
 	set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu));
 
 
 	/* Ack: we are alive */
 	/* Ack: we are alive */
-	mb(); /* Theoretically the ack = 0 might not be on this CPU yet. */
+	smp_mb(); /* Theoretically the ack = 0 might not be on this CPU yet. */
 	atomic_inc(&stopmachine_thread_ack);
 	atomic_inc(&stopmachine_thread_ack);
 
 
 	/* Simple state machine */
 	/* Simple state machine */
@@ -43,14 +43,14 @@ static int stopmachine(void *cpu)
 			local_irq_disable();
 			local_irq_disable();
 			irqs_disabled = 1;
 			irqs_disabled = 1;
 			/* Ack: irqs disabled. */
 			/* Ack: irqs disabled. */
-			mb(); /* Must read state first. */
+			smp_mb(); /* Must read state first. */
 			atomic_inc(&stopmachine_thread_ack);
 			atomic_inc(&stopmachine_thread_ack);
 		} else if (stopmachine_state == STOPMACHINE_PREPARE
 		} else if (stopmachine_state == STOPMACHINE_PREPARE
 			   && !prepared) {
 			   && !prepared) {
 			/* Everyone is in place, hold CPU. */
 			/* Everyone is in place, hold CPU. */
 			preempt_disable();
 			preempt_disable();
 			prepared = 1;
 			prepared = 1;
-			mb(); /* Must read state first. */
+			smp_mb(); /* Must read state first. */
 			atomic_inc(&stopmachine_thread_ack);
 			atomic_inc(&stopmachine_thread_ack);
 		}
 		}
 		/* Yield in first stage: migration threads need to
 		/* Yield in first stage: migration threads need to
@@ -62,7 +62,7 @@ static int stopmachine(void *cpu)
 	}
 	}
 
 
 	/* Ack: we are exiting. */
 	/* Ack: we are exiting. */
-	mb(); /* Must read state first. */
+	smp_mb(); /* Must read state first. */
 	atomic_inc(&stopmachine_thread_ack);
 	atomic_inc(&stopmachine_thread_ack);
 
 
 	if (irqs_disabled)
 	if (irqs_disabled)
@@ -77,7 +77,7 @@ static int stopmachine(void *cpu)
 static void stopmachine_set_state(enum stopmachine_state state)
 static void stopmachine_set_state(enum stopmachine_state state)
 {
 {
 	atomic_set(&stopmachine_thread_ack, 0);
 	atomic_set(&stopmachine_thread_ack, 0);
-	wmb();
+	smp_wmb();
 	stopmachine_state = state;
 	stopmachine_state = state;
 	while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads)
 	while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads)
 		cpu_relax();
 		cpu_relax();

+ 10 - 10
kernel/sys.c

@@ -525,7 +525,7 @@ asmlinkage long sys_setregid(gid_t rgid, gid_t egid)
 	if (new_egid != old_egid)
 	if (new_egid != old_egid)
 	{
 	{
 		current->mm->dumpable = 0;
 		current->mm->dumpable = 0;
-		wmb();
+		smp_wmb();
 	}
 	}
 	if (rgid != (gid_t) -1 ||
 	if (rgid != (gid_t) -1 ||
 	    (egid != (gid_t) -1 && egid != old_rgid))
 	    (egid != (gid_t) -1 && egid != old_rgid))
@@ -556,7 +556,7 @@ asmlinkage long sys_setgid(gid_t gid)
 		if(old_egid != gid)
 		if(old_egid != gid)
 		{
 		{
 			current->mm->dumpable=0;
 			current->mm->dumpable=0;
-			wmb();
+			smp_wmb();
 		}
 		}
 		current->gid = current->egid = current->sgid = current->fsgid = gid;
 		current->gid = current->egid = current->sgid = current->fsgid = gid;
 	}
 	}
@@ -565,7 +565,7 @@ asmlinkage long sys_setgid(gid_t gid)
 		if(old_egid != gid)
 		if(old_egid != gid)
 		{
 		{
 			current->mm->dumpable=0;
 			current->mm->dumpable=0;
-			wmb();
+			smp_wmb();
 		}
 		}
 		current->egid = current->fsgid = gid;
 		current->egid = current->fsgid = gid;
 	}
 	}
@@ -596,7 +596,7 @@ static int set_user(uid_t new_ruid, int dumpclear)
 	if(dumpclear)
 	if(dumpclear)
 	{
 	{
 		current->mm->dumpable = 0;
 		current->mm->dumpable = 0;
-		wmb();
+		smp_wmb();
 	}
 	}
 	current->uid = new_ruid;
 	current->uid = new_ruid;
 	return 0;
 	return 0;
@@ -653,7 +653,7 @@ asmlinkage long sys_setreuid(uid_t ruid, uid_t euid)
 	if (new_euid != old_euid)
 	if (new_euid != old_euid)
 	{
 	{
 		current->mm->dumpable=0;
 		current->mm->dumpable=0;
-		wmb();
+		smp_wmb();
 	}
 	}
 	current->fsuid = current->euid = new_euid;
 	current->fsuid = current->euid = new_euid;
 	if (ruid != (uid_t) -1 ||
 	if (ruid != (uid_t) -1 ||
@@ -703,7 +703,7 @@ asmlinkage long sys_setuid(uid_t uid)
 	if (old_euid != uid)
 	if (old_euid != uid)
 	{
 	{
 		current->mm->dumpable = 0;
 		current->mm->dumpable = 0;
-		wmb();
+		smp_wmb();
 	}
 	}
 	current->fsuid = current->euid = uid;
 	current->fsuid = current->euid = uid;
 	current->suid = new_suid;
 	current->suid = new_suid;
@@ -748,7 +748,7 @@ asmlinkage long sys_setresuid(uid_t ruid, uid_t euid, uid_t suid)
 		if (euid != current->euid)
 		if (euid != current->euid)
 		{
 		{
 			current->mm->dumpable = 0;
 			current->mm->dumpable = 0;
-			wmb();
+			smp_wmb();
 		}
 		}
 		current->euid = euid;
 		current->euid = euid;
 	}
 	}
@@ -798,7 +798,7 @@ asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
 		if (egid != current->egid)
 		if (egid != current->egid)
 		{
 		{
 			current->mm->dumpable = 0;
 			current->mm->dumpable = 0;
-			wmb();
+			smp_wmb();
 		}
 		}
 		current->egid = egid;
 		current->egid = egid;
 	}
 	}
@@ -845,7 +845,7 @@ asmlinkage long sys_setfsuid(uid_t uid)
 		if (uid != old_fsuid)
 		if (uid != old_fsuid)
 		{
 		{
 			current->mm->dumpable = 0;
 			current->mm->dumpable = 0;
-			wmb();
+			smp_wmb();
 		}
 		}
 		current->fsuid = uid;
 		current->fsuid = uid;
 	}
 	}
@@ -875,7 +875,7 @@ asmlinkage long sys_setfsgid(gid_t gid)
 		if (gid != old_fsgid)
 		if (gid != old_fsgid)
 		{
 		{
 			current->mm->dumpable = 0;
 			current->mm->dumpable = 0;
-			wmb();
+			smp_wmb();
 		}
 		}
 		current->fsgid = gid;
 		current->fsgid = gid;
 		key_fsgid_changed(current);
 		key_fsgid_changed(current);

+ 1 - 1
kernel/timer.c

@@ -1007,7 +1007,7 @@ asmlinkage long sys_getppid(void)
 		 * Make sure we read the pid before re-reading the
 		 * Make sure we read the pid before re-reading the
 		 * parent pointer:
 		 * parent pointer:
 		 */
 		 */
-		rmb();
+		smp_rmb();
 		parent = me->group_leader->real_parent;
 		parent = me->group_leader->real_parent;
 		if (old != parent)
 		if (old != parent)
 			continue;
 			continue;

+ 3 - 3
lib/rwsem-spinlock.c

@@ -76,7 +76,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite)
 		list_del(&waiter->list);
 		list_del(&waiter->list);
 		tsk = waiter->task;
 		tsk = waiter->task;
 		/* Don't touch waiter after ->task has been NULLed */
 		/* Don't touch waiter after ->task has been NULLed */
-		mb();
+		smp_mb();
 		waiter->task = NULL;
 		waiter->task = NULL;
 		wake_up_process(tsk);
 		wake_up_process(tsk);
 		put_task_struct(tsk);
 		put_task_struct(tsk);
@@ -91,7 +91,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite)
 
 
 		list_del(&waiter->list);
 		list_del(&waiter->list);
 		tsk = waiter->task;
 		tsk = waiter->task;
-		mb();
+		smp_mb();
 		waiter->task = NULL;
 		waiter->task = NULL;
 		wake_up_process(tsk);
 		wake_up_process(tsk);
 		put_task_struct(tsk);
 		put_task_struct(tsk);
@@ -123,7 +123,7 @@ __rwsem_wake_one_writer(struct rw_semaphore *sem)
 	list_del(&waiter->list);
 	list_del(&waiter->list);
 
 
 	tsk = waiter->task;
 	tsk = waiter->task;
-	mb();
+	smp_mb();
 	waiter->task = NULL;
 	waiter->task = NULL;
 	wake_up_process(tsk);
 	wake_up_process(tsk);
 	put_task_struct(tsk);
 	put_task_struct(tsk);

+ 2 - 2
lib/rwsem.c

@@ -74,7 +74,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading)
 	 */
 	 */
 	list_del(&waiter->list);
 	list_del(&waiter->list);
 	tsk = waiter->task;
 	tsk = waiter->task;
-	mb();
+	smp_mb();
 	waiter->task = NULL;
 	waiter->task = NULL;
 	wake_up_process(tsk);
 	wake_up_process(tsk);
 	put_task_struct(tsk);
 	put_task_struct(tsk);
@@ -117,7 +117,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading)
 		waiter = list_entry(next, struct rwsem_waiter, list);
 		waiter = list_entry(next, struct rwsem_waiter, list);
 		next = waiter->list.next;
 		next = waiter->list.next;
 		tsk = waiter->task;
 		tsk = waiter->task;
-		mb();
+		smp_mb();
 		waiter->task = NULL;
 		waiter->task = NULL;
 		wake_up_process(tsk);
 		wake_up_process(tsk);
 		put_task_struct(tsk);
 		put_task_struct(tsk);

+ 2 - 2
mm/mempool.c

@@ -229,7 +229,7 @@ repeat_alloc:
 	/* Now start performing page reclaim */
 	/* Now start performing page reclaim */
 	gfp_temp = gfp_mask;
 	gfp_temp = gfp_mask;
 	prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE);
 	prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE);
-	mb();
+	smp_mb();
 	if (!pool->curr_nr)
 	if (!pool->curr_nr)
 		io_schedule();
 		io_schedule();
 	finish_wait(&pool->wait, &wait);
 	finish_wait(&pool->wait, &wait);
@@ -250,7 +250,7 @@ void mempool_free(void *element, mempool_t *pool)
 {
 {
 	unsigned long flags;
 	unsigned long flags;
 
 
-	mb();
+	smp_mb();
 	if (pool->curr_nr < pool->min_nr) {
 	if (pool->curr_nr < pool->min_nr) {
 		spin_lock_irqsave(&pool->lock, flags);
 		spin_lock_irqsave(&pool->lock, flags);
 		if (pool->curr_nr < pool->min_nr) {
 		if (pool->curr_nr < pool->min_nr) {