static inline void notify_daemon(struct consfront_dev *dev) { /* Use evtchn: this is called early, before irq is set up. */ if (!dev) minios_notify_remote_via_evtchn(start_info.console.domU.evtchn); else minios_notify_remote_via_evtchn(dev->evtchn); }
static void xenbus_thread_func(void *ign) { struct xsd_sockmsg msg; unsigned prod = xenstore_buf->rsp_prod; for (;;) { minios_wait_event(xb_waitq, prod != xenstore_buf->rsp_prod); while (1) { prod = xenstore_buf->rsp_prod; DEBUG("Rsp_cons %d, rsp_prod %d.\n", xenstore_buf->rsp_cons, xenstore_buf->rsp_prod); if (xenstore_buf->rsp_prod - xenstore_buf->rsp_cons < sizeof(msg)) { minios_notify_remote_via_evtchn(start_info.store_evtchn); break; } rmb(); memcpy_from_ring(xenstore_buf->rsp, &msg, MASK_XENSTORE_IDX(xenstore_buf->rsp_cons), sizeof(msg)); DEBUG("Msg len %d, %d avail, id %d.\n", msg.len + sizeof(msg), xenstore_buf->rsp_prod - xenstore_buf->rsp_cons, msg.req_id); if (xenstore_buf->rsp_prod - xenstore_buf->rsp_cons < sizeof(msg) + msg.len) { minios_notify_remote_via_evtchn(start_info.store_evtchn); break; } DEBUG("Message is good.\n"); if(msg.type == XS_WATCH_EVENT) { struct xenbus_event *event = bmk_xmalloc_bmk(sizeof(*event) + msg.len); struct xenbus_event_queue *events = NULL; char *data = (char*)event + sizeof(*event); struct xenbus_watch *watch; memcpy_from_ring(xenstore_buf->rsp, data, MASK_XENSTORE_IDX(xenstore_buf->rsp_cons + sizeof(msg)), msg.len); event->path = data; event->token = event->path + bmk_strlen(event->path) + 1; mb(); xenstore_buf->rsp_cons += msg.len + sizeof(msg); spin_lock(&xenbus_req_lock); MINIOS_LIST_FOREACH(watch, &watches, entry) if (!bmk_strcmp(watch->token, event->token)) { event->watch = watch; events = watch->events; break; } if (events) { queue_event(events, event); } else { minios_printk("unexpected watch token %s\n", event->token); bmk_memfree(event, BMK_MEMWHO_WIREDBMK); } spin_unlock(&xenbus_req_lock); } else { req_info[msg.req_id].for_queue->reply = bmk_xmalloc_bmk(sizeof(msg) + msg.len); memcpy_from_ring(xenstore_buf->rsp, req_info[msg.req_id].for_queue->reply, MASK_XENSTORE_IDX(xenstore_buf->rsp_cons), msg.len + sizeof(msg)); mb(); xenstore_buf->rsp_cons += msg.len + sizeof(msg); spin_lock(&xenbus_req_lock); queue_event(req_info[msg.req_id].reply_queue, req_info[msg.req_id].for_queue); spin_unlock(&xenbus_req_lock); } wmb(); minios_notify_remote_via_evtchn(start_info.store_evtchn); } }