RE: [PATCH 1/4] RFC Thermal: Enhance Generic Thermal layer with policies

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Eduardo,

> Hello Durgadoss,
> 
> Things are moving fast! Losts of work on going.
> This is good. Just that now we have some overlaps. I'd propose to be
> more structured and align between ourselves. Having branches would
> be a nice starting point. I can collect your changes and post to gitorious
> or something if you agree.
> 
> I like the approach Durgadoss is proposing. So we can have different
> policy behavior on different zones.

Thank you..

> 
> But we need to see how we merge both of your work. There is still
> Amit's work, and I haven't sent my changes yet :-)

Yes in the next patch set I will try to be synced up with Rui's patches.

> 
> This patch introduces several things. I see at least three
> major changes. Can you split it into smaller pieces?

True and agree with you.
I had various reasons due to which I could not do that.
Now things are clear, and will make it more organized in the next set.

> > +    .weights: This parameter defines the 'influence' of a particular cooling
> > +	      device on this thermal zone, on a percentage scale. The sum of
> > +	      all these weights cannot exceed 100. The order of values in
> > +	      this array should match with that of the cooling_devices_name.
> > +1.4.3 An example thermal_zone_params structure
> > +	struct thermal_zone_params tzp = {
> > +                .thermal_zone_name = "CPU",
> > +                .num_cdevs = 2,
> > +                .cdevs_name = {"CPU", "Memory"},
> > +                .weights = {70, 30},
> > +        };
> > +
> 
> Nice! Only missing point from the documentation above is that it is not
> so clear how platform code is suppose to provide the zone params structure...

I hope (luckily) my patch 4/4 explains that :-)

> >
> > +int (*get_platform_thermal_params)(struct thermal_zone_device *tzd);
> > +EXPORT_SYMBOL(get_platform_thermal_params);
> > +
> 
> Are we sure we want to go in this way? Shouldn't the zone register be
> enough to provide this data per zone?

As I mentioned in other patch, this can here or can be in a platform
thermal driver file. I think keeping it here makes it easier, otherwise
we need to make sure every driver (that wants to fetch pdata) has
this defined there.
I am not saying it is a difficult thing, but thinking from the view of
somebody who just writes driver for a thermal chip, this approach
can make his/her life easy.

> > +	struct thermal_zone_params *tzp = tz->tzp;
> > +
> > +	if (!strcmp(policy, "fair_share")) {
> > +		tzp->throttle_policy = THERMAL_FAIR_SHARE;
> > +	} else if (!strcmp(policy, "step_wise")) {
> > +		tzp->throttle_policy = THERMAL_STEP_WISE;
> > +	} else if (!strcmp(policy, "user_space")) {
> > +		tzp->throttle_policy = THERMAL_USER_SPACE;
> > +	} else {
> > +		dev_err(&tz->device, "Setting throttling policy failed:\n");
> > +		return -EINVAL;
> > +	}
> 
> For the comparison above: sysfs_streq.

I am not aware of the API. Will look at it. Thank you.

> 
> How do we handle locking and make sure the policy switch is sane and not having
> concurrency issues?

Will add protection.

> > +
> > +static int create_policy_attr(struct thermal_zone_device *tz)
> 
> This function name is not so good as the function also creates the device file.

You seem to be good at naming :-)
Any free suggestions for this name here ?

> > +static void update_tz_params(struct thermal_zone_params *tzp,
> 
> Any better naming for this function?

I can think through, but suggestions are welcome :-)

> 
> Is flag bool? If so, please use it.

Yes will use bool. 

> > +	ret = get_platform_thermal_params(tz);
> > +	if (ret) {
> > +		dev_err(&tz->device,
> > +		"parameters for zone %s not defined:%d\n", tz->type, ret);
> > +		return;
> 
> checkpatch.pl --strict says this about the above:
> CHECK: Alignment should match open parenthesis
> #205: FILE: drivers/thermal/thermal_sys.c:759:
> +		dev_err(&tz->device,
> +		"parameters for zone %s not defined:%d\n", tz->type, ret);

I don't run it with --strict.
Will try next time, if it does not affect readability will make this change.

> > +	kobject_uevent(&tz->device.kobj, KOBJ_CHANGE);
> 
> This is not good. I believe we have a userspace notification mechanism already.
> 
> Rui, in general we need to standardize the kernel <-> userland userspace
> communication/
> notification system. Is the existing netlink enough? Why would we need a sysfs
> notify?

I agree on the standardization.
I added the existing netlink mechanism a year ago, and we have a couple of
systems using that. That time, the inspiration came from one of the acpi
drivers.

Now, I would like to move towards a UEvent approach (as more user land
apps are moving towards that).

> > -		if (state > 0)
> > -			cdev->ops->set_cur_state(cdev, --state);
> > -		if (state == 0)
> > -			tz->passive = false;
> > +
> > +		if (trend == THERMAL_TREND_HEATING)
> > +			__throttle(cdev);
> > +		else
> > +			__dethrottle(cdev);
> 
> I like the above. Looks way cleaner.

Thank you.

> 
> On the other hand, does it make sense to make linear_throttle a
> real throttle_policy, instead of treating it as a separate case?
> 
> Meaning, also having its own file, just like the others.

Exactly..Will do.

> > +static inline int sw_throttle(struct thermal_zone_device *tz, int trip,
> > +			enum thermal_trip_type trip_type)
> > +{
> > +	return 0;
> > +}
> > +#endif
> 
> Nip: Another way, instead of having the ifdeferry here, we could have a header
> file which does the config check above.

Do you think it is Ok to have this inside thermal.h ?
Or is it better to create one more new .h say thermal_policy.h or thermal_governor.h ?

> 
> 
> Can someone explain me why .notify is a must for thermal_shutdow?

I have no idea. I also wanted to know the reason.
I thought instead of asking in an e-mail, if I touch code more people will answer,
and looks like it worked :-)

If I don't get any valid reason, I will remove this check/modify this as necessary.

> 
> It is not clear what is the difference of the above and the existing
> thermal_zone_device_update().

Again not intended to be different.
I will clean it up.

> 
> Is this one supposed to be called from interrupt context?
> 
> device_update has mutex locking, this one does not have...

Interrupt context is fine, but only from a bottom half.
So, I will add protection here and clean this.

> Something like this might look better?

I don't know why I did not do this :-(

> +		switch (trip_type) {
> +		case THERMAL_TRIP_CRITICAL:
> +		case THERMAL_TRIP_HOT:
> +			handle_critical_trips(tz, count, trip_type);
> +			break;
> +		case THERMAL_TRIP_ACTIVE:
> +		case THERMAL_TRIP_PASSIVE:
> +			handle_non_critical_trips(tz, count, trip_type);
> +			break;


> >  };
> >
> > +enum thermal_trend {
> > +	THERMAL_TREND_NONE,
> 
> Same comment on Rui's patch applies here... Does TREND_NONE stands for
> 'TREND_STABLE'?

We can use 'stable'. I will sync up with Rui's Patches.

> > +	 * See Documentation/thermal/sysfs-api.txt for more information.
> > +	 */
> > +	int weights[MAX_COOLING_DEVICES];
> 
> Would it make sense to have an array of structs here instead of two arrays?
> 
> Instead of doing:
> +	{
> +		.thermal_zone_name = "CPU",
> +		.throttle_policy = THERMAL_FAIR_SHARE,
> +		.num_cdevs = 2,
> +		.cdevs_name = {"CPU", "Battery"},
> +		.weights = {80, 20},
> +	},
> 
> one would do:
> +	{
> +		.thermal_zone_name = "CPU",
> +		.throttle_policy = THERMAL_FAIR_SHARE,
> +		.num_cdevs = 2,
> +		.cdevs = {
> +			{
> +				.name = "CPU",
> +				.weight = 80,
> +			},
> +			{
> +				.name = "Battery",
> +				.weight = 20,
> +			},
> +		},
> +	},
> 
> It looks lengthier, I know. But at least looks more well structured I'd say.

I dropped it for the same reason.
But, this is going to be inside a platform file, so we can choose to do this.

Thanks,
Durga

--
To unsubscribe from this list: send the line "unsubscribe linux-acpi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux IBM ACPI]     [Linux Power Management]     [Linux Kernel]     [Linux Laptop]     [Kernel Newbies]     [Share Photos]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Samba]     [Video 4 Linux]     [Device Mapper]     [Linux Resources]

  Powered by Linux