Skip to contentSkip to conversation

Optimize the resource overlap check

PATCH In review Richard Yang 2 participants 3 messages Apr 16, 2012 – Apr 24, 2012 1 message not in the archive

Subsystems (3)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH 1/1 Optimize the resource overlap check

In coalesce_windows() it tries to check whether the res1 and res2 overlap. This function do four comparisons, which could be done with one comparisons.

Also make the resource_check_overlap() a common function for others.

---
 arch/x86/pci/acpi.c    |   12 +-----------
 include/linux/ioport.h |    7 +++++++
 2 files changed, 8 insertions(+), 11 deletions(-)
arch/x86/pci/acpi.c +1 -11
index 68c3c13..f2bb99e 100644
@@ -181,13 +181,6 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
 	return AE_OK;
 }
 
-static bool resource_contains(struct resource *res, resource_size_t point)
-{
-	if (res->start <= point && point <= res->end)
-		return true;
-	return false;
-}
-
 static void coalesce_windows(struct pci_root_info *info, unsigned long type)
 {
 	int i, j;
@@ -208,10 +201,7 @@ static void coalesce_windows(struct pci_root_info *info, unsigned long type)
 			 * our resources no longer match the ACPI _CRS, but
 			 * the kernel resource tree doesn't allow overlaps.
 			 */
-			if (resource_contains(res1, res2->start) ||
-			    resource_contains(res1, res2->end) ||
-			    resource_contains(res2, res1->start) ||
-			    resource_contains(res2, res1->end)) {
+			if (resource_check_overlap(res1, res2)) {
 				res1->start = min(res1->start, res2->start);
 				res1->end = max(res1->end, res2->end);
 				dev_info(&info->bridge->dev,
include/linux/ioport.h +7 -0
index e9bb22c..374259b 100644
@@ -198,5 +198,12 @@ extern int
 walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
 		void *arg, int (*func)(unsigned long, unsigned long, void *));
 
+static inline int resource_check_overlap(struct resource *r1,
+                                         struct resource *r2)
+{
+       return (r1->start <= r2->end && r1->end >= r2->start);
+}
+
+
 #endif /* __ASSEMBLY__ */
 #endif	/* _LINUX_IOPORT_H */
Signature · 5 lines
1.7.4.1

-- 
Richard Yang
Help you, Help me
maintainer
#2 lore raw
Quoted 48 lines · Richard Yang

In coalesce_windows() it tries to check whether the res1 and res2 overlap. This function do four comparisons, which could be done with one comparisons.

Also make the resource_check_overlap() a common function for others.

---
 arch/x86/pci/acpi.c    |   12 +-----------
 include/linux/ioport.h |    7 +++++++

 2 files changed, 8 insertions(+), 11 deletions(-)
arch/x86/pci/acpi.c +1 -11
index 68c3c13..f2bb99e 100644
@@ -181,13 +181,6 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
        return AE_OK;
  }
 
-static bool resource_contains(struct resource *res, resource_size_t point)
-{
-       if (res->start <= point && point <= res->end)
-               return true;
-       return false;
-}
-
  static void coalesce_windows(struct pci_root_info *info, unsigned long type)
  {
        int i, j;
@@ -208,10 +201,7 @@ static void coalesce_windows(struct pci_root_info *info, unsigned long type)
                         * our resources no longer match the ACPI _CRS, but
                         * the kernel resource tree doesn't allow overlaps.
                         */
-                       if (resource_contains(res1, res2->start) ||
-                           resource_contains(res1, res2->end) ||
-                           resource_contains(res2, res1->start) ||
-                           resource_contains(res2, res1->end)) {
+                       if (resource_check_overlap(res1, res2)) {
                                res1->start = min(res1->start, res2->start);
                                res1->end = max(res1->end, res2->end);
                                dev_info(&info->bridge->dev,
include/linux/ioport.h +0 -0
index e9bb22c..374259b 100644

include/linux/ioport.h extern int · line 205

Quoted 8 lines
include/linux/ioport.h +5 -0
@@ -198,5 +198,12 @@ extern int
  walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
                void *arg, int (*func)(unsigned long, unsigned long, void *));
 
+static inline int resource_check_overlap(struct resource *r1,
+                                         struct resource *r2)
+{
+       return (r1->start <= r2->end && r1->end >= r2->start);
+}

I like the concept, but resource_check_overlap() is not a very good name. It returns a boolean, but the function name doesn't give any clue about the sense. "resource_overlaps()" or something similar would be better.

Bjorn

#3 lore raw
Quoted 53 lines · Bjorn Helgaas
Quoted 51 lines · Richard Yang

In coalesce_windows() it tries to check whether the res1 and res2 overlap. This function do four comparisons, which could be done with one comparisons.

Also make the resource_check_overlap() a common function for others.

---
 arch/x86/pci/acpi.c    |   12 +-----------
 include/linux/ioport.h |    7 +++++++

 2 files changed, 8 insertions(+), 11 deletions(-)
arch/x86/pci/acpi.c +1 -11
index 68c3c13..f2bb99e 100644
@@ -181,13 +181,6 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
        return AE_OK;
  }
 
-static bool resource_contains(struct resource *res, resource_size_t point)
-{
-       if (res->start <= point && point <= res->end)
-               return true;
-       return false;
-}
-
  static void coalesce_windows(struct pci_root_info *info, unsigned long type)
  {
        int i, j;
@@ -208,10 +201,7 @@ static void coalesce_windows(struct pci_root_info *info, unsigned long type)
                         * our resources no longer match the ACPI _CRS, but
                         * the kernel resource tree doesn't allow overlaps.
                         */
-                       if (resource_contains(res1, res2->start) ||
-                           resource_contains(res1, res2->end) ||
-                           resource_contains(res2, res1->start) ||
-                           resource_contains(res2, res1->end)) {
+                       if (resource_check_overlap(res1, res2)) {
                                res1->start = min(res1->start, res2->start);
                                res1->end = max(res1->end, res2->end);
                                dev_info(&info->bridge->dev,
include/linux/ioport.h +0 -0
index e9bb22c..374259b 100644
@@ -198,5 +198,12 @@ extern int
  walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages,
                void *arg, int (*func)(unsigned long, unsigned long, void *));
 
Quoted 10 lines

include/linux/ioport.h extern int · line 205

Quoted 5 lines
include/linux/ioport.h +5 -0
+static inline int resource_check_overlap(struct resource *r1,
+                                         struct resource *r2)
+{
+       return (r1->start <= r2->end && r1->end >= r2->start);
+}

I like the concept, but resource_check_overlap() is not a very good name. It returns a boolean, but the function name doesn't give any clue about the sense. "resource_overlaps()" or something similar would be better.

change to this will be better?

static inline bool resource_overlaps(struct resource *r1,

Quoted 2 lines

Bjorn

Signature · 2 lines
Richard Yang
Help you, Help me