4.14-stable review patch.  If anyone has any objections, please let me know.

------------------

From: Nadav Amit <na...@vmware.com>

commit ce664331b2487a5d244a51cbdd8cb54f866fbe5d upstream.

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. This might cause VMCI doorbell not to be enabled, resulting in
degraded performance.

Fixes: 48e3d668b790 ("VMware balloon: Enable notification via VMCI")
Cc: sta...@vger.kernel.org
Reviewed-by: Xavier Deguillard <xdeguill...@vmware.com>
Signed-off-by: Nadav Amit <na...@vmware.com>
Signed-off-by: Greg Kroah-Hartman <gre...@linuxfoundation.org>

---
 drivers/misc/vmw_balloon.c |   37 +++++++++++++++++++------------------
 1 file changed, 19 insertions(+), 18 deletions(-)

--- a/drivers/misc/vmw_balloon.c
+++ b/drivers/misc/vmw_balloon.c
@@ -1036,29 +1036,30 @@ static void vmballoon_vmci_cleanup(struc
  */
 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;
 }
 
 /*


Reply via email to