Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 348096
b: refs/heads/master
c: 128dd17
h: refs/heads/master
v: v3
  • Loading branch information
Eric Wong authored and Linus Torvalds committed Jan 2, 2013
1 parent d4ab858 commit c5a3d93
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 2 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 4a490b78cb7e0e5efa44425df72a9fedc1c36366
refs/heads/master: 128dd1759d96ad36c379240f8b9463e8acfd37a1
22 changes: 21 additions & 1 deletion trunk/fs/eventpoll.c
Original file line number Diff line number Diff line change
Expand Up @@ -1313,7 +1313,7 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even
* otherwise we might miss an event that happens between the
* f_op->poll() call and the new event set registering.
*/
epi->event.events = event->events;
epi->event.events = event->events; /* need barrier below */
pt._key = event->events;
epi->event.data = event->data; /* protected by mtx */
if (epi->event.events & EPOLLWAKEUP) {
Expand All @@ -1323,6 +1323,26 @@ static int ep_modify(struct eventpoll *ep, struct epitem *epi, struct epoll_even
ep_destroy_wakeup_source(epi);
}

/*
* The following barrier has two effects:
*
* 1) Flush epi changes above to other CPUs. This ensures
* we do not miss events from ep_poll_callback if an
* event occurs immediately after we call f_op->poll().
* We need this because we did not take ep->lock while
* changing epi above (but ep_poll_callback does take
* ep->lock).
*
* 2) We also need to ensure we do not miss _past_ events
* when calling f_op->poll(). This barrier also
* pairs with the barrier in wq_has_sleeper (see
* comments for wq_has_sleeper).
*
* This barrier will now guarantee ep_poll_callback or f_op->poll
* (or both) will notice the readiness of an item.
*/
smp_mb();

/*
* Get current event bits. We can safely use the file* here because
* its usage count has been increased by the caller of this function.
Expand Down

0 comments on commit c5a3d93

Please sign in to comment.