Re: Userland breakage from "Modify the device name as devfreq(X) for sysfs"
From: John Stultz
Date: Wed May 30 2018 - 13:01:05 EST
On Wed, May 30, 2018 at 12:31 AM, Greg KH <gregkh@xxxxxxxxxxxxxxxxxxx> wrote:
> On Tue, May 29, 2018 at 11:52:37PM -0700, John Stultz wrote:
>> On Tue, May 29, 2018 at 10:33 PM, Greg KH <gregkh@xxxxxxxxxxxxxxxxxxx> wrote:
>> > On Tue, May 29, 2018 at 10:14:35PM -0700, John Stultz wrote:
>> >> On Tue, May 8, 2018 at 7:28 PM, Chanwoo Choi <cw00.choi@xxxxxxxxxxx> wrote:
>> >> > On 2018ë 05ì 09ì 08:17, John Stultz wrote:
>> >> >> Hey folks,
>> >> >> I wanted to bring up an issue we've recently tripped over, which was
>> >> >> caused by 4585fbcb5331f ("PM / devfreq: Modify the device name as
>> >> >> devfreq(X) for sysfs").
>> >> >> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit?id=4585fbcb5331fc910b7e553ad3efd0dd7b320d14
>> >> >>
>> >> >> That patch replaced paths like:
>> >> >> /sys/class/devfreq/ddr_devfreq/min_freq
>> >> >> and
>> >> >> /sys/class/devfreq/e82c0000.mali/min_freq
>> >> >>
>> >> >> With
>> >> >> /sys/class/devfreq/devfreq(0)/min_freq
>> >> >> and
>> >> >> /sys/class/devfreq/devfreq(1)/min_freq
>> >> >>
>> >> >>
>> >> >> This broke userspace we have that needs to work on 4.4, 4.9 and 4.14 (and on).
>> >> >
>> >> > Firstly, I'm sorry to make some problem on userland.
>> >> >
>> >> >>
>> >> >> I wanted to try to ask to understand more about the rational for this
>> >> >> patch, as it doesn't make much sense to me, particularly as now it is
>> >> >> less obvious as to which path is for which device - and more
>> >> >> worrisome it could change depending on initialization order.
>> >> >
>> >> > Some linux framework used the their own prefix under "/sys/class/"
>> >> > for device such as input/pwm/hwmon/regulator and so on.
>> >> > (But, some linux framework used the device name directly without any changes)
>> >> >
>> >> > I thought that devfreq better to use use the consistent name.
>> >> > If user wanted to access the specific device with device name,
>> >> > the user can access the path of '/sys/devices/platform/...'.
>> >> >
>> >> > [Example on Exynos5433-based TM2 board]
>> >> > root@localhost:~# ls -al /sys/class/devfreq
>> >> > total 0
>> >> > drwxr-xr-x 2 root root 0 Jul 26 04:49 .
>> >> > drwxr-xr-x 50 root root 0 Jan 1 1970 ..
>> >> > lrwxrwxrwx 1 root root 0 Jul 26 04:49 devfreq0 -> ../../devices/platform/soc/soc:bus0/devfreq/devfreq0
>> >> > lrwxrwxrwx 1 root root 0 Jul 26 04:49 devfreq1 -> ../../devices/platform/soc/soc:bus1/devfreq/devfreq1
>> >> > (skip)
>> >> >
>> >> > - User can access the devfreq device with specific device name.
>> >> > root@localhost:/sys/devices/platform/soc/soc:bus0/devfreq/devfreq0# pwd
>> >> > /sys/devices/platform/soc/soc:bus0/devfreq/devfreq0
>> >> >
>> >> > root@localhost:/sys/devices/platform/soc/soc:bus0/devfreq/devfreq0# ls
>> >> > available_frequencies device min_freq subsystem uevent
>> >> > available_governors governor polling_interval target_freq
>> >> > cur_freq max_freq power trans_stat
>> >> >
>> >> > root@localhost:/sys/devices/platform/soc/soc:bus0/devfreq/devfreq0# cat min_freq
>> >> > 160000000
>> >> >
>> >>
>> >> Sorry to not get back to you sooner on this. Was on vacation then this
>> >> discussion got buried in my inbox.
>> >>
>> >> I do agree that it the consistency with other subsystems is an
>> >> improvement, but it still doesn't help our situation that userspace
>> >> applications can't consistently work between kernel versions, as even
>> >> if we go with the /sys/devices/platform/soc/soc:bus0/devfreq/devfreq0
>> >> path rather then the /sys/class/devfreq/ path, in older kernels the
>> >> /sys/devices/platform/soc/soc:bus0/devfreq/devfreq0 doesn't exist.
>> >
>> > Ick, that's not ok. The sys/class/ path should always work for old and
>> > new. If not, it's broken and should be reverted.
>> >
>> > And it seems like it still works, just that the "names" are now
>> > different in the class path, of the device, right? And that should be
>> > fine, what is breaking when a device name changes?
>>
>> Well, code that is looking for:
>> /sys/class/devfreq/ddr_devfreq/min_freq
>>
>> won't work with newer kernels unless its changed to look for:
>> /sys/class/devfreq/devfreq0/min_freq
>>
>> (assuming the ddr_devfreq driver loaded before the mali one :)
>
> Ugh. In working with sysfs you should never care about the device name,
> you should be iterating over:
> /sys/class/devfreq/*/min_freq
>
> and just picking up the one you find that has a link back to whatever
> you want it to be. Device names are not deterministic, as you even
> claim here as you were somehow depending on the module load order :)
Well, previously it used the dev name, which was somewhat
deterministic (e82c0000.mali or ddr_devfreq) regardless of module load
order. Now, its just devfreqN, which obviously isn't deterministic.
Part of the trouble, as Chanwoo mentioned is there is no name entry,
so even iterating over the the devices, the devfreqN sysfs dirs are
indistinguishable.
> So if/when a device name changes, userspace always has to handle that
> properly.
>
> What tool/script is failing here? What package is it part of so that we
> can fix it to use sysfs "properly"?
Its an Android PowerHAL for HiKey960 devices. I'm happy to change it
to make it work properly, but we do want it to work with 4.4, 4.9,
4.14 and mainline.
> Now if somehow we can not figure out _which_ devfreq class device is
> associated with the "correct" real device, then that's a problem and
> needs to be fixed. But changing the naming scheme is not the proper fix
> for that.
Ok. So maybe if we get name entries added to both upstream and -stable
kernels, we can iterate over the directories if they are named
e82c0000.mali or devfreq0 all the same, and that might work out.
>> >> I agree we need a name attribute so folks can tell the difference
>> >> between devices.
>> >>
>> >> I'm also not too much of a stickler that the old ABI broke, as long as
>> >> we have some solution that works across kernels. So I'd request that
>> >> you at least make older -stable kernels (4.4 and 4.9) behavior
>> >> consistent with upstream.
>> >
>> > No, I don't want to backport api changes like that as then users of
>> > those kernels that were working just fine break :)
>> >
>> > So I think mainline needs to revert this.
>>
>> The trouble is that the break happened awhile back (4.10) so if we
>> revert its likely to break any new users since then.
>>
>> That's why I suggested we find some way to have both paths work. But I
>> don't know enough sysfs tricks to have a good suggestion on how to
>> easily do so.
>
> We have compatible symlinks all over the place in sysfs, usually we try
> to bury them behind config options for when you have to run new kernels
> on old userspace implementations. But sometimes we just let them live
> on for forever...
Ok. I'll try to look that up.
> What exactly would need to be linked to what in order to keep this
> working?
I was thinking just having both dev_name() and devfreqN entries, but
with the name node added (to both newer and older kernels) we can
probably adapt to make it work w/o compatibility links.
thanks
-john