#endif
 
 #ifndef __WARN
-#define __WARN() do {                                                  \
-       printk("WARNING: at %s:%d %s()\n", __FILE__,                    \
-               __LINE__, __FUNCTION__);                                \
-       dump_stack();                                                   \
-} while (0)
+#ifndef __ASSEMBLY__
+extern void warn_on_slowpath(const char *file, const int line);
+#define WANT_WARN_ON_SLOWPATH
+#endif
+#define __WARN() warn_on_slowpath(__FILE__, __LINE__)
 #endif
 
 #ifndef WARN_ON
 
 #include <linux/kexec.h>
 #include <linux/debug_locks.h>
 #include <linux/random.h>
+#include <linux/kallsyms.h>
 
 int panic_on_oops;
 int tainted;
                (unsigned long long)oops_id);
 }
 
+#ifdef WANT_WARN_ON_SLOWPATH
+void warn_on_slowpath(const char *file, int line)
+{
+       char function[KSYM_SYMBOL_LEN];
+       unsigned long caller = (unsigned long) __builtin_return_address(0);
+
+       sprint_symbol(function, caller);
+       printk(KERN_WARNING "WARNING: at %s:%d %s()\n", file,
+               line, function);
+       dump_stack();
+}
+EXPORT_SYMBOL(warn_on_slowpath);
+#endif
+
 #ifdef CONFIG_CC_STACKPROTECTOR
 /*
  * Called when gcc's -fstack-protector feature is used, and