}
}
+#ifdef notyet
+static void
+if_start_rollup(void)
+{
+ /* TODO */
+}
+#endif
+
static void
ifnetinit(void *dummy __unused)
{
netmsg_service_port_init(&thr->td_msgport);
lwkt_schedule(thr);
}
+#ifdef notyet
+ netisr_register_rollup(if_start_rollup, NETISR_ROLLUP_PRIO_IFSTART);
+#endif
}
struct ifnet *
struct netmsg_rollup {
TAILQ_ENTRY(netmsg_rollup) ru_entry;
netisr_ru_t ru_func;
+ int ru_prio;
};
struct netmsg_barrier {
}
void
-netisr_register_rollup(netisr_ru_t ru_func)
+netisr_register_rollup(netisr_ru_t ru_func, int prio)
{
- struct netmsg_rollup *ru;
+ struct netmsg_rollup *new_ru, *ru;
+
+ new_ru = kmalloc(sizeof(*new_ru), M_TEMP, M_WAITOK|M_ZERO);
+ new_ru->ru_func = ru_func;
+ new_ru->ru_prio = prio;
- ru = kmalloc(sizeof(*ru), M_TEMP, M_WAITOK|M_ZERO);
- ru->ru_func = ru_func;
- TAILQ_INSERT_TAIL(&netrulist, ru, ru_entry);
+ /*
+ * Higher priority "rollup" appears first
+ */
+ TAILQ_FOREACH(ru, &netrulist, ru_entry) {
+ if (ru->ru_prio < new_ru->ru_prio) {
+ TAILQ_INSERT_BEFORE(ru, new_ru, ru_entry);
+ return;
+ }
+ }
+ TAILQ_INSERT_TAIL(&netrulist, new_ru, ru_entry);
}
/*
#define NETMSG_SERVICE_ADAPTIVE 1
#define NETMSG_SERVICE_MPSAFE 2
+#define NETISR_ROLLUP_PRIO_TCP 200
+#define NETISR_ROLLUP_PRIO_IFSTART 50
+
extern lwkt_port netisr_adone_rport;
extern lwkt_port netisr_afree_rport;
extern lwkt_port netisr_afree_free_so_rport;
void netisr_register(int, netisr_fn_t, netisr_cpufn_t);
void netisr_register_hashcheck(int, netisr_hashck_t);
-void netisr_register_rollup(netisr_ru_t ru_func);
+void netisr_register_rollup(netisr_ru_t ru_func, int ru_prio);
void netisr_characterize(int num, struct mbuf **mp, int hoff);
void netisr_hashcheck(int num, struct mbuf *m,
}
syncache_init();
- netisr_register_rollup(tcp_willblock);
+ netisr_register_rollup(tcp_willblock, NETISR_ROLLUP_PRIO_TCP);
}
static void