OSDN Git Service

perf affinity: Fix out of bound access to "sched_cpus" mask
authorAthira Rajeev <atrajeev@linux.vnet.ibm.com>
Mon, 5 Sep 2022 14:19:28 +0000 (19:49 +0530)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Tue, 6 Sep 2022 12:45:23 +0000 (09:45 -0300)
The affinity code in "affinity_set" function access array named
"sched_cpus". The size for this array is allocated in affinity_setup
function which is nothing but value from get_cpu_set_size. This is used
to contain the cpumask value for each cpu.

While setting bit for each cpu, it calls "set_bit" function which access
index in sched_cpus array.  If we provide a command-line option to -C
which is more than the number of CPU's present in the system, the
set_bit could access an array member which is out-of the array size.
This is because currently, there is no boundary check for the CPU.  This
will result in seg fault:

<<>>
   ./perf stat -C 12323431 ls
  Perf can support 2048 CPUs. Consider raising MAX_NR_CPUS
  Segmentation fault (core dumped)
<<>>

Fix this by adding boundary check for the array.

After the fix from powerpc system:

<<>>
  ./perf stat -C 12323431 ls 1>out
  Perf can support 2048 CPUs. Consider raising MAX_NR_CPUS

   Performance counter stats for 'CPU(s) 12323431':

     <not supported> msec cpu-clock
     <not supported>      context-switches
     <not supported>      cpu-migrations
     <not supported>      page-faults
     <not supported>      cycles
     <not supported>      instructions
     <not supported>      branches
     <not supported>      branch-misses

         0.001192373 seconds time elapsed
<<>>

Reported-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Signed-off-by: Athira Jajeev <atrajeev@linux.vnet.ibm.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Tested-by: Nageswara R Sastry <rnsastry@linux.ibm.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Kajol Jain <kjain@linux.ibm.com>
Cc: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
Cc: Michael Ellerman <mpe@ellerman.id.au>
Cc: linuxppc-dev@lists.ozlabs.org
Link: https://lore.kernel.org/r/20220905141929.7171-1-atrajeev@linux.vnet.ibm.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/util/affinity.c

index 4d216c0..4ee96b3 100644 (file)
@@ -49,8 +49,14 @@ void affinity__set(struct affinity *a, int cpu)
 {
        int cpu_set_size = get_cpu_set_size();
 
-       if (cpu == -1)
+       /*
+        * Return:
+        * - if cpu is -1
+        * - restrict out of bound access to sched_cpus
+        */
+       if (cpu == -1 || ((cpu >= (cpu_set_size * 8))))
                return;
+
        a->changed = true;
        set_bit(cpu, a->sched_cpus);
        /*