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
1351 { CHANNELMSG_19, 0, NULL },1351 { CHANNELMSG_19, 0, NULL },
1352 { CHANNELMSG_20, 0, NULL },1352 { CHANNELMSG_20, 0, NULL },
1353 { CHANNELMSG_TL_CONNECT_REQUEST, 0, NULL },1353 { CHANNELMSG_TL_CONNECT_REQUEST, 0, NULL },
1354 { CHANNELMSG_22, 0, NULL },
1355 { CHANNELMSG_TL_CONNECT_RESULT, 0, NULL },
1354};1356};
1355 1357
1356/*1358/*
@@ -1362,25 +1364,16 @@ void vmbus_onmessage(void *context) · 5 unmodified lines
1362{1364{
1363 struct hv_message *msg = context;1365 struct hv_message *msg = context;
1364 struct vmbus_channel_message_header *hdr;1366 struct vmbus_channel_message_header *hdr;
1365 int size;
1366 1367
1367 hdr = (struct vmbus_channel_message_header *)msg->u.payload;1368 hdr = (struct vmbus_channel_message_header *)msg->u.payload;
1368 size = msg->header.payload_size;
1369 1369
1370 trace_vmbus_on_message(hdr);1370 trace_vmbus_on_message(hdr);
1371 1371
1372 if (hdr->msgtype >= CHANNELMSG_COUNT) {1372 /*
1373 pr_err("Received invalid channel message type %d size %d\n",1373 * vmbus_on_msg_dpc() makes sure the hdr->msgtype here can not go
1374 hdr->msgtype, size);1374 * out of bound and the message_handler pointer can not be NULL.
1375 print_hex_dump_bytes("", DUMP_PREFIX_NONE,1375 */
1376 (unsigned char *)msg->u.payload, size);1376 channel_message_table[hdr->msgtype].message_handler(hdr);
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);
1384}1377}
1385 1378
1386/*1379/*
drivers/hv/vmbus_drv.c+4−0
@@ -1033,6 +1033,10 @@ void vmbus_on_msg_dpc(unsigned long data) · 1032 unmodified lines
1033 }1033 }
1034 1034
1035 entry = &channel_message_table[hdr->msgtype];1035 entry = &channel_message_table[hdr->msgtype];
1036
1037 if (!entry->message_handler)
1038 goto msg_handled;
1039
1036 if (entry->handler_type == VMHT_BLOCKING) {1040 if (entry->handler_type == VMHT_BLOCKING) {
1037 ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);1041 ctx = kmalloc(sizeof(*ctx), GFP_ATOMIC);
1038 if (ctx == NULL)1042 if (ctx == NULL)
include/linux/hyperv.h+2−0
@@ -425,6 +425,8 @@ enum vmbus_channel_message_type { · 424 unmodified lines
425 CHANNELMSG_19 = 19,425 CHANNELMSG_19 = 19,
426 CHANNELMSG_20 = 20,426 CHANNELMSG_20 = 20,
427 CHANNELMSG_TL_CONNECT_REQUEST = 21,427 CHANNELMSG_TL_CONNECT_REQUEST = 21,
428 CHANNELMSG_22 = 22,
429 CHANNELMSG_TL_CONNECT_RESULT = 23,
428 CHANNELMSG_COUNT430 CHANNELMSG_COUNT
429};431};
430 432