tech-kern archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: In-kernel process exit hooks?



On Fri, 8 Jan 2016, Paul Goyette wrote:

The saga continues!   :)

<snip>

Next, I'm going to have a look at fd_getfile2()/fclose() and see if that
is a viable approach.

Hmmm. The comments in kern/kern_descrip.c for fd_getfile2() require that the process is not allowed to fork or exit "across this call" (which I assume means "until the reference to the struct file is released").

I'm not sure how to prevent this. I could probably re-use the exithook mechanism from the previous approach to handle the exit case, but how to prevent fork() is another beast entirely (I think). And to make things worse, the example code in the filemon(4) man page explicitly calls fork().

I'm quickly running out of ideas here... I'm strongly leaning towards leaving the code alone, and more clearly documenting the conditions under which the hang occurs (ie, closure of the activity-log fd prior to disassociated the activity-log from the /dev/filemon fd, whether the close is done explicitly or as part of the sequential close that occurs at process exit).

Someone (Martin@, I think) earlier suggested modifying things to use cv_timedwait() in fd_close(), and modifying fd_free() to retry. This might help in the process exit scenario, but doesn't address the case where the application process explicitly closes the file with the extra reference.

It might also be possible to modify fd_close() to have a filemon-specific close routine, similar to what is currently being done for knote_fdclose(). But this seems rather heavy-handed for something that has such a limited use-case as filemon(4).

The only other approach I can think of is to modify filemon(4) so it does not directly write any data to the activity log. Rather than having the application provide a log fd (on which the extra reference needs to be taken), the application would read(2) from the filemon fd and handle the "logging" itself. This would mean two additional trips across the kernel/userland boundary for every event, which feels like a rather costly approach. It would also mean modifying make(1) (the only "production" use-case for filemon(4)).


Any other suggestions would be appreciated.


+------------------+--------------------------+------------------------+
| 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