All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Winiarska, Iwona" <iwona.winiarska@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>
Cc: "corbet@lwn.net" <corbet@lwn.net>,
	"jae.hyun.yoo@linux.intel.com" <jae.hyun.yoo@linux.intel.com>,
	"d.mueller@elsoft.ch" <d.mueller@elsoft.ch>,
	"linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"andrew@aj.id.au" <andrew@aj.id.au>,
	"Luck, Tony" <tony.luck@intel.com>,
	"Lutomirski, Andy" <luto@kernel.org>,
	"andriy.shevchenko@linux.intel.com"
	<andriy.shevchenko@linux.intel.com>,
	"mchehab@kernel.org" <mchehab@kernel.org>,
	"jdelvare@suse.com" <jdelvare@suse.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"olof@lixom.net" <olof@lixom.net>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux@roeck-us.net" <linux@roeck-us.net>,
	"zweiss@equinix.com" <zweiss@equinix.com>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"joel@jms.id.au" <joel@jms.id.au>,
	"yazen.ghannam@amd.com" <yazen.ghannam@amd.com>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"pierre-louis.bossart@linux.intel.com"
	<pierre-louis.bossart@linux.intel.com>,
	"x86@kernel.org" <x86@kernel.org>, "bp@alien8.de" <bp@alien8.de>
Subject: Re: [PATCH v2 09/15] peci: Add sysfs interface for PECI bus
Date: Mon, 15 Nov 2021 22:19:04 +0000	[thread overview]
Message-ID: <0fb36e270cd497ade90eb0a4e9882819af3472dd.camel@intel.com> (raw)
In-Reply-To: <CAPcyv4hhtTi+dKspjoamYj53GxT4Ot_1pG5-eavUJdihD8iAEg@mail.gmail.com>

On Fri, 2021-08-27 at 12:11 -0700, Dan Williams wrote:
> On Tue, Aug 3, 2021 at 4:35 AM Iwona Winiarska
> <iwona.winiarska@intel.com> wrote:
> > 
> > PECI devices may not be discoverable at the time when PECI controller is
> > being added (e.g. BMC can boot up when the Host system is still in S5).
> > Since we currently don't have the capabilities to figure out the Host
> > system state inside the PECI subsystem itself, we have to rely on
> > userspace to do it for us.
> > 
> > In the future, PECI subsystem may be expanded with mechanisms that allow
> > us to avoid depending on userspace interaction (e.g. CPU presence could
> > be detected using GPIO, and the information on whether it's discoverable
> > could be obtained over IPMI).
> 
> Thanks for this detail.
> 
> > Unfortunately, those methods may ultimately not be available (support
> > will vary from platform to platform), which means that we still need
> > platform independent method triggered by userspace.
> > 
> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
> > ---
> >  Documentation/ABI/testing/sysfs-bus-peci | 16 +++++
> >  drivers/peci/Makefile                    |  2 +-
> >  drivers/peci/core.c                      |  3 +-
> >  drivers/peci/device.c                    |  1 +
> >  drivers/peci/internal.h                  |  5 ++
> >  drivers/peci/sysfs.c                     | 82 ++++++++++++++++++++++++
> >  6 files changed, 107 insertions(+), 2 deletions(-)
> >  create mode 100644 Documentation/ABI/testing/sysfs-bus-peci
> >  create mode 100644 drivers/peci/sysfs.c
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-bus-peci
> > b/Documentation/ABI/testing/sysfs-bus-peci
> > new file mode 100644
> > index 000000000000..56c2b2216bbd
> > --- /dev/null
> > +++ b/Documentation/ABI/testing/sysfs-bus-peci
> > @@ -0,0 +1,16 @@
> > +What:          /sys/bus/peci/rescan
> > +Date:          July 2021
> > +KernelVersion: 5.15
> > +Contact:       Iwona Winiarska <iwona.winiarska@intel.com>
> > +Description:
> > +               Writing a non-zero value to this attribute will
> > +               initiate scan for PECI devices on all PECI controllers
> > +               in the system.
> > +
> > +What:          /sys/bus/peci/devices/<controller_id>-<device_addr>/remove
> > +Date:          July 2021
> > +KernelVersion: 5.15
> > +Contact:       Iwona Winiarska <iwona.winiarska@intel.com>
> > +Description:
> > +               Writing a non-zero value to this attribute will
> > +               remove the PECI device and any of its children.
> > diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile
> > index c5f9d3fe21bb..917f689e147a 100644
> > --- a/drivers/peci/Makefile
> > +++ b/drivers/peci/Makefile
> > @@ -1,7 +1,7 @@
> >  # SPDX-License-Identifier: GPL-2.0-only
> > 
> >  # Core functionality
> > -peci-y := core.o request.o device.o
> > +peci-y := core.o request.o device.o sysfs.o
> >  obj-$(CONFIG_PECI) += peci.o
> > 
> >  # Hardware specific bus drivers
> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c
> > index d143f1a7fe98..c473acb3c2a0 100644
> > --- a/drivers/peci/core.c
> > +++ b/drivers/peci/core.c
> > @@ -34,7 +34,7 @@ struct device_type peci_controller_type = {
> >         .release        = peci_controller_dev_release,
> >  };
> > 
> > -static int peci_controller_scan_devices(struct peci_controller *controller)
> > +int peci_controller_scan_devices(struct peci_controller *controller)
> >  {
> >         int ret;
> >         u8 addr;
> > @@ -159,6 +159,7 @@ EXPORT_SYMBOL_NS_GPL(devm_peci_controller_add, PECI);
> > 
> >  struct bus_type peci_bus_type = {
> >         .name           = "peci",
> > +       .bus_groups     = peci_bus_groups,
> >  };
> > 
> >  static int __init peci_init(void)
> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c
> > index 32811248997b..d77d9dabd51e 100644
> > --- a/drivers/peci/device.c
> > +++ b/drivers/peci/device.c
> > @@ -110,5 +110,6 @@ static void peci_device_release(struct device *dev)
> >  }
> > 
> >  struct device_type peci_device_type = {
> > +       .groups         = peci_device_groups,
> >         .release        = peci_device_release,
> >  };
> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h
> > index 57d11a902c5d..978e12c8e1d3 100644
> > --- a/drivers/peci/internal.h
> > +++ b/drivers/peci/internal.h
> > @@ -8,6 +8,7 @@
> >  #include <linux/types.h>
> > 
> >  struct peci_controller;
> > +struct attribute_group;
> >  struct peci_device;
> >  struct peci_request;
> > 
> > @@ -19,12 +20,16 @@ struct peci_request *peci_request_alloc(struct
> > peci_device *device, u8 tx_len, u
> >  void peci_request_free(struct peci_request *req);
> > 
> >  extern struct device_type peci_device_type;
> > +extern const struct attribute_group *peci_device_groups[];
> > 
> >  int peci_device_create(struct peci_controller *controller, u8 addr);
> >  void peci_device_destroy(struct peci_device *device);
> > 
> >  extern struct bus_type peci_bus_type;
> > +extern const struct attribute_group *peci_bus_groups[];
> 
> To me, sysfs.c is small enough to just fold into core.c, then no need
> to declare public attribute arrays like this, but up to you if you
> prefer the sysfs.c split.

Left the sysfs split for now.

> 
> > 
> >  extern struct device_type peci_controller_type;
> > 
> > +int peci_controller_scan_devices(struct peci_controller *controller);
> > +
> >  #endif /* __PECI_INTERNAL_H */
> > diff --git a/drivers/peci/sysfs.c b/drivers/peci/sysfs.c
> > new file mode 100644
> > index 000000000000..db9ef05776e3
> > --- /dev/null
> > +++ b/drivers/peci/sysfs.c
> > @@ -0,0 +1,82 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2021 Intel Corporation
> > +
> > +#include <linux/device.h>
> > +#include <linux/kernel.h>
> > +#include <linux/peci.h>
> > +
> > +#include "internal.h"
> > +
> > +static int rescan_controller(struct device *dev, void *data)
> > +{
> > +       if (dev->type != &peci_controller_type)
> > +               return 0;
> > +
> > +       return peci_controller_scan_devices(to_peci_controller(dev));
> > +}
> > +
> > +static ssize_t rescan_store(struct bus_type *bus, const char *buf, size_t
> > count)
> > +{
> > +       bool res;
> > +       int ret;
> > +
> > +       ret = kstrtobool(buf, &res);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (!res)
> > +               return count;
> > +
> > +       ret = bus_for_each_dev(&peci_bus_type, NULL, NULL,
> > rescan_controller);
> > +       if (ret)
> > +               return ret;
> > +
> > +       return count;
> > +}
> > +static BUS_ATTR_WO(rescan);
> > +
> > +static struct attribute *peci_bus_attrs[] = {
> > +       &bus_attr_rescan.attr,
> > +       NULL
> > +};
> > +
> > +static const struct attribute_group peci_bus_group = {
> > +       .attrs = peci_bus_attrs,
> > +};
> > +
> > +const struct attribute_group *peci_bus_groups[] = {
> > +       &peci_bus_group,
> > +       NULL
> > +};
> > +
> > +static ssize_t remove_store(struct device *dev, struct device_attribute
> > *attr,
> > +                           const char *buf, size_t count)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +       bool res;
> > +       int ret;
> > +
> > +       ret = kstrtobool(buf, &res);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (res && device_remove_file_self(dev, attr))
> > +               peci_device_destroy(device);
> 
> How do you solve races between sysfs device remove and controller
> device remove? Looks like double-free at first glance. Have a look at
> the  kill_device() helper as one way to resolve this double-delete
> race..

Done.

Thanks
-Iwona

> 
> > +
> > +       return count;
> > +}
> > +static DEVICE_ATTR_IGNORE_LOCKDEP(remove, 0200, NULL, remove_store);
> > +
> > +static struct attribute *peci_device_attrs[] = {
> > +       &dev_attr_remove.attr,
> > +       NULL
> > +};
> > +
> > +static const struct attribute_group peci_device_group = {
> > +       .attrs = peci_device_attrs,
> > +};
> > +
> > +const struct attribute_group *peci_device_groups[] = {
> > +       &peci_device_group,
> > +       NULL
> > +};
> > --
> > 2.31.1
> > 
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

WARNING: multiple messages have this Message-ID (diff)
From: "Winiarska, Iwona" <iwona.winiarska@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>
Cc: "corbet@lwn.net" <corbet@lwn.net>,
	"jae.hyun.yoo@linux.intel.com" <jae.hyun.yoo@linux.intel.com>,
	"d.mueller@elsoft.ch" <d.mueller@elsoft.ch>,
	"linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"andrew@aj.id.au" <andrew@aj.id.au>,
	"Luck, Tony" <tony.luck@intel.com>,
	"Lutomirski, Andy" <luto@kernel.org>,
	"andriy.shevchenko@linux.intel.com" 
	<andriy.shevchenko@linux.intel.com>,
	"mchehab@kernel.org" <mchehab@kernel.org>,
	"jdelvare@suse.com" <jdelvare@suse.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"olof@lixom.net" <olof@lixom.net>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"linux@roeck-us.net" <linux@roeck-us.net>,
	"zweiss@equinix.com" <zweiss@equinix.com>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"joel@jms.id.au" <joel@jms.id.au>,
	"yazen.ghannam@amd.com" <yazen.ghannam@amd.com>,
	"linux-arm-kernel@lists.infradead.org" 
	<linux-arm-kernel@lists.infradead.org>,
	"pierre-louis.bossart@linux.intel.com" 
	<pierre-louis.bossart@linux.intel.com>,
	"x86@kernel.org" <x86@kernel.org>, "bp@alien8.de" <bp@alien8.de>
Subject: Re: [PATCH v2 09/15] peci: Add sysfs interface for PECI bus
Date: Mon, 15 Nov 2021 22:19:04 +0000	[thread overview]
Message-ID: <0fb36e270cd497ade90eb0a4e9882819af3472dd.camel@intel.com> (raw)
In-Reply-To: <CAPcyv4hhtTi+dKspjoamYj53GxT4Ot_1pG5-eavUJdihD8iAEg@mail.gmail.com>

On Fri, 2021-08-27 at 12:11 -0700, Dan Williams wrote:
> On Tue, Aug 3, 2021 at 4:35 AM Iwona Winiarska
> <iwona.winiarska@intel.com> wrote:
> > 
> > PECI devices may not be discoverable at the time when PECI controller is
> > being added (e.g. BMC can boot up when the Host system is still in S5).
> > Since we currently don't have the capabilities to figure out the Host
> > system state inside the PECI subsystem itself, we have to rely on
> > userspace to do it for us.
> > 
> > In the future, PECI subsystem may be expanded with mechanisms that allow
> > us to avoid depending on userspace interaction (e.g. CPU presence could
> > be detected using GPIO, and the information on whether it's discoverable
> > could be obtained over IPMI).
> 
> Thanks for this detail.
> 
> > Unfortunately, those methods may ultimately not be available (support
> > will vary from platform to platform), which means that we still need
> > platform independent method triggered by userspace.
> > 
> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
> > ---
> >  Documentation/ABI/testing/sysfs-bus-peci | 16 +++++
> >  drivers/peci/Makefile                    |  2 +-
> >  drivers/peci/core.c                      |  3 +-
> >  drivers/peci/device.c                    |  1 +
> >  drivers/peci/internal.h                  |  5 ++
> >  drivers/peci/sysfs.c                     | 82 ++++++++++++++++++++++++
> >  6 files changed, 107 insertions(+), 2 deletions(-)
> >  create mode 100644 Documentation/ABI/testing/sysfs-bus-peci
> >  create mode 100644 drivers/peci/sysfs.c
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-bus-peci
> > b/Documentation/ABI/testing/sysfs-bus-peci
> > new file mode 100644
> > index 000000000000..56c2b2216bbd
> > --- /dev/null
> > +++ b/Documentation/ABI/testing/sysfs-bus-peci
> > @@ -0,0 +1,16 @@
> > +What:          /sys/bus/peci/rescan
> > +Date:          July 2021
> > +KernelVersion: 5.15
> > +Contact:       Iwona Winiarska <iwona.winiarska@intel.com>
> > +Description:
> > +               Writing a non-zero value to this attribute will
> > +               initiate scan for PECI devices on all PECI controllers
> > +               in the system.
> > +
> > +What:          /sys/bus/peci/devices/<controller_id>-<device_addr>/remove
> > +Date:          July 2021
> > +KernelVersion: 5.15
> > +Contact:       Iwona Winiarska <iwona.winiarska@intel.com>
> > +Description:
> > +               Writing a non-zero value to this attribute will
> > +               remove the PECI device and any of its children.
> > diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile
> > index c5f9d3fe21bb..917f689e147a 100644
> > --- a/drivers/peci/Makefile
> > +++ b/drivers/peci/Makefile
> > @@ -1,7 +1,7 @@
> >  # SPDX-License-Identifier: GPL-2.0-only
> > 
> >  # Core functionality
> > -peci-y := core.o request.o device.o
> > +peci-y := core.o request.o device.o sysfs.o
> >  obj-$(CONFIG_PECI) += peci.o
> > 
> >  # Hardware specific bus drivers
> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c
> > index d143f1a7fe98..c473acb3c2a0 100644
> > --- a/drivers/peci/core.c
> > +++ b/drivers/peci/core.c
> > @@ -34,7 +34,7 @@ struct device_type peci_controller_type = {
> >         .release        = peci_controller_dev_release,
> >  };
> > 
> > -static int peci_controller_scan_devices(struct peci_controller *controller)
> > +int peci_controller_scan_devices(struct peci_controller *controller)
> >  {
> >         int ret;
> >         u8 addr;
> > @@ -159,6 +159,7 @@ EXPORT_SYMBOL_NS_GPL(devm_peci_controller_add, PECI);
> > 
> >  struct bus_type peci_bus_type = {
> >         .name           = "peci",
> > +       .bus_groups     = peci_bus_groups,
> >  };
> > 
> >  static int __init peci_init(void)
> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c
> > index 32811248997b..d77d9dabd51e 100644
> > --- a/drivers/peci/device.c
> > +++ b/drivers/peci/device.c
> > @@ -110,5 +110,6 @@ static void peci_device_release(struct device *dev)
> >  }
> > 
> >  struct device_type peci_device_type = {
> > +       .groups         = peci_device_groups,
> >         .release        = peci_device_release,
> >  };
> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h
> > index 57d11a902c5d..978e12c8e1d3 100644
> > --- a/drivers/peci/internal.h
> > +++ b/drivers/peci/internal.h
> > @@ -8,6 +8,7 @@
> >  #include <linux/types.h>
> > 
> >  struct peci_controller;
> > +struct attribute_group;
> >  struct peci_device;
> >  struct peci_request;
> > 
> > @@ -19,12 +20,16 @@ struct peci_request *peci_request_alloc(struct
> > peci_device *device, u8 tx_len, u
> >  void peci_request_free(struct peci_request *req);
> > 
> >  extern struct device_type peci_device_type;
> > +extern const struct attribute_group *peci_device_groups[];
> > 
> >  int peci_device_create(struct peci_controller *controller, u8 addr);
> >  void peci_device_destroy(struct peci_device *device);
> > 
> >  extern struct bus_type peci_bus_type;
> > +extern const struct attribute_group *peci_bus_groups[];
> 
> To me, sysfs.c is small enough to just fold into core.c, then no need
> to declare public attribute arrays like this, but up to you if you
> prefer the sysfs.c split.

Left the sysfs split for now.

> 
> > 
> >  extern struct device_type peci_controller_type;
> > 
> > +int peci_controller_scan_devices(struct peci_controller *controller);
> > +
> >  #endif /* __PECI_INTERNAL_H */
> > diff --git a/drivers/peci/sysfs.c b/drivers/peci/sysfs.c
> > new file mode 100644
> > index 000000000000..db9ef05776e3
> > --- /dev/null
> > +++ b/drivers/peci/sysfs.c
> > @@ -0,0 +1,82 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2021 Intel Corporation
> > +
> > +#include <linux/device.h>
> > +#include <linux/kernel.h>
> > +#include <linux/peci.h>
> > +
> > +#include "internal.h"
> > +
> > +static int rescan_controller(struct device *dev, void *data)
> > +{
> > +       if (dev->type != &peci_controller_type)
> > +               return 0;
> > +
> > +       return peci_controller_scan_devices(to_peci_controller(dev));
> > +}
> > +
> > +static ssize_t rescan_store(struct bus_type *bus, const char *buf, size_t
> > count)
> > +{
> > +       bool res;
> > +       int ret;
> > +
> > +       ret = kstrtobool(buf, &res);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (!res)
> > +               return count;
> > +
> > +       ret = bus_for_each_dev(&peci_bus_type, NULL, NULL,
> > rescan_controller);
> > +       if (ret)
> > +               return ret;
> > +
> > +       return count;
> > +}
> > +static BUS_ATTR_WO(rescan);
> > +
> > +static struct attribute *peci_bus_attrs[] = {
> > +       &bus_attr_rescan.attr,
> > +       NULL
> > +};
> > +
> > +static const struct attribute_group peci_bus_group = {
> > +       .attrs = peci_bus_attrs,
> > +};
> > +
> > +const struct attribute_group *peci_bus_groups[] = {
> > +       &peci_bus_group,
> > +       NULL
> > +};
> > +
> > +static ssize_t remove_store(struct device *dev, struct device_attribute
> > *attr,
> > +                           const char *buf, size_t count)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +       bool res;
> > +       int ret;
> > +
> > +       ret = kstrtobool(buf, &res);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (res && device_remove_file_self(dev, attr))
> > +               peci_device_destroy(device);
> 
> How do you solve races between sysfs device remove and controller
> device remove? Looks like double-free at first glance. Have a look at
> the  kill_device() helper as one way to resolve this double-delete
> race..

Done.

Thanks
-Iwona

> 
> > +
> > +       return count;
> > +}
> > +static DEVICE_ATTR_IGNORE_LOCKDEP(remove, 0200, NULL, remove_store);
> > +
> > +static struct attribute *peci_device_attrs[] = {
> > +       &dev_attr_remove.attr,
> > +       NULL
> > +};
> > +
> > +static const struct attribute_group peci_device_group = {
> > +       .attrs = peci_device_attrs,
> > +};
> > +
> > +const struct attribute_group *peci_device_groups[] = {
> > +       &peci_device_group,
> > +       NULL
> > +};
> > --
> > 2.31.1
> > 

WARNING: multiple messages have this Message-ID (diff)
From: "Winiarska, Iwona" <iwona.winiarska@intel.com>
To: "Williams, Dan J" <dan.j.williams@intel.com>
Cc: "linux-aspeed@lists.ozlabs.org" <linux-aspeed@lists.ozlabs.org>,
	"linux-doc@vger.kernel.org" <linux-doc@vger.kernel.org>,
	"zweiss@equinix.com" <zweiss@equinix.com>,
	"jae.hyun.yoo@linux.intel.com" <jae.hyun.yoo@linux.intel.com>,
	"andriy.shevchenko@linux.intel.com"
	<andriy.shevchenko@linux.intel.com>,
	"corbet@lwn.net" <corbet@lwn.net>,
	"openbmc@lists.ozlabs.org" <openbmc@lists.ozlabs.org>,
	"x86@kernel.org" <x86@kernel.org>,
	"pierre-louis.bossart@linux.intel.com"
	<pierre-louis.bossart@linux.intel.com>,
	"mingo@redhat.com" <mingo@redhat.com>,
	"linux@roeck-us.net" <linux@roeck-us.net>,
	"devicetree@vger.kernel.org" <devicetree@vger.kernel.org>,
	"jdelvare@suse.com" <jdelvare@suse.com>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"robh+dt@kernel.org" <robh+dt@kernel.org>,
	"bp@alien8.de" <bp@alien8.de>,
	"Lutomirski, Andy" <luto@kernel.org>,
	"tglx@linutronix.de" <tglx@linutronix.de>,
	"mchehab@kernel.org" <mchehab@kernel.org>,
	"linux-arm-kernel@lists.infradead.org"
	<linux-arm-kernel@lists.infradead.org>,
	"linux-hwmon@vger.kernel.org" <linux-hwmon@vger.kernel.org>,
	"Luck, Tony" <tony.luck@intel.com>,
	"andrew@aj.id.au" <andrew@aj.id.au>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"rdunlap@infradead.org" <rdunlap@infradead.org>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"yazen.ghannam@amd.com" <yazen.ghannam@amd.com>,
	"olof@lixom.net" <olof@lixom.net>
Subject: Re: [PATCH v2 09/15] peci: Add sysfs interface for PECI bus
Date: Mon, 15 Nov 2021 22:19:04 +0000	[thread overview]
Message-ID: <0fb36e270cd497ade90eb0a4e9882819af3472dd.camel@intel.com> (raw)
In-Reply-To: <CAPcyv4hhtTi+dKspjoamYj53GxT4Ot_1pG5-eavUJdihD8iAEg@mail.gmail.com>

On Fri, 2021-08-27 at 12:11 -0700, Dan Williams wrote:
> On Tue, Aug 3, 2021 at 4:35 AM Iwona Winiarska
> <iwona.winiarska@intel.com> wrote:
> > 
> > PECI devices may not be discoverable at the time when PECI controller is
> > being added (e.g. BMC can boot up when the Host system is still in S5).
> > Since we currently don't have the capabilities to figure out the Host
> > system state inside the PECI subsystem itself, we have to rely on
> > userspace to do it for us.
> > 
> > In the future, PECI subsystem may be expanded with mechanisms that allow
> > us to avoid depending on userspace interaction (e.g. CPU presence could
> > be detected using GPIO, and the information on whether it's discoverable
> > could be obtained over IPMI).
> 
> Thanks for this detail.
> 
> > Unfortunately, those methods may ultimately not be available (support
> > will vary from platform to platform), which means that we still need
> > platform independent method triggered by userspace.
> > 
> > Signed-off-by: Iwona Winiarska <iwona.winiarska@intel.com>
> > ---
> >  Documentation/ABI/testing/sysfs-bus-peci | 16 +++++
> >  drivers/peci/Makefile                    |  2 +-
> >  drivers/peci/core.c                      |  3 +-
> >  drivers/peci/device.c                    |  1 +
> >  drivers/peci/internal.h                  |  5 ++
> >  drivers/peci/sysfs.c                     | 82 ++++++++++++++++++++++++
> >  6 files changed, 107 insertions(+), 2 deletions(-)
> >  create mode 100644 Documentation/ABI/testing/sysfs-bus-peci
> >  create mode 100644 drivers/peci/sysfs.c
> > 
> > diff --git a/Documentation/ABI/testing/sysfs-bus-peci
> > b/Documentation/ABI/testing/sysfs-bus-peci
> > new file mode 100644
> > index 000000000000..56c2b2216bbd
> > --- /dev/null
> > +++ b/Documentation/ABI/testing/sysfs-bus-peci
> > @@ -0,0 +1,16 @@
> > +What:          /sys/bus/peci/rescan
> > +Date:          July 2021
> > +KernelVersion: 5.15
> > +Contact:       Iwona Winiarska <iwona.winiarska@intel.com>
> > +Description:
> > +               Writing a non-zero value to this attribute will
> > +               initiate scan for PECI devices on all PECI controllers
> > +               in the system.
> > +
> > +What:          /sys/bus/peci/devices/<controller_id>-<device_addr>/remove
> > +Date:          July 2021
> > +KernelVersion: 5.15
> > +Contact:       Iwona Winiarska <iwona.winiarska@intel.com>
> > +Description:
> > +               Writing a non-zero value to this attribute will
> > +               remove the PECI device and any of its children.
> > diff --git a/drivers/peci/Makefile b/drivers/peci/Makefile
> > index c5f9d3fe21bb..917f689e147a 100644
> > --- a/drivers/peci/Makefile
> > +++ b/drivers/peci/Makefile
> > @@ -1,7 +1,7 @@
> >  # SPDX-License-Identifier: GPL-2.0-only
> > 
> >  # Core functionality
> > -peci-y := core.o request.o device.o
> > +peci-y := core.o request.o device.o sysfs.o
> >  obj-$(CONFIG_PECI) += peci.o
> > 
> >  # Hardware specific bus drivers
> > diff --git a/drivers/peci/core.c b/drivers/peci/core.c
> > index d143f1a7fe98..c473acb3c2a0 100644
> > --- a/drivers/peci/core.c
> > +++ b/drivers/peci/core.c
> > @@ -34,7 +34,7 @@ struct device_type peci_controller_type = {
> >         .release        = peci_controller_dev_release,
> >  };
> > 
> > -static int peci_controller_scan_devices(struct peci_controller *controller)
> > +int peci_controller_scan_devices(struct peci_controller *controller)
> >  {
> >         int ret;
> >         u8 addr;
> > @@ -159,6 +159,7 @@ EXPORT_SYMBOL_NS_GPL(devm_peci_controller_add, PECI);
> > 
> >  struct bus_type peci_bus_type = {
> >         .name           = "peci",
> > +       .bus_groups     = peci_bus_groups,
> >  };
> > 
> >  static int __init peci_init(void)
> > diff --git a/drivers/peci/device.c b/drivers/peci/device.c
> > index 32811248997b..d77d9dabd51e 100644
> > --- a/drivers/peci/device.c
> > +++ b/drivers/peci/device.c
> > @@ -110,5 +110,6 @@ static void peci_device_release(struct device *dev)
> >  }
> > 
> >  struct device_type peci_device_type = {
> > +       .groups         = peci_device_groups,
> >         .release        = peci_device_release,
> >  };
> > diff --git a/drivers/peci/internal.h b/drivers/peci/internal.h
> > index 57d11a902c5d..978e12c8e1d3 100644
> > --- a/drivers/peci/internal.h
> > +++ b/drivers/peci/internal.h
> > @@ -8,6 +8,7 @@
> >  #include <linux/types.h>
> > 
> >  struct peci_controller;
> > +struct attribute_group;
> >  struct peci_device;
> >  struct peci_request;
> > 
> > @@ -19,12 +20,16 @@ struct peci_request *peci_request_alloc(struct
> > peci_device *device, u8 tx_len, u
> >  void peci_request_free(struct peci_request *req);
> > 
> >  extern struct device_type peci_device_type;
> > +extern const struct attribute_group *peci_device_groups[];
> > 
> >  int peci_device_create(struct peci_controller *controller, u8 addr);
> >  void peci_device_destroy(struct peci_device *device);
> > 
> >  extern struct bus_type peci_bus_type;
> > +extern const struct attribute_group *peci_bus_groups[];
> 
> To me, sysfs.c is small enough to just fold into core.c, then no need
> to declare public attribute arrays like this, but up to you if you
> prefer the sysfs.c split.

Left the sysfs split for now.

> 
> > 
> >  extern struct device_type peci_controller_type;
> > 
> > +int peci_controller_scan_devices(struct peci_controller *controller);
> > +
> >  #endif /* __PECI_INTERNAL_H */
> > diff --git a/drivers/peci/sysfs.c b/drivers/peci/sysfs.c
> > new file mode 100644
> > index 000000000000..db9ef05776e3
> > --- /dev/null
> > +++ b/drivers/peci/sysfs.c
> > @@ -0,0 +1,82 @@
> > +// SPDX-License-Identifier: GPL-2.0-only
> > +// Copyright (c) 2021 Intel Corporation
> > +
> > +#include <linux/device.h>
> > +#include <linux/kernel.h>
> > +#include <linux/peci.h>
> > +
> > +#include "internal.h"
> > +
> > +static int rescan_controller(struct device *dev, void *data)
> > +{
> > +       if (dev->type != &peci_controller_type)
> > +               return 0;
> > +
> > +       return peci_controller_scan_devices(to_peci_controller(dev));
> > +}
> > +
> > +static ssize_t rescan_store(struct bus_type *bus, const char *buf, size_t
> > count)
> > +{
> > +       bool res;
> > +       int ret;
> > +
> > +       ret = kstrtobool(buf, &res);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (!res)
> > +               return count;
> > +
> > +       ret = bus_for_each_dev(&peci_bus_type, NULL, NULL,
> > rescan_controller);
> > +       if (ret)
> > +               return ret;
> > +
> > +       return count;
> > +}
> > +static BUS_ATTR_WO(rescan);
> > +
> > +static struct attribute *peci_bus_attrs[] = {
> > +       &bus_attr_rescan.attr,
> > +       NULL
> > +};
> > +
> > +static const struct attribute_group peci_bus_group = {
> > +       .attrs = peci_bus_attrs,
> > +};
> > +
> > +const struct attribute_group *peci_bus_groups[] = {
> > +       &peci_bus_group,
> > +       NULL
> > +};
> > +
> > +static ssize_t remove_store(struct device *dev, struct device_attribute
> > *attr,
> > +                           const char *buf, size_t count)
> > +{
> > +       struct peci_device *device = to_peci_device(dev);
> > +       bool res;
> > +       int ret;
> > +
> > +       ret = kstrtobool(buf, &res);
> > +       if (ret)
> > +               return ret;
> > +
> > +       if (res && device_remove_file_self(dev, attr))
> > +               peci_device_destroy(device);
> 
> How do you solve races between sysfs device remove and controller
> device remove? Looks like double-free at first glance. Have a look at
> the  kill_device() helper as one way to resolve this double-delete
> race..

Done.

Thanks
-Iwona

> 
> > +
> > +       return count;
> > +}
> > +static DEVICE_ATTR_IGNORE_LOCKDEP(remove, 0200, NULL, remove_store);
> > +
> > +static struct attribute *peci_device_attrs[] = {
> > +       &dev_attr_remove.attr,
> > +       NULL
> > +};
> > +
> > +static const struct attribute_group peci_device_group = {
> > +       .attrs = peci_device_attrs,
> > +};
> > +
> > +const struct attribute_group *peci_device_groups[] = {
> > +       &peci_device_group,
> > +       NULL
> > +};
> > --
> > 2.31.1
> > 

  reply	other threads:[~2021-11-15 22:20 UTC|newest]

Thread overview: 147+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-08-03 11:31 [PATCH v2 00/15] Introduce PECI subsystem Iwona Winiarska
2021-08-03 11:31 ` Iwona Winiarska
2021-08-03 11:31 ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 01/15] x86/cpu: Move intel-family to arch-independent headers Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-10-04 19:03   ` Borislav Petkov
2021-10-04 19:03     ` Borislav Petkov
2021-10-04 19:03     ` Borislav Petkov
2021-10-11 19:21     ` Winiarska, Iwona
2021-10-11 19:21       ` Winiarska, Iwona
2021-10-11 19:21       ` Winiarska, Iwona
2021-10-11 19:40       ` Dave Hansen
2021-10-11 19:40         ` Dave Hansen
2021-10-11 19:40         ` Dave Hansen
2021-10-11 20:53         ` Winiarska, Iwona
2021-10-11 20:53           ` Winiarska, Iwona
2021-10-11 20:53           ` Winiarska, Iwona
2021-10-11 23:12           ` Dave Hansen
2021-10-11 23:12             ` Dave Hansen
2021-10-11 23:12             ` Dave Hansen
2021-10-11 20:06       ` Borislav Petkov
2021-10-11 20:06         ` Borislav Petkov
2021-10-11 20:06         ` Borislav Petkov
2021-10-11 20:38         ` Winiarska, Iwona
2021-10-11 20:38           ` Winiarska, Iwona
2021-10-11 20:38           ` Winiarska, Iwona
2021-10-11 21:31           ` Borislav Petkov
2021-10-11 21:31             ` Borislav Petkov
2021-10-11 21:31             ` Borislav Petkov
2021-10-12 23:15             ` Winiarska, Iwona
2021-10-12 23:15               ` Winiarska, Iwona
2021-10-12 23:15               ` Winiarska, Iwona
2021-10-13  6:42               ` Borislav Petkov
2021-10-13  6:42                 ` Borislav Petkov
2021-10-13  6:42                 ` Borislav Petkov
2021-08-03 11:31 ` [PATCH v2 02/15] x86/cpu: Extract cpuid helpers to arch-independent Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-10-04 19:08   ` Borislav Petkov
2021-10-04 19:08     ` Borislav Petkov
2021-10-04 19:08     ` Borislav Petkov
2021-10-11 19:32     ` Winiarska, Iwona
2021-10-11 19:32       ` Winiarska, Iwona
2021-10-11 19:32       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 03/15] dt-bindings: Add generic bindings for PECI Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-11 18:11   ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-03 11:31 ` [PATCH v2 04/15] dt-bindings: Add bindings for peci-aspeed Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-11 18:11   ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-11 18:11     ` Rob Herring
2021-08-03 11:31 ` [PATCH v2 05/15] ARM: dts: aspeed: Add PECI controller nodes Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 06/15] peci: Add core infrastructure Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-25 22:58   ` Dan Williams
2021-08-25 22:58     ` Dan Williams
2021-08-25 22:58     ` Dan Williams
2021-08-26 22:40     ` Winiarska, Iwona
2021-08-26 22:40       ` Winiarska, Iwona
2021-08-26 22:40       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 07/15] peci: Add peci-aspeed controller driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-26  1:35   ` Dan Williams
2021-08-26  1:35     ` Dan Williams
2021-08-26  1:35     ` Dan Williams
2021-08-26 23:54     ` Winiarska, Iwona
2021-08-26 23:54       ` Winiarska, Iwona
2021-08-26 23:54       ` Winiarska, Iwona
2021-08-27 16:24       ` Dan Williams
2021-08-27 16:24         ` Dan Williams
2021-08-27 16:24         ` Dan Williams
2021-08-29 19:42         ` Winiarska, Iwona
2021-08-29 19:42           ` Winiarska, Iwona
2021-08-29 19:42           ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 08/15] peci: Add device detection Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-27 19:01   ` Dan Williams
2021-08-27 19:01     ` Dan Williams
2021-08-27 19:01     ` Dan Williams
2021-11-15 22:18     ` Winiarska, Iwona
2021-11-15 22:18       ` Winiarska, Iwona
2021-11-15 22:18       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 09/15] peci: Add sysfs interface for PECI bus Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-27 19:11   ` Dan Williams
2021-08-27 19:11     ` Dan Williams
2021-08-27 19:11     ` Dan Williams
2021-11-15 22:19     ` Winiarska, Iwona [this message]
2021-11-15 22:19       ` Winiarska, Iwona
2021-11-15 22:19       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 10/15] peci: Add support for PECI device drivers Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-27 21:19   ` Dan Williams
2021-08-27 21:19     ` Dan Williams
2021-08-27 21:19     ` Dan Williams
2021-11-15 22:20     ` Winiarska, Iwona
2021-11-15 22:20       ` Winiarska, Iwona
2021-11-15 22:20       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 11/15] peci: Add peci-cpu driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 12/15] hwmon: peci: Add cputemp driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 15:24   ` Guenter Roeck
2021-08-03 15:24     ` Guenter Roeck
2021-08-03 15:24     ` Guenter Roeck
2021-08-04 10:43     ` Winiarska, Iwona
2021-08-04 10:43       ` Winiarska, Iwona
2021-08-04 10:43       ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 13/15] hwmon: peci: Add dimmtemp driver Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 15:39   ` Guenter Roeck
2021-08-03 15:39     ` Guenter Roeck
2021-08-03 15:39     ` Guenter Roeck
2021-08-04 10:46     ` Winiarska, Iwona
2021-08-04 10:46       ` Winiarska, Iwona
2021-08-04 10:46       ` Winiarska, Iwona
2021-08-04 17:33       ` Guenter Roeck
2021-08-04 17:33         ` Guenter Roeck
2021-08-04 17:33         ` Guenter Roeck
2021-08-05 21:48         ` Winiarska, Iwona
2021-08-05 21:48           ` Winiarska, Iwona
2021-08-05 21:48           ` Winiarska, Iwona
2021-08-03 11:31 ` [PATCH v2 14/15] docs: hwmon: Document PECI drivers Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31 ` [PATCH v2 15/15] docs: Add PECI documentation Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-03 11:31   ` Iwona Winiarska
2021-08-05 12:17 ` [PATCH v2 00/15] Introduce PECI subsystem Greg Kroah-Hartman
2021-08-05 12:17   ` Greg Kroah-Hartman
2021-08-05 12:17   ` Greg Kroah-Hartman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=0fb36e270cd497ade90eb0a4e9882819af3472dd.camel@intel.com \
    --to=iwona.winiarska@intel.com \
    --cc=andrew@aj.id.au \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=arnd@arndb.de \
    --cc=bp@alien8.de \
    --cc=corbet@lwn.net \
    --cc=d.mueller@elsoft.ch \
    --cc=dan.j.williams@intel.com \
    --cc=devicetree@vger.kernel.org \
    --cc=gregkh@linuxfoundation.org \
    --cc=jae.hyun.yoo@linux.intel.com \
    --cc=jdelvare@suse.com \
    --cc=joel@jms.id.au \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-aspeed@lists.ozlabs.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-hwmon@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=luto@kernel.org \
    --cc=mchehab@kernel.org \
    --cc=mingo@redhat.com \
    --cc=olof@lixom.net \
    --cc=openbmc@lists.ozlabs.org \
    --cc=pierre-louis.bossart@linux.intel.com \
    --cc=rdunlap@infradead.org \
    --cc=robh+dt@kernel.org \
    --cc=tglx@linutronix.de \
    --cc=tony.luck@intel.com \
    --cc=x86@kernel.org \
    --cc=yazen.ghannam@amd.com \
    --cc=zweiss@equinix.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.