History

Drivers: hv: vmbus: Ignore CHANNELMSG_TL_CONNECT_RESULT(23)

When a Linux hv_sock app tries to connect to a Service GUID on which no host app is listening, a recent host (RS3+) sends a CHANNELMSG_TL_CONNECT_RESULT (23) message to Linux and this triggers such a warning: unknown msgtype=23 WARNING: CPU: 2 PID: 0 at drivers/hv/vmbus_drv.c:1031 vmbus_on_msg_dpc Actually Linux can safely ignore the message because the Linux app's connect() will time out in 2 seconds: see VSOCK_DEFAULT_CONNECT_TIMEOUT and vsock_stream_connect(). We don't bother to make use of the message because: 1) it's only supported on recent hosts; 2) a non-trivial effort is required to use the message in Linux, but the benefit is small. So, let's not see the warning by silently ignoring the message.

Dexuan Cui committed 6 years ago

Commit ddc9d351 parent 382a4623 files · +13 −14Browse files

Unified · Split

3 files
  1. drivers/hv/channel_mgmt.c +7 −14
  2. drivers/hv/vmbus_drv.c +4 −0
  3. include/linux/hyperv.h +2 −0
drivers/hv/channel_mgmt.c+7−14
@@ -1351,6 +1351,8 @@ channel_message_table[CHANNELMSG_COUNT] = { · 1350 unmodified lines
13511351 { CHANNELMSG_19, 0, NULL },
13521352 { CHANNELMSG_20, 0, NULL },
13531353 { CHANNELMSG_TL_CONNECT_REQUEST, 0, NULL },
1354+ { CHANNELMSG_22, 0, NULL },
1355+ { CHANNELMSG_TL_CONNECT_RESULT, 0, NULL },
13541356 };
13551357
13561358 /*
@@ -1362,25 +1364,16 @@ void vmbus_onmessage(void *context) · 5 unmodified lines
13621364 {
13631365 struct hv_message *msg = context;
13641366 struct vmbus_channel_message_header *hdr;
1365− int size;
13661367
13671368 hdr = (struct vmbus_channel_message_header *)msg->u.payload;
1368− size = msg->header.payload_size;
13691369
13701370 trace_vmbus_on_message(hdr);
13711371
1372− if (hdr->msgtype >= CHANNELMSG_COUNT) {
1373− pr_err("Received invalid channel message type %d size %d\n",
1374− hdr->msgtype, size);
1375− print_hex_dump_bytes("", DUMP_PREFIX_NONE,
1376− (unsigned char *)msg->u.payload, size);
1377− return;
1378− }
1379−
1380− if (channel_message_table[hdr->msgtype].message_handler)
1381− channel_message_table[hdr->msgtype].message_handler(hdr);
1382− else
1383− pr_err("Unhandled channel message type %d\n", hdr->msgtype);
1372+ /*
1373+ * vmbus_on_msg_dpc() makes sure the hdr->msgtype here can not go
1374+ * out of bound and the message_handler pointer can not be NULL.
1375+ */
1376+ channel_message_table[hdr->msgtype].message_handler(hdr);
13841377 }
13851378
13861379 /*
drivers/hv/vmbus_drv.c+4−0
@@ -1033,6 +1033,10 @@ void vmbus_on_msg_dpc(unsigned long data) · 1032 unmodified lines
10331033 }
10341034
10351035 entry = &channel_message_table[hdr->msgtype];
1036+
1037+ if (!entry->message_handler)
1038+ goto msg_handled;
1039+
10361040 if (entry->handler_type == VMHT_BLOCKING) {
10371041 ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
10381042 if (ctx == NULL)
include/linux/hyperv.h+2−0
@@ -425,6 +425,8 @@ enum vmbus_channel_message_type { · 424 unmodified lines
425425 CHANNELMSG_19 = 19,
426426 CHANNELMSG_20 = 20,
427427 CHANNELMSG_TL_CONNECT_REQUEST = 21,
428+ CHANNELMSG_22 = 22,
429+ CHANNELMSG_TL_CONNECT_RESULT = 23,
428430 CHANNELMSG_COUNT
429431 };
430432