[PATCH] ARM: probes: Don't stop the machine if we're in the debugger

2015-08-24 Thread Douglas Anderson
If we're in kgdb then the machine is already stopped.  Trying to stop
it again will cause us to try to sleep, which is not allowed while in
kgdb.  To avoid this problem, only stop the machine when we're not in
kgdb.

Reported-by: Aapo Vienamo 
Suggested-by: Kees Cook 
Signed-off-by: Douglas Anderson 
---
 arch/arm/kernel/patch.c | 7 ++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
index 69bda1a..abf30ec 100644
--- a/arch/arm/kernel/patch.c
+++ b/arch/arm/kernel/patch.c
@@ -1,5 +1,6 @@
 #include 
 #include 
+#include 
 #include 
 #include 
 #include 
@@ -124,6 +125,9 @@ void __kprobes patch_text(void *addr, unsigned int insn)
.insn = insn,
};
 
-   stop_machine(patch_text_stop_machine, &patch, NULL);
+   /* Stop machine before patching; but not if in the debugger */
+   if (unlikely(in_dbg_master()))
+   patch_text_stop_machine(&patch);
+   else
+   stop_machine(patch_text_stop_machine, &patch, NULL);
 }
-- 
2.5.0.457.gab17608

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ARM: probes: Don't stop the machine if we're in the debugger

2015-08-24 Thread Stephen Boyd

On 08/24/2015 04:58 PM, Douglas Anderson wrote:

If we're in kgdb then the machine is already stopped.  Trying to stop
it again will cause us to try to sleep, which is not allowed while in
kgdb.  To avoid this problem, only stop the machine when we're not in
kgdb.

Reported-by: Aapo Vienamo 
Suggested-by: Kees Cook 
Signed-off-by: Douglas Anderson 
---


Can you add the backtrace?


  arch/arm/kernel/patch.c | 7 ++-
  1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
index 69bda1a..abf30ec 100644
--- a/arch/arm/kernel/patch.c
+++ b/arch/arm/kernel/patch.c
@@ -1,5 +1,6 @@
  #include 
  #include 
+#include 
  #include 
  #include 
  #include 
@@ -124,6 +125,9 @@ void __kprobes patch_text(void *addr, unsigned int insn)
.insn = insn,
};
  
-	stop_machine(patch_text_stop_machine, &patch, NULL);

+   /* Stop machine before patching; but not if in the debugger */
+   if (unlikely(in_dbg_master()))
+   patch_text_stop_machine(&patch);
+   else
+   stop_machine(patch_text_stop_machine, &patch, NULL);
  }


Perhaps it would be better to add a different function for the kgdb call 
site? Then it's explicit what's going on without us having to figure out 
when in_dbg_master() is true.


--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
a Linux Foundation Collaborative Project

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ARM: probes: Don't stop the machine if we're in the debugger

2015-08-25 Thread Kees Cook
On Mon, Aug 24, 2015 at 5:19 PM, Stephen Boyd  wrote:
> On 08/24/2015 04:58 PM, Douglas Anderson wrote:
>>
>> If we're in kgdb then the machine is already stopped.  Trying to stop
>> it again will cause us to try to sleep, which is not allowed while in
>> kgdb.  To avoid this problem, only stop the machine when we're not in
>> kgdb.
>>
>> Reported-by: Aapo Vienamo 
>> Suggested-by: Kees Cook 

I actually suggested using in_atomic_preempt_off() which is I think a
better catch-all. Could you use that instead, please?

-Kees

>> Signed-off-by: Douglas Anderson 
>> ---
>
>
> Can you add the backtrace?
>
>>   arch/arm/kernel/patch.c | 7 ++-
>>   1 file changed, 6 insertions(+), 1 deletion(-)
>>
>> diff --git a/arch/arm/kernel/patch.c b/arch/arm/kernel/patch.c
>> index 69bda1a..abf30ec 100644
>> --- a/arch/arm/kernel/patch.c
>> +++ b/arch/arm/kernel/patch.c
>> @@ -1,5 +1,6 @@
>>   #include 
>>   #include 
>> +#include 
>>   #include 
>>   #include 
>>   #include 
>> @@ -124,6 +125,9 @@ void __kprobes patch_text(void *addr, unsigned int
>> insn)
>> .insn = insn,
>> };
>>   - stop_machine(patch_text_stop_machine, &patch, NULL);
>> +   /* Stop machine before patching; but not if in the debugger */
>> +   if (unlikely(in_dbg_master()))
>> +   patch_text_stop_machine(&patch);
>> +   else
>> +   stop_machine(patch_text_stop_machine, &patch, NULL);
>>   }
>
>
> Perhaps it would be better to add a different function for the kgdb call
> site? Then it's explicit what's going on without us having to figure out
> when in_dbg_master() is true.
>
> --
> Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
> a Linux Foundation Collaborative Project
>



-- 
Kees Cook
Chrome OS Security
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ARM: probes: Don't stop the machine if we're in the debugger

2015-08-25 Thread Doug Anderson
Kees,

On Tue, Aug 25, 2015 at 9:50 AM, Kees Cook  wrote:
> On Mon, Aug 24, 2015 at 5:19 PM, Stephen Boyd  wrote:
>> On 08/24/2015 04:58 PM, Douglas Anderson wrote:
>>>
>>> If we're in kgdb then the machine is already stopped.  Trying to stop
>>> it again will cause us to try to sleep, which is not allowed while in
>>> kgdb.  To avoid this problem, only stop the machine when we're not in
>>> kgdb.
>>>
>>> Reported-by: Aapo Vienamo 
>>> Suggested-by: Kees Cook 
>
> I actually suggested using in_atomic_preempt_off() which is I think a
> better catch-all. Could you use that instead, please?

I chose not to use that because (I think) in_atomic_preempt_off()
doesn't guarantee that stop_machine() is not needed.  Said another
way: if in_atomic_preempt_off() returns true then we can't sleep on
the current CPU.  ...but other CPUs may be running.  In this case
technically we need to call stop_machine(), but we'd need to do it in
a way that didn't require sleeping.

In the case of kgdb we know that the machine is stopped and we're
atomic too.  ...so we could certainly fix kgdb by checking for
"atomic", but that would mean there would be other places where we'd
get no warning and (I think) invalid behavior.

Stephen Boyd suggested that I just change this so that we expose a new
function and that makes everything a bit cleaner.  I'll try that.

-Doug
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH] ARM: probes: Don't stop the machine if we're in the debugger

2015-08-25 Thread Doug Anderson
Hi,

On Mon, Aug 24, 2015 at 5:19 PM, Stephen Boyd  wrote:
> Can you add the backtrace?

Good point.  Done.

> Perhaps it would be better to add a different function for the kgdb call
> site? Then it's explicit what's going on without us having to figure out
> when in_dbg_master() is true.

Actually, there was already a function to patch the text directly
without stopping the machine.  :)

Adding a bit of extra noise here to point to my new patch since it has
a very different title than this one (so might be hard to find).  See
.

-Doug
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/