[RFC 01/12] Drivers: hv: vmbus: Drop unsupported VMBus devices earlier

From: mhkelley58
Date: Tue Jun 04 2024 - 01:11:02 EST


From: Michael Kelley <mhklinux@xxxxxxxxxxx>

Because Hyper-V doesn't know ahead-of-time what operating system will be
running in a guest VM, it may offer to Linux guests VMBus devices that are
intended for use only in Windows guests. Currently in Linux, VMBus
channels are created for these devices, and they are processed by
vmbus_device_register(). While nothing further happens because no matching
driver is found, the channel continues to exist.

To avoid having the spurious channel, drop such devices immediately in
vmbus_onoffer(), based on identifying the device in the
vmbus_unsupported_devs table. If Hyper-V should issue a rescind request
for the device, no matching channel will be found and the rescind will
also be ignored.

Since unsupported devices are dropped early, the check for unsupported
devices in hv_get_dev_type() is redundant. Remove it.

Signed-off-by: Michael Kelley <mhklinux@xxxxxxxxxxx>
---
drivers/hv/channel_mgmt.c | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/drivers/hv/channel_mgmt.c b/drivers/hv/channel_mgmt.c
index 3c6011a48dab..a216a0aede73 100644
--- a/drivers/hv/channel_mgmt.c
+++ b/drivers/hv/channel_mgmt.c
@@ -203,7 +203,7 @@ static u16 hv_get_dev_type(const struct vmbus_channel *channel)
const guid_t *guid = &channel->offermsg.offer.if_type;
u16 i;

- if (is_hvsock_channel(channel) || is_unsupported_vmbus_devs(guid))
+ if (is_hvsock_channel(channel))
return HV_UNKNOWN;

for (i = HV_IDE; i < HV_UNKNOWN; i++) {
@@ -1036,6 +1036,16 @@ static void vmbus_onoffer(struct vmbus_channel_message_header *hdr)

trace_vmbus_onoffer(offer);

+ /*
+ * Hyper-V may offer pseudo-devices with functionality intended for
+ * Windows guests. Silently ignore them. There's no value in
+ * cluttering dmesg with error messages.
+ */
+ if (is_unsupported_vmbus_devs(&offer->offer.if_type)) {
+ atomic_dec(&vmbus_connection.offer_in_progress);
+ return;
+ }
+
if (!vmbus_is_valid_offer(offer)) {
pr_err_ratelimited("Invalid offer %d from the host supporting isolation\n",
offer->child_relid);
--
2.25.1