When vmballoon_vmci_init() sets a doorbell using VMCI_DOORBELL_SET, for
some reason it does not consider the status and looks at the result.
However, the hypervisor does not update the result - it updates the
status.

Fixes: 48e3d668b790 ("VMware balloon: Enable notification via VMCI")

Reviewed-by: Xavier Deguillard <xdeguill...@vmware.com>
Signed-off-by: Nadav Amit <na...@vmware.com>
---
 drivers/misc/vmw_balloon.c | 37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

diff --git a/drivers/misc/vmw_balloon.c b/drivers/misc/vmw_balloon.c
index db3cf91a515d..6e0b09b79fb5 100644
--- a/drivers/misc/vmw_balloon.c
+++ b/drivers/misc/vmw_balloon.c
@@ -1034,29 +1034,30 @@ static void vmballoon_vmci_cleanup(struct vmballoon *b)
  */
 static int vmballoon_vmci_init(struct vmballoon *b)
 {
-       int error = 0;
+       unsigned long error, dummy;
 
-       if ((b->capabilities & VMW_BALLOON_SIGNALLED_WAKEUP_CMD) != 0) {
-               error = vmci_doorbell_create(&b->vmci_doorbell,
-                               VMCI_FLAG_DELAYED_CB,
-                               VMCI_PRIVILEGE_FLAG_RESTRICTED,
-                               vmballoon_doorbell, b);
-
-               if (error == VMCI_SUCCESS) {
-                       VMWARE_BALLOON_CMD(VMCI_DOORBELL_SET,
-                                       b->vmci_doorbell.context,
-                                       b->vmci_doorbell.resource, error);
-                       STATS_INC(b->stats.doorbell_set);
-               }
-       }
+       if ((b->capabilities & VMW_BALLOON_SIGNALLED_WAKEUP_CMD) == 0)
+               return 0;
 
-       if (error != 0) {
-               vmballoon_vmci_cleanup(b);
+       error = vmci_doorbell_create(&b->vmci_doorbell, VMCI_FLAG_DELAYED_CB,
+                                    VMCI_PRIVILEGE_FLAG_RESTRICTED,
+                                    vmballoon_doorbell, b);
 
-               return -EIO;
-       }
+       if (error != VMCI_SUCCESS)
+               goto fail;
+
+       error = VMWARE_BALLOON_CMD(VMCI_DOORBELL_SET, b->vmci_doorbell.context,
+                                  b->vmci_doorbell.resource, dummy);
+
+       STATS_INC(b->stats.doorbell_set);
+
+       if (error != VMW_BALLOON_SUCCESS)
+               goto fail;
 
        return 0;
+fail:
+       vmballoon_vmci_cleanup(b);
+       return -EIO;
 }
 
 /*
-- 
2.17.0

Reply via email to