Optimize the resource overlap check
A message that is not in the archive (sent off-list or not yet received): [email protected]
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
@@ -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
@@ -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
Bjorn Helgaas
maintainerQuoted 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.Signed-off-by Wei Yang <[email protected]>---
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@@ -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
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
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.Signed-off-by Wei Yang <[email protected]>---
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@@ -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@@ -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