On Wed, May 10, 2017 at 10:02:46PM +0000, mario.limoncie...@dell.com wrote: > > -----Original Message----- > > From: Darren Hart [mailto:dvh...@infradead.org] > > Sent: Wednesday, May 10, 2017 1:12 AM > > To: Greg Kroah-Hartman <gre...@linuxfoundation.org> > > Cc: Linus Torvalds <torva...@linux-foundation.org>; Limonciello, Mario > > <mario_limoncie...@dell.com>; Pali Rohár <pali.ro...@gmail.com>; Andy > > Shevchenko <andriy.shevche...@linux.intel.com>; Rafael Wysocki > > <r...@rjwysocki.net>; Andy Lutomirski <l...@amacapital.net>; LKML <linux- > > ker...@vger.kernel.org>; platform-driver-...@vger.kernel.org > > Subject: Re: WMI and Kernel:User interface > > > > On Wed, May 10, 2017 at 07:13:41AM +0200, Greg Kroah-Hartman wrote: > > > On Tue, May 09, 2017 at 04:16:39PM -0700, Darren Hart wrote: > > > > Linus and Greg, > > > > > > > > We are in the process of redesigning the Windows Management > > Instrumentation > > > > (WMI) [1] system in the kernel. WMI is the Microsoft implementation of > > > > Web- > > Based > > > > Enterprise Management (WBEM). We are looking to provide WMI access to > > userspace, > > > > while allowing the kernel to filter requests that conflict with its own > > > > usage. > > > > We'd like your take on how this approach relates to our commitment to > > > > not > > break > > > > userspace. > > > > > > > > For this discussion, we are specifically referring to ACPI PNP0C14 WMI > > > > devices, consisting of a GUID and a set of methods and events, as well > > > > as a > > > > precompiled intermediate description of the methods and arguments (MOF). > > Exposed > > > > to userspace, these methods provide for BIOS interaction and are used > > > > for > > system > > > > management as well as LEDs, hot keys, radio switches, etc. There is > > > > vendor > > > > interest in achieving feature parity with Windows by exposing WMI > > > > methods to > > > > userspace for system management. > > > > > > > > While it appears WMI intended to be accessed from userspace, we have > > > > made use of it in the kernel to support various laptop features by > > > > connecting > > > > the WMI methods to other subsystems, notably input, leds, and rfkill > > > > [2]. The > > > > challenge is continuing to use WMI for these platform features, while > > > > allowing > > > > userspace to use it for system management tasks. Unfortunately, the WMI > > methods > > > > are not guaranteed to be split up along granular functional lines, and > > > > we will > > > > certainly face situations where the same GUID::METHOD_ID will be needed > > > > for > > a > > > > kernel feature (say LED support) as well as a system management task. > > > > > > > > To address this, I have proposed [3] that exporting WMI be opt-in, only > > > > done at > > > > the request of and in collaboration with a vendor, with the kernel > > > > platform > > > > driver given the opportunity to filter requests. This filtering would > > > > need to be > > > > at the method and argument inspection level, such as checking for > > > > specific bits > > > > in the input buffer, and rejecting the request if they conflict with an > > > > in > > > > kernel usage (that's worst case, in some cases just GUID or method ID > > > > could be > > > > sufficient). > > > > > > > > Because the kernel and the platform drivers are under continual > > > > development, > > and > > > > new systems appear regularly, we will encounter necessary changes to the > > > > platform driver WMI request filters. These changes could be considered a > > change > > > > to the kernel provided WMI interface to userspace. For example, we could > > > > regularly accept a call to $GUID::$METHOD_ID with bit 4 of the buffer > > > > set, and > > > > later deny the call when we determine it interferes with kernel usage. > > > > > > > > In your view, is it acceptable to provide a chardev interface, for > > > > example, > > > > exposing WMI methods to userspace, with the understanding that the > > > > kernel > > may > > > > choose to filter certain requests which conflict with its own use? And > > > > that this > > > > filtering may change as new features are added to the platform drivers? > > > > > > So, for example, if a new driver for a "brightness key" were added to > > > the kernel, all of a sudden the "raw" access to the wmi data through the > > > chardev would filtered away by the kernel and not seen by userspace? > > > > > > > Pali provided some detail in the rather lengthy thread I linked to [3], but > > the > > summary is that there is nothing to encourage vendors to separate out > > functionality into separate method ids. Some do, the asus-wmi driver seems > > to > > have a reasonable separation, others do a lot with a single method id. > > > > In the scenario you mention, it could be that the brightness key shows up > > in a > > new laptop. Because we've never seen it before, the kernel driver doesn't > > detect > > it and send the input event. The clever user realizes they can write a > > userspace > > program to deal with this [a] by writing a my-laptop-brightness-key-daemon > > which > > also makes a WMI method call to affect the change in brightness in response > > to > > the keypress. > > > > Another user notices the dmesg is reporting "Unknown WMI Event" when they > > press > > that key and send a patch to make the corresponding wmi call to affect the > > brightness change (which depends on driver data to track the brightness > > value). > > To avoid conflicting with userspace, they also blacklist the > > WMI_BRIGHTNESS_CMD > > from being called by userspace. > > > > Now the first user makes a call to set the brightness, and receives an error > > code instead of a successful response. Their program no longer works - > > although > > with a current kernel, their brightness key would. > > > > I glossed over a few things there, but the description isn't too far off > > from a > > plausible scenario. > > > > > Why would you want to do that? What's wrong with providing "raw" access > > > through a chardev, and the current in-kernel access as well at the same > > > time? > > > > > > I don't really understand what would "break" over time here. > > > > Like the scenario above, if the behavior has state, if userspace and the > > kernel > > attempt to control it, neither will have an accurate state representation. > > > > We could allow both and if things start not working, the user would have to > > choose between the kernel driver and the userspace management application. > > This > > was the scenario Pali was particularly keen to avoid. > > > > That said, to date I haven't come across anything that states there can > > only be > > one userspace application accessing WMI at any given time. It should be > > straightforward to serialize WMI calls such that they cannot "cross the > > streams". > > > > > > > > thanks, > > > > > > greg k-h > > > > > > > a. This is perhaps a contrived scenario since hotkeys generate events, and > > as > > far as I understand it, there is no interest in exporting events to > > userspace, > > just the methods. > > > > -- > > Darren Hart > > VMware Open Source Technology Center > > This above discussion is confusing because it's referring specifically to > "WMI events". > related to brightness keypresses that don't make sense to go to userspace. > > The more interesting (and potentially problematic) area is things that read > and write > data using ASL methods. > > So here's a "more" realistic scenario: > > OEM has support through a WMI function to control keyboard backlight timeouts > and intensity. That same WMI function also can support turning on/off an > individual > USB port. Backlight timeouts are done by setting the first argument to "1" > and USB > port control is done by setting first argument to "2". > > Some userspace app is developed that can control both of these functions > through > the chardev. Later an enterprising young kernel developer realizes that > backlight > control should be done through a platform driver instead. > > They write a platform driver to do it, and add a filter to block "1" > arguments from > userspace. Now if the userspace app tries to call the chardev with the "1" > argument > some error code is returned indicating this request is not supported. > > The result is the userspace app broke, but it broke because the kernel is > supporting > the method in a much smarter and more scalable way. >
Thank you Mario, that's a much better example. -- Darren Hart VMware Open Source Technology Center