#ifdef CONFIG_MODULES
  bool trace_module_has_bad_taint(struct module *mod)
  {
 -      return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP));
 +      return mod->taints & ~((1 << TAINT_OOT_MODULE) | (1 << TAINT_CRAP) |
 +                             (1 << TAINT_UNSIGNED_MODULE));
  }
  
+ static BLOCKING_NOTIFIER_HEAD(tracepoint_notify_list);
+ 
+ /**
+  * register_tracepoint_notifier - register tracepoint coming/going notifier
+  * @nb: notifier block
+  *
+  * Notifiers registered with this function are called on module
+  * coming/going with the tracepoint_module_list_mutex held.
+  * The notifier block callback should expect a "struct tp_module" data
+  * pointer.
+  */
+ int register_tracepoint_module_notifier(struct notifier_block *nb)
+ {
+       struct tp_module *tp_mod;
+       int ret;
+ 
+       mutex_lock(&tracepoint_module_list_mutex);
+       ret = blocking_notifier_chain_register(&tracepoint_notify_list, nb);
+       if (ret)
+               goto end;
+       list_for_each_entry(tp_mod, &tracepoint_module_list, list)
+               (void) nb->notifier_call(nb, MODULE_STATE_COMING, tp_mod);
+ end:
+       mutex_unlock(&tracepoint_module_list_mutex);
+       return ret;
+ }
+ EXPORT_SYMBOL_GPL(register_tracepoint_module_notifier);
+ 
+ /**
+  * unregister_tracepoint_notifier - unregister tracepoint coming/going notifier
+  * @nb: notifier block
+  *
+  * The notifier block callback should expect a "struct tp_module" data
+  * pointer.
+  */
+ int unregister_tracepoint_module_notifier(struct notifier_block *nb)
+ {
+       struct tp_module *tp_mod;
+       int ret;
+ 
+       mutex_lock(&tracepoint_module_list_mutex);
+       ret = blocking_notifier_chain_unregister(&tracepoint_notify_list, nb);
+       if (ret)
+               goto end;
+       list_for_each_entry(tp_mod, &tracepoint_module_list, list)
+               (void) nb->notifier_call(nb, MODULE_STATE_GOING, tp_mod);
+ end:
+       mutex_unlock(&tracepoint_module_list_mutex);
+       return ret;
+ 
+ }
+ EXPORT_SYMBOL_GPL(unregister_tracepoint_module_notifier);
+ 
+ /*
+  * Ensure the tracer unregistered the module's probes before the module
+  * teardown is performed. Prevents leaks of probe and data pointers.
+  */
+ static void tp_module_going_check_quiescent(struct tracepoint * const *begin,
+               struct tracepoint * const *end)
+ {
+       struct tracepoint * const *iter;
+ 
+       if (!begin)
+               return;
+       for (iter = begin; iter < end; iter++)
+               WARN_ON_ONCE((*iter)->funcs);
+ }
+ 
  static int tracepoint_module_coming(struct module *mod)
  {
        struct tp_module *tp_mod;