When anything in systemtap_module_init fails, and we return non-zero,
then the module load is aborted. The normal module unload path
(systemtap_module_exit) is not even attempted, so we need to make sure
that all partially-allocated resources are returned.
Our timer callbacks for the gettimeofday subsystem are a classic example
of this error. If we don't unregister the timers before aborting init,
they will later be called and cause a kernel fault.
We also were neglecting to free the percpu context. A memory leak is
less harmful, but that's fixed now too.
o->newline() << "synchronize_sched();";
o->newline() << "#endif";
+ // In case gettimeofday was started, it needs to be stopped
+ o->newline() << "#ifdef STAP_NEED_GETTIMEOFDAY";
+ o->newline() << " _stp_kill_time();"; // An error is no cause to hurry...
+ o->newline() << "#endif";
+
+ // Free up the context memory after an error too
+ o->newline() << "free_percpu (contexts);";
+
o->newline() << "return rc;";
o->newline(-1) << "}\n";
}