Re: [PATCH 1/3] resource: shared I/O region support

Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]
From: Giel van Schijndel
Date: Monday, March 29, 2010 - 10:38 am

On Mon, Mar 29, 2010 at 09:07:13AM -0700, Jesse Barnes wrote:

Sure.

(I copied Alan's signed-off-by from his reply to the patch)

Patch after this line:
========================================================================
resource: shared I/O region support

SuperIO devices share regions and use lock/unlock operations to chip
select.  We therefore need to be able to request a resource and wait for
it to be freed by whichever other SuperIO device currently hogs it.
Right now you have to poll which is horrible.

Add a MUXED field to IO port resources. If the MUXED field is set on the
resource and on the request (via request_muxed_region) then we block
until the previous owner of the muxed resource releases their region.

This allows us to implement proper resource sharing and locking for
superio chips using code of the form

enable_my_superio_dev() {
	request_muxed_region(0x44, 0x02, "superio:watchdog");
	outb() ..sequence to enable chip
}

disable_my_superio_dev() {
	outb() .. sequence of disable chip
	release_region(0x44, 0x02);
}

Signed-off-by: Giel van Schijndel <me@mortis.eu>
Signed-off-by: Alan Cox <alan@linux.intel.com>
---
 include/linux/ioport.h |    4 +++-
 kernel/resource.c      |   16 +++++++++++++++-
 2 files changed, 18 insertions(+), 2 deletions(-)

diff --git a/include/linux/ioport.h b/include/linux/ioport.h
index 71ab79d..604fd29 100644
--- a/include/linux/ioport.h
+++ b/include/linux/ioport.h
@@ -52,6 +52,7 @@ struct resource_list {
 
 #define IORESOURCE_MEM_64	0x00100000
 #define IORESOURCE_WINDOW	0x00200000	/* forwarded by bridge */
+#define IORESOURCE_MUXED	0x00400000	/* Resource is software muxed */
 
 #define IORESOURCE_EXCLUSIVE	0x08000000	/* Userland may not map this resource */
 #define IORESOURCE_DISABLED	0x10000000
@@ -141,7 +142,8 @@ static inline unsigned long resource_type(const struct resource *res)
 }
 
 /* Convenience shorthand with allocation */
-#define request_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), 0)
+#define request_region(start,n,name)		__request_region(&ioport_resource, (start), (n), (name), 0)
+#define request_muxed_region(start,n,name)	__request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED)
 #define __request_mem_region(start,n,name, excl) __request_region(&iomem_resource, (start), (n), (name), excl)
 #define request_mem_region(start,n,name) __request_region(&iomem_resource, (start), (n), (name), 0)
 #define request_mem_region_exclusive(start,n,name) \
diff --git a/kernel/resource.c b/kernel/resource.c
index 2d5be5d..ab44c7f 100644
--- a/kernel/resource.c
+++ b/kernel/resource.c
@@ -15,6 +15,7 @@
 #include <linux/spinlock.h>
 #include <linux/fs.h>
 #include <linux/proc_fs.h>
+#include <linux/sched.h>
 #include <linux/seq_file.h>
 #include <linux/device.h>
 #include <linux/pfn.h>
@@ -651,6 +652,8 @@ resource_size_t resource_alignment(struct resource *res)
  * release_region releases a matching busy region.
  */
 
+static DECLARE_WAIT_QUEUE_HEAD(muxed_resource_wait);
+
 /**
  * __request_region - create a new busy resource region
  * @parent: parent resource descriptor
@@ -663,6 +666,7 @@ struct resource * __request_region(struct resource *parent,
 				   resource_size_t start, resource_size_t n,
 				   const char *name, int flags)
 {
+	DECLARE_WAITQUEUE(wait, current);
 	struct resource *res = kzalloc(sizeof(*res), GFP_KERNEL);
 
 	if (!res)
@@ -687,7 +691,15 @@ struct resource * __request_region(struct resource *parent,
 			if (!(conflict->flags & IORESOURCE_BUSY))
 				continue;
 		}
-
+		if (conflict->flags & flags & IORESOURCE_MUXED) {
+			add_wait_queue(&muxed_resource_wait, &wait);
+			write_unlock(&resource_lock);
+			set_current_state(TASK_UNINTERRUPTIBLE);
+			schedule();
+			remove_wait_queue(&muxed_resource_wait, &wait);
+			write_lock(&resource_lock);
+			continue;
+		}
 		/* Uhhuh, that didn't work out.. */
 		kfree(res);
 		res = NULL;
@@ -761,6 +773,8 @@ void __release_region(struct resource *parent, resource_size_t start,
 				break;
 			*p = res->sibling;
 			write_unlock(&resource_lock);
+			if (res->flags & IORESOURCE_MUXED)
+				wake_up(&muxed_resource_wait);
 			kfree(res);
 			return;
 		}
-- 
1.6.4.4

-- 
Met vriendelijke groet,
With kind regards,
Giel van Schijndel
Previous message: [thread] [date] [author]
Next message: [thread] [date] [author]

Messages in current thread:
[PATCH] hwmon: f71882fg: properly acquire I/O regions whil ..., Giel van Schijndel, (Tue Mar 23, 7:12 am)
Re: [PATCH] hwmon: f71882fg: properly acquire I/O regions ..., Giel van Schijndel, (Tue Mar 23, 7:17 am)
Re: [PATCH] hwmon: f71882fg: properly acquire I/O regions ..., Giel van Schijndel, (Tue Mar 23, 4:01 pm)
[PATCH 1/4] [RFC] hwmon: f71882fg: Add support for the Fin ..., Giel van Schijndel, (Tue Mar 23, 4:12 pm)
[PATCH 2/4] hwmon: f71882fg: prepare for addition of watch ..., Giel van Schijndel, (Tue Mar 23, 4:12 pm)
[PATCH 3/4] hwmon: f71882fg: add watchdog detection code, Giel van Schijndel, (Tue Mar 23, 4:12 pm)
[PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API for F7 ..., Giel van Schijndel, (Tue Mar 23, 4:12 pm)
Re: [PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API fo ..., Giel van Schijndel, (Tue Mar 23, 4:26 pm)
Re: [PATCH] hwmon: f71882fg: properly acquire I/O regions ..., Giel van Schijndel, (Wed Mar 24, 1:46 am)
[PATCH] hwmon: f71882fg: code cleanup, Giel van Schijndel, (Wed Mar 24, 2:09 am)
[PATCH] hwmon: f71882fg: acquire I/O regions while we're w ..., Giel van Schijndel, (Wed Mar 24, 2:09 am)
Re: [PATCH 1/4] hwmon: f71882fg: Add support for the Finte ..., Giel van Schijndel, (Wed Mar 24, 2:23 am)
Re: [PATCH] hwmon: f71882fg: properly acquire I/O regions ..., Giel van Schijndel, (Wed Mar 24, 2:34 am)
Re: [PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API fo ..., Giel van Schijndel, (Wed Mar 24, 2:36 am)
Re: [PATCH] hwmon: f71882fg: code cleanup, Jean Delvare, (Wed Mar 24, 5:54 am)
Re: [PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API fo ..., Giel van Schijndel, (Wed Mar 24, 8:35 am)
Re: [PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API fo ..., Giel van Schijndel, (Wed Mar 24, 1:35 pm)
Re: [PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API fo ..., Giel van Schijndel, (Thu Mar 25, 1:54 am)
Re: [PATCH 4/4] [RFC] hwmon: f71882fg: Add watchdog API fo ..., Giel van Schijndel, (Thu Mar 25, 3:40 am)
[PATCH 1/3] resource: shared I/O region support, Giel van Schijndel, (Thu Mar 25, 6:17 am)
[PATCH 2/3] hwmon: f71882fg: use a muxed resource lock for ..., Giel van Schijndel, (Thu Mar 25, 6:17 am)
[PATCH 3/3] [RFC] watchdog: f71808e_wdt: new watchdog driv ..., Giel van Schijndel, (Thu Mar 25, 6:17 am)
Re: [PATCH 1/3] resource: shared I/O region support, Giel van Schijndel, (Thu Mar 25, 11:03 am)
Re: [PATCH 1/3] resource: shared I/O region support, Alan Cox, (Thu Mar 25, 11:16 am)
Re: [PATCH 1/3] resource: shared I/O region support, Giel van Schijndel, (Mon Mar 29, 1:18 am)
Re: [PATCH 1/3] resource: shared I/O region support, Jesse Barnes, (Mon Mar 29, 9:07 am)
Re: [PATCH 1/3] resource: shared I/O region support, Giel van Schijndel, (Mon Mar 29, 10:38 am)
Re: [PATCH 1/3] resource: shared I/O region support, Giel van Schijndel, (Mon Mar 29, 10:44 am)
Re: [PATCH 1/3] resource: shared I/O region support, H. Peter Anvin, (Mon Mar 29, 10:45 am)
Re: [PATCH 1/3] resource: shared I/O region support, Jesse Barnes, (Mon Mar 29, 10:59 am)
Re: [PATCH 1/3] resource: shared I/O region support, Jesse Barnes, (Mon Mar 29, 10:59 am)
Re: [PATCH 1/3] resource: shared I/O region support, Jesse Barnes, (Mon Mar 29, 11:06 am)
Re: [PATCH 1/3] resource: shared I/O region support, H. Peter Anvin, (Mon Mar 29, 11:17 am)
Re: [PATCH 1/3] resource: shared I/O region support, Alan Cox, (Mon Mar 29, 11:29 am)
Re: [PATCH 1/3] resource: shared I/O region support, Alan Cox, (Mon Mar 29, 11:39 am)
Re: [PATCH 1/3] resource: shared I/O region support, H. Peter Anvin, (Mon Mar 29, 11:56 am)
Re: [PATCH 3/3] [RFC] watchdog: f71808e_wdt: new watchdog ..., Giel van Schijndel, (Tue Mar 30, 2:06 am)
Re: [PATCH 1/3] resource: shared I/O region support, Jesse Barnes, (Fri Apr 2, 1:29 pm)
Re: [PATCH 2/3] hwmon: f71882fg: use a muxed resource lock ..., Giel van Schijndel, (Sun Apr 25, 3:35 am)
Re: [PATCH 3/3] [RFC] watchdog: f71808e_wdt: new watchdog ..., Wim Van Sebroeck, (Thu May 20, 12:52 am)
Re: [PATCH 3/3] [RFC] watchdog: f71808e_wdt: new watchdog ..., Giel van Schijndel, (Tue May 25, 2:08 pm)
Re: [PATCH 3/3] [RFC] watchdog: f71808e_wdt: new watchdog ..., Wim Van Sebroeck, (Wed May 26, 12:38 am)
Re: [PATCH 2/3] hwmon: f71882fg: use a muxed resource lock ..., Giel van Schijndel, (Sat Jul 31, 2:21 pm)
Re: [PATCH 3/3] [RFC] watchdog: f71808e_wdt: new watchdog ..., Giel van Schijndel, (Sat Jul 31, 2:36 pm)
Re: [PATCH 1/4] hwmon: f71882fg: Add support for the Finte ..., Giel van Schijndel, (Sat Jul 31, 4:31 pm)
Re: [PATCH 1/4] hwmon: f71882fg: Add support for the Finte ..., Giel van Schijndel, (Sun Aug 1, 6:22 am)
[PATCH] hwmon: f71882fg: Add support for the Fintek F71808E, Giel van Schijndel, (Sun Aug 1, 6:30 am)
[PATCH 1/2] hwmon: f71882fg: use a muxed resource lock for ..., Giel van Schijndel, (Sun Aug 1, 6:30 am)
[PATCH 2/2] watchdog: f71808e_wdt: new watchdog driver for ..., Giel van Schijndel, (Sun Aug 1, 6:30 am)
Re: [PATCH] hwmon: f71882fg: Add support for the Fintek F7 ..., Giel van Schijndel, (Wed Aug 4, 8:44 am)
Re: [PATCH] hwmon: f71882fg: Add support for the Fintek F7 ..., Giel van Schijndel, (Tue Aug 10, 12:11 pm)
Re: [PATCH] hwmon: f71882fg: Add support for the Fintek F7 ..., Giel van Schijndel, (Sun Aug 22, 11:28 am)
Re: [PATCH 1/2] hwmon: f71882fg: use a muxed resource lock ..., Giel van Schijndel, (Sat Oct 2, 3:59 pm)
[PATCH] hwmon: f71882fg: use a muxed resource lock for the ..., Giel van Schijndel, (Sun Oct 3, 5:09 am)