cpufreq_curr_sysctl: memory allocation

Andriy Gapon avg at freebsd.org
Sun Jun 20 16:19:52 UTC 2010


on 20/06/2010 19:09 Alexander Motin said the following:
> Andriy Gapon wrote:
>> I noticed that cpufreq_curr_sysctl performs a substantial memory allocation and
>> deallocation on each call.  Its size is CF_MAX_LEVELS * sizeof(*levels), which
>> is ~24KB.  This happens even for read-only calls to just query current level.
>> And such calls happen quite frequently when powerd is running.
> 
> Worse is that it not just consumes time, but causes a bunch or TLB flush
> IPIs on free(). For read-only call it doesn't even needs CF_MAX_LEVELS *
> sizeof(*levels). sizeof(*levels) seems should be enough there. May be
> then it fits into some existing UMA zone, minimizing penalty.

Yes, exactly, for R/O case only one level structure gets populated.

>> I think that this is an unnecessary and avoidable load for VM system.
>> Couldn't a buffer be preallocated in sc and re-used for the calls?
>> Even if not, for some reason, then wouldn't it be better to have a dedicated uma
>> zone for that rather than doing malloc+free?
> 
> Dedicated rarely used UMA zone may eat much more memory then it is
> needed on SMP.

I agree, but I hope that a single buffer should be sufficient.
As I understand, all sysctl operate under Giant unless specifically flagged
otherwise.  And I don't see any code to explicitly handle concurrent invocations
in cpufreq_curr_sysctl.

-- 
Andriy Gapon


More information about the freebsd-acpi mailing list