From: Andrea Parri <parri.andrea@xxxxxxxxx> 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 <mikelley@xxxxxxxxxxxxx> > Signed-off-by: Andrea Parri <parri.andrea@xxxxxxxxx> > --- > 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