tech-kern archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: How to identify specific wait-state for a "DE" process?
On Wed, 6 Jan 2016, Paul Goyette wrote:
I need to figure out why this is a problem when filemon(4) "borrows" the fd
for stdout, but is not a problem when it borrows a real file.
OK, I figured out what's going on.
In the failure scenario, we have the following events:
1. Process opens /dev/filemon and gets fd #3
2. Process tells filemon to log activity to fd #1 (stdout)
3. Process calls sys_exit(), which starts process cleanup
4. Clean-up code tries to fd_close all open descriptors, in
order, so handles fd #0 and then fd #1
5. fd #1 has another reference, so we wait on the condvar,
which never gets broadcast since there's no other thread
to run. We hang here forever.
In the success scenario, we have a slightly different sequence:
1. Process opens /dev/filemon and gets fd #3
2. Process opens up a temp file (or simply calls dup(stdout))
and gets fd #4; the process tells filemon to log activity
to fd #4
3. Process calls sys_exit(), which starts process cleanup
4. Clean-up code tries to fd_close all open descriptors, in
order, so handles fd #0 and then fd #1
5. In this scenario, fd#1 has no extra references, so it can
close normally.
6. Cleanup proceeds with fd #2, and then gets to fd#3, where
/dev/filemon is open
7. We call filemon_close() which calls fd_putfile() on fd #4.
This removes the additional reference on fd #4
8. Cleanup moves on to fd #4 which now has only a single
reference, so it, too, can be successfully closed!
As long as the /dev/filemon file descriptor is numerically smaller than
the logging fd, it gets closed first, and everything works fine. But we
will hang if we try to close the logging file first because of the extra
reference.
Does anyone have any good suggestions for how to arrange for another
thread/lwp to run so it can remove the extra reference to the logging
descriptor?
+------------------+--------------------------+------------------------+
| Paul Goyette | PGP Key fingerprint: | E-mail addresses: |
| (Retired) | FA29 0E3B 35AF E8AE 6651 | paul at whooppee.com |
| Kernel Developer | 0786 F758 55DE 53BA 7731 | pgoyette at netbsd.org |
+------------------+--------------------------+------------------------+
Home |
Main Index |
Thread Index |
Old Index