On Tue, May 26, 2020 at 5:28 PM Alan Stern stern@rowland.harvard.edu wrote:
On Tue, May 26, 2020 at 05:19:07PM +0200, Rafael J. Wysocki wrote:
On Tue, May 26, 2020 at 5:07 PM Krzysztof WilczyĆski kw@linux.com wrote:
Hello Greg,
[...]
It's "interesting" how using your new helper doesn't actually make the code smaller. Perhaps it isn't a good helper function?
The idea for the helper was inspired by the comment Dan made to Bjorn about Bjorn's change, as per:
https://lore.kernel.org/driverdev-devel/20191016135002.GA24678@kadam/
It looked like a good idea to try to reduce the following:
dev->driver && dev->driver->pm && dev->driver->pm->prepare
Into something more succinct. Albeit, given the feedback from yourself and Rafael, I gather that this helper is not really a good addition.
IMO it could be used for reducing code duplication like you did in the PCI code, but not necessarily in the other places where the code in question is not exactly duplicated.
The code could be a little more succinct, although it wouldn't fit every usage. For example,
#define pm_do_callback(dev, method) \ (dev->driver && dev->driver->pm && dev->driver->pm->callback ? \ dev->driver->pm->callback(dev) : 0)
Then the usage is something like:
ret = pm_do_callback(dev, prepare);
Would this be an overall improvement?
It wouldn't cover all of the use cases.
For example, PCI does other things in addition to running a callback when it is present.
Something like this might be enough though:
#define pm_driver_callback_is_present(dev, method) \ (dev->driver && dev->driver->pm && dev->driver->pm->method)
#define pm_run_driver_callback(dev, method) \ (pm_driver_callback_is_present(dev, method) ? dev->driver->pm->method(dev) : 0)
#define pm_get_driver_callback(dev, method) \ (pm_driver_callback_is_present(dev, method) ? dev->driver->pm->method : NULL)
so whoever needs the callback pointer can use pm_get_driver_callback() and whoever only needs to run the callback can use pm_run_driver_callback().
Cheers!