#include <linux/extable.h>
 #include <linux/kdebug.h>
 #include <linux/kallsyms.h>
+#include <linux/kgdb.h>
 #include <linux/ftrace.h>
 #include <linux/objtool.h>
 #include <linux/pgtable.h>
        return ret;
 }
 
-static bool is_padding_int3(unsigned long addr, unsigned long eaddr)
-{
-       unsigned char ops;
-
-       for (; addr < eaddr; addr++) {
-               if (get_kernel_nofault(ops, (void *)addr) < 0 ||
-                   ops != INT3_INSN_OPCODE)
-                       return false;
-       }
-
-       return true;
-}
-
 /* Decode whole function to ensure any instructions don't jump into target */
 static int can_optimize(unsigned long paddr)
 {
                ret = insn_decode_kernel(&insn, (void *)recovered_insn);
                if (ret < 0)
                        return 0;
-
+#ifdef CONFIG_KGDB
                /*
-                * In the case of detecting unknown breakpoint, this could be
-                * a padding INT3 between functions. Let's check that all the
-                * rest of the bytes are also INT3.
+                * If there is a dynamically installed kgdb sw breakpoint,
+                * this function should not be probed.
                 */
-               if (insn.opcode.bytes[0] == INT3_INSN_OPCODE)
-                       return is_padding_int3(addr, paddr - offset + size) ? 1 : 0;
-
+               if (insn.opcode.bytes[0] == INT3_INSN_OPCODE &&
+                   kgdb_has_hit_break(addr))
+                       return 0;
+#endif
                /* Recover address */
                insn.kaddr = (void *)addr;
                insn.next_byte = (void *)(addr + insn.length);