summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvisa <visa@openbsd.org>2017-07-12 13:25:12 +0000
committervisa <visa@openbsd.org>2017-07-12 13:25:12 +0000
commit4196a8994a6191ceb6ec0841efce1003eac9bed9 (patch)
tree5161ba1f794f5c48fcab948464a5492e6b91a5df
parentDo not need to set up USR2 twice. (diff)
downloadwireguard-openbsd-4196a8994a6191ceb6ec0841efce1003eac9bed9.tar.xz
wireguard-openbsd-4196a8994a6191ceb6ec0841efce1003eac9bed9.zip
Reorganize separate configuration fields into per-CPU structs
to compact the data indexing. This additionally improves the cache locality of the data.
-rw-r--r--sys/arch/octeon/dev/octciu.c77
1 files changed, 43 insertions, 34 deletions
diff --git a/sys/arch/octeon/dev/octciu.c b/sys/arch/octeon/dev/octciu.c
index a047d2c753e..0d3b88c78ce 100644
--- a/sys/arch/octeon/dev/octciu.c
+++ b/sys/arch/octeon/dev/octciu.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: octciu.c,v 1.3 2017/07/07 10:04:43 visa Exp $ */
+/* $OpenBSD: octciu.c,v 1.4 2017/07/12 13:25:12 visa Exp $ */
/*
* Copyright (c) 2000-2004 Opsycon AB (www.opsycon.se)
@@ -66,14 +66,18 @@ struct intrbank {
#define IRQ_TO_BANK(x) ((x) >> 6)
#define IRQ_TO_BIT(x) ((x) & 0x3f)
+struct octciu_cpu {
+ struct intrbank scpu_ibank[NBANKS];
+ uint64_t scpu_intem[NBANKS];
+ uint64_t scpu_imask[NIPLS][NBANKS];
+};
+
struct octciu_softc {
struct device sc_dev;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
+ struct octciu_cpu sc_cpu[MAXCPUS];
struct intrhand *sc_intrhand[OCTCIU_NINTS];
- struct intrbank sc_ibank[MAXCPUS][NBANKS];
- uint64_t sc_intem[MAXCPUS][NBANKS];
- uint64_t sc_imask[MAXCPUS][NIPLS][NBANKS];
int (*sc_ipi_handler)(void *);
@@ -167,19 +171,22 @@ void
octciu_init(void)
{
struct octciu_softc *sc = octciu_sc;
+ struct octciu_cpu *scpu;
int cpuid = cpu_number();
+ scpu = &sc->sc_cpu[cpuid];
+
bus_space_write_8(sc->sc_iot, sc->sc_ioh, CIU_IP2_EN0(cpuid), 0);
bus_space_write_8(sc->sc_iot, sc->sc_ioh, CIU_IP3_EN0(cpuid), 0);
bus_space_write_8(sc->sc_iot, sc->sc_ioh, CIU_IP2_EN1(cpuid), 0);
bus_space_write_8(sc->sc_iot, sc->sc_ioh, CIU_IP3_EN1(cpuid), 0);
- sc->sc_ibank[cpuid][0].en = CIU_IP2_EN0(cpuid);
- sc->sc_ibank[cpuid][0].sum = CIU_IP2_SUM0(cpuid);
- sc->sc_ibank[cpuid][0].id = 0;
- sc->sc_ibank[cpuid][1].en = CIU_IP2_EN1(cpuid);
- sc->sc_ibank[cpuid][1].sum = CIU_INT32_SUM1;
- sc->sc_ibank[cpuid][1].id = 1;
+ scpu->scpu_ibank[0].en = CIU_IP2_EN0(cpuid);
+ scpu->scpu_ibank[0].sum = CIU_IP2_SUM0(cpuid);
+ scpu->scpu_ibank[0].id = 0;
+ scpu->scpu_ibank[1].en = CIU_IP2_EN1(cpuid);
+ scpu->scpu_ibank[1].sum = CIU_INT32_SUM1;
+ scpu->scpu_ibank[1].id = 1;
}
void *
@@ -223,7 +230,8 @@ octciu_intr_establish(int irq, int level, int (*ih_fun)(void *),
continue;
*p = ih;
- sc->sc_intem[cpuid][IRQ_TO_BANK(irq)] |= 1UL << IRQ_TO_BIT(irq);
+ sc->sc_cpu[cpuid].scpu_intem[IRQ_TO_BANK(irq)] |=
+ 1UL << IRQ_TO_BIT(irq);
octciu_intr_makemasks(sc);
splx(s); /* causes hw mask update */
@@ -273,7 +281,7 @@ octciu_intr_disestablish(void *_ih)
sc->sc_intrhand[irq] = ih->ih_next;
if (sc->sc_intrhand[irq] == NULL)
- sc->sc_intem[cpuid][IRQ_TO_BANK(irq)] &=
+ sc->sc_cpu[cpuid].scpu_intem[IRQ_TO_BANK(irq)] &=
~(1UL << IRQ_TO_BIT(irq));
} else {
for (p = sc->sc_intrhand[irq]; p != NULL; p = p->ih_next) {
@@ -298,10 +306,10 @@ octciu_intr_disestablish(void *_ih)
void
octciu_intr_makemasks(struct octciu_softc *sc)
{
- int cpuid = cpu_number();
- int irq, level;
+ struct octciu_cpu *scpu = &sc->sc_cpu[cpu_number()];
struct intrhand *q;
uint intrlevel[OCTCIU_NINTS];
+ int irq, level;
/* First, figure out which levels each IRQ uses. */
for (irq = 0; irq < OCTCIU_NINTS; irq++) {
@@ -323,8 +331,8 @@ octciu_intr_makemasks(struct octciu_softc *sc)
if (intrlevel[irq] & (1 << level))
mask[IRQ_TO_BANK(irq)] |=
1UL << IRQ_TO_BIT(irq);
- sc->sc_imask[cpuid][level][0] = mask[0];
- sc->sc_imask[cpuid][level][1] = mask[1];
+ scpu->scpu_imask[level][0] = mask[0];
+ scpu->scpu_imask[level][1] = mask[1];
}
/*
* There are tty, network and disk drivers that use free() at interrupt
@@ -337,18 +345,18 @@ octciu_intr_makemasks(struct octciu_softc *sc)
dst[0] |= src[0]; \
dst[1] |= src[1]; \
} while (0)
- ADD_MASK(sc->sc_imask[cpuid][IPL_NET], sc->sc_imask[cpuid][IPL_BIO]);
- ADD_MASK(sc->sc_imask[cpuid][IPL_TTY], sc->sc_imask[cpuid][IPL_NET]);
- ADD_MASK(sc->sc_imask[cpuid][IPL_VM], sc->sc_imask[cpuid][IPL_TTY]);
- ADD_MASK(sc->sc_imask[cpuid][IPL_CLOCK], sc->sc_imask[cpuid][IPL_VM]);
- ADD_MASK(sc->sc_imask[cpuid][IPL_HIGH], sc->sc_imask[cpuid][IPL_CLOCK]);
- ADD_MASK(sc->sc_imask[cpuid][IPL_IPI], sc->sc_imask[cpuid][IPL_HIGH]);
+ ADD_MASK(scpu->scpu_imask[IPL_NET], scpu->scpu_imask[IPL_BIO]);
+ ADD_MASK(scpu->scpu_imask[IPL_TTY], scpu->scpu_imask[IPL_NET]);
+ ADD_MASK(scpu->scpu_imask[IPL_VM], scpu->scpu_imask[IPL_TTY]);
+ ADD_MASK(scpu->scpu_imask[IPL_CLOCK], scpu->scpu_imask[IPL_VM]);
+ ADD_MASK(scpu->scpu_imask[IPL_HIGH], scpu->scpu_imask[IPL_CLOCK]);
+ ADD_MASK(scpu->scpu_imask[IPL_IPI], scpu->scpu_imask[IPL_HIGH]);
/*
* These are pseudo-levels.
*/
- sc->sc_imask[cpuid][IPL_NONE][0] = 0;
- sc->sc_imask[cpuid][IPL_NONE][1] = 0;
+ scpu->scpu_imask[IPL_NONE][0] = 0;
+ scpu->scpu_imask[IPL_NONE][1] = 0;
}
static inline int
@@ -380,6 +388,7 @@ octciu_intr_bank(struct octciu_softc *sc, struct intrbank *bank,
{
struct cpu_info *ci = curcpu();
struct intrhand *ih;
+ struct octciu_cpu *scpu = &sc->sc_cpu[cpu_number()];
uint64_t imr, isr, mask;
int handled, ipl, irq;
#ifdef MULTIPROCESSOR
@@ -403,7 +412,7 @@ octciu_intr_bank(struct octciu_softc *sc, struct intrbank *bank,
* If interrupts are spl-masked, mask them and wait for splx()
* to reenable them when necessary.
*/
- if ((mask = isr & sc->sc_imask[ci->ci_cpuid][frame->ipl][bank->id])
+ if ((mask = isr & scpu->scpu_imask[frame->ipl][bank->id])
!= 0) {
isr &= ~mask;
imr &= ~mask;
@@ -470,20 +479,20 @@ uint32_t
octciu_intr(uint32_t hwpend, struct trapframe *frame)
{
struct octciu_softc *sc = octciu_sc;
- int cpuid = cpu_number();
+ struct octciu_cpu *scpu = &sc->sc_cpu[cpu_number()];
int handled;
- handled = octciu_intr_bank(sc, &sc->sc_ibank[cpuid][0], frame);
- handled |= octciu_intr_bank(sc, &sc->sc_ibank[cpuid][1], frame);
+ handled = octciu_intr_bank(sc, &scpu->scpu_ibank[0], frame);
+ handled |= octciu_intr_bank(sc, &scpu->scpu_ibank[1], frame);
return handled ? hwpend : 0;
}
void
octciu_splx(int newipl)
{
- struct octciu_softc *sc = octciu_sc;
struct cpu_info *ci = curcpu();
- cpuid_t cpuid = ci->ci_cpuid;
+ struct octciu_softc *sc = octciu_sc;
+ struct octciu_cpu *scpu = &sc->sc_cpu[ci->ci_cpuid];
/* Update IPL. Order highly important! */
__asm__ (".set noreorder\n");
@@ -492,10 +501,10 @@ octciu_splx(int newipl)
__asm__ (".set reorder\n");
/* Set hardware masks. */
- bus_space_write_8(sc->sc_iot, sc->sc_ioh, sc->sc_ibank[cpuid][0].en,
- sc->sc_intem[cpuid][0] & ~sc->sc_imask[cpuid][newipl][0]);
- bus_space_write_8(sc->sc_iot, sc->sc_ioh, sc->sc_ibank[cpuid][1].en,
- sc->sc_intem[cpuid][1] & ~sc->sc_imask[cpuid][newipl][1]);
+ bus_space_write_8(sc->sc_iot, sc->sc_ioh, scpu->scpu_ibank[0].en,
+ scpu->scpu_intem[0] & ~scpu->scpu_imask[newipl][0]);
+ bus_space_write_8(sc->sc_iot, sc->sc_ioh, scpu->scpu_ibank[1].en,
+ scpu->scpu_intem[1] & ~scpu->scpu_imask[newipl][1]);
/* If we still have softints pending trigger processing. */
if (ci->ci_softpending != 0 && newipl < IPL_SOFTINT)