Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1447240 > unrolled thread
| Started by | Shanker Donthineni <shankerd@codeaurora.org> |
|---|---|
| First post | 2016-07-20 16:00 +0200 |
| Last post | 2016-07-20 16:00 +0200 |
| Articles | 3 — 1 participant |
Back to article view | Back to linux.kernel
[PATCH V3 0/4] Change fixed mmio handlers to a variable number Shanker Donthineni <shankerd@codeaurora.org> - 2016-07-20 16:00 +0200
[PATCH V3 3/4] xen/arm: io: Use binary search for mmio handler lookup Shanker Donthineni <shankerd@codeaurora.org> - 2016-07-20 16:00 +0200
[PATCH V3 1/4] arm/io: Use separate memory allocation for mmio handlers Shanker Donthineni <shankerd@codeaurora.org> - 2016-07-20 16:00 +0200
| From | Shanker Donthineni <shankerd@codeaurora.org> |
|---|---|
| Date | 2016-07-20 16:00 +0200 |
| Subject | [PATCH V3 0/4] Change fixed mmio handlers to a variable number |
| Message-ID | <rX0cx-28F-11@gated-at.bofh.it> |
The maximum number of mmio handlers that are allowed is limited to a macro MAX_IO_HANDLER(16), which is not enough for supporting per CPU Redistributor regions. We need at least MAX_IO_HANDLER+CONFIG_NR_CPUS mmio handlers in order to support ACPI based XEN boot. This patchset uses the dynamic allocation strategy to allocate memory resource dynamically depends on the number of Redistributor regions that are described in the APCI MADT table. Shanker Donthineni (4): arm/io: Use separate memory allocation for mmio handlers xen: Add generic implementation of binary search xen/arm: io: Use binary search for mmio handler lookup arm/vgic: Change fixed number of mmio handlers to variable number xen/arch/arm/domain.c | 12 +++++++---- xen/arch/arm/io.c | 52 +++++++++++++++++++++++++++++++--------------- xen/arch/arm/vgic-v2.c | 3 ++- xen/arch/arm/vgic-v3.c | 5 ++++- xen/arch/arm/vgic.c | 10 +++------ xen/common/Makefile | 1 + xen/common/bsearch.c | 51 +++++++++++++++++++++++++++++++++++++++++++++ xen/include/asm-arm/mmio.h | 7 +++++-- xen/include/asm-arm/vgic.h | 5 +++-- xen/include/xen/lib.h | 3 +++ 10 files changed, 115 insertions(+), 34 deletions(-) create mode 100644 xen/common/bsearch.c -- Qualcomm Datacenter Technologies, Inc. on behalf of the Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
[toc] | [next] | [standalone]
| From | Shanker Donthineni <shankerd@codeaurora.org> |
|---|---|
| Date | 2016-07-20 16:00 +0200 |
| Subject | [PATCH V3 3/4] xen/arm: io: Use binary search for mmio handler lookup |
| Message-ID | <rX0cy-28F-19@gated-at.bofh.it> |
| In reply to | #1447240 |
As the number of I/O handlers increase, the overhead associated with
linear lookup also increases. The system might have maximum of 144
(assuming CONFIG_NR_CPUS=128) mmio handlers. In worst case scenario,
it would require 144 iterations for finding a matching handler. Now
it is time for us to change from linear (complexity O(n)) to a binary
search (complexity O(log n) for reducing mmio handler lookup overhead.
Signed-off-by: Shanker Donthineni <shankerd@codeaurora.org>
---
xen/arch/arm/io.c | 39 ++++++++++++++++++++++++---------------
1 file changed, 24 insertions(+), 15 deletions(-)
diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c
index 40330f0..e8aa7fa 100644
--- a/xen/arch/arm/io.c
+++ b/xen/arch/arm/io.c
@@ -20,6 +20,7 @@
#include <xen/lib.h>
#include <xen/spinlock.h>
#include <xen/sched.h>
+#include <xen/sort.h>
#include <asm/current.h>
#include <asm/mmio.h>
@@ -70,27 +71,31 @@ static int handle_write(const struct mmio_handler *handler, struct vcpu *v,
handler->priv);
}
-static const struct mmio_handler *find_mmio_handler(struct domain *d,
- paddr_t gpa)
+/* This function assumes that mmio regions are not overlapped */
+static int cmp_mmio_handler(const void *key, const void *elem)
{
- const struct mmio_handler *handler;
- unsigned int i;
- struct vmmio *vmmio = &d->arch.vmmio;
+ const struct mmio_handler *handler0 = key;
+ const struct mmio_handler *handler1 = elem;
- read_lock(&vmmio->lock);
+ if ( handler0->addr < handler1->addr )
+ return -1;
- for ( i = 0; i < vmmio->num_entries; i++ )
- {
- handler = &vmmio->handlers[i];
+ if ( handler0->addr > (handler1->addr + handler1->size) )
+ return 1;
- if ( (gpa >= handler->addr) &&
- (gpa < (handler->addr + handler->size)) )
- break;
- }
+ return 0;
+}
- if ( i == vmmio->num_entries )
- handler = NULL;
+static const struct mmio_handler *find_mmio_handler(struct domain *d,
+ paddr_t gpa)
+{
+ struct vmmio *vmmio = &d->arch.vmmio;
+ struct mmio_handler key = {.addr = gpa};
+ const struct mmio_handler *handler;
+ read_lock(&vmmio->lock);
+ handler = bsearch(&key, vmmio->handlers, vmmio->num_entries,
+ sizeof(*handler), cmp_mmio_handler);
read_unlock(&vmmio->lock);
return handler;
@@ -131,6 +136,10 @@ void register_mmio_handler(struct domain *d,
vmmio->num_entries++;
+ /* Sort mmio handlers in ascending order based on base address */
+ sort(vmmio->handlers, vmmio->num_entries, sizeof(struct mmio_handler),
+ cmp_mmio_handler, NULL);
+
write_unlock(&vmmio->lock);
}
--
Qualcomm Datacenter Technologies, Inc. on behalf of the Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
[toc] | [prev] | [next] | [standalone]
| From | Shanker Donthineni <shankerd@codeaurora.org> |
|---|---|
| Date | 2016-07-20 16:00 +0200 |
| Subject | [PATCH V3 1/4] arm/io: Use separate memory allocation for mmio handlers |
| Message-ID | <rX0cy-28F-21@gated-at.bofh.it> |
| In reply to | #1447240 |
The number of mmio handlers are limited to a compile time macro
MAX_IO_HANDLER which is 16. This number is not at all sufficient
to support per CPU distributor regions. Either it needs to be
increased to a bigger number, at least CONFIG_NR_CPUS+16, or
allocate a separate memory for mmio handlers dynamically during
domain build.
This patch uses the dynamic allocation strategy to reduce memory
footprint for 'struct domain' instead of static allocation.
Signed-off-by: Shanker Donthineni <shankerd@codeaurora.org>
Acked-by: Julien Grall <julien.grall@arm.com>
---
xen/arch/arm/domain.c | 6 ++++--
xen/arch/arm/io.c | 13 +++++++++++--
xen/include/asm-arm/mmio.h | 7 +++++--
3 files changed, 20 insertions(+), 6 deletions(-)
diff --git a/xen/arch/arm/domain.c b/xen/arch/arm/domain.c
index 61fc08e..0170cee 100644
--- a/xen/arch/arm/domain.c
+++ b/xen/arch/arm/domain.c
@@ -546,7 +546,7 @@ void vcpu_destroy(struct vcpu *v)
int arch_domain_create(struct domain *d, unsigned int domcr_flags,
struct xen_arch_domainconfig *config)
{
- int rc;
+ int rc, count;
d->arch.relmem = RELMEM_not_started;
@@ -569,7 +569,8 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags,
share_xen_page_with_guest(
virt_to_page(d->shared_info), d, XENSHARE_writable);
- if ( (rc = domain_io_init(d)) != 0 )
+ count = MAX_IO_HANDLER;
+ if ( (rc = domain_io_init(d, count)) != 0 )
goto fail;
if ( (rc = p2m_alloc_table(d)) != 0 )
@@ -663,6 +664,7 @@ void arch_domain_destroy(struct domain *d)
free_xenheap_pages(d->arch.efi_acpi_table,
get_order_from_bytes(d->arch.efi_acpi_len));
#endif
+ domain_io_free(d);
}
void arch_domain_shutdown(struct domain *d)
diff --git a/xen/arch/arm/io.c b/xen/arch/arm/io.c
index 5a96836..40330f0 100644
--- a/xen/arch/arm/io.c
+++ b/xen/arch/arm/io.c
@@ -118,7 +118,7 @@ void register_mmio_handler(struct domain *d,
struct vmmio *vmmio = &d->arch.vmmio;
struct mmio_handler *handler;
- BUG_ON(vmmio->num_entries >= MAX_IO_HANDLER);
+ BUG_ON(vmmio->num_entries >= vmmio->max_num_entries);
write_lock(&vmmio->lock);
@@ -134,14 +134,23 @@ void register_mmio_handler(struct domain *d,
write_unlock(&vmmio->lock);
}
-int domain_io_init(struct domain *d)
+int domain_io_init(struct domain *d, int max_count)
{
rwlock_init(&d->arch.vmmio.lock);
d->arch.vmmio.num_entries = 0;
+ d->arch.vmmio.max_num_entries = max_count;
+ d->arch.vmmio.handlers = xzalloc_array(struct mmio_handler, max_count);
+ if ( !d->arch.vmmio.handlers )
+ return -ENOMEM;
return 0;
}
+void domain_io_free(struct domain *d)
+{
+ xfree(d->arch.vmmio.handlers);
+}
+
/*
* Local variables:
* mode: C
diff --git a/xen/include/asm-arm/mmio.h b/xen/include/asm-arm/mmio.h
index 32f10f2..c620eed 100644
--- a/xen/include/asm-arm/mmio.h
+++ b/xen/include/asm-arm/mmio.h
@@ -52,15 +52,18 @@ struct mmio_handler {
struct vmmio {
int num_entries;
+ int max_num_entries;
rwlock_t lock;
- struct mmio_handler handlers[MAX_IO_HANDLER];
+ struct mmio_handler *handlers;
};
extern int handle_mmio(mmio_info_t *info);
void register_mmio_handler(struct domain *d,
const struct mmio_handler_ops *ops,
paddr_t addr, paddr_t size, void *priv);
-int domain_io_init(struct domain *d);
+int domain_io_init(struct domain *d, int max_count);
+void domain_io_free(struct domain *d);
+
#endif /* __ASM_ARM_MMIO_H__ */
--
Qualcomm Datacenter Technologies, Inc. on behalf of the Qualcomm Technologies, Inc.
Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web