From mboxrd@z Thu Jan 1 00:00:00 1970 From: francis.giraldeau@gmail.com (Francis Giraldeau) Date: Tue, 26 Jun 2012 16:52:01 +0200 Subject: [lttng-dev] [PATCH] Expose kernel tracer to user-space In-Reply-To: <20120626064016.GD11952@Krystal> References: <1338938654-16515-1-git-send-email-francis.giraldeau@gmail.com> <20120626064016.GD11952@Krystal> Message-ID: <4FE9CC91.5030301@gmail.com> Le 2012-06-26 08:40, Mathieu Desnoyers a ?crit : >> +/* >> + * lttng_uevent_set_handler - set handler functions for uevent >> + * >> + * Access to handler code is protected with rwlock in order to >> + * prevent the optional module to be removed while in use. >> + */ >> + >> +void lttng_uevent_set_handler(write_ops_t handler) >> +{ >> + write_lock(&uevent_rwlock); > > write lock not necessary. > > if (!lttng_uevent_set_handler) > release refcount in prior handler's module. > > then: > take a refcount on the module that contains the handler address. > (explicit) The function now looks like this: void lttng_uevent_set_handler(struct file_operations *fops) { if (lttng_uevent_handler) { module_put(lttng_uevent_handler->owner); } if (fops && try_module_get(fops->owner)) { lttng_uevent_handler = fops; return; } lttng_uevent_handler = NULL; return; } The problem with this approach is that lttng_uevent can't be unloaded anymore: rmmod lttng_uevent ERROR: Module lttng_uevent is in use The module lttng_uevent can't be unloaded without unloading the module lttng_tracer. The function module_exit of lttng_uevent is never called, such that there is a chicken-and-egg situation. This problem was solved by using rwlock to access the handler pointer. In the rare event when unload module would occur while a trace event is recorded, the write lock was preventing to change the handler pointer while it's in use. But maybe there is another way to do it? Thanks! Francis Giraldeau -------------- next part -------------- A non-text attachment was scrubbed... Name: smime.p7s Type: application/pkcs7-signature Size: 4476 bytes Desc: Signature cryptographique S/MIME URL: