From 0a17d1a1f31a0d92627437099149b5a14e51a010 Mon Sep 17 00:00:00 2001 From: Matthew Dillon Date: Tue, 5 Jan 2010 19:28:12 -0800 Subject: [PATCH] kernel - poll - Fix MP races * Some of the poll code had been taken out from under the MP lock too early, creating races. Put it back under the MP lock until the whole mess can be rewritten using kqueue. Reported-by: Rumko --- sys/kern/sys_generic.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 7b2ce4a6d1..88ebdf43fc 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -1077,13 +1077,13 @@ sys_poll(struct poll_args *uap) bits = smallbits; error = copyin(uap->fds, bits, ni); if (error) - goto done; + goto done2; if (uap->timeout != INFTIM) { atv.tv_sec = uap->timeout / 1000; atv.tv_usec = (uap->timeout % 1000) * 1000; if (itimerfix(&atv)) { error = EINVAL; - goto done; + goto done2; } getmicrouptime(&rtv); timevaladd(&atv, &rtv); @@ -1092,18 +1092,17 @@ sys_poll(struct poll_args *uap) atv.tv_usec = 0; } timo = 0; + get_mplock(); retry: ncoll = nselcoll; lp->lwp_flag |= LWP_SELECT; - get_mplock(); error = pollscan(p, bits, nfds, &uap->sysmsg_result); - rel_mplock(); if (error || uap->sysmsg_result) - goto done; + goto done1; if (atv.tv_sec || atv.tv_usec) { getmicrouptime(&rtv); if (timevalcmp(&rtv, &atv, >=)) - goto done; + goto done1; ttv = atv; timevalsub(&ttv, &rtv); timo = ttv.tv_sec > 24 * 60 * 60 ? @@ -1121,7 +1120,9 @@ retry: if (error == 0) goto retry; -done: +done1: + rel_mplock(); +done2: lp->lwp_flag &= ~LWP_SELECT; /* poll is not restarted after signals... */ if (error == ERESTART) -- 2.41.0