/* Send a mesasge to xenbus, in the same fashion as xb_write, and block waiting for a reply. The reply is malloced and should be freed by the caller. */ struct xsd_sockmsg * xenbus_msg_reply(int type, xenbus_transaction_t trans, struct write_req *io, int nr_reqs) { int id; struct xsd_sockmsg *rep; id = allocate_xenbus_id(); xb_write(type, id, trans, io, nr_reqs); DEBUG("waiting on response to request %d\n", id); wait_event(&req_info[id].waitq, req_info[id].ready); DEBUG("woke up on response to request %d\n", id); rmb(); rep = req_info[id].reply; BUG_ON(rep->req_id != id); release_xenbus_id(id); return rep; }
/* Send a mesasge to xenbus, in the same fashion as xb_write, and block waiting for a reply. The reply is malloced and should be freed by the caller. */ struct xsd_sockmsg * xenbus_msg_reply(int type, xenbus_transaction_t trans, struct write_req *io, int nr_reqs) { int id; DEFINE_WAIT(w); struct xsd_sockmsg *rep; id = allocate_xenbus_id(); add_waiter(w, req_info[id].waitq); xb_write(type, id, trans, io, nr_reqs); schedule(); remove_waiter(w, req_info[id].waitq); wake(current); rep = req_info[id].reply; BUG_ON(rep->req_id != id); release_xenbus_id(id); return rep; }