Helper, check for the existence of local RKMS
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 2 Dec 2014 22:43:03 +0000 (14:43 -0800)
committerBarret Rhoden <brho@cs.berkeley.edu>
Tue, 2 Dec 2014 22:57:07 +0000 (14:57 -0800)
For the local core only.

kern/include/trap.h
kern/src/trap.c

index 94a9f44..b46b0a2 100644 (file)
@@ -81,6 +81,7 @@ void kernel_msg_init(void);
 uint32_t send_kernel_message(uint32_t dst, amr_t pc, long arg0, long arg1,
                              long arg2, int type);
 void handle_kmsg_ipi(struct hw_trapframe *hw_tf, void *data);
+bool has_routine_kmsg(void);
 void process_routine_kmsg(void);
 void print_kmsgs(uint32_t coreid);
 
index 752740b..ead4965 100644 (file)
@@ -107,7 +107,7 @@ void handle_kmsg_ipi(struct hw_trapframe *hw_tf, void *data)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        struct kernel_message *kmsg_i, *temp;
-       /* Avoid locking if the list appears empty (lockless peak is okay) */
+       /* Avoid locking if the list appears empty (lockless peek is okay) */
        if (STAILQ_EMPTY(&pcpui->immed_amsgs))
                return;
        /* The lock serves as a cmb to force a re-read of the head of the list */
@@ -121,12 +121,19 @@ void handle_kmsg_ipi(struct hw_trapframe *hw_tf, void *data)
        spin_unlock_irqsave(&pcpui->immed_amsg_lock);
 }
 
+bool has_routine_kmsg(void)
+{
+       struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
+       /* lockless peek */
+       return !STAILQ_EMPTY(&pcpui->routine_amsgs);
+}
+
 /* Helper function, gets the next routine KMSG (RKM).  Returns 0 if the list was
  * empty. */
 static kernel_message_t *get_next_rkmsg(struct per_cpu_info *pcpui)
 {
        struct kernel_message *kmsg;
-       /* Avoid locking if the list appears empty (lockless peak is okay) */
+       /* Avoid locking if the list appears empty (lockless peek is okay) */
        if (STAILQ_EMPTY(&pcpui->routine_amsgs))
                return 0;
        /* The lock serves as a cmb to force a re-read of the head of the list.