[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen master] x86/hvmloader: Don't wait for the producer to fill the ring if



commit d9eb706356ad4dbd04aad563ec4d2bcd3d7d6c03
Author:     Anshul Makkar <anshul.makkar@xxxxxxxxxx>
AuthorDate: Tue May 23 15:12:58 2017 +0100
Commit:     Andrew Cooper <andrew.cooper3@xxxxxxxxxx>
CommitDate: Thu May 25 09:59:49 2017 +0100

    x86/hvmloader: Don't wait for the producer to fill the ring if
    
    The condition: if there is a space in the ring then wait for the producer
    to fill the ring also evaluates to true even if the ring if full. It
    leads to a deadlock where producer is waiting for consumer
    to consume the items and consumer is waiting for producer to fill the ring.
    
    Fix for the issue: check if the ring is full and then break from
    the loop to consume the items from the ring.
    eg. case: prod = 1272, cons = 248.
    
    Signed-off-by: Anshul Makkar <anshul.makkar@xxxxxxxxxx>
    Reviewed-by: Jan Beulich <jbeulich@xxxxxxxx>
    Release-acked-by: Julien Grall <julien.grall@xxxxxxx>
---
 tools/firmware/hvmloader/xenbus.c | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/tools/firmware/hvmloader/xenbus.c 
b/tools/firmware/hvmloader/xenbus.c
index 448157d..2b89a56 100644
--- a/tools/firmware/hvmloader/xenbus.c
+++ b/tools/firmware/hvmloader/xenbus.c
@@ -141,7 +141,19 @@ static void ring_read(char *data, uint32_t len)
         /* Don't overrun the producer pointer */
         while ( (part = MASK_XENSTORE_IDX(rings->rsp_prod -
                                           rings->rsp_cons)) == 0 )
+        {
+            /*
+             * Don't wait for producer to fill the ring if it is already full.
+             * Condition happens when you write string > 1K into the ring.
+             * eg case prod=1272 cons=248.
+             */
+            if ( rings->rsp_prod - rings->rsp_cons == XENSTORE_RING_SIZE )
+            {
+                part = XENSTORE_RING_SIZE;
+                break;
+            }
             ring_wait();
+        }
         /* Don't overrun the end of the ring */
         if ( part > (XENSTORE_RING_SIZE - MASK_XENSTORE_IDX(rings->rsp_cons)) )
             part = XENSTORE_RING_SIZE - MASK_XENSTORE_IDX(rings->rsp_cons);
--
generated by git-patchbot for /home/xen/git/xen.git#master

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxx
https://lists.xenproject.org/xen-changelog

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.