zone device是如何决定使用哪个governer的

本文详细解析了Linux内核中温度调控器(governer)的注册与选择机制。通过分析源码,揭示了默认调控器的选择依据以及配置宏如何影响这一过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们知道调节温度的governer有五种,分别是fair_share/gov_bang_bang/step_wise/user_space/power_allocator。
在thermal_init->thermal_register_governors 中我们看到这五种governer其实默认都已经注册给kernel了

static int __init thermal_register_governors(void)
{
	int result;

	result = thermal_gov_step_wise_register();
	if (result)
		return result;

	result = thermal_gov_fair_share_register();
	if (result)
		return result;

	result = thermal_gov_bang_bang_register();
	if (result)
		return result;

	result = thermal_gov_user_space_register();
	if (result)
		return result;

	return thermal_gov_power_allocator_register();
}

那zone device到底是如何选择用那种governer的呢?
答案是thermal_init->of_parse_thermal_zones->thermal_zone_device_register中的下面这段code决定的
	if (tz->tzp)
		governor = __find_governor(tz->tzp->governor_name);
	else
		governor = def_governor;

由于从dts中没有包含struct thermal_zone_params *tzp。因此这里会governor = def_governor;
而def_governor是在注册governer的时候赋值的
int thermal_register_governor(struct thermal_governor *governor)
{
	int err;
	const char *name;
	struct thermal_zone_device *pos;

	if (!governor)
		return -EINVAL;

	mutex_lock(&thermal_governor_lock);

	err = -EBUSY;
//由于是第一次注册这个governer,所以这里的__find_governor 会返回NULL
	if (!__find_governor(governor->name)) {
		bool match_default;

		err = 0;
//将这个新注册的governer的添加到全局的thermal_governor_list中 
		list_add(&governor->governor_list, &thermal_governor_list);
//哈哈哈,这里是重点code,决定def_governor的赋值
		match_default = !strncmp(governor->name,
					 DEFAULT_THERMAL_GOVERNOR,
					 THERMAL_NAME_LENGTH);

		if (!def_governor && match_default)
			def_governor = governor;
	}

	return err;
}

这里的DEFAULT_THERMAL_GOVERNOR定义如下:
#if defined(CONFIG_THERMAL_DEFAULT_GOV_STEP_WISE)
#define DEFAULT_THERMAL_GOVERNOR       "step_wise"
#elif defined(CONFIG_THERMAL_DEFAULT_GOV_FAIR_SHARE)
#define DEFAULT_THERMAL_GOVERNOR       "fair_share"
#elif defined(CONFIG_THERMAL_DEFAULT_GOV_USER_SPACE)
#define DEFAULT_THERMAL_GOVERNOR       "user_space"
#elif defined(CONFIG_THERMAL_DEFAULT_GOV_POWER_ALLOCATOR)
#define DEFAULT_THERMAL_GOVERNOR       "power_allocator"
#endif
原来def_governor就是赋值的DEFAULT_THERMAL_GOVERNOR 这个字符串,而这个字符串的赋值是有上面这个五个config定义的。
到这里zone device是如何指定governer就彻底明白了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值