#endif
 
 void __set_breakpoint(int nr, struct arch_hw_breakpoint *brk);
+void suspend_breakpoints(void);
+void restore_breakpoints(void);
 bool ppc_breakpoint_available(void);
 #ifdef CONFIG_PPC_ADV_DEBUG_REGS
 extern void do_send_trap(struct pt_regs *regs, unsigned long address,
 
        return 0;
 }
 
-void __set_breakpoint(int nr, struct arch_hw_breakpoint *brk)
+static void set_hw_breakpoint(int nr, struct arch_hw_breakpoint *brk)
 {
-       memcpy(this_cpu_ptr(¤t_brk[nr]), brk, sizeof(*brk));
-
        if (dawr_enabled())
                // Power8 or later
                set_dawr(nr, brk);
                WARN_ON_ONCE(1);
 }
 
+void __set_breakpoint(int nr, struct arch_hw_breakpoint *brk)
+{
+       memcpy(this_cpu_ptr(¤t_brk[nr]), brk, sizeof(*brk));
+       set_hw_breakpoint(nr, brk);
+}
+
 /* Check if we have DAWR or DABR hardware */
 bool ppc_breakpoint_available(void)
 {
 }
 EXPORT_SYMBOL_GPL(ppc_breakpoint_available);
 
+/* Disable the breakpoint in hardware without touching current_brk[] */
+void suspend_breakpoints(void)
+{
+       struct arch_hw_breakpoint brk = {0};
+       int i;
+
+       if (!ppc_breakpoint_available())
+               return;
+
+       for (i = 0; i < nr_wp_slots(); i++)
+               set_hw_breakpoint(i, &brk);
+}
+
+/*
+ * Re-enable breakpoints suspended by suspend_breakpoints() in hardware
+ * from current_brk[]
+ */
+void restore_breakpoints(void)
+{
+       int i;
+
+       if (!ppc_breakpoint_available())
+               return;
+
+       for (i = 0; i < nr_wp_slots(); i++)
+               set_hw_breakpoint(i, this_cpu_ptr(¤t_brk[i]));
+}
+
 #ifdef CONFIG_PPC_TRANSACTIONAL_MEM
 
 static inline bool tm_enabled(struct task_struct *tsk)