From: Andrea Parri <parri.and...@gmail.com> Sent: Thursday, October 10, 2019 
8:46 AM
> 
> 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 <mikel...@microsoft.com>
> Signed-off-by: Andrea Parri <parri.and...@gmail.com>
> ---
>  drivers/hv/connection.c | 46 ++++++++++++++---------------------------
>  drivers/hv/vmbus_drv.c  |  3 +--
>  include/linux/hyperv.h  |  4 ----
>  3 files changed, 17 insertions(+), 36 deletions(-)
> 
> @@ -244,20 +232,18 @@ int vmbus_connect(void)
>        * version.
>        */
> 
> -     version = VERSION_CURRENT;
> +     for (i = 0; i < ARRAY_SIZE(vmbus_versions); i++) {
> +             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)
> +     if (vmbus_connection.conn_state != CONNECTED)
>               goto cleanup;
> 

This is a nit, but the loop exit path bugs me.  When a connection
is established, the loop is exited by the "break", and then
conn_state has to be tested again to decide whether the loop
exited due to getting a connection vs. hitting the end of the list.
Slightly cleaner in my mind would be:

        for (i=0; ; i++) {
                if (i == ARRAY_SIZE(vmbus_versions))
                        goto cleanup;

                version  = vmbus_versions[i];
                ret = vmbus_negotiate_version(msginfo, version);
                if (ret == -ETIMEDOUT)
                        goto cleanup;

                if (vmbus_connection.conn_state == CONNECTED)
                        break;
        }

Michael

Reply via email to