|
@@ -909,16 +909,18 @@ void __symbol_put(const char *symbol)
|
|
}
|
|
}
|
|
EXPORT_SYMBOL(__symbol_put);
|
|
EXPORT_SYMBOL(__symbol_put);
|
|
|
|
|
|
|
|
+/* Note this assumes addr is a function, which it currently always is. */
|
|
void symbol_put_addr(void *addr)
|
|
void symbol_put_addr(void *addr)
|
|
{
|
|
{
|
|
struct module *modaddr;
|
|
struct module *modaddr;
|
|
|
|
+ unsigned long a = (unsigned long)dereference_function_descriptor(addr);
|
|
|
|
|
|
- if (core_kernel_text((unsigned long)addr))
|
|
|
|
|
|
+ if (core_kernel_text(a))
|
|
return;
|
|
return;
|
|
|
|
|
|
/* module_text_address is safe here: we're supposed to have reference
|
|
/* module_text_address is safe here: we're supposed to have reference
|
|
* to module from symbol_get, so it can't go away. */
|
|
* to module from symbol_get, so it can't go away. */
|
|
- modaddr = __module_text_address((unsigned long)addr);
|
|
|
|
|
|
+ modaddr = __module_text_address(a);
|
|
BUG_ON(!modaddr);
|
|
BUG_ON(!modaddr);
|
|
module_put(modaddr);
|
|
module_put(modaddr);
|
|
}
|
|
}
|