Revision d80e731ecab420ddcb79ee9d0ac427acbc187b4b authored by Oleg Nesterov on 24 February 2012, 19:07:11 UTC, committed by Linus Torvalds on 24 February 2012, 19:42:50 UTC
This patch is intentionally incomplete to simplify the review. It ignores ep_unregister_pollwait() which plays with the same wqh. See the next change. epoll assumes that the EPOLL_CTL_ADD'ed file controls everything f_op->poll() needs. In particular it assumes that the wait queue can't go away until eventpoll_release(). This is not true in case of signalfd, the task which does EPOLL_CTL_ADD uses its ->sighand which is not connected to the file. This patch adds the special event, POLLFREE, currently only for epoll. It expects that init_poll_funcptr()'ed hook should do the necessary cleanup. Perhaps it should be defined as EPOLLFREE in eventpoll. __cleanup_sighand() is changed to do wake_up_poll(POLLFREE) if ->signalfd_wqh is not empty, we add the new signalfd_cleanup() helper. ep_poll_callback(POLLFREE) simply does list_del_init(task_list). This make this poll entry inconsistent, but we don't care. If you share epoll fd which contains our sigfd with another process you should blame yourself. signalfd is "really special". I simply do not know how we can define the "right" semantics if it used with epoll. The main problem is, epoll calls signalfd_poll() once to establish the connection with the wait queue, after that signalfd_poll(NULL) returns the different/inconsistent results depending on who does EPOLL_CTL_MOD/signalfd_read/etc. IOW: apart from sigmask, signalfd has nothing to do with the file, it works with the current thread. In short: this patch is the hack which tries to fix the symptoms. It also assumes that nobody can take tasklist_lock under epoll locks, this seems to be true. Note: - we do not have wake_up_all_poll() but wake_up_poll() is fine, poll/epoll doesn't use WQ_FLAG_EXCLUSIVE. - signalfd_cleanup() uses POLLHUP along with POLLFREE, we need a couple of simple changes in eventpoll.c to make sure it can't be "lost". Reported-by: Maxime Bizon <mbizon@freebox.fr> Cc: <stable@kernel.org> Signed-off-by: Oleg Nesterov <oleg@redhat.com> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 855a85f
File | Mode | Size |
---|---|---|
3com | ||
acenic | ||
adaptec | ||
advansys | ||
av7110 | ||
bnx2 | ||
bnx2x | ||
cis | ||
cpia2 | ||
cxgb3 | ||
dabusb | ||
dsp56k | ||
e100 | ||
edgeport | ||
emi26 | ||
emi62 | ||
ess | ||
kaweth | ||
keyspan | ||
keyspan_pda | ||
korg | ||
matrox | ||
myricom | ||
ositech | ||
qlogic | ||
r128 | ||
radeon | ||
sb16 | ||
sun | ||
tehuti | ||
tigon | ||
ttusb-budget | ||
vicam | ||
yam | ||
yamaha | ||
.gitignore | -rw-r--r-- | 39 bytes |
Makefile | -rw-r--r-- | 11.7 KB |
README.AddingFirmware | -rw-r--r-- | 1.5 KB |
WHENCE | -rw-r--r-- | 27.7 KB |
atmsar11.HEX | -rw-r--r-- | 18.7 KB |
ihex2fw.c | -rw-r--r-- | 6.6 KB |
intelliport2.bin.ihex | -rw-r--r-- | 92.2 KB |
mts_cdma.fw.ihex | -rw-r--r-- | 37.2 KB |
mts_edge.fw.ihex | -rw-r--r-- | 37.8 KB |
mts_gsm.fw.ihex | -rw-r--r-- | 37.2 KB |
ti_3410.fw.ihex | -rw-r--r-- | 37.0 KB |
ti_5052.fw.ihex | -rw-r--r-- | 37.0 KB |
tr_smctr.bin.ihex | -rw-r--r-- | 20.5 KB |
whiteheat.HEX | -rw-r--r-- | 43.9 KB |
whiteheat_loader.HEX | -rw-r--r-- | 11.8 KB |
whiteheat_loader_debug.HEX | -rw-r--r-- | 17.2 KB |
![swh spinner](/static/img/swh-spinner.gif)
Computing file changes ...