Re: [PATCH 2/2 v4] staging: unisys: move parahotplug to sysfs

2014-07-27 Thread Greg KH
On Thu, Jul 24, 2014 at 10:55:09PM -0400, Benjamin Romer wrote:
 Move the /proc/visorchipset/parahotplug interface to sysfs under
 /sys/devices/platform/visorchipset/parahotplug/deviceenabled and
 /sys/devices/platform/visorchipset/parahotplug/devicedisabled.
 
 The parahotplug interface is used to deal with SR-IOV recovery situations on
 s-Par guest partitions. The command service partition will send a message to a
 guest when an SR-IOV device that guest is using needs to be temporarily 
 removed.
 The message triggers a udev event that will cause a recovery script to run.
 When that script has completed its work, it will write to one of the
 parahotplug interfaces to send a message back to Command, indicating that the
 recovery action has completed.
 
 When a guest that is sharing an SR-IOV device is restarted, that guest will
 take down the PF driver on the device, but any guests with VFs will not know
 that their device needs to be reset as well. The recovery script makes it so
 the device will be shut down fully and then restarted after the sharing guest
 comes back up, and ensures that the timing is correct.
 
 Moving this interface to sysfs orphans the visorchipset_proc_read_writeonly()
 function, so it is also removed.
 
 Signed-off-by: Benjamin Romer benjamin.ro...@unisys.com
 ---
 v4: this patch is unchanged from v3.
 v3: The interface was split in two, so only the ID need be passed as a 
 parameter
 to use the interfaces. Additional documentation was added.
 v2: attribute creation was fixed and checks for controlvm_channel pointer were
 removed.
 
  .../unisys/visorchipset/visorchipset_main.c| 99 
 +-
  1 file changed, 39 insertions(+), 60 deletions(-)
 
 diff --git a/drivers/staging/unisys/visorchipset/visorchipset_main.c 
 b/drivers/staging/unisys/visorchipset/visorchipset_main.c
 index 13f4da8..7a7f515 100644
 --- a/drivers/staging/unisys/visorchipset/visorchipset_main.c
 +++ b/drivers/staging/unisys/visorchipset/visorchipset_main.c
 @@ -98,19 +98,11 @@ static CONTROLVM_MESSAGE_PACKET g_DeviceChangeStatePacket;
  #define is_diagpool_channel(channel_type_guid) \
(uuid_le_cmp(channel_type_guid, UltraDiagPoolChannelProtocolGuid) == 0)
  
 -#define VISORCHIPSET_PARAHOTPLUG_PROC_ENTRY_FN parahotplug
 -static struct proc_dir_entry *parahotplug_proc_dir;
 -
  static LIST_HEAD(BusInfoList);
  static LIST_HEAD(DevInfoList);
  
 -static struct proc_dir_entry *ProcDir;
  static VISORCHANNEL *ControlVm_channel;
  
 -static ssize_t visorchipset_proc_read_writeonly(struct file *file,
 - char __user *buf,
 - size_t len, loff_t *offset);
 -
  typedef struct {
   U8 __iomem *ptr;/* pointer to base address of payload pool */
   U64 offset; /* offset from beginning of controlvm
 @@ -293,6 +285,14 @@ static ssize_t chipsetready_store(struct device *dev,
   struct device_attribute *attr, const char *buf, size_t count);
  static DEVICE_ATTR_WO(chipsetready);
  
 +static ssize_t devicedisabled_store(struct device *dev,
 + struct device_attribute *attr, const char *buf, size_t count);
 +static DEVICE_ATTR_WO(devicedisabled);
 +
 +static ssize_t deviceenabled_store(struct device *dev,
 + struct device_attribute *attr, const char *buf, size_t count);
 +static DEVICE_ATTR_WO(deviceenabled);
 +
  static struct attribute *visorchipset_install_attrs[] = {
   dev_attr_toolaction.attr,
   dev_attr_boottotool.attr,
 @@ -317,9 +317,21 @@ static struct attribute_group visorchipset_guest_group = 
 {
   .attrs = visorchipset_guest_attrs
  };
  
 +static struct attribute *visorchipset_parahotplug_attrs[] = {
 + dev_attr_devicedisabled.attr,
 + dev_attr_deviceenabled.attr,
 + NULL
 +};
 +
 +static struct attribute_group visorchipset_parahotplug_group = {
 + .name = parahotplug,
 + .attrs = visorchipset_parahotplug_attrs
 +};
 +
  static const struct attribute_group *visorchipset_dev_groups[] = {
   visorchipset_install_group,
   visorchipset_guest_group,
 + visorchipset_parahotplug_group,
   NULL
  };
  
 @@ -1723,53 +1735,36 @@ parahotplug_process_message(CONTROLVM_MESSAGE *inmsg)
   }
  }
  
 -/*
 - * Gets called when the udev script writes to
 - * /proc/visorchipset/parahotplug.  Expects input in the form of id
 - * active where id is the identifier passed to the script that
 - * matches a request on the request list, and active is 0 or 1
 - * indicating whether the device is now enabled or not.
 +/* The parahotplug/devicedisabled interface gets called by our support script
 + * when an SR-IOV device has been shut down. The ID is passed to the script
 + * and then passed back when the device has been removed.
   */
 -static ssize_t
 -parahotplug_proc_write(struct file *file, const char __user *buffer,
 -size_t count, loff_t *ppos)
 +ssize_t devicedisabled_store(struct 

[PATCH 2/2 v4] staging: unisys: move parahotplug to sysfs

2014-07-24 Thread Benjamin Romer
Move the /proc/visorchipset/parahotplug interface to sysfs under
/sys/devices/platform/visorchipset/parahotplug/deviceenabled and
/sys/devices/platform/visorchipset/parahotplug/devicedisabled.

The parahotplug interface is used to deal with SR-IOV recovery situations on
s-Par guest partitions. The command service partition will send a message to a
guest when an SR-IOV device that guest is using needs to be temporarily removed.
The message triggers a udev event that will cause a recovery script to run.
When that script has completed its work, it will write to one of the
parahotplug interfaces to send a message back to Command, indicating that the
recovery action has completed.

When a guest that is sharing an SR-IOV device is restarted, that guest will
take down the PF driver on the device, but any guests with VFs will not know
that their device needs to be reset as well. The recovery script makes it so
the device will be shut down fully and then restarted after the sharing guest
comes back up, and ensures that the timing is correct.

Moving this interface to sysfs orphans the visorchipset_proc_read_writeonly()
function, so it is also removed.

Signed-off-by: Benjamin Romer benjamin.ro...@unisys.com
---
v4: this patch is unchanged from v3.
v3: The interface was split in two, so only the ID need be passed as a parameter
to use the interfaces. Additional documentation was added.
v2: attribute creation was fixed and checks for controlvm_channel pointer were
removed.

 .../unisys/visorchipset/visorchipset_main.c| 99 +-
 1 file changed, 39 insertions(+), 60 deletions(-)

diff --git a/drivers/staging/unisys/visorchipset/visorchipset_main.c 
b/drivers/staging/unisys/visorchipset/visorchipset_main.c
index 13f4da8..7a7f515 100644
--- a/drivers/staging/unisys/visorchipset/visorchipset_main.c
+++ b/drivers/staging/unisys/visorchipset/visorchipset_main.c
@@ -98,19 +98,11 @@ static CONTROLVM_MESSAGE_PACKET g_DeviceChangeStatePacket;
 #define is_diagpool_channel(channel_type_guid) \
 (uuid_le_cmp(channel_type_guid, UltraDiagPoolChannelProtocolGuid) == 0)
 
-#define VISORCHIPSET_PARAHOTPLUG_PROC_ENTRY_FN parahotplug
-static struct proc_dir_entry *parahotplug_proc_dir;
-
 static LIST_HEAD(BusInfoList);
 static LIST_HEAD(DevInfoList);
 
-static struct proc_dir_entry *ProcDir;
 static VISORCHANNEL *ControlVm_channel;
 
-static ssize_t visorchipset_proc_read_writeonly(struct file *file,
-   char __user *buf,
-   size_t len, loff_t *offset);
-
 typedef struct {
U8 __iomem *ptr;/* pointer to base address of payload pool */
U64 offset; /* offset from beginning of controlvm
@@ -293,6 +285,14 @@ static ssize_t chipsetready_store(struct device *dev,
struct device_attribute *attr, const char *buf, size_t count);
 static DEVICE_ATTR_WO(chipsetready);
 
+static ssize_t devicedisabled_store(struct device *dev,
+   struct device_attribute *attr, const char *buf, size_t count);
+static DEVICE_ATTR_WO(devicedisabled);
+
+static ssize_t deviceenabled_store(struct device *dev,
+   struct device_attribute *attr, const char *buf, size_t count);
+static DEVICE_ATTR_WO(deviceenabled);
+
 static struct attribute *visorchipset_install_attrs[] = {
dev_attr_toolaction.attr,
dev_attr_boottotool.attr,
@@ -317,9 +317,21 @@ static struct attribute_group visorchipset_guest_group = {
.attrs = visorchipset_guest_attrs
 };
 
+static struct attribute *visorchipset_parahotplug_attrs[] = {
+   dev_attr_devicedisabled.attr,
+   dev_attr_deviceenabled.attr,
+   NULL
+};
+
+static struct attribute_group visorchipset_parahotplug_group = {
+   .name = parahotplug,
+   .attrs = visorchipset_parahotplug_attrs
+};
+
 static const struct attribute_group *visorchipset_dev_groups[] = {
visorchipset_install_group,
visorchipset_guest_group,
+   visorchipset_parahotplug_group,
NULL
 };
 
@@ -1723,53 +1735,36 @@ parahotplug_process_message(CONTROLVM_MESSAGE *inmsg)
}
 }
 
-/*
- * Gets called when the udev script writes to
- * /proc/visorchipset/parahotplug.  Expects input in the form of id
- * active where id is the identifier passed to the script that
- * matches a request on the request list, and active is 0 or 1
- * indicating whether the device is now enabled or not.
+/* The parahotplug/devicedisabled interface gets called by our support script
+ * when an SR-IOV device has been shut down. The ID is passed to the script
+ * and then passed back when the device has been removed.
  */
-static ssize_t
-parahotplug_proc_write(struct file *file, const char __user *buffer,
-  size_t count, loff_t *ppos)
+ssize_t devicedisabled_store(struct device *dev, struct device_attribute *attr,
+   const char *buf, size_t count)
 {
-   char buf[64];
uint id;
-