[PATCH] use smp_mb/wmb/rmb where possible
akpm@osdl.org [Sun, 1 May 2005 15:58:47 +0000 (08:58 -0700)]
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>

fs/buffer.c
ipc/mqueue.c
kernel/kthread.c
kernel/profile.c
kernel/ptrace.c
kernel/stop_machine.c
kernel/sys.c
kernel/timer.c
lib/rwsem-spinlock.c
lib/rwsem.c
mm/mempool.c

index 665db84..188365c 100644 (file)
@@ -218,7 +218,7 @@ struct super_block *freeze_bdev(struct block_device *bdev)
        sb = get_super(bdev);
        if (sb && !(sb->s_flags & MS_RDONLY)) {
                sb->s_frozen = SB_FREEZE_WRITE;
-               wmb();
+               smp_wmb();
 
                sync_inodes_sb(sb, 0);
                DQUOT_SYNC(sb);
@@ -235,7 +235,7 @@ struct super_block *freeze_bdev(struct block_device *bdev)
                sync_inodes_sb(sb, 1);
 
                sb->s_frozen = SB_FREEZE_TRANS;
-               wmb();
+               smp_wmb();
 
                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)
                        sb->s_op->unlockfs(sb);
                sb->s_frozen = SB_UNFROZEN;
-               wmb();
+               smp_wmb();
                wake_up(&sb->s_wait_unfrozen);
                drop_super(sb);
        }
index cb0cd3c..33f7152 100644 (file)
@@ -767,7 +767,7 @@ static inline void pipelined_send(struct mqueue_inode_info *info,
        list_del(&receiver->list);
        receiver->state = STATE_PENDING;
        wake_up_process(receiver->task);
-       wmb();
+       smp_wmb();
        receiver->state = STATE_READY;
 }
 
@@ -786,7 +786,7 @@ static inline void pipelined_receive(struct mqueue_inode_info *info)
        list_del(&sender->list);
        sender->state = STATE_PENDING;
        wake_up_process(sender->task);
-       wmb();
+       smp_wmb();
        sender->state = STATE_READY;
 }
 
index e377e22..f50f174 100644 (file)
@@ -174,7 +174,7 @@ int kthread_stop(struct task_struct *k)
 
        /* Must init completion *before* thread sees kthread_stop_info.k */
        init_completion(&kthread_stop_info.done);
-       wmb();
+       smp_wmb();
 
        /* Now set kthread_should_stop() to true, and wake it up. */
        kthread_stop_info.k = k;
index a38fa70..a66be46 100644 (file)
@@ -522,7 +522,7 @@ static int __init create_hash_tables(void)
        return 0;
 out_cleanup:
        prof_on = 0;
-       mb();
+       smp_mb();
        on_each_cpu(profile_nop, NULL, 0, 1);
        for_each_online_cpu(cpu) {
                struct page *page;
index 88b306c..f5cc1ce 100644 (file)
@@ -135,7 +135,7 @@ int ptrace_attach(struct task_struct *task)
            (current->gid != task->sgid) ||
            (current->gid != task->gid)) && !capable(CAP_SYS_PTRACE))
                goto bad;
-       rmb();
+       smp_rmb();
        if (!task->mm->dumpable && !capable(CAP_SYS_PTRACE))
                goto bad;
        /* the same process cannot be attached many times */
index c39ed70..6116b25 100644 (file)
@@ -33,7 +33,7 @@ static int stopmachine(void *cpu)
        set_cpus_allowed(current, cpumask_of_cpu((int)(long)cpu));
 
        /* 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);
 
        /* Simple state machine */
@@ -43,14 +43,14 @@ static int stopmachine(void *cpu)
                        local_irq_disable();
                        irqs_disabled = 1;
                        /* Ack: irqs disabled. */
-                       mb(); /* Must read state first. */
+                       smp_mb(); /* Must read state first. */
                        atomic_inc(&stopmachine_thread_ack);
                } else if (stopmachine_state == STOPMACHINE_PREPARE
                           && !prepared) {
                        /* Everyone is in place, hold CPU. */
                        preempt_disable();
                        prepared = 1;
-                       mb(); /* Must read state first. */
+                       smp_mb(); /* Must read state first. */
                        atomic_inc(&stopmachine_thread_ack);
                }
                /* Yield in first stage: migration threads need to
@@ -62,7 +62,7 @@ static int stopmachine(void *cpu)
        }
 
        /* Ack: we are exiting. */
-       mb(); /* Must read state first. */
+       smp_mb(); /* Must read state first. */
        atomic_inc(&stopmachine_thread_ack);
 
        if (irqs_disabled)
@@ -77,7 +77,7 @@ static int stopmachine(void *cpu)
 static void stopmachine_set_state(enum stopmachine_state state)
 {
        atomic_set(&stopmachine_thread_ack, 0);
-       wmb();
+       smp_wmb();
        stopmachine_state = state;
        while (atomic_read(&stopmachine_thread_ack) != stopmachine_num_threads)
                cpu_relax();
index 462d78d..df2ddcc 100644 (file)
@@ -525,7 +525,7 @@ asmlinkage long sys_setregid(gid_t rgid, gid_t egid)
        if (new_egid != old_egid)
        {
                current->mm->dumpable = 0;
-               wmb();
+               smp_wmb();
        }
        if (rgid != (gid_t) -1 ||
            (egid != (gid_t) -1 && egid != old_rgid))
@@ -556,7 +556,7 @@ asmlinkage long sys_setgid(gid_t gid)
                if(old_egid != gid)
                {
                        current->mm->dumpable=0;
-                       wmb();
+                       smp_wmb();
                }
                current->gid = current->egid = current->sgid = current->fsgid = gid;
        }
@@ -565,7 +565,7 @@ asmlinkage long sys_setgid(gid_t gid)
                if(old_egid != gid)
                {
                        current->mm->dumpable=0;
-                       wmb();
+                       smp_wmb();
                }
                current->egid = current->fsgid = gid;
        }
@@ -596,7 +596,7 @@ static int set_user(uid_t new_ruid, int dumpclear)
        if(dumpclear)
        {
                current->mm->dumpable = 0;
-               wmb();
+               smp_wmb();
        }
        current->uid = new_ruid;
        return 0;
@@ -653,7 +653,7 @@ asmlinkage long sys_setreuid(uid_t ruid, uid_t euid)
        if (new_euid != old_euid)
        {
                current->mm->dumpable=0;
-               wmb();
+               smp_wmb();
        }
        current->fsuid = current->euid = new_euid;
        if (ruid != (uid_t) -1 ||
@@ -703,7 +703,7 @@ asmlinkage long sys_setuid(uid_t uid)
        if (old_euid != uid)
        {
                current->mm->dumpable = 0;
-               wmb();
+               smp_wmb();
        }
        current->fsuid = current->euid = uid;
        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)
                {
                        current->mm->dumpable = 0;
-                       wmb();
+                       smp_wmb();
                }
                current->euid = euid;
        }
@@ -798,7 +798,7 @@ asmlinkage long sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid)
                if (egid != current->egid)
                {
                        current->mm->dumpable = 0;
-                       wmb();
+                       smp_wmb();
                }
                current->egid = egid;
        }
@@ -845,7 +845,7 @@ asmlinkage long sys_setfsuid(uid_t uid)
                if (uid != old_fsuid)
                {
                        current->mm->dumpable = 0;
-                       wmb();
+                       smp_wmb();
                }
                current->fsuid = uid;
        }
@@ -875,7 +875,7 @@ asmlinkage long sys_setfsgid(gid_t gid)
                if (gid != old_fsgid)
                {
                        current->mm->dumpable = 0;
-                       wmb();
+                       smp_wmb();
                }
                current->fsgid = gid;
                key_fsgid_changed(current);
index ecb3d67..207aa4f 100644 (file)
@@ -1007,7 +1007,7 @@ asmlinkage long sys_getppid(void)
                 * Make sure we read the pid before re-reading the
                 * parent pointer:
                 */
-               rmb();
+               smp_rmb();
                parent = me->group_leader->real_parent;
                if (old != parent)
                        continue;
index 21f0db2..40ffde9 100644 (file)
@@ -76,7 +76,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite)
                list_del(&waiter->list);
                tsk = waiter->task;
                /* Don't touch waiter after ->task has been NULLed */
-               mb();
+               smp_mb();
                waiter->task = NULL;
                wake_up_process(tsk);
                put_task_struct(tsk);
@@ -91,7 +91,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite)
 
                list_del(&waiter->list);
                tsk = waiter->task;
-               mb();
+               smp_mb();
                waiter->task = NULL;
                wake_up_process(tsk);
                put_task_struct(tsk);
@@ -123,7 +123,7 @@ __rwsem_wake_one_writer(struct rw_semaphore *sem)
        list_del(&waiter->list);
 
        tsk = waiter->task;
-       mb();
+       smp_mb();
        waiter->task = NULL;
        wake_up_process(tsk);
        put_task_struct(tsk);
index 7644089..62fa4eb 100644 (file)
@@ -74,7 +74,7 @@ __rwsem_do_wake(struct rw_semaphore *sem, int downgrading)
         */
        list_del(&waiter->list);
        tsk = waiter->task;
-       mb();
+       smp_mb();
        waiter->task = NULL;
        wake_up_process(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);
                next = waiter->list.next;
                tsk = waiter->task;
-               mb();
+               smp_mb();
                waiter->task = NULL;
                wake_up_process(tsk);
                put_task_struct(tsk);
index e9a0a63..c9f3d46 100644 (file)
@@ -229,7 +229,7 @@ repeat_alloc:
        /* Now start performing page reclaim */
        gfp_temp = gfp_mask;
        prepare_to_wait(&pool->wait, &wait, TASK_UNINTERRUPTIBLE);
-       mb();
+       smp_mb();
        if (!pool->curr_nr)
                io_schedule();
        finish_wait(&pool->wait, &wait);
@@ -250,7 +250,7 @@ void mempool_free(void *element, mempool_t *pool)
 {
        unsigned long flags;
 
-       mb();
+       smp_mb();
        if (pool->curr_nr < pool->min_nr) {
                spin_lock_irqsave(&pool->lock, flags);
                if (pool->curr_nr < pool->min_nr) {