From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wei Liu Subject: [PATCH MINI-OS] xenbus: notify the other end when necessary Date: Mon, 26 Oct 2015 09:47:48 +0000 Message-ID: <1445852868-16532-1-git-send-email-wei.liu2@citrix.com> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Sender: xen-devel-bounces@lists.xen.org Errors-To: xen-devel-bounces@lists.xen.org To: minios-devel@lists.xenproject.org Cc: Ian Jackson , Xen-devel , Wei Liu , Ian Campbell , Samuel Thibault List-Id: xen-devel@lists.xenproject.org The xenbus thread didn't send notification to other end when it expected more data or consumed responses, which led to stalling the ring from time to time. This is the culprit that guest was less responsive when using stubdom because the device model was stalled. Fix this by sending notification to the other end at the right places. Signed-off-by: Wei Liu --- Cc: Ian Campbell Cc: Ian Jackson Cc: Samuel Thibault With this path I can migrate a guest with stubdom a few thousand times without any issue, while before I could easily trigger time out within a few iterations. This should make OSSTest stubdom test case more reliable. Ian J, this is a patch suitable for backporting to 4.6. It's good time to branch mini-os now. --- xenbus/xenbus.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/xenbus/xenbus.c b/xenbus/xenbus.c index 4613ed6..7451161 100644 --- a/xenbus/xenbus.c +++ b/xenbus/xenbus.c @@ -205,8 +205,10 @@ static void xenbus_thread_func(void *ign) 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)) + if (xenstore_buf->rsp_prod - xenstore_buf->rsp_cons < sizeof(msg)) { + notify_remote_via_evtchn(start_info.store_evtchn); break; + } rmb(); memcpy_from_ring(xenstore_buf->rsp, &msg, @@ -217,8 +219,10 @@ static void xenbus_thread_func(void *ign) xenstore_buf->rsp_prod - xenstore_buf->rsp_cons, msg.req_id); if (xenstore_buf->rsp_prod - xenstore_buf->rsp_cons < - sizeof(msg) + msg.len) + sizeof(msg) + msg.len) { + notify_remote_via_evtchn(start_info.store_evtchn); break; + } DEBUG("Message is good.\n"); @@ -265,6 +269,9 @@ static void xenbus_thread_func(void *ign) xenstore_buf->rsp_cons += msg.len + sizeof(msg); wake_up(&req_info[msg.req_id].waitq); } + + wmb(); + notify_remote_via_evtchn(start_info.store_evtchn); } } } -- 2.1.4