|
Dear Eric, I checked rh srpm https://content-web.rhn.redhat.com/rhn/public/NULL/kernel/2.6.32-279.19.1.el6/SRPMS/kernel-2.6.32-279.19.1.el6.src.rpm?__gda__=1366390847_8550b8568c50ea46b3180266b476353d&ext=.rpm__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 符永涛 <yongtaofu@xxxxxxxxx>
-- 符永涛 |
| Previous by Date: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, 符永涛 |
|---|---|
| Next by Date: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, Eric Sandeen |
| Previous by Thread: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, 符永涛 |
| Next by Thread: | Re: xfs_iunlink_remove: xfs_inotobp() returned error 22 -- debugging, Eric Sandeen |
| Indexes: | [Date] [Thread] [Top] [All Lists] |