Skip to content

Commit ddc9d35

Browse files
dcuiSasha Levin
authored andcommitted
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. Signed-off-by: Dexuan Cui <[email protected]> Reviewed-by: Michael Kelley <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 382a462 commit ddc9d35

File tree

3 files changed

+13
-14
lines changed

3 files changed

+13
-14
lines changed

drivers/hv/channel_mgmt.c

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1351,6 +1351,8 @@ channel_message_table[CHANNELMSG_COUNT] = {
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)
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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1033,6 +1033,10 @@ void vmbus_on_msg_dpc(unsigned long data)
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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,6 +425,8 @@ enum vmbus_channel_message_type {
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

0 commit comments

Comments
 (0)