Re: [PATCH 4/8] cpumask: convert kernel trace functions

Mike Travis
2008-12-19T16:54:50Z

Steven Rostedt wrote:
> On Fri, 19 Dec 2008, Mike Travis wrote:
>
>> Impact: Reduce memory usage, use new cpumask API.
>>
>> Convert kernel trace functions to use struct cpumask.
>>
>
> [..]
>
>> #define for_each_buffer_cpu(buffer, cpu) \
>> - for_each_cpu_mask(cpu, buffer->cpumask)
>> + for_each_cpu(cpu, buffer->cpumask)
>>
>> #define TS_SHIFT 27
>> #define TS_MASK ((1ULL << TS_SHIFT) - 1)
>> @@ -262,7 +262,7 @@ struct ring_buffer {
>> unsigned pages;
>> unsigned flags;
>> int cpus;
>> - cpumask_t cpumask;
>> + cpumask_var_t cpumask;
>> atomic_t record_disabled;
>>
>> struct mutex mutex;
>> @@ -453,6 +453,9 @@ struct ring_buffer *ring_buffer_alloc(un
>> if (!buffer)
>> return NULL;
>>
>> + if (!alloc_cpumask_var(&buffer->cpumask, GFP_KERNEL))
>> + goto fail_free_buffer;
>> +
>
>
> How does this save memory if we just allocate a cpumask var everytime
> we allocate a ring buffer? Is cpumask_var_t a mask of possible CPUS and
> not NR_CPUS?
>
> Otherwise, I see this as just adding one extra pointer.
>
> -- Steve

Hi Steve,

Yes, eventually, the cpumask_var_t will be allocated based on cpumask_size()
which will become BITS_TO_LONG(nr_cpu_ids) instead of BITS_TO_LONGS(NR_CPUS)
as soon as the kernel becomes "cpumask" clean. (clean being that it ignores
all bits >= nr_cpu_ids.)

Note that on small NR_CPUS count systems, cpumask_var_t is a static array
and no allocation happens, so it only kicks in when CONFIG_CPUMASK_OFFSTACK=y.

Thanks,
Mike