18
18
* Haiyang Zhang <haiyangz@microsoft.com>
19
19
* Hank Janssen <hjanssen@microsoft.com>
21
#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21
23
#include <linux/kernel.h>
22
24
#include <linux/init.h>
23
25
#include <linux/module.h>
59
52
PAGE_SIZE, &recvlen, &requestid);
62
DPRINT_DBG(VMBUS, "shutdown packet: len=%d, requestid=%lld",
65
55
icmsghdrp = (struct icmsg_hdr *)&shut_txf_buf[
66
56
sizeof(struct vmbuspipe_hdr)];
79
69
icmsghdrp->status = HV_S_OK;
80
70
execute_shutdown = true;
82
DPRINT_INFO(VMBUS, "Shutdown request received -"
83
" graceful shutdown initiated");
72
pr_info("Shutdown request received -"
73
" graceful shutdown initiated\n");
86
76
icmsghdrp->status = HV_E_FAIL;
87
77
execute_shutdown = false;
89
DPRINT_INFO(VMBUS, "Shutdown request received -"
79
pr_info("Shutdown request received -"
80
" Invalid request\n");
95
85
icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION
159
149
PAGE_SIZE, &recvlen, &requestid);
161
151
if (recvlen > 0) {
162
DPRINT_DBG(VMBUS, "timesync packet: recvlen=%d, requestid=%lld",
165
152
icmsghdrp = (struct icmsg_hdr *)&time_txf_buf[
166
153
sizeof(struct vmbuspipe_hdr)];
200
187
PAGE_SIZE, &recvlen, &requestid);
202
189
if (recvlen > 0) {
203
DPRINT_DBG(VMBUS, "heartbeat packet: len=%d, requestid=%lld",
206
190
icmsghdrp = (struct icmsg_hdr *)&hbeat_txf_buf[
207
191
sizeof(struct vmbuspipe_hdr)];
268
249
hbeat_txf_buf = kmalloc(PAGE_SIZE, GFP_KERNEL);
270
251
if (!shut_txf_buf || !time_txf_buf || !hbeat_txf_buf) {
272
"Unable to allocate memory for receive buffer\n");
252
pr_info("Unable to allocate memory for receive buffer\n");
273
253
kfree(shut_txf_buf);
274
254
kfree(time_txf_buf);
275
255
kfree(hbeat_txf_buf);
279
hv_cb_utils[HV_SHUTDOWN_MSG].channel->onchannel_callback =
280
&shutdown_onchannelcallback;
281
259
hv_cb_utils[HV_SHUTDOWN_MSG].callback = &shutdown_onchannelcallback;
283
hv_cb_utils[HV_TIMESYNC_MSG].channel->onchannel_callback =
284
×ync_onchannelcallback;
285
261
hv_cb_utils[HV_TIMESYNC_MSG].callback = ×ync_onchannelcallback;
287
hv_cb_utils[HV_HEARTBEAT_MSG].channel->onchannel_callback =
288
&heartbeat_onchannelcallback;
289
263
hv_cb_utils[HV_HEARTBEAT_MSG].callback = &heartbeat_onchannelcallback;
291
hv_cb_utils[HV_KVP_MSG].channel->onchannel_callback =
292
&hv_kvp_onchannelcallback;
265
hv_cb_utils[HV_KVP_MSG].callback = &hv_kvp_onchannelcallback;
299
270
static void exit_hyperv_utils(void)
301
printk(KERN_INFO "De-Registered HyperV Utility Driver\n");
303
hv_cb_utils[HV_SHUTDOWN_MSG].channel->onchannel_callback =
305
hv_cb_utils[HV_SHUTDOWN_MSG].callback = &chn_cb_negotiate;
307
hv_cb_utils[HV_TIMESYNC_MSG].channel->onchannel_callback =
309
hv_cb_utils[HV_TIMESYNC_MSG].callback = &chn_cb_negotiate;
311
hv_cb_utils[HV_HEARTBEAT_MSG].channel->onchannel_callback =
313
hv_cb_utils[HV_HEARTBEAT_MSG].callback = &chn_cb_negotiate;
315
hv_cb_utils[HV_KVP_MSG].channel->onchannel_callback =
272
pr_info("De-Registered HyperV Utility Driver\n");
274
if (hv_cb_utils[HV_SHUTDOWN_MSG].channel != NULL)
275
hv_cb_utils[HV_SHUTDOWN_MSG].channel->onchannel_callback =
277
hv_cb_utils[HV_SHUTDOWN_MSG].callback = NULL;
279
if (hv_cb_utils[HV_TIMESYNC_MSG].channel != NULL)
280
hv_cb_utils[HV_TIMESYNC_MSG].channel->onchannel_callback =
282
hv_cb_utils[HV_TIMESYNC_MSG].callback = NULL;
284
if (hv_cb_utils[HV_HEARTBEAT_MSG].channel != NULL)
285
hv_cb_utils[HV_HEARTBEAT_MSG].channel->onchannel_callback =
287
hv_cb_utils[HV_HEARTBEAT_MSG].callback = NULL;
289
if (hv_cb_utils[HV_KVP_MSG].channel != NULL)
290
hv_cb_utils[HV_KVP_MSG].channel->onchannel_callback =
292
hv_cb_utils[HV_KVP_MSG].callback = NULL;
319
296
kfree(shut_txf_buf);