swi: Pass cpuid to swi register and unregister
authorSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 28 Oct 2011 15:47:31 +0000 (23:47 +0800)
committerSepherosa Ziehau <sephe@dragonflybsd.org>
Fri, 28 Oct 2011 15:47:31 +0000 (23:47 +0800)
Pass -1 as cpuid then these functions will try pin the ithread to
different CPU based on the 'intr' to be registered/unregistered.

Device and taskqueue swi ithreads' cpuid is not explicitly specified,
i.e. -1 is used, swi_vm still runs on CPU0.

sys/bus/cam/cam_xpt.c
sys/dev/serial/cy/cy.c
sys/dev/serial/sio/sio.c
sys/kern/kern_intr.c
sys/kern/subr_taskqueue.c
sys/platform/pc32/i386/vm_machdep.c
sys/platform/pc64/x86_64/vm_machdep.c
sys/sys/interrupt.h

index 14813ce..61a9ef3 100644 (file)
@@ -1534,7 +1534,7 @@ xpt_init(void *dummy)
                kprintf("xpt_init: failed to create rescan thread\n");
        }
        /* Install our software interrupt handlers */
-       register_swi(SWI_CAMBIO, swi_cambio, NULL, "swi_cambio", NULL);
+       register_swi(SWI_CAMBIO, swi_cambio, NULL, "swi_cambio", NULL, -1);
 
        return (0);
 }
index 709c766..1da54b0 100644 (file)
@@ -617,7 +617,7 @@ cyattach_common(cy_addr cy_iobase, int cy_align)
 
        if (!sio_registered) {
                callout_init_mp(&sio_timeout_handle);
-               register_swi_mp(SWI_TTY, siopoll, NULL, "cy", NULL);
+               register_swi_mp(SWI_TTY, siopoll, NULL, "cy", NULL, -1);
                sio_registered = TRUE;
        }
        minorbase = UNIT_TO_MINOR(unit);
index 901a05c..250bdeb 100644 (file)
@@ -1192,7 +1192,7 @@ determined_type: ;
        kprintf("\n");
 
        if (!sio_registered) {
-               register_swi(SWI_TTY, siopoll, NULL ,"swi_siopoll", NULL);
+               register_swi(SWI_TTY, siopoll, NULL ,"swi_siopoll", NULL, -1);
                sio_registered = TRUE;
        }
        minorbase = UNIT_TO_MINOR(unit);
index e0ad8fa..286f05f 100644 (file)
@@ -202,20 +202,27 @@ sysctl_emergency_freq(SYSCTL_HANDLER_ARGS)
  */
 void *
 register_swi(int intr, inthand2_t *handler, void *arg, const char *name,
-               struct lwkt_serialize *serializer)
+               struct lwkt_serialize *serializer, int cpuid)
 {
     if (intr < FIRST_SOFTINT || intr >= MAX_INTS)
        panic("register_swi: bad intr %d", intr);
-    return(register_int(intr, handler, arg, name, serializer, 0, 0));
+
+    if (cpuid < 0)
+       cpuid = intr % ncpus;
+    return(register_int(intr, handler, arg, name, serializer, 0, cpuid));
 }
 
 void *
 register_swi_mp(int intr, inthand2_t *handler, void *arg, const char *name,
-               struct lwkt_serialize *serializer)
+               struct lwkt_serialize *serializer, int cpuid)
 {
     if (intr < FIRST_SOFTINT || intr >= MAX_INTS)
        panic("register_swi: bad intr %d", intr);
-    return(register_int(intr, handler, arg, name, serializer, INTR_MPSAFE, 0));
+
+    if (cpuid < 0)
+       cpuid = intr % ncpus;
+    return(register_int(intr, handler, arg, name, serializer,
+        INTR_MPSAFE, cpuid));
 }
 
 void *
@@ -335,9 +342,12 @@ register_int(int intr, inthand2_t *handler, void *arg, const char *name,
 }
 
 void
-unregister_swi(void *id)
+unregister_swi(void *id, int intr, int cpuid)
 {
-    unregister_int(id, 0);
+    if (cpuid < 0)
+       cpuid = intr % ncpus;
+
+    unregister_int(id, cpuid);
 }
 
 void
index 66ff9ee..33a30f2 100644 (file)
@@ -394,14 +394,14 @@ taskqueue_thread_enqueue(void *context)
 }
 
 TASKQUEUE_DEFINE(swi, taskqueue_swi_enqueue, 0,
-        register_swi(SWI_TQ, taskqueue_swi_run, NULL, "swi_taskq", NULL));
+        register_swi(SWI_TQ, taskqueue_swi_run, NULL, "swi_taskq", NULL, -1));
 /*
  * XXX: possibly use a different SWI_TQ_MP or so.
  * related: sys/interrupt.h
  * related: platform/XXX/isa/ipl_funcs.c
  */
 TASKQUEUE_DEFINE(swi_mp, taskqueue_swi_enqueue, 0,
-        register_swi(SWI_TQ, taskqueue_swi_mp_run, NULL, "swi_mp_taskq", NULL));
+    register_swi(SWI_TQ, taskqueue_swi_mp_run, NULL, "swi_mp_taskq", NULL, -1));
 
 struct taskqueue *taskqueue_thread[MAXCPU];
 
index a2a4ab4..13ace21 100644 (file)
@@ -480,7 +480,7 @@ swi_vm(void *arg, void *frame)
 static void
 swi_vm_setup(void *arg)
 {
-       register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL);
+       register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL, 0);
 }
 
 SYSINIT(vm_setup, SI_BOOT2_MACHDEP, SI_ORDER_ANY, swi_vm_setup, NULL);
index 772f567..4927e1c 100644 (file)
@@ -361,7 +361,7 @@ swi_vm(void *arg, void *frame)
 static void
 swi_vm_setup(void *arg)
 {
-       register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL);
+       register_swi(SWI_VM, swi_vm, NULL, "swi_vm", NULL, 0);
 }
 
 SYSINIT(vm_setup, SI_BOOT2_MACHDEP, SI_ORDER_ANY, swi_vm_setup, NULL);
index 9157649..7232151 100644 (file)
@@ -108,10 +108,10 @@ struct thread;
 struct lwkt_serialize;
 void *register_swi(int intr, inthand2_t *handler, void *arg,
                            const char *name,
-                           struct lwkt_serialize *serializer);
+                           struct lwkt_serialize *serializer, int cpuid);
 void *register_swi_mp(int intr, inthand2_t *handler, void *arg,
                            const char *name,
-                           struct lwkt_serialize *serializer);
+                           struct lwkt_serialize *serializer, int cpuid);
 void *register_int(int intr, inthand2_t *handler, void *arg,
                            const char *name,
                            struct lwkt_serialize *serializer, int flags,
@@ -121,7 +121,7 @@ int count_registered_ints(int intr);
 const char *get_registered_name(int intr);
 
 void swi_setpriority(int intr, int pri);
-void unregister_swi(void *id);
+void unregister_swi(void *id, int intr, int cpuid);
 void unregister_int(void *id, int cpuid);
 void register_randintr(int intr);
 void unregister_randintr(int intr);