linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] coresight: Do not call smp_processor_id() from preemptible
@ 2019-05-03 16:04 Suzuki K Poulose
  2019-05-03 16:04 ` [PATCH 2/2] coresight: alloc_perf_buf: Do not call smp_processor_id " Suzuki K Poulose
  2019-05-08 16:39 ` [PATCH 1/2] coresight: Do not call smp_processor_id() " Mathieu Poirier
  0 siblings, 2 replies; 4+ messages in thread
From: Suzuki K Poulose @ 2019-05-03 16:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, coresight, mathieu.poirier, Suzuki K Poulose

Instead of using smp_processor_id() to figure out the node,
use the numa_node_id() for the current CPU node to avoid
splats like :

 BUG: using smp_processor_id() in preemptible [00000000] code: perf/1743
 caller is alloc_etr_buf.isra.6+0x80/0xa0
 CPU: 1 PID: 1743 Comm: perf Not tainted 5.1.0-rc6-147786-g116841e #344
 Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno Development Platform, BIOS EDK II Feb  1 2019
  Call trace:
   dump_backtrace+0x0/0x150
   show_stack+0x14/0x20
   dump_stack+0x9c/0xc4
   debug_smp_processor_id+0x10c/0x110
   alloc_etr_buf.isra.6+0x80/0xa0
   tmc_alloc_etr_buffer+0x12c/0x1f0
   etm_setup_aux+0x1c4/0x230
   rb_alloc_aux+0x1b8/0x2b8
   perf_mmap+0x35c/0x478
   mmap_region+0x34c/0x4f0
   do_mmap+0x2d8/0x418
   vm_mmap_pgoff+0xd0/0xf8
   ksys_mmap_pgoff+0x88/0xf8
   __arm64_sys_mmap+0x28/0x38
   el0_svc_handler+0xd8/0x138
   el0_svc+0x8/0xc

Fixes: 855ab61c16bf70b646 ("coresight: tmc-etr: Refactor function tmc_etr_setup_perf_buf()")
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
---
 drivers/hwtracing/coresight/coresight-tmc-etr.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 793639f..74578bd 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1323,13 +1323,11 @@ static struct etr_perf_buffer *
 tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
 		       int nr_pages, void **pages, bool snapshot)
 {
-	int node, cpu = event->cpu;
+	int node;
 	struct etr_buf *etr_buf;
 	struct etr_perf_buffer *etr_perf;
 
-	if (cpu == -1)
-		cpu = smp_processor_id();
-	node = cpu_to_node(cpu);
+	node = (event->cpu == -1)? numa_node_id() : cpu_to_node(event->cpu);
 
 	etr_perf = kzalloc_node(sizeof(*etr_perf), GFP_KERNEL, node);
 	if (!etr_perf)
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* [PATCH 2/2] coresight: alloc_perf_buf: Do not call smp_processor_id from preemptible
  2019-05-03 16:04 [PATCH 1/2] coresight: Do not call smp_processor_id() from preemptible Suzuki K Poulose
@ 2019-05-03 16:04 ` Suzuki K Poulose
  2019-05-08 16:39 ` [PATCH 1/2] coresight: Do not call smp_processor_id() " Mathieu Poirier
  1 sibling, 0 replies; 4+ messages in thread
From: Suzuki K Poulose @ 2019-05-03 16:04 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: linux-kernel, coresight, mathieu.poirier, Suzuki K Poulose

We find the current CPU using smp_processor_id() if the event is not bound
to a CPU, to find the node for memory allocation. Use the safe numa_node_id()
instead to avoid BUG().

 BUG: using smp_processor_id() in preemptible [00000000] code: perf/1743
 caller is tmc_alloc_etr_buffer+0x1bc/0x1f0
 CPU: 1 PID: 1743 Comm: perf Not tainted 5.1.0-rc6-147786-g116841e #344
 Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno Development Platform, BIOS EDK II Feb  1 2019
 Call trace:
  dump_backtrace+0x0/0x150
  show_stack+0x14/0x20
  dump_stack+0x9c/0xc4
  debug_smp_processor_id+0x10c/0x110
  tmc_alloc_etr_buffer+0x1bc/0x1f0
  etm_setup_aux+0x1c4/0x230
  rb_alloc_aux+0x1b8/0x2b8
  perf_mmap+0x35c/0x478
  mmap_region+0x34c/0x4f0
  do_mmap+0x2d8/0x418
  vm_mmap_pgoff+0xd0/0xf8
  ksys_mmap_pgoff+0x88/0xf8
  __arm64_sys_mmap+0x28/0x38
  el0_svc_handler+0xd8/0x138
  el0_svc+0x8/0xc

Fixes: 22f429f19c4135d51e9 ("coresight: etm-perf: Add support for ETR backend")
Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
---
 drivers/hwtracing/coresight/coresight-tmc-etr.c | 7 ++-----
 1 file changed, 2 insertions(+), 5 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
index 74578bd..104df66 100644
--- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
+++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
@@ -1184,14 +1184,11 @@ static struct etr_buf *
 alloc_etr_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
 	      int nr_pages, void **pages, bool snapshot)
 {
-	int node, cpu = event->cpu;
+	int node;
 	struct etr_buf *etr_buf;
 	unsigned long size;
 
-	if (cpu == -1)
-		cpu = smp_processor_id();
-	node = cpu_to_node(cpu);
-
+	node = (event->cpu == -1) ? numa_node_id() : cpu_to_node(event->cpu);
 	/*
 	 * Try to match the perf ring buffer size if it is larger
 	 * than the size requested via sysfs.
-- 
2.7.4


^ permalink raw reply related	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] coresight: Do not call smp_processor_id() from preemptible
  2019-05-03 16:04 [PATCH 1/2] coresight: Do not call smp_processor_id() from preemptible Suzuki K Poulose
  2019-05-03 16:04 ` [PATCH 2/2] coresight: alloc_perf_buf: Do not call smp_processor_id " Suzuki K Poulose
@ 2019-05-08 16:39 ` Mathieu Poirier
  2019-05-08 16:43   ` Suzuki K Poulose
  1 sibling, 1 reply; 4+ messages in thread
From: Mathieu Poirier @ 2019-05-08 16:39 UTC (permalink / raw)
  To: Suzuki K Poulose
  Cc: linux-arm-kernel, Linux Kernel Mailing List, Coresight ML

Hi Suzuki,

On Fri, 3 May 2019 at 10:04, Suzuki K Poulose <suzuki.poulose@arm.com> wrote:
>
> Instead of using smp_processor_id() to figure out the node,
> use the numa_node_id() for the current CPU node to avoid
> splats like :
>
>  BUG: using smp_processor_id() in preemptible [00000000] code: perf/1743
>  caller is alloc_etr_buf.isra.6+0x80/0xa0
>  CPU: 1 PID: 1743 Comm: perf Not tainted 5.1.0-rc6-147786-g116841e #344
>  Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno Development Platform, BIOS EDK II Feb  1 2019
>   Call trace:
>    dump_backtrace+0x0/0x150
>    show_stack+0x14/0x20
>    dump_stack+0x9c/0xc4
>    debug_smp_processor_id+0x10c/0x110
>    alloc_etr_buf.isra.6+0x80/0xa0
>    tmc_alloc_etr_buffer+0x12c/0x1f0
>    etm_setup_aux+0x1c4/0x230
>    rb_alloc_aux+0x1b8/0x2b8
>    perf_mmap+0x35c/0x478
>    mmap_region+0x34c/0x4f0
>    do_mmap+0x2d8/0x418
>    vm_mmap_pgoff+0xd0/0xf8
>    ksys_mmap_pgoff+0x88/0xf8
>    __arm64_sys_mmap+0x28/0x38
>    el0_svc_handler+0xd8/0x138
>    el0_svc+0x8/0xc
>

That is very interesting...

> Fixes: 855ab61c16bf70b646 ("coresight: tmc-etr: Refactor function tmc_etr_setup_perf_buf()")
> Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
> ---
>  drivers/hwtracing/coresight/coresight-tmc-etr.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> index 793639f..74578bd 100644
> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
> @@ -1323,13 +1323,11 @@ static struct etr_perf_buffer *
>  tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
>                        int nr_pages, void **pages, bool snapshot)
>  {
> -       int node, cpu = event->cpu;
> +       int node;
>         struct etr_buf *etr_buf;
>         struct etr_perf_buffer *etr_perf;
>
> -       if (cpu == -1)
> -               cpu = smp_processor_id();
> -       node = cpu_to_node(cpu);
> +       node = (event->cpu == -1)? numa_node_id() : cpu_to_node(event->cpu);

Seems to me using numa_node_id() simply circumvent function
debug_smp_processor_id() and using get_cpu() and put_cpu() would be
more appropriate.  But I'll trust the NUMA people have thought about
this long before me.  Would you mind sending another revision that fix
the same code for ETB and ETF?

Thanks,
Mathieu

>
>         etr_perf = kzalloc_node(sizeof(*etr_perf), GFP_KERNEL, node);
>         if (!etr_perf)
> --
> 2.7.4
>

^ permalink raw reply	[flat|nested] 4+ messages in thread

* Re: [PATCH 1/2] coresight: Do not call smp_processor_id() from preemptible
  2019-05-08 16:39 ` [PATCH 1/2] coresight: Do not call smp_processor_id() " Mathieu Poirier
@ 2019-05-08 16:43   ` Suzuki K Poulose
  0 siblings, 0 replies; 4+ messages in thread
From: Suzuki K Poulose @ 2019-05-08 16:43 UTC (permalink / raw)
  To: mathieu.poirier; +Cc: linux-arm-kernel, linux-kernel, coresight



On 08/05/2019 17:39, Mathieu Poirier wrote:
> Hi Suzuki,
> 
> On Fri, 3 May 2019 at 10:04, Suzuki K Poulose <suzuki.poulose@arm.com> wrote:
>>
>> Instead of using smp_processor_id() to figure out the node,
>> use the numa_node_id() for the current CPU node to avoid
>> splats like :
>>
>>   BUG: using smp_processor_id() in preemptible [00000000] code: perf/1743
>>   caller is alloc_etr_buf.isra.6+0x80/0xa0
>>   CPU: 1 PID: 1743 Comm: perf Not tainted 5.1.0-rc6-147786-g116841e #344
>>   Hardware name: ARM LTD ARM Juno Development Platform/ARM Juno Development Platform, BIOS EDK II Feb  1 2019
>>    Call trace:
>>     dump_backtrace+0x0/0x150
>>     show_stack+0x14/0x20
>>     dump_stack+0x9c/0xc4
>>     debug_smp_processor_id+0x10c/0x110
>>     alloc_etr_buf.isra.6+0x80/0xa0
>>     tmc_alloc_etr_buffer+0x12c/0x1f0
>>     etm_setup_aux+0x1c4/0x230
>>     rb_alloc_aux+0x1b8/0x2b8
>>     perf_mmap+0x35c/0x478
>>     mmap_region+0x34c/0x4f0
>>     do_mmap+0x2d8/0x418
>>     vm_mmap_pgoff+0xd0/0xf8
>>     ksys_mmap_pgoff+0x88/0xf8
>>     __arm64_sys_mmap+0x28/0x38
>>     el0_svc_handler+0xd8/0x138
>>     el0_svc+0x8/0xc
>>
> 
> That is very interesting...
> 
>> Fixes: 855ab61c16bf70b646 ("coresight: tmc-etr: Refactor function tmc_etr_setup_perf_buf()")
>> Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
>> Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
>> ---
>>   drivers/hwtracing/coresight/coresight-tmc-etr.c | 6 ++----
>>   1 file changed, 2 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/hwtracing/coresight/coresight-tmc-etr.c b/drivers/hwtracing/coresight/coresight-tmc-etr.c
>> index 793639f..74578bd 100644
>> --- a/drivers/hwtracing/coresight/coresight-tmc-etr.c
>> +++ b/drivers/hwtracing/coresight/coresight-tmc-etr.c
>> @@ -1323,13 +1323,11 @@ static struct etr_perf_buffer *
>>   tmc_etr_setup_perf_buf(struct tmc_drvdata *drvdata, struct perf_event *event,
>>                         int nr_pages, void **pages, bool snapshot)
>>   {
>> -       int node, cpu = event->cpu;
>> +       int node;
>>          struct etr_buf *etr_buf;
>>          struct etr_perf_buffer *etr_perf;
>>
>> -       if (cpu == -1)
>> -               cpu = smp_processor_id();
>> -       node = cpu_to_node(cpu);
>> +       node = (event->cpu == -1)? numa_node_id() : cpu_to_node(event->cpu);
> 
> Seems to me using numa_node_id() simply circumvent function
> debug_smp_processor_id() and using get_cpu() and put_cpu() would be
> more appropriate.  But I'll trust the NUMA people have thought about
> this long before me.  Would you mind sending another revision that fix
> the same code for ETB and ETF?

Sure, will send it soon.

Suzuki

^ permalink raw reply	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2019-05-08 16:43 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-05-03 16:04 [PATCH 1/2] coresight: Do not call smp_processor_id() from preemptible Suzuki K Poulose
2019-05-03 16:04 ` [PATCH 2/2] coresight: alloc_perf_buf: Do not call smp_processor_id " Suzuki K Poulose
2019-05-08 16:39 ` [PATCH 1/2] coresight: Do not call smp_processor_id() " Mathieu Poirier
2019-05-08 16:43   ` Suzuki K Poulose

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).