Merge branch 'x86-hyperv-for-linus' of git://git.kernel.org/pub/scm/linux/kernel...
[sfrench/cifs-2.6.git] / drivers / hv / hv_snapshot.c
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * An implementation of host initiated guest snapshot.
4  *
5  * Copyright (C) 2013, Microsoft, Inc.
6  * Author : K. Y. Srinivasan <kys@microsoft.com>
7  */
8 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
9
10 #include <linux/net.h>
11 #include <linux/nls.h>
12 #include <linux/connector.h>
13 #include <linux/workqueue.h>
14 #include <linux/hyperv.h>
15
16 #include "hyperv_vmbus.h"
17 #include "hv_utils_transport.h"
18
19 #define VSS_MAJOR  5
20 #define VSS_MINOR  0
21 #define VSS_VERSION    (VSS_MAJOR << 16 | VSS_MINOR)
22
23 #define VSS_VER_COUNT 1
24 static const int vss_versions[] = {
25         VSS_VERSION
26 };
27
28 #define FW_VER_COUNT 1
29 static const int fw_versions[] = {
30         UTIL_FW_VERSION
31 };
32
33 /*
34  * Timeout values are based on expecations from host
35  */
36 #define VSS_FREEZE_TIMEOUT (15 * 60)
37
38 /*
39  * Global state maintained for transaction that is being processed. For a class
40  * of integration services, including the "VSS service", the specified protocol
41  * is a "request/response" protocol which means that there can only be single
42  * outstanding transaction from the host at any given point in time. We use
43  * this to simplify memory management in this driver - we cache and process
44  * only one message at a time.
45  *
46  * While the request/response protocol is guaranteed by the host, we further
47  * ensure this by serializing packet processing in this driver - we do not
48  * read additional packets from the VMBUs until the current packet is fully
49  * handled.
50  */
51
52 static struct {
53         int state;   /* hvutil_device_state */
54         int recv_len; /* number of bytes received. */
55         struct vmbus_channel *recv_channel; /* chn we got the request */
56         u64 recv_req_id; /* request ID. */
57         struct hv_vss_msg  *msg; /* current message */
58 } vss_transaction;
59
60
61 static void vss_respond_to_host(int error);
62
63 /*
64  * This state maintains the version number registered by the daemon.
65  */
66 static int dm_reg_value;
67
68 static const char vss_devname[] = "vmbus/hv_vss";
69 static __u8 *recv_buffer;
70 static struct hvutil_transport *hvt;
71
72 static void vss_timeout_func(struct work_struct *dummy);
73 static void vss_handle_request(struct work_struct *dummy);
74
75 static DECLARE_DELAYED_WORK(vss_timeout_work, vss_timeout_func);
76 static DECLARE_WORK(vss_handle_request_work, vss_handle_request);
77
78 static void vss_poll_wrapper(void *channel)
79 {
80         /* Transaction is finished, reset the state here to avoid races. */
81         vss_transaction.state = HVUTIL_READY;
82         hv_vss_onchannelcallback(channel);
83 }
84
85 /*
86  * Callback when data is received from user mode.
87  */
88
89 static void vss_timeout_func(struct work_struct *dummy)
90 {
91         /*
92          * Timeout waiting for userspace component to reply happened.
93          */
94         pr_warn("VSS: timeout waiting for daemon to reply\n");
95         vss_respond_to_host(HV_E_FAIL);
96
97         hv_poll_channel(vss_transaction.recv_channel, vss_poll_wrapper);
98 }
99
100 static void vss_register_done(void)
101 {
102         hv_poll_channel(vss_transaction.recv_channel, vss_poll_wrapper);
103         pr_debug("VSS: userspace daemon registered\n");
104 }
105
106 static int vss_handle_handshake(struct hv_vss_msg *vss_msg)
107 {
108         u32 our_ver = VSS_OP_REGISTER1;
109
110         switch (vss_msg->vss_hdr.operation) {
111         case VSS_OP_REGISTER:
112                 /* Daemon doesn't expect us to reply */
113                 dm_reg_value = VSS_OP_REGISTER;
114                 break;
115         case VSS_OP_REGISTER1:
116                 /* Daemon expects us to reply with our own version */
117                 if (hvutil_transport_send(hvt, &our_ver, sizeof(our_ver),
118                                           vss_register_done))
119                         return -EFAULT;
120                 dm_reg_value = VSS_OP_REGISTER1;
121                 break;
122         default:
123                 return -EINVAL;
124         }
125         pr_info("VSS: userspace daemon ver. %d connected\n", dm_reg_value);
126         return 0;
127 }
128
129 static int vss_on_msg(void *msg, int len)
130 {
131         struct hv_vss_msg *vss_msg = (struct hv_vss_msg *)msg;
132
133         if (len != sizeof(*vss_msg)) {
134                 pr_debug("VSS: Message size does not match length\n");
135                 return -EINVAL;
136         }
137
138         if (vss_msg->vss_hdr.operation == VSS_OP_REGISTER ||
139             vss_msg->vss_hdr.operation == VSS_OP_REGISTER1) {
140                 /*
141                  * Don't process registration messages if we're in the middle
142                  * of a transaction processing.
143                  */
144                 if (vss_transaction.state > HVUTIL_READY) {
145                         pr_debug("VSS: Got unexpected registration request\n");
146                         return -EINVAL;
147                 }
148
149                 return vss_handle_handshake(vss_msg);
150         } else if (vss_transaction.state == HVUTIL_USERSPACE_REQ) {
151                 vss_transaction.state = HVUTIL_USERSPACE_RECV;
152
153                 if (vss_msg->vss_hdr.operation == VSS_OP_HOT_BACKUP)
154                         vss_transaction.msg->vss_cf.flags =
155                                 VSS_HBU_NO_AUTO_RECOVERY;
156
157                 if (cancel_delayed_work_sync(&vss_timeout_work)) {
158                         vss_respond_to_host(vss_msg->error);
159                         /* Transaction is finished, reset the state. */
160                         hv_poll_channel(vss_transaction.recv_channel,
161                                         vss_poll_wrapper);
162                 }
163         } else {
164                 /* This is a spurious call! */
165                 pr_debug("VSS: Transaction not active\n");
166                 return -EINVAL;
167         }
168         return 0;
169 }
170
171 static void vss_send_op(void)
172 {
173         int op = vss_transaction.msg->vss_hdr.operation;
174         int rc;
175         struct hv_vss_msg *vss_msg;
176
177         /* The transaction state is wrong. */
178         if (vss_transaction.state != HVUTIL_HOSTMSG_RECEIVED) {
179                 pr_debug("VSS: Unexpected attempt to send to daemon\n");
180                 return;
181         }
182
183         vss_msg = kzalloc(sizeof(*vss_msg), GFP_KERNEL);
184         if (!vss_msg)
185                 return;
186
187         vss_msg->vss_hdr.operation = op;
188
189         vss_transaction.state = HVUTIL_USERSPACE_REQ;
190
191         schedule_delayed_work(&vss_timeout_work, op == VSS_OP_FREEZE ?
192                         VSS_FREEZE_TIMEOUT * HZ : HV_UTIL_TIMEOUT * HZ);
193
194         rc = hvutil_transport_send(hvt, vss_msg, sizeof(*vss_msg), NULL);
195         if (rc) {
196                 pr_warn("VSS: failed to communicate to the daemon: %d\n", rc);
197                 if (cancel_delayed_work_sync(&vss_timeout_work)) {
198                         vss_respond_to_host(HV_E_FAIL);
199                         vss_transaction.state = HVUTIL_READY;
200                 }
201         }
202
203         kfree(vss_msg);
204 }
205
206 static void vss_handle_request(struct work_struct *dummy)
207 {
208         switch (vss_transaction.msg->vss_hdr.operation) {
209         /*
210          * Initiate a "freeze/thaw" operation in the guest.
211          * We respond to the host once the operation is complete.
212          *
213          * We send the message to the user space daemon and the operation is
214          * performed in the daemon.
215          */
216         case VSS_OP_THAW:
217         case VSS_OP_FREEZE:
218         case VSS_OP_HOT_BACKUP:
219                 if (vss_transaction.state < HVUTIL_READY) {
220                         /* Userspace is not registered yet */
221                         pr_debug("VSS: Not ready for request.\n");
222                         vss_respond_to_host(HV_E_FAIL);
223                         return;
224                 }
225
226                 pr_debug("VSS: Received request for op code: %d\n",
227                         vss_transaction.msg->vss_hdr.operation);
228                 vss_transaction.state = HVUTIL_HOSTMSG_RECEIVED;
229                 vss_send_op();
230                 return;
231         case VSS_OP_GET_DM_INFO:
232                 vss_transaction.msg->dm_info.flags = 0;
233                 break;
234         default:
235                 break;
236         }
237
238         vss_respond_to_host(0);
239         hv_poll_channel(vss_transaction.recv_channel, vss_poll_wrapper);
240 }
241
242 /*
243  * Send a response back to the host.
244  */
245
246 static void
247 vss_respond_to_host(int error)
248 {
249         struct icmsg_hdr *icmsghdrp;
250         u32     buf_len;
251         struct vmbus_channel *channel;
252         u64     req_id;
253
254         /*
255          * Copy the global state for completing the transaction. Note that
256          * only one transaction can be active at a time.
257          */
258
259         buf_len = vss_transaction.recv_len;
260         channel = vss_transaction.recv_channel;
261         req_id = vss_transaction.recv_req_id;
262
263         icmsghdrp = (struct icmsg_hdr *)
264                         &recv_buffer[sizeof(struct vmbuspipe_hdr)];
265
266         if (channel->onchannel_callback == NULL)
267                 /*
268                  * We have raced with util driver being unloaded;
269                  * silently return.
270                  */
271                 return;
272
273         icmsghdrp->status = error;
274
275         icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION | ICMSGHDRFLAG_RESPONSE;
276
277         vmbus_sendpacket(channel, recv_buffer, buf_len, req_id,
278                                 VM_PKT_DATA_INBAND, 0);
279
280 }
281
282 /*
283  * This callback is invoked when we get a VSS message from the host.
284  * The host ensures that only one VSS transaction can be active at a time.
285  */
286
287 void hv_vss_onchannelcallback(void *context)
288 {
289         struct vmbus_channel *channel = context;
290         u32 recvlen;
291         u64 requestid;
292         struct hv_vss_msg *vss_msg;
293         int vss_srv_version;
294
295         struct icmsg_hdr *icmsghdrp;
296
297         if (vss_transaction.state > HVUTIL_READY)
298                 return;
299
300         vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 2, &recvlen,
301                          &requestid);
302
303         if (recvlen > 0) {
304                 icmsghdrp = (struct icmsg_hdr *)&recv_buffer[
305                         sizeof(struct vmbuspipe_hdr)];
306
307                 if (icmsghdrp->icmsgtype == ICMSGTYPE_NEGOTIATE) {
308                         if (vmbus_prep_negotiate_resp(icmsghdrp,
309                                  recv_buffer, fw_versions, FW_VER_COUNT,
310                                  vss_versions, VSS_VER_COUNT,
311                                  NULL, &vss_srv_version)) {
312
313                                 pr_info("VSS IC version %d.%d\n",
314                                         vss_srv_version >> 16,
315                                         vss_srv_version & 0xFFFF);
316                         }
317                 } else {
318                         vss_msg = (struct hv_vss_msg *)&recv_buffer[
319                                 sizeof(struct vmbuspipe_hdr) +
320                                 sizeof(struct icmsg_hdr)];
321
322                         /*
323                          * Stash away this global state for completing the
324                          * transaction; note transactions are serialized.
325                          */
326
327                         vss_transaction.recv_len = recvlen;
328                         vss_transaction.recv_req_id = requestid;
329                         vss_transaction.msg = (struct hv_vss_msg *)vss_msg;
330
331                         schedule_work(&vss_handle_request_work);
332                         return;
333                 }
334
335                 icmsghdrp->icflags = ICMSGHDRFLAG_TRANSACTION
336                         | ICMSGHDRFLAG_RESPONSE;
337
338                 vmbus_sendpacket(channel, recv_buffer,
339                                        recvlen, requestid,
340                                        VM_PKT_DATA_INBAND, 0);
341         }
342
343 }
344
345 static void vss_on_reset(void)
346 {
347         if (cancel_delayed_work_sync(&vss_timeout_work))
348                 vss_respond_to_host(HV_E_FAIL);
349         vss_transaction.state = HVUTIL_DEVICE_INIT;
350 }
351
352 int
353 hv_vss_init(struct hv_util_service *srv)
354 {
355         if (vmbus_proto_version < VERSION_WIN8_1) {
356                 pr_warn("Integration service 'Backup (volume snapshot)'"
357                         " not supported on this host version.\n");
358                 return -ENOTSUPP;
359         }
360         recv_buffer = srv->recv_buffer;
361         vss_transaction.recv_channel = srv->channel;
362
363         /*
364          * When this driver loads, the user level daemon that
365          * processes the host requests may not yet be running.
366          * Defer processing channel callbacks until the daemon
367          * has registered.
368          */
369         vss_transaction.state = HVUTIL_DEVICE_INIT;
370
371         hvt = hvutil_transport_init(vss_devname, CN_VSS_IDX, CN_VSS_VAL,
372                                     vss_on_msg, vss_on_reset);
373         if (!hvt) {
374                 pr_warn("VSS: Failed to initialize transport\n");
375                 return -EFAULT;
376         }
377
378         return 0;
379 }
380
381 void hv_vss_deinit(void)
382 {
383         vss_transaction.state = HVUTIL_DEVICE_DYING;
384         cancel_delayed_work_sync(&vss_timeout_work);
385         cancel_work_sync(&vss_handle_request_work);
386         hvutil_transport_destroy(hvt);
387 }