Added current core_id so we can properly reroute interrupts after moving kcb.
authorSimon Gerber <simon.gerber@inf.ethz.ch>
Fri, 24 Jan 2014 13:29:59 +0000 (14:29 +0100)
committerGerd Zellweger <mail@gerdzellweger.com>
Tue, 14 Oct 2014 06:50:10 +0000 (08:50 +0200)
include/barrelfish/domain.h
include/barrelfish_kpi/dispatcher_shared.h
kernel/arch/x86/startup_x86.c
kernel/arch/x86_64/syscall.c
kernel/include/kcb.h
kernel/kcb.c
kernel/syscall.c
lib/barrelfish/domain.c
lib/pci/pci_client.c

index 92cc613..1044cb6 100644 (file)
@@ -31,6 +31,7 @@ struct spawn_rpc_client;
 struct waitset *get_default_waitset(void);
 void disp_set_core_id(coreid_t core_id);
 coreid_t disp_get_core_id(void);
+coreid_t disp_get_current_core_id(void);
 domainid_t disp_get_domain_id(void);
 coreid_t disp_handle_get_core_id(dispatcher_handle_t handle);
 void set_monitor_binding(struct monitor_binding *b);
index 0d50987..17566cb 100644 (file)
@@ -56,6 +56,7 @@ struct dispatcher_shared_generic {
     char        name[DISP_NAME_LEN];///< Name of domain, for debugging purposes
     uint32_t    fpu_used;               ///< Was FPU used while disabled?
     uint32_t    fpu_trap;               ///< State of FPU trap
+    coreid_t    curr_core_id;  ///< Core id of current core, in this part so kernel can update
 };
 
 static inline struct dispatcher_shared_generic*
index 960effd..b72d0f3 100644 (file)
@@ -336,6 +336,8 @@ void kernel_startup(void)
 #else
 #error must define scheduler
 #endif
+            // update core id of domains
+            kcb_update_core_id(kcb_current);
             // set queue pointers
             scheduler_restore_state();
             // restore wakeup queue state
index 8653d39..6c7a22a 100644 (file)
@@ -377,6 +377,8 @@ static struct sysret kernel_add_kcb(struct capability *kern_cap,
     }
     // reset scheduler statistics
     scheduler_reset_time();
+    // update current core id of all domains
+    kcb_update_core_id(new_kcb);
     // upcall domains with registered interrupts to tell them to reregister
     irq_table_notify_domains(new_kcb);
 
index bb4c256..5a0c279 100644 (file)
@@ -101,5 +101,6 @@ static inline void switch_kcb(struct kcb *next)
 }
 
 errval_t kcb_remove(struct kcb *to_remove);
+void kcb_update_core_id(struct kcb *kcb);
 
 #endif
index 8979bb0..ec65f50 100644 (file)
@@ -14,8 +14,8 @@
 
 #include <kernel.h>
 #include <kcb.h>
+#include <dispatch.h>
 
-// returns true if we removed `to_remove'
 errval_t kcb_remove(struct kcb *to_remove)
 {
     if (to_remove == kcb_current) {
@@ -53,3 +53,39 @@ errval_t kcb_remove(struct kcb *to_remove)
 
     return SYS_ERR_KCB_NOT_FOUND;
 }
+
+void kcb_update_core_id(struct kcb *kcb)
+{
+#ifdef CONFIG_SCHEDULER_RBED
+    for (struct dcb *d = kcb->queue_head; d; d = d->next) {
+        printk(LOG_NOTE, "[sched] updating current core id to %d for %s\n",
+                my_core_id, get_disp_name(d));
+        struct dispatcher_shared_generic *disp =
+            get_dispatcher_shared_generic(d->disp);
+        disp->curr_core_id = my_core_id;
+    }
+#elif CONFIG_SCHEDULER_RR
+#error NYI!
+#else
+#error must define scheduler policy in Config.hs
+#endif
+    // do it for dcbs in wakeup queue
+    for (struct dcb *d = kcb->wakeup_queue_head; d; d=d->wakeup_next) {
+        printk(LOG_NOTE, "[wakeup] updating current core id to %d for %s\n",
+                my_core_id, get_disp_name(d));
+        struct dispatcher_shared_generic *disp =
+            get_dispatcher_shared_generic(d->disp);
+        disp->curr_core_id = my_core_id;
+    }
+
+    for (int i = 0; i < NDISPATCH; i++) {
+        struct capability *cap = &kcb->irq_dispatch[i].cap;
+        if (cap->type == ObjType_EndPoint) {
+            printk(LOG_NOTE, "[irq] updating current core id to %d for %s\n",
+                    my_core_id, get_disp_name(cap->u.endpoint.listener));
+            struct dispatcher_shared_generic *disp =
+                get_dispatcher_shared_generic(cap->u.endpoint.listener->disp);
+            disp->curr_core_id = my_core_id;
+        }
+    }
+}
index bbf6637..672157c 100644 (file)
@@ -150,6 +150,13 @@ sys_dispatcher_setup(struct capability *to, capaddr_t cptr, int depth,
         dcb->domain_id = odisp->u.dispatcher.dcb->domain_id;
     }
 
+    /* 7. (HACK) Set current core id */
+    {
+    struct dispatcher_shared_generic *disp =
+        get_dispatcher_shared_generic(dcb->disp);
+    disp->curr_core_id = my_core_id;
+    }
+
     if(!dcb->is_vm_guest) {
         struct dispatcher_shared_generic *disp =
                     get_dispatcher_shared_generic(dcb->disp);
index 17e2a3c..12c81c9 100644 (file)
@@ -932,6 +932,16 @@ coreid_t disp_get_core_id(void)
 }
 
 /**
+ * \brief returns the current core_id stored in disp_shared struct
+ */
+coreid_t disp_get_current_core_id(void)
+{
+    dispatcher_handle_t handle = curdispatcher();
+    struct dispatcher_shared_generic* disp = get_dispatcher_shared_generic(handle);
+    return disp->curr_core_id;
+}
+
+/**
  * \brief returns the domain_id stored in disp_priv struct
  */
 domainid_t disp_get_domain_id(void)
index ac0f9ef..feb19bb 100644 (file)
@@ -58,7 +58,7 @@ errval_t pci_reregister_irq_for_device(uint32_t class, uint32_t subclass, uint32
 
     err = pci_client->vtbl.
         reregister_interrupt(pci_client, class, subclass, prog_if, vendor,
-                device, bus, dev, fun, 0 /* HACK: should be *real* core id */,
+                device, bus, dev, fun, disp_get_current_core_id(),
                 vector, &msgerr);
     if (err_is_fail(err)) {
         return err;