Hey Serge, I don't think your symbol_get() is doing what you think it is ;-) > + * Add the stacked module (as specified by name and ops). > + * If the module is not compiled in, the symbol_get at the end will > + * prevent the the module from being unloaded. > +*/ > +static int stacker_register (const char *name, struct security_operations *ops) > +{ ... > + symbol_get(ops); > + > +out: > + spin_unlock(&stacker_lock); > + return ret; > +} Seemed useful to be able to view which modules had been unloaded. Easier to maintain them on their own list than to compute the difference of and . Patch attached, not sure if you are cool with reusing the 'unload' file. > +static struct stacker_attribute stacker_attr_unload = { > + .attr = {.name = "unload", .mode = S_IFREG | S_IRUGO | S_IWUSR}, > + .store = stacker_unload_write, > +}; Apart from this, looks good. I ran it against our regression tests using AppArmor (SubDomain) composed with Capability and everything was functionally as expected. I still need to run it through our SMP stress tests. Thanks Tony