Drivers: hv: vmbus: Introduce table of VMBus protocol versions
authorAndrea Parri <parri.andrea@gmail.com>
Tue, 15 Oct 2019 11:46:44 +0000 (13:46 +0200)
committerSasha Levin <sashal@kernel.org>
Fri, 22 Nov 2019 01:10:43 +0000 (20:10 -0500)
The technique used to get the next VMBus version seems increasisly
clumsy as the number of VMBus versions increases.  Performance is
not a concern since this is only done once during system boot; it's
just that we'll end up with more lines of code than is really needed.

As an alternative, introduce a table with the version numbers listed
in order (from the most recent to the oldest).  vmbus_connect() loops
through the versions listed in the table until it gets an accepted
connection or gets to the end of the table (invalid version).

Suggested-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Andrea Parri <parri.andrea@gmail.com>
Reviewed-by: Wei Liu <wei.liu@kernel.org>
Reviewed-by: Michael Kelley <mikelley@microsoft.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/hv/connection.c
drivers/hv/vmbus_drv.c
include/linux/hyperv.h

index 6e4c015783ffca5ec063c59ff5a478d2dc93de46..8dc48f53c1ac4f06060a0f6cd8d074bb3ca76270 100644 (file)
@@ -40,29 +40,17 @@ EXPORT_SYMBOL_GPL(vmbus_connection);
 __u32 vmbus_proto_version;
 EXPORT_SYMBOL_GPL(vmbus_proto_version);
 
-static __u32 vmbus_get_next_version(__u32 current_version)
-{
-       switch (current_version) {
-       case (VERSION_WIN7):
-               return VERSION_WS2008;
-
-       case (VERSION_WIN8):
-               return VERSION_WIN7;
-
-       case (VERSION_WIN8_1):
-               return VERSION_WIN8;
-
-       case (VERSION_WIN10):
-               return VERSION_WIN8_1;
-
-       case (VERSION_WIN10_V5):
-               return VERSION_WIN10;
-
-       case (VERSION_WS2008):
-       default:
-               return VERSION_INVAL;
-       }
-}
+/*
+ * Table of VMBus versions listed from newest to oldest.
+ */
+static __u32 vmbus_versions[] = {
+       VERSION_WIN10_V5,
+       VERSION_WIN10,
+       VERSION_WIN8_1,
+       VERSION_WIN8,
+       VERSION_WIN7,
+       VERSION_WS2008
+};
 
 int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, u32 version)
 {
@@ -169,8 +157,8 @@ int vmbus_negotiate_version(struct vmbus_channel_msginfo *msginfo, u32 version)
  */
 int vmbus_connect(void)
 {
-       int ret = 0;
        struct vmbus_channel_msginfo *msginfo = NULL;
+       int i, ret = 0;
        __u32 version;
 
        /* Initialize the vmbus connection */
@@ -244,21 +232,19 @@ int vmbus_connect(void)
         * version.
         */
 
-       version = VERSION_CURRENT;
+       for (i = 0; ; i++) {
+               if (i == ARRAY_SIZE(vmbus_versions))
+                       goto cleanup;
+
+               version = vmbus_versions[i];
 
-       do {
                ret = vmbus_negotiate_version(msginfo, version);
                if (ret == -ETIMEDOUT)
                        goto cleanup;
 
                if (vmbus_connection.conn_state == CONNECTED)
                        break;
-
-               version = vmbus_get_next_version(version);
-       } while (version != VERSION_INVAL);
-
-       if (version == VERSION_INVAL)
-               goto cleanup;
+       }
 
        vmbus_proto_version = version;
        pr_info("Vmbus version:%d.%d\n",
index 53a60c81e220d805fbcf28ce49e95019b6320f0b..0ac874faf7209e29a13aa12ca2a1587b5b29a8d5 100644 (file)
@@ -2220,8 +2220,7 @@ static int vmbus_bus_resume(struct device *dev)
         * We only use the 'vmbus_proto_version', which was in use before
         * hibernation, to re-negotiate with the host.
         */
-       if (vmbus_proto_version == VERSION_INVAL ||
-           vmbus_proto_version == 0) {
+       if (!vmbus_proto_version) {
                pr_err("Invalid proto version = 0x%x\n", vmbus_proto_version);
                return -EINVAL;
        }
index b4a017093b697e615b6850860f9d58a8ed65193c..c08b62dbd151f1bbb418fbcf987d37357968980d 100644 (file)
@@ -192,10 +192,6 @@ static inline u32 hv_get_avail_to_write_percent(
 #define VERSION_WIN10  ((4 << 16) | (0))
 #define VERSION_WIN10_V5 ((5 << 16) | (0))
 
-#define VERSION_INVAL -1
-
-#define VERSION_CURRENT VERSION_WIN10_V5
-
 /* Make maximum size of pipe payload of 16K */
 #define MAX_PIPE_DATA_PAYLOAD          (sizeof(u8) * 16384)