/proc/cpuinfo versus /proc/softirqs: how to properly count CPUs?

Vijay Chauhan kernel.vijay at gmail.com
Mon Oct 22 12:11:53 EDT 2012


On Mon, Oct 22, 2012 at 7:30 PM, Robert P. J. Day <rpjday at crashcourse.ca> wrote:
>
>   poking around under /proc on my quad-core asus laptop and just
> noticed that while /proc/cpuinfo (properly) lists my 8 processors,
> /proc/softirqs instead lists 16, with the last 8 having values of all
> zeroes (not surprisingly).  with the middle columns snipped for
> brevity, my /proc/softirqs shows:
>
>                     CPU0       CPU1 ...     CPU13      CPU14      CPU15
>           HI:          0          0 ...         0          0          0
>        TIMER:    1018887      45313 ...         0          0          0
>       NET_TX:       1182       1813 ...         0          0          0
>       NET_RX:        991        719 ...         0          0          0
>        BLOCK:      44559         13 ...         0          0          0
> BLOCK_IOPOLL:          0          0 ...         0          0          0
>      TASKLET:      41582        419 ...         0          0          0
>        SCHED:      76438      28658 ...         0          0          0
>      HRTIMER:        738        709 ...         0          0          0
>          RCU:     136797      82392 ...         0          0          0
>
> with all of the zero values from CPU8-CPU15.  so the obvious question
> is -- why?  why the difference in the way those two proc files count
> the "number" of CPUs on my system?
>
>   for /proc/cpuinfo, the logic is in arch/x86/kernel/cpu/proc.c, and
> the way the seq_file is implemented:
>
>   static void *c_start(struct seq_file *m, loff_t *pos)
>   {
>         *pos = cpumask_next(*pos - 1, cpu_online_mask);
>         if ((*pos) < nr_cpu_ids)
>                 return &cpu_data(*pos);
>         return NULL;
>   }
>
> so that loop clearly iterates through the "online" CPUs, which would
> appear to be the correct loop criteria.
>
>   the code for softirqs, however, is in fs/proc/softirqs.c, and is
> much simpler:
>
>   static int show_softirqs(struct seq_file *p, void *v)
>   {
>         int i, j;
>
>         seq_puts(p, "                    ");
>         for_each_possible_cpu(i)
>                 seq_printf(p, "CPU%-8d", i);
>         seq_putc(p, '\n');
>
>         for (i = 0; i < NR_SOFTIRQS; i++) {
>                 seq_printf(p, "%12s:", softirq_to_name[i]);
>                 for_each_possible_cpu(j)
>                         seq_printf(p, " %10u", kstat_softirqs_cpu(i, j));
>                 seq_putc(p, '\n');
>         }
>         return 0;
>   }
>
> note that that code uses the macro "for_each_possible_cpu()" rather
> than examining only *online* CPUs.  in dmesg, i see the lines:
>
> [    0.000000] smpboot: Allowing 16 CPUs, 8 hotplug CPUs
> [    0.000000] setup_percpu: NR_CPUS:256 nr_cpumask_bits:256 nr_cpu_ids:16 nr_node_ids:1
>
> and the code for all this counting is in arch/x86/kernel/smpboot.c,
> which you can check out for yourself, but this brings me back to the
> basic question -- why is the code for softirqs iterating through all
> *possible* CPUs (in my case, apparently, 16), when i have only 8
> *online* CPUs?

Sorry for jumping in but i have basic question here.
What is the difference between  *online* CPUs and *possible* CPUs?

Thanks,
VIjay

>
> rday
>
> --
>
> ========================================================================
> Robert P. J. Day                                 Ottawa, Ontario, CANADA
>                         http://crashcourse.ca
>
> Twitter:                                       http://twitter.com/rpjday
> LinkedIn:                               http://ca.linkedin.com/in/rpjday
> ========================================================================
>
>
> _______________________________________________
> Kernelnewbies mailing list
> Kernelnewbies at kernelnewbies.org
> http://lists.kernelnewbies.org/mailman/listinfo/kernelnewbies



More information about the Kernelnewbies mailing list