PERFORCE change 94516 for review
Kip Macy
kmacy at FreeBSD.org
Mon Apr 3 07:23:21 UTC 2006
http://perforce.freebsd.org/chv.cgi?CH=94516
Change 94516 by kmacy at kmacy_storage:sun4v_work on 2006/04/03 07:22:38
create separate intrq_alloc function so that per-cpu queues are pre-allocated before cpu_mp_bootstrap
initialize IPIs locally
Affected files ...
.. //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/intr_machdep.c#5 edit
Differences ...
==== //depot/projects/kmacy_sun4v/src/sys/sun4v/sun4v/intr_machdep.c#5 (text+ko) ====
@@ -74,12 +74,14 @@
#include <sys/mutex.h>
#include <sys/pcpu.h>
#include <sys/proc.h>
+#include <sys/smp.h>
#include <sys/vmmeter.h>
#include <machine/frame.h>
#include <machine/intr_machdep.h>
#include <machine/hypervisor_api.h>
#include <machine/cpu.h>
+#include <machine/smp.h>
#include <vm/vm.h>
#include <vm/pmap.h>
@@ -119,14 +121,25 @@
int cpu_q_entries = 128;
int dev_q_entries = 128;
+static vm_offset_t *mondo_data_array;
+static vm_offset_t *cpu_list_array;
+static vm_offset_t *cpu_q_array;
+static vm_offset_t *dev_q_array;
+static vm_offset_t *rq_array;
+static vm_offset_t *nrq_array;
+static int cpu_list_size;
+
+
+
/* protect the intr_vectors table */
static struct mtx intr_table_lock;
static void intr_execute_handlers(void *);
static void intr_stray_level(struct trapframe *);
static void intr_stray_vector(void *);
-static int intrcnt_setname(const char *, int);
+static int intrcnt_setname(const char *, int);
static void intrcnt_updatename(int, const char *, int);
+static void cpu_intrq_alloc(void);
/*
* not MPSAFE
@@ -207,7 +220,7 @@
intr_stray_level(struct trapframe *tf)
{
- printf("stray level interrupt\n");
+ printf("stray level interrupt - pil=%ld\n", tf->tf_pil);
}
static void
@@ -240,8 +253,14 @@
intr_vectors[i].iv_vec = i;
}
intr_handlers[PIL_LOW] = intr_fast;
+
+#ifdef SMP
+ intr_handlers[PIL_AST] = cpu_ipi_ast;
+ intr_handlers[PIL_RENDEZVOUS] = (ih_func_t *)smp_rendezvous_action;
+ intr_handlers[PIL_STOP]= cpu_ipi_stop;
+#endif
mtx_init(&intr_table_lock, "intr table", NULL, MTX_SPIN);
-
+ cpu_intrq_alloc();
cpu_intrq_init();
}
@@ -365,42 +384,64 @@
/*
* Allocate and register intrq fields
*/
+static void
+cpu_intrq_alloc(void)
+{
+
+
+
+ mondo_data_array = malloc(INTR_REPORT_SIZE*MAXCPU, M_DEVBUF, M_WAITOK | M_ZERO);
+ PANIC_IF(mondo_data_array == NULL);
+
+ cpu_list_size = CPU_LIST_SIZE > INTR_REPORT_SIZE ? CPU_LIST_SIZE : INTR_REPORT_SIZE;
+ cpu_list_array = malloc(cpu_list_size*MAXCPU, M_DEVBUF, M_WAITOK | M_ZERO);
+ PANIC_IF(cpu_list_array == NULL);
+
+ cpu_q_array = malloc(INTR_CPU_Q_SIZE*MAXCPU, M_DEVBUF, M_WAITOK | M_ZERO);
+ PANIC_IF(cpu_q_array == NULL);
+
+ dev_q_array = malloc(INTR_DEV_Q_SIZE*MAXCPU, M_DEVBUF, M_WAITOK | M_ZERO);
+ PANIC_IF(dev_q_array == NULL);
+
+ rq_array = malloc(2*CPU_RQ_SIZE*MAXCPU, M_DEVBUF, M_WAITOK | M_ZERO);
+ PANIC_IF(rq_array == NULL);
+
+ nrq_array = malloc(2*CPU_NRQ_SIZE*MAXCPU, M_DEVBUF, M_WAITOK | M_ZERO);
+ PANIC_IF(nrq_array == NULL);
+
+}
+
void
cpu_intrq_init()
{
-
+
uint64_t error;
- int cpu_list_size;
- pcpup->pc_mondo_data = malloc(INTR_REPORT_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
- PANIC_IF(pcpup->pc_mondo_data == NULL)
+ pcpup->pc_mondo_data = mondo_data_array + curcpu*INTR_REPORT_SIZE;
pcpup->pc_mondo_data_ra = vtophys(pcpup->pc_mondo_data);
- cpu_list_size = CPU_LIST_SIZE > INTR_REPORT_SIZE ? CPU_LIST_SIZE : INTR_REPORT_SIZE;
- pcpup->pc_cpu_list = malloc(cpu_list_size, M_DEVBUF, M_WAITOK | M_ZERO);
- PANIC_IF(pcpup->pc_cpu_list == NULL)
+ pcpup->pc_cpu_list = cpu_list_array + curcpu*cpu_list_size;
+
pcpup->pc_cpu_list_ra = vtophys(pcpup->pc_cpu_list);
- pcpup->pc_cpu_q = malloc(INTR_CPU_Q_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
- PANIC_IF(pcpup->pc_cpu_q == NULL);
+ pcpup->pc_cpu_q = cpu_q_array + curcpu*INTR_CPU_Q_SIZE;
+
pcpup->pc_cpu_q_ra = vtophys(pcpup->pc_cpu_q);
pcpup->pc_cpu_q_size = INTR_CPU_Q_SIZE;
- pcpup->pc_dev_q = malloc(INTR_DEV_Q_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
- PANIC_IF(pcpup->pc_dev_q == NULL);
+ pcpup->pc_dev_q = dev_q_array + curcpu*INTR_DEV_Q_SIZE;
pcpup->pc_dev_q_ra = vtophys(pcpup->pc_dev_q);
pcpup->pc_dev_q_size = INTR_DEV_Q_SIZE;
- pcpup->pc_rq = malloc(2*CPU_RQ_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
- PANIC_IF(pcpup->pc_rq == NULL);
+ pcpup->pc_rq = rq_array + curcpu*2*CPU_RQ_SIZE;
pcpup->pc_rq_ra = vtophys(pcpup->pc_rq);
pcpup->pc_rq_size = CPU_RQ_SIZE;
- pcpup->pc_nrq = malloc(2*CPU_NRQ_SIZE, M_DEVBUF, M_WAITOK | M_ZERO);
- PANIC_IF(pcpup->pc_nrq == NULL);
+ pcpup->pc_nrq = nrq_array + curcpu*2*CPU_NRQ_SIZE;
pcpup->pc_nrq_ra = vtophys(pcpup->pc_nrq);
pcpup->pc_nrq_size = CPU_NRQ_SIZE;
+
error = hv_cpu_qconf(Q(CPU_MONDO_QUEUE_HEAD), pcpup->pc_cpu_q_ra, cpu_q_entries);
if (error != H_EOK)
panic("cpu_mondo queue configuration failed: %lu", error);
@@ -417,5 +458,4 @@
if (error != H_EOK)
panic("non-resumable error queue configuration failed: %lu", error);
-
}
More information about the p4-projects
mailing list