|
Hi Eric, Here's the server info:[root@xxxxxxxxxxx ~]# rpm -qa|grep kernel kernel-debug-debuginfo-2.6.32-279.19.1.el6.x86_64 kernel-headers-2.6.32-279.19.1.el6.x86_64 abrt-addon-kerneloops-2.0.8-6.el6.x86_64 dracut-kernel-004-283.el6.noarch kernel-debuginfo-common-x86_64-2.6.32-279.19.1.el6.x86_64 kernel-debuginfo-2.6.32-279.19.1.el6.x86_64 kernel-debug-2.6.32-279.19.1.el6.x86_64 kernel-devel-2.6.32-279.19.1.el6.x86_64 libreport-plugin-kerneloops-2.0.9-5.el6.x86_64 kernel-firmware-2.6.32-279.19.1.el6.noarch kernel-2.6.32-279.19.1.el6.x86_64 kernel-debug-devel-2.6.32-279.19.1.el6.x86_64 [root@xxxxxxxxxxx ~]# uname -a Linux 10.23.72.95 2.6.32-279.19.1.el6.x86_64 #1 SMP Fri Apr 19 10:44:52 CST 2013 x86_64 x86_64 x86_64 GNU/Linux [root@xxxxxxxxxxx ~]# The kernel code looks like: __rwsem_do_wake(struct rw_semaphore *sem, int wakewrite) { struct rwsem_waiter *waiter; struct task_struct *tsk; int woken; waiter = list_entry(sem->wait_list.next, struct rwsem_waiter, list); if (!wakewrite) { if (waiter->flags & RWSEM_WAITING_FOR_WRITE) goto out; goto dont_wake_writers; } /* if we are allowed to wake writers try to grant a single write lock * if there's a writer at the front of the queue * - we leave the 'waiting count' incremented to signify potential * contention */ if (waiter->flags & RWSEM_WAITING_FOR_WRITE) { sem->activity = -1; list_del(&waiter->list); tsk = waiter->task; /* Don't touch waiter after ->task has been NULLed */ smp_mb(); waiter->task = NULL; wake_up_process(tsk); put_task_struct(tsk); goto out; } /* grant an infinite number of read locks to the front of the queue */ dont_wake_writers: woken = 0; while (waiter->flags & RWSEM_WAITING_FOR_READ) { struct list_head *next = waiter->list.next; list_del(&waiter->list); tsk = waiter->task; smp_mb(); waiter->task = NULL; wake_up_process(tsk); put_task_struct(tsk); woken++; if (list_empty(&sem->wait_list)) break; waiter = list_entry(next, struct rwsem_waiter, list); } sem->activity += woken; out: return sem; } 2013/4/20 Eric Sandeen <sandeen@xxxxxxxxxxx>
-- 符永涛 |
| Previous by Date: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, Eric Sandeen |
|---|---|
| Next by Date: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, 符永涛 |
| Previous by Thread: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, Eric Sandeen |
| Next by Thread: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, 符永涛 |
| Indexes: | [Date] [Thread] [Top] [All Lists] |