lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Wed, 12 Feb 2020 11:52:49 +0100 From: "Rafael J. Wysocki" <rafael@...nel.org> To: Christian Brauner <christian.brauner@...ntu.com> Cc: "David S. Miller" <davem@...emloft.net>, Greg Kroah-Hartman <gregkh@...uxfoundation.org>, Linux Kernel Mailing List <linux-kernel@...r.kernel.org>, netdev <netdev@...r.kernel.org>, "Rafael J. Wysocki" <rafael@...nel.org>, Pavel Machek <pavel@....cz>, Jakub Kicinski <kuba@...nel.org>, Eric Dumazet <edumazet@...gle.com>, Stephen Hemminger <stephen@...workplumber.org>, Linux PM <linux-pm@...r.kernel.org> Subject: Re: [PATCH net-next 07/10] drivers/base/power: add dpm_sysfs_change_owner() On Wed, Feb 12, 2020 at 11:43 AM Christian Brauner <christian.brauner@...ntu.com> wrote: > > Add a helper to change the owner of a device's power entries. This > needs to happen when the ownership of a device is changed, e.g. when > moving network devices between network namespaces. > The ownership of a device's power entries is determined based on the > ownership of the corresponding kobject, i.e. only if the ownership of a > kobject is changed will this function change the ownership of the > corresponding sysfs entries. > This function will be used to correctly account for ownership changes, > e.g. when moving network devices between network namespaces. > > Signed-off-by: Christian Brauner <christian.brauner@...ntu.com> > --- > drivers/base/core.c | 4 ++++ > drivers/base/power/power.h | 2 ++ > drivers/base/power/sysfs.c | 37 +++++++++++++++++++++++++++++++++++++ > 3 files changed, 43 insertions(+) > > diff --git a/drivers/base/core.c b/drivers/base/core.c > index 262217287a09..dfaf6d3614fa 100644 > --- a/drivers/base/core.c > +++ b/drivers/base/core.c > @@ -3515,6 +3515,10 @@ int device_change_owner(struct device *dev) > if (error) > goto out; > > + error = dpm_sysfs_change_owner(dev); > + if (error) > + goto out; > + > #ifdef CONFIG_BLOCK > if (sysfs_deprecated && dev->class == &block_class) > goto out; > diff --git a/drivers/base/power/power.h b/drivers/base/power/power.h > index 444f5c169a0b..f68490d0811b 100644 > --- a/drivers/base/power/power.h > +++ b/drivers/base/power/power.h > @@ -74,6 +74,7 @@ extern int pm_qos_sysfs_add_flags(struct device *dev); > extern void pm_qos_sysfs_remove_flags(struct device *dev); > extern int pm_qos_sysfs_add_latency_tolerance(struct device *dev); > extern void pm_qos_sysfs_remove_latency_tolerance(struct device *dev); > +extern int dpm_sysfs_change_owner(struct device *dev); > > #else /* CONFIG_PM */ > > @@ -88,6 +89,7 @@ static inline void pm_runtime_remove(struct device *dev) {} > > static inline int dpm_sysfs_add(struct device *dev) { return 0; } > static inline void dpm_sysfs_remove(struct device *dev) {} > +static inline int dpm_sysfs_change_owner(struct device *dev) { return 0; } > > #endif > > diff --git a/drivers/base/power/sysfs.c b/drivers/base/power/sysfs.c > index d7d82db2e4bc..ce1fd346e854 100644 > --- a/drivers/base/power/sysfs.c > +++ b/drivers/base/power/sysfs.c > @@ -684,6 +684,43 @@ int dpm_sysfs_add(struct device *dev) > return rc; > } > > +int dpm_sysfs_change_owner(struct device *dev) > +{ > + int rc; > + > + if (device_pm_not_required(dev)) > + return 0; > + > + rc = sysfs_group_change_owner(&dev->kobj, &pm_attr_group); > + if (rc) > + return rc; > + > + if (pm_runtime_callbacks_present(dev)) { > + rc = sysfs_group_change_owner(&dev->kobj, > + &pm_runtime_attr_group); > + if (rc) > + return rc; > + } > + if (device_can_wakeup(dev)) { > + rc = sysfs_group_change_owner(&dev->kobj, > + &pm_wakeup_attr_group); > + if (rc) > + return rc; > + } > + if (dev->power.set_latency_tolerance) { > + rc = sysfs_group_change_owner(&dev->kobj, > + &pm_qos_latency_tolerance_attr_group); > + if (rc) > + return rc; > + } > + if (dev->power.wakeup && dev->power.wakeup->dev) { This is related to the device_can_wakeup(dev) condition above (i.e. it will never be 'true' if that one is 'false'). LGTM apart from this. > + rc = device_change_owner(dev->power.wakeup->dev); > + if (rc) > + return rc; > + } > + return 0; > +} > + > int wakeup_sysfs_add(struct device *dev) > { > return sysfs_merge_group(&dev->kobj, &pm_wakeup_attr_group); > -- > 2.25.0 >
Powered by blists - more mailing lists