KMSGs no longer self-ipi for routine messages
authorBarret Rhoden <brho@cs.berkeley.edu>
Sun, 11 Nov 2012 09:07:22 +0000 (01:07 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Wed, 21 Nov 2012 23:41:17 +0000 (15:41 -0800)
We used to need this when we had routine messages that popped into
userspace.  The self-ipi forced us to trap back into the kernel to
process the rest of the messages.  Now that our proc management kmsgs
all return (let alone not popping into userspace), this isn't a concern.

We can still have kmsgs that don't return (like __launch_kthread()),
since we'll always run our routine KMSGs at some point in the future
(smp_idle() or proc_restartcore()).

I'd normally wait til combining all the KMSG code to do this, but the
non-x86 arches didn't have ipi_is_pending().

kern/arch/i686/trap.c
kern/arch/riscv/trap.c
kern/arch/sparc/trap.c

index 2508580..500586a 100644 (file)
@@ -648,11 +648,6 @@ void __kernel_message(struct trapframe *tf, void *data)
                        /* copy in, and then free, in case we don't return */
                        msg_cp = *k_msg;
                        kmem_cache_free(kernel_msg_cache, (void*)k_msg);
-                       /* make sure an IPI is pending if we have more work */
-                       /* technically, we don't need to lock when checking */
-                       if (!STAILQ_EMPTY(&myinfo->routine_amsgs) &&
-                              !ipi_is_pending(I_KERNEL_MSG))
-                               send_self_ipi(I_KERNEL_MSG);
                        /* Execute the kernel message */
                        assert(msg_cp.pc);
                        assert(msg_cp.dstid == core_id());
@@ -697,10 +692,6 @@ void process_routine_kmsg(struct trapframe *tf)
                /* copy in, and then free, in case we don't return */
                msg_cp = *k_msg;
                kmem_cache_free(kernel_msg_cache, (void*)k_msg);
-               /* make sure an IPI is pending if we have more work */
-               if (!STAILQ_EMPTY(&myinfo->routine_amsgs) &&
-                      !ipi_is_pending(I_KERNEL_MSG))
-                       send_self_ipi(I_KERNEL_MSG);
                /* Execute the kernel message */
                assert(msg_cp.pc);
                assert(msg_cp.dstid == core_id());
index 96be0b3..44e714b 100644 (file)
@@ -207,10 +207,6 @@ handle_ipi(trapframe_t* tf)
                        /* copy in, and then free, in case we don't return */
                        msg_cp = *k_msg;
                        kmem_cache_free(kernel_msg_cache, (void*)k_msg);
-                       /* make sure an IPI is pending if we have more work */
-                       /* techincally, we don't need to lock when checking */
-                       if (!STAILQ_EMPTY(&myinfo->routine_amsgs))
-                               send_ipi(core_id());
                        /* Execute the kernel message */
                        assert(msg_cp.pc);
                        msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
@@ -251,9 +247,6 @@ process_routine_kmsg(struct trapframe *tf)
                /* copy in, and then free, in case we don't return */
                msg_cp = *k_msg;
                kmem_cache_free(kernel_msg_cache, (void*)k_msg);
-               /* make sure an IPI is pending if we have more work */
-               if (!STAILQ_EMPTY(&myinfo->routine_amsgs))
-                       send_ipi(core_id());
                /* Execute the kernel message */
                assert(msg_cp.pc);
                msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
index 577db09..adb47da 100644 (file)
@@ -260,10 +260,6 @@ void handle_ipi(trapframe_t* tf)
                        /* copy in, and then free, in case we don't return */
                        msg_cp = *k_msg;
                        kmem_cache_free(kernel_msg_cache, (void*)k_msg);
-                       /* make sure an IPI is pending if we have more work */
-                       /* techincally, we don't need to lock when checking */
-                       if (!STAILQ_EMPTY(&myinfo->routine_amsgs))
-                               send_ipi(core_id());
                        /* Execute the kernel message */
                        assert(msg_cp.pc);
                        msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);
@@ -303,9 +299,6 @@ void process_routine_kmsg(struct trapframe *tf)
                /* copy in, and then free, in case we don't return */
                msg_cp = *k_msg;
                kmem_cache_free(kernel_msg_cache, (void*)k_msg);
-               /* make sure an IPI is pending if we have more work */
-               if (!STAILQ_EMPTY(&myinfo->routine_amsgs))
-                       send_ipi(core_id());
                /* Execute the kernel message */
                assert(msg_cp.pc);
                msg_cp.pc(tf, msg_cp.srcid, msg_cp.arg0, msg_cp.arg1, msg_cp.arg2);