1 // SPDX-License-Identifier: GPL-2.0
2 /*
3 * Copyright (C) 2018-2020 Intel Corporation.
4 * Copyright (C) 2020 Red Hat, Inc.
5 *
6 * Author: Tiwei Bie <tiwei.bie@intel.com>
7 * Jason Wang <jasowang@redhat.com>
8 *
9 * Thanks Michael S. Tsirkin for the valuable comments and
10 * suggestions. And thanks to Cunming Liang and Zhihong Wang for all
11 * their supports.
12 */
13
14 #include <linux/kernel.h>
15 #include <linux/module.h>
16 #include <linux/cdev.h>
17 #include <linux/device.h>
18 #include <linux/mm.h>
19 #include <linux/slab.h>
20 #include <linux/iommu.h>
21 #include <linux/uuid.h>
22 #include <linux/vdpa.h>
23 #include <linux/nospec.h>
24 #include <linux/vhost.h>
25
26 #include "vhost.h"
27
28 enum {
29 VHOST_VDPA_BACKEND_FEATURES =
30 (1ULL << VHOST_BACKEND_F_IOTLB_MSG_V2) |
31 (1ULL << VHOST_BACKEND_F_IOTLB_BATCH) |
32 (1ULL << VHOST_BACKEND_F_IOTLB_ASID),
33 };
34
35 #define VHOST_VDPA_DEV_MAX (1U << MINORBITS)
36
37 static int max_iotlb_entries = 2048;
38 module_param(max_iotlb_entries, int, 0444);
39 MODULE_PARM_DESC(max_iotlb_entries,
40 "Maximum number of iotlb entries. (default: 2048)");
41
42 #define VHOST_VDPA_IOTLB_BUCKETS 16
43
44 struct vhost_vdpa_as {
45 struct hlist_node hash_link;
46 struct vhost_iotlb iotlb;
47 u32 id;
48 };
49
50 struct vhost_vdpa {
51 struct vhost_dev vdev;
52 struct iommu_domain *domain;
53 struct vhost_virtqueue *vqs;
54 struct completion completion;
55 struct vdpa_device *vdpa;
56 struct hlist_head as[VHOST_VDPA_IOTLB_BUCKETS];
57 struct device dev;
58 struct cdev cdev;
59 atomic_t opened;
60 u32 nvqs;
61 int virtio_id;
62 int minor;
63 struct eventfd_ctx *config_ctx;
64 int in_batch;
65 struct vdpa_iova_range range;
66 u32 batch_asid;
67 bool suspended;
68 };
69
70 static DEFINE_IDA(vhost_vdpa_ida);
71
72 static dev_t vhost_vdpa_major;
73
74 static void vhost_vdpa_iotlb_unmap(struct vhost_vdpa *v,
75 struct vhost_iotlb *iotlb, u64 start,
76 u64 last, u32 asid);
77
iotlb_to_asid(struct vhost_iotlb * iotlb)78 static inline u32 iotlb_to_asid(struct vhost_iotlb *iotlb)
79 {
80 struct vhost_vdpa_as *as = container_of(iotlb, struct
81 vhost_vdpa_as, iotlb);
82 return as->id;
83 }
84
asid_to_as(struct vhost_vdpa * v,u32 asid)85 static struct vhost_vdpa_as *asid_to_as(struct vhost_vdpa *v, u32 asid)
86 {
87 struct hlist_head *head = &v->as[asid % VHOST_VDPA_IOTLB_BUCKETS];
88 struct vhost_vdpa_as *as;
89
90 hlist_for_each_entry(as, head, hash_link)
91 if (as->id == asid)
92 return as;
93
94 return NULL;
95 }
96
asid_to_iotlb(struct vhost_vdpa * v,u32 asid)97 static struct vhost_iotlb *asid_to_iotlb(struct vhost_vdpa *v, u32 asid)
98 {
99 struct vhost_vdpa_as *as = asid_to_as(v, asid);
100
101 if (!as)
102 return NULL;
103
104 return &as->iotlb;
105 }
106
vhost_vdpa_alloc_as(struct vhost_vdpa * v,u32 asid)107 static struct vhost_vdpa_as *vhost_vdpa_alloc_as(struct vhost_vdpa *v, u32 asid)
108 {
109 struct hlist_head *head = &v->as[asid % VHOST_VDPA_IOTLB_BUCKETS];
110 struct vhost_vdpa_as *as;
111
112 if (asid_to_as(v, asid))
113 return NULL;
114
115 if (asid >= v->vdpa->nas)
116 return NULL;
117 if (max_iotlb_entries <= 0)
118 return NULL;
119
120 as = kmalloc_obj(*as);
121 if (!as)
122 return NULL;
123
124 vhost_iotlb_init(&as->iotlb, max_iotlb_entries, 0);
125 as->id = asid;
126 hlist_add_head(&as->hash_link, head);
127
128 return as;
129 }
130
vhost_vdpa_find_alloc_as(struct vhost_vdpa * v,u32 asid)131 static struct vhost_vdpa_as *vhost_vdpa_find_alloc_as(struct vhost_vdpa *v,
132 u32 asid)
133 {
134 struct vhost_vdpa_as *as = asid_to_as(v, asid);
135
136 if (as)
137 return as;
138
139 return vhost_vdpa_alloc_as(v, asid);
140 }
141
vhost_vdpa_reset_map(struct vhost_vdpa * v,u32 asid)142 static void vhost_vdpa_reset_map(struct vhost_vdpa *v, u32 asid)
143 {
144 struct vdpa_device *vdpa = v->vdpa;
145 const struct vdpa_config_ops *ops = vdpa->config;
146
147 if (ops->reset_map)
148 ops->reset_map(vdpa, asid);
149 }
150
vhost_vdpa_remove_as(struct vhost_vdpa * v,u32 asid)151 static int vhost_vdpa_remove_as(struct vhost_vdpa *v, u32 asid)
152 {
153 struct vhost_vdpa_as *as = asid_to_as(v, asid);
154
155 if (!as)
156 return -EINVAL;
157
158 hlist_del(&as->hash_link);
159 vhost_vdpa_iotlb_unmap(v, &as->iotlb, 0ULL, 0ULL - 1, asid);
160 /*
161 * Devices with vendor specific IOMMU may need to restore
162 * iotlb to the initial or default state, which cannot be
163 * cleaned up in the all range unmap call above. Give them
164 * a chance to clean up or reset the map to the desired
165 * state.
166 */
167 vhost_vdpa_reset_map(v, asid);
168 kfree(as);
169
170 return 0;
171 }
172
handle_vq_kick(struct vhost_work * work)173 static void handle_vq_kick(struct vhost_work *work)
174 {
175 struct vhost_virtqueue *vq = container_of(work, struct vhost_virtqueue,
176 poll.work);
177 struct vhost_vdpa *v = container_of(vq->dev, struct vhost_vdpa, vdev);
178 const struct vdpa_config_ops *ops = v->vdpa->config;
179
180 ops->kick_vq(v->vdpa, vq - v->vqs);
181 }
182
vhost_vdpa_virtqueue_cb(void * private)183 static irqreturn_t vhost_vdpa_virtqueue_cb(void *private)
184 {
185 struct vhost_virtqueue *vq = private;
186 struct eventfd_ctx *call_ctx = vq->call_ctx.ctx;
187
188 if (call_ctx)
189 eventfd_signal(call_ctx);
190
191 return IRQ_HANDLED;
192 }
193
vhost_vdpa_config_cb(void * private)194 static irqreturn_t vhost_vdpa_config_cb(void *private)
195 {
196 struct vhost_vdpa *v = private;
197 struct eventfd_ctx *config_ctx = v->config_ctx;
198
199 if (config_ctx)
200 eventfd_signal(config_ctx);
201
202 return IRQ_HANDLED;
203 }
204
vhost_vdpa_setup_vq_irq(struct vhost_vdpa * v,u16 qid)205 static void vhost_vdpa_setup_vq_irq(struct vhost_vdpa *v, u16 qid)
206 {
207 struct vhost_virtqueue *vq = &v->vqs[qid];
208 const struct vdpa_config_ops *ops = v->vdpa->config;
209 struct vdpa_device *vdpa = v->vdpa;
210 int ret, irq;
211
212 if (!ops->get_vq_irq)
213 return;
214
215 irq = ops->get_vq_irq(vdpa, qid);
216 if (irq < 0)
217 return;
218
219 if (!vq->call_ctx.ctx)
220 return;
221
222 ret = irq_bypass_register_producer(&vq->call_ctx.producer,
223 vq->call_ctx.ctx, irq);
224 if (unlikely(ret))
225 dev_info(&v->dev, "vq %u, irq bypass producer (eventfd %p) registration fails, ret = %d\n",
226 qid, vq->call_ctx.ctx, ret);
227 }
228
vhost_vdpa_unsetup_vq_irq(struct vhost_vdpa * v,u16 qid)229 static void vhost_vdpa_unsetup_vq_irq(struct vhost_vdpa *v, u16 qid)
230 {
231 struct vhost_virtqueue *vq = &v->vqs[qid];
232
233 irq_bypass_unregister_producer(&vq->call_ctx.producer);
234 }
235
_compat_vdpa_reset(struct vhost_vdpa * v)236 static int _compat_vdpa_reset(struct vhost_vdpa *v)
237 {
238 struct vdpa_device *vdpa = v->vdpa;
239 u32 flags = 0;
240
241 v->suspended = false;
242
243 if (v->vdev.vqs) {
244 flags |= !vhost_backend_has_feature(v->vdev.vqs[0],
245 VHOST_BACKEND_F_IOTLB_PERSIST) ?
246 VDPA_RESET_F_CLEAN_MAP : 0;
247 }
248
249 return vdpa_reset(vdpa, flags);
250 }
251
vhost_vdpa_reset(struct vhost_vdpa * v)252 static int vhost_vdpa_reset(struct vhost_vdpa *v)
253 {
254 v->in_batch = 0;
255 return _compat_vdpa_reset(v);
256 }
257
vhost_vdpa_bind_mm(struct vhost_vdpa * v)258 static long vhost_vdpa_bind_mm(struct vhost_vdpa *v)
259 {
260 struct vdpa_device *vdpa = v->vdpa;
261 const struct vdpa_config_ops *ops = vdpa->config;
262
263 if (!vdpa->use_va || !ops->bind_mm)
264 return 0;
265
266 return ops->bind_mm(vdpa, v->vdev.mm);
267 }
268
vhost_vdpa_unbind_mm(struct vhost_vdpa * v)269 static void vhost_vdpa_unbind_mm(struct vhost_vdpa *v)
270 {
271 struct vdpa_device *vdpa = v->vdpa;
272 const struct vdpa_config_ops *ops = vdpa->config;
273
274 if (!vdpa->use_va || !ops->unbind_mm)
275 return;
276
277 ops->unbind_mm(vdpa);
278 }
279
vhost_vdpa_get_device_id(struct vhost_vdpa * v,u8 __user * argp)280 static long vhost_vdpa_get_device_id(struct vhost_vdpa *v, u8 __user *argp)
281 {
282 struct vdpa_device *vdpa = v->vdpa;
283 const struct vdpa_config_ops *ops = vdpa->config;
284 u32 device_id;
285
286 device_id = ops->get_device_id(vdpa);
287
288 if (copy_to_user(argp, &device_id, sizeof(device_id)))
289 return -EFAULT;
290
291 return 0;
292 }
293
vhost_vdpa_get_status(struct vhost_vdpa * v,u8 __user * statusp)294 static long vhost_vdpa_get_status(struct vhost_vdpa *v, u8 __user *statusp)
295 {
296 struct vdpa_device *vdpa = v->vdpa;
297 const struct vdpa_config_ops *ops = vdpa->config;
298 u8 status;
299
300 status = ops->get_status(vdpa);
301
302 if (copy_to_user(statusp, &status, sizeof(status)))
303 return -EFAULT;
304
305 return 0;
306 }
307
vhost_vdpa_set_status(struct vhost_vdpa * v,u8 __user * statusp)308 static long vhost_vdpa_set_status(struct vhost_vdpa *v, u8 __user *statusp)
309 {
310 struct vdpa_device *vdpa = v->vdpa;
311 const struct vdpa_config_ops *ops = vdpa->config;
312 u8 status, status_old;
313 u32 nvqs = v->nvqs;
314 int ret;
315 u16 i;
316
317 if (copy_from_user(&status, statusp, sizeof(status)))
318 return -EFAULT;
319
320 status_old = ops->get_status(vdpa);
321
322 /*
323 * Userspace shouldn't remove status bits unless reset the
324 * status to 0.
325 */
326 if (status != 0 && (status_old & ~status) != 0)
327 return -EINVAL;
328
329 if ((status_old & VIRTIO_CONFIG_S_DRIVER_OK) && !(status & VIRTIO_CONFIG_S_DRIVER_OK))
330 for (i = 0; i < nvqs; i++)
331 vhost_vdpa_unsetup_vq_irq(v, i);
332
333 if (status == 0) {
334 ret = _compat_vdpa_reset(v);
335 if (ret)
336 return ret;
337 } else
338 vdpa_set_status(vdpa, status);
339
340 if ((status & VIRTIO_CONFIG_S_DRIVER_OK) && !(status_old & VIRTIO_CONFIG_S_DRIVER_OK))
341 for (i = 0; i < nvqs; i++)
342 vhost_vdpa_setup_vq_irq(v, i);
343
344 return 0;
345 }
346
vhost_vdpa_config_validate(struct vhost_vdpa * v,struct vhost_vdpa_config * c)347 static int vhost_vdpa_config_validate(struct vhost_vdpa *v,
348 struct vhost_vdpa_config *c)
349 {
350 struct vdpa_device *vdpa = v->vdpa;
351 size_t size = vdpa->config->get_config_size(vdpa);
352
353 if (c->len == 0 || c->off > size)
354 return -EINVAL;
355
356 if (c->len > size - c->off)
357 return -E2BIG;
358
359 return 0;
360 }
361
vhost_vdpa_get_config(struct vhost_vdpa * v,struct vhost_vdpa_config __user * c)362 static long vhost_vdpa_get_config(struct vhost_vdpa *v,
363 struct vhost_vdpa_config __user *c)
364 {
365 struct vdpa_device *vdpa = v->vdpa;
366 struct vhost_vdpa_config config;
367 unsigned long size = offsetof(struct vhost_vdpa_config, buf);
368 u8 *buf;
369
370 if (copy_from_user(&config, c, size))
371 return -EFAULT;
372 if (vhost_vdpa_config_validate(v, &config))
373 return -EINVAL;
374 buf = kvzalloc(config.len, GFP_KERNEL);
375 if (!buf)
376 return -ENOMEM;
377
378 vdpa_get_config(vdpa, config.off, buf, config.len);
379
380 if (copy_to_user(c->buf, buf, config.len)) {
381 kvfree(buf);
382 return -EFAULT;
383 }
384
385 kvfree(buf);
386 return 0;
387 }
388
vhost_vdpa_set_config(struct vhost_vdpa * v,struct vhost_vdpa_config __user * c)389 static long vhost_vdpa_set_config(struct vhost_vdpa *v,
390 struct vhost_vdpa_config __user *c)
391 {
392 struct vdpa_device *vdpa = v->vdpa;
393 struct vhost_vdpa_config config;
394 unsigned long size = offsetof(struct vhost_vdpa_config, buf);
395 u8 *buf;
396
397 if (copy_from_user(&config, c, size))
398 return -EFAULT;
399 if (vhost_vdpa_config_validate(v, &config))
400 return -EINVAL;
401
402 buf = vmemdup_user(c->buf, config.len);
403 if (IS_ERR(buf))
404 return PTR_ERR(buf);
405
406 vdpa_set_config(vdpa, config.off, buf, config.len);
407
408 kvfree(buf);
409 return 0;
410 }
411
vhost_vdpa_can_suspend(const struct vhost_vdpa * v)412 static bool vhost_vdpa_can_suspend(const struct vhost_vdpa *v)
413 {
414 struct vdpa_device *vdpa = v->vdpa;
415 const struct vdpa_config_ops *ops = vdpa->config;
416
417 return ops->suspend;
418 }
419
vhost_vdpa_can_resume(const struct vhost_vdpa * v)420 static bool vhost_vdpa_can_resume(const struct vhost_vdpa *v)
421 {
422 struct vdpa_device *vdpa = v->vdpa;
423 const struct vdpa_config_ops *ops = vdpa->config;
424
425 return ops->resume;
426 }
427
vhost_vdpa_has_desc_group(const struct vhost_vdpa * v)428 static bool vhost_vdpa_has_desc_group(const struct vhost_vdpa *v)
429 {
430 struct vdpa_device *vdpa = v->vdpa;
431 const struct vdpa_config_ops *ops = vdpa->config;
432
433 return ops->get_vq_desc_group;
434 }
435
vhost_vdpa_get_features(struct vhost_vdpa * v,u64 __user * featurep)436 static long vhost_vdpa_get_features(struct vhost_vdpa *v, u64 __user *featurep)
437 {
438 struct vdpa_device *vdpa = v->vdpa;
439 const struct vdpa_config_ops *ops = vdpa->config;
440 u64 features;
441
442 features = ops->get_device_features(vdpa);
443
444 if (copy_to_user(featurep, &features, sizeof(features)))
445 return -EFAULT;
446
447 return 0;
448 }
449
vhost_vdpa_get_backend_features(const struct vhost_vdpa * v)450 static u64 vhost_vdpa_get_backend_features(const struct vhost_vdpa *v)
451 {
452 struct vdpa_device *vdpa = v->vdpa;
453 const struct vdpa_config_ops *ops = vdpa->config;
454
455 if (!ops->get_backend_features)
456 return 0;
457 else
458 return ops->get_backend_features(vdpa);
459 }
460
vhost_vdpa_has_persistent_map(const struct vhost_vdpa * v)461 static bool vhost_vdpa_has_persistent_map(const struct vhost_vdpa *v)
462 {
463 struct vdpa_device *vdpa = v->vdpa;
464 const struct vdpa_config_ops *ops = vdpa->config;
465
466 return (!ops->set_map && !ops->dma_map) || ops->reset_map ||
467 vhost_vdpa_get_backend_features(v) & BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST);
468 }
469
vhost_vdpa_set_features(struct vhost_vdpa * v,u64 __user * featurep)470 static long vhost_vdpa_set_features(struct vhost_vdpa *v, u64 __user *featurep)
471 {
472 struct vdpa_device *vdpa = v->vdpa;
473 const struct vdpa_config_ops *ops = vdpa->config;
474 struct vhost_dev *d = &v->vdev;
475 u64 actual_features;
476 u64 features;
477 int i;
478
479 /*
480 * It's not allowed to change the features after they have
481 * been negotiated.
482 */
483 if (ops->get_status(vdpa) & VIRTIO_CONFIG_S_FEATURES_OK)
484 return -EBUSY;
485
486 if (copy_from_user(&features, featurep, sizeof(features)))
487 return -EFAULT;
488
489 if (vdpa_set_features(vdpa, features))
490 return -EINVAL;
491
492 /* let the vqs know what has been configured */
493 actual_features = ops->get_driver_features(vdpa);
494 for (i = 0; i < d->nvqs; ++i) {
495 struct vhost_virtqueue *vq = d->vqs[i];
496
497 mutex_lock(&vq->mutex);
498 vq->acked_features = actual_features;
499 mutex_unlock(&vq->mutex);
500 }
501
502 return 0;
503 }
504
vhost_vdpa_get_vring_num(struct vhost_vdpa * v,u16 __user * argp)505 static long vhost_vdpa_get_vring_num(struct vhost_vdpa *v, u16 __user *argp)
506 {
507 struct vdpa_device *vdpa = v->vdpa;
508 const struct vdpa_config_ops *ops = vdpa->config;
509 u16 num;
510
511 num = ops->get_vq_num_max(vdpa);
512
513 if (copy_to_user(argp, &num, sizeof(num)))
514 return -EFAULT;
515
516 return 0;
517 }
518
vhost_vdpa_config_put(struct vhost_vdpa * v)519 static void vhost_vdpa_config_put(struct vhost_vdpa *v)
520 {
521 if (v->config_ctx) {
522 eventfd_ctx_put(v->config_ctx);
523 v->config_ctx = NULL;
524 }
525 }
526
vhost_vdpa_set_config_call(struct vhost_vdpa * v,u32 __user * argp)527 static long vhost_vdpa_set_config_call(struct vhost_vdpa *v, u32 __user *argp)
528 {
529 struct vdpa_callback cb;
530 int fd;
531 struct eventfd_ctx *ctx;
532
533 cb.callback = vhost_vdpa_config_cb;
534 cb.private = v;
535 if (copy_from_user(&fd, argp, sizeof(fd)))
536 return -EFAULT;
537
538 ctx = fd == VHOST_FILE_UNBIND ? NULL : eventfd_ctx_fdget(fd);
539 swap(ctx, v->config_ctx);
540
541 if (!IS_ERR_OR_NULL(ctx))
542 eventfd_ctx_put(ctx);
543
544 if (IS_ERR(v->config_ctx)) {
545 long ret = PTR_ERR(v->config_ctx);
546
547 v->config_ctx = NULL;
548 return ret;
549 }
550
551 v->vdpa->config->set_config_cb(v->vdpa, &cb);
552
553 return 0;
554 }
555
vhost_vdpa_get_iova_range(struct vhost_vdpa * v,u32 __user * argp)556 static long vhost_vdpa_get_iova_range(struct vhost_vdpa *v, u32 __user *argp)
557 {
558 struct vhost_vdpa_iova_range range = {
559 .first = v->range.first,
560 .last = v->range.last,
561 };
562
563 if (copy_to_user(argp, &range, sizeof(range)))
564 return -EFAULT;
565 return 0;
566 }
567
vhost_vdpa_get_config_size(struct vhost_vdpa * v,u32 __user * argp)568 static long vhost_vdpa_get_config_size(struct vhost_vdpa *v, u32 __user *argp)
569 {
570 struct vdpa_device *vdpa = v->vdpa;
571 const struct vdpa_config_ops *ops = vdpa->config;
572 u32 size;
573
574 size = ops->get_config_size(vdpa);
575
576 if (copy_to_user(argp, &size, sizeof(size)))
577 return -EFAULT;
578
579 return 0;
580 }
581
vhost_vdpa_get_vqs_count(struct vhost_vdpa * v,u32 __user * argp)582 static long vhost_vdpa_get_vqs_count(struct vhost_vdpa *v, u32 __user *argp)
583 {
584 struct vdpa_device *vdpa = v->vdpa;
585
586 if (copy_to_user(argp, &vdpa->nvqs, sizeof(vdpa->nvqs)))
587 return -EFAULT;
588
589 return 0;
590 }
591
592 /* After a successful return of ioctl the device must not process more
593 * virtqueue descriptors. The device can answer to read or writes of config
594 * fields as if it were not suspended. In particular, writing to "queue_enable"
595 * with a value of 1 will not make the device start processing buffers.
596 */
vhost_vdpa_suspend(struct vhost_vdpa * v)597 static long vhost_vdpa_suspend(struct vhost_vdpa *v)
598 {
599 struct vdpa_device *vdpa = v->vdpa;
600 const struct vdpa_config_ops *ops = vdpa->config;
601 int ret;
602
603 if (!(ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK))
604 return 0;
605
606 if (!ops->suspend)
607 return -EOPNOTSUPP;
608
609 ret = ops->suspend(vdpa);
610 if (!ret)
611 v->suspended = true;
612
613 return ret;
614 }
615
616 /* After a successful return of this ioctl the device resumes processing
617 * virtqueue descriptors. The device becomes fully operational the same way it
618 * was before it was suspended.
619 */
vhost_vdpa_resume(struct vhost_vdpa * v)620 static long vhost_vdpa_resume(struct vhost_vdpa *v)
621 {
622 struct vdpa_device *vdpa = v->vdpa;
623 const struct vdpa_config_ops *ops = vdpa->config;
624 int ret;
625
626 if (!(ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK))
627 return 0;
628
629 if (!ops->resume)
630 return -EOPNOTSUPP;
631
632 ret = ops->resume(vdpa);
633 if (!ret)
634 v->suspended = false;
635
636 return ret;
637 }
638
vhost_vdpa_vring_ioctl(struct vhost_vdpa * v,unsigned int cmd,void __user * argp)639 static long vhost_vdpa_vring_ioctl(struct vhost_vdpa *v, unsigned int cmd,
640 void __user *argp)
641 {
642 struct vdpa_device *vdpa = v->vdpa;
643 const struct vdpa_config_ops *ops = vdpa->config;
644 struct vdpa_vq_state vq_state;
645 struct vdpa_callback cb;
646 struct vhost_virtqueue *vq;
647 struct vhost_vring_state s;
648 u32 idx;
649 long r;
650
651 r = get_user(idx, (u32 __user *)argp);
652 if (r < 0)
653 return r;
654
655 if (idx >= v->nvqs)
656 return -ENOBUFS;
657
658 idx = array_index_nospec(idx, v->nvqs);
659 vq = &v->vqs[idx];
660
661 switch (cmd) {
662 case VHOST_VDPA_SET_VRING_ENABLE:
663 if (copy_from_user(&s, argp, sizeof(s)))
664 return -EFAULT;
665 ops->set_vq_ready(vdpa, idx, s.num);
666 return 0;
667 case VHOST_VDPA_GET_VRING_GROUP:
668 if (!ops->get_vq_group)
669 return -EOPNOTSUPP;
670 s.index = idx;
671 s.num = ops->get_vq_group(vdpa, idx);
672 if (s.num >= vdpa->ngroups)
673 return -EIO;
674 else if (copy_to_user(argp, &s, sizeof(s)))
675 return -EFAULT;
676 return 0;
677 case VHOST_VDPA_GET_VRING_DESC_GROUP:
678 if (!vhost_vdpa_has_desc_group(v))
679 return -EOPNOTSUPP;
680 s.index = idx;
681 s.num = ops->get_vq_desc_group(vdpa, idx);
682 if (s.num >= vdpa->ngroups)
683 return -EIO;
684 else if (copy_to_user(argp, &s, sizeof(s)))
685 return -EFAULT;
686 return 0;
687 case VHOST_VDPA_SET_GROUP_ASID:
688 if (copy_from_user(&s, argp, sizeof(s)))
689 return -EFAULT;
690 if (idx >= vdpa->ngroups || s.num >= vdpa->nas)
691 return -EINVAL;
692 if (ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK)
693 return -EBUSY;
694 if (!ops->set_group_asid)
695 return -EOPNOTSUPP;
696 return ops->set_group_asid(vdpa, idx, s.num);
697 case VHOST_VDPA_GET_VRING_SIZE:
698 if (!ops->get_vq_size)
699 return -EOPNOTSUPP;
700 s.index = idx;
701 s.num = ops->get_vq_size(vdpa, idx);
702 if (copy_to_user(argp, &s, sizeof(s)))
703 return -EFAULT;
704 return 0;
705 case VHOST_GET_VRING_BASE:
706 r = ops->get_vq_state(v->vdpa, idx, &vq_state);
707 if (r)
708 return r;
709
710 if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
711 vq->last_avail_idx = vq_state.packed.last_avail_idx |
712 (vq_state.packed.last_avail_counter << 15);
713 vq->last_used_idx = vq_state.packed.last_used_idx |
714 (vq_state.packed.last_used_counter << 15);
715 } else {
716 vq->last_avail_idx = vq_state.split.avail_index;
717 }
718 break;
719 case VHOST_SET_VRING_CALL:
720 if (vq->call_ctx.ctx) {
721 if (ops->get_status(vdpa) &
722 VIRTIO_CONFIG_S_DRIVER_OK)
723 vhost_vdpa_unsetup_vq_irq(v, idx);
724 }
725 break;
726 }
727
728 r = vhost_vring_ioctl(&v->vdev, cmd, argp);
729 if (r)
730 return r;
731
732 switch (cmd) {
733 case VHOST_SET_VRING_ADDR:
734 if ((ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK) && !v->suspended)
735 return -EINVAL;
736
737 if (ops->set_vq_address(vdpa, idx,
738 (u64)(uintptr_t)vq->desc,
739 (u64)(uintptr_t)vq->avail,
740 (u64)(uintptr_t)vq->used))
741 r = -EINVAL;
742 break;
743
744 case VHOST_SET_VRING_BASE:
745 if ((ops->get_status(vdpa) & VIRTIO_CONFIG_S_DRIVER_OK) && !v->suspended)
746 return -EINVAL;
747
748 if (vhost_has_feature(vq, VIRTIO_F_RING_PACKED)) {
749 vq_state.packed.last_avail_idx = vq->last_avail_idx & 0x7fff;
750 vq_state.packed.last_avail_counter = !!(vq->last_avail_idx & 0x8000);
751 vq_state.packed.last_used_idx = vq->last_used_idx & 0x7fff;
752 vq_state.packed.last_used_counter = !!(vq->last_used_idx & 0x8000);
753 } else {
754 vq_state.split.avail_index = vq->last_avail_idx;
755 }
756 r = ops->set_vq_state(vdpa, idx, &vq_state);
757 break;
758
759 case VHOST_SET_VRING_CALL:
760 if (vq->call_ctx.ctx) {
761 cb.callback = vhost_vdpa_virtqueue_cb;
762 cb.private = vq;
763 cb.trigger = vq->call_ctx.ctx;
764 if (ops->get_status(vdpa) &
765 VIRTIO_CONFIG_S_DRIVER_OK)
766 vhost_vdpa_setup_vq_irq(v, idx);
767 } else {
768 cb.callback = NULL;
769 cb.private = NULL;
770 cb.trigger = NULL;
771 }
772 ops->set_vq_cb(vdpa, idx, &cb);
773 break;
774
775 case VHOST_SET_VRING_NUM:
776 ops->set_vq_num(vdpa, idx, vq->num);
777 break;
778 }
779
780 return r;
781 }
782
vhost_vdpa_unlocked_ioctl(struct file * filep,unsigned int cmd,unsigned long arg)783 static long vhost_vdpa_unlocked_ioctl(struct file *filep,
784 unsigned int cmd, unsigned long arg)
785 {
786 struct vhost_vdpa *v = filep->private_data;
787 struct vhost_dev *d = &v->vdev;
788 void __user *argp = (void __user *)arg;
789 u64 __user *featurep = argp;
790 u64 features;
791 long r = 0;
792
793 if (cmd == VHOST_SET_BACKEND_FEATURES) {
794 if (copy_from_user(&features, featurep, sizeof(features)))
795 return -EFAULT;
796 if (features & ~(VHOST_VDPA_BACKEND_FEATURES |
797 BIT_ULL(VHOST_BACKEND_F_DESC_ASID) |
798 BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST) |
799 BIT_ULL(VHOST_BACKEND_F_SUSPEND) |
800 BIT_ULL(VHOST_BACKEND_F_RESUME) |
801 BIT_ULL(VHOST_BACKEND_F_ENABLE_AFTER_DRIVER_OK)))
802 return -EOPNOTSUPP;
803 if ((features & BIT_ULL(VHOST_BACKEND_F_SUSPEND)) &&
804 !vhost_vdpa_can_suspend(v))
805 return -EOPNOTSUPP;
806 if ((features & BIT_ULL(VHOST_BACKEND_F_RESUME)) &&
807 !vhost_vdpa_can_resume(v))
808 return -EOPNOTSUPP;
809 if ((features & BIT_ULL(VHOST_BACKEND_F_DESC_ASID)) &&
810 !(features & BIT_ULL(VHOST_BACKEND_F_IOTLB_ASID)))
811 return -EINVAL;
812 if ((features & BIT_ULL(VHOST_BACKEND_F_DESC_ASID)) &&
813 !vhost_vdpa_has_desc_group(v))
814 return -EOPNOTSUPP;
815 if ((features & BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST)) &&
816 !vhost_vdpa_has_persistent_map(v))
817 return -EOPNOTSUPP;
818 vhost_set_backend_features(&v->vdev, features);
819 return 0;
820 }
821
822 mutex_lock(&d->mutex);
823
824 switch (cmd) {
825 case VHOST_VDPA_GET_DEVICE_ID:
826 r = vhost_vdpa_get_device_id(v, argp);
827 break;
828 case VHOST_VDPA_GET_STATUS:
829 r = vhost_vdpa_get_status(v, argp);
830 break;
831 case VHOST_VDPA_SET_STATUS:
832 r = vhost_vdpa_set_status(v, argp);
833 break;
834 case VHOST_VDPA_GET_CONFIG:
835 r = vhost_vdpa_get_config(v, argp);
836 break;
837 case VHOST_VDPA_SET_CONFIG:
838 r = vhost_vdpa_set_config(v, argp);
839 break;
840 case VHOST_GET_FEATURES:
841 r = vhost_vdpa_get_features(v, argp);
842 break;
843 case VHOST_SET_FEATURES:
844 r = vhost_vdpa_set_features(v, argp);
845 break;
846 case VHOST_VDPA_GET_VRING_NUM:
847 r = vhost_vdpa_get_vring_num(v, argp);
848 break;
849 case VHOST_VDPA_GET_GROUP_NUM:
850 if (copy_to_user(argp, &v->vdpa->ngroups,
851 sizeof(v->vdpa->ngroups)))
852 r = -EFAULT;
853 break;
854 case VHOST_VDPA_GET_AS_NUM:
855 if (copy_to_user(argp, &v->vdpa->nas, sizeof(v->vdpa->nas)))
856 r = -EFAULT;
857 break;
858 case VHOST_SET_LOG_BASE:
859 case VHOST_SET_LOG_FD:
860 r = -ENOIOCTLCMD;
861 break;
862 case VHOST_VDPA_SET_CONFIG_CALL:
863 r = vhost_vdpa_set_config_call(v, argp);
864 break;
865 case VHOST_GET_BACKEND_FEATURES:
866 features = VHOST_VDPA_BACKEND_FEATURES;
867 if (vhost_vdpa_can_suspend(v))
868 features |= BIT_ULL(VHOST_BACKEND_F_SUSPEND);
869 if (vhost_vdpa_can_resume(v))
870 features |= BIT_ULL(VHOST_BACKEND_F_RESUME);
871 if (vhost_vdpa_has_desc_group(v))
872 features |= BIT_ULL(VHOST_BACKEND_F_DESC_ASID);
873 if (vhost_vdpa_has_persistent_map(v))
874 features |= BIT_ULL(VHOST_BACKEND_F_IOTLB_PERSIST);
875 features |= vhost_vdpa_get_backend_features(v);
876 if (copy_to_user(featurep, &features, sizeof(features)))
877 r = -EFAULT;
878 break;
879 case VHOST_VDPA_GET_IOVA_RANGE:
880 r = vhost_vdpa_get_iova_range(v, argp);
881 break;
882 case VHOST_VDPA_GET_CONFIG_SIZE:
883 r = vhost_vdpa_get_config_size(v, argp);
884 break;
885 case VHOST_VDPA_GET_VQS_COUNT:
886 r = vhost_vdpa_get_vqs_count(v, argp);
887 break;
888 case VHOST_VDPA_SUSPEND:
889 r = vhost_vdpa_suspend(v);
890 break;
891 case VHOST_VDPA_RESUME:
892 r = vhost_vdpa_resume(v);
893 break;
894 default:
895 r = vhost_dev_ioctl(&v->vdev, cmd, argp);
896 if (r == -ENOIOCTLCMD)
897 r = vhost_vdpa_vring_ioctl(v, cmd, argp);
898 break;
899 }
900
901 if (r)
902 goto out;
903
904 switch (cmd) {
905 case VHOST_SET_OWNER:
906 r = vhost_vdpa_bind_mm(v);
907 if (r)
908 vhost_dev_reset_owner(d, NULL);
909 break;
910 }
911 out:
912 mutex_unlock(&d->mutex);
913 return r;
914 }
vhost_vdpa_general_unmap(struct vhost_vdpa * v,struct vhost_iotlb_map * map,u32 asid)915 static void vhost_vdpa_general_unmap(struct vhost_vdpa *v,
916 struct vhost_iotlb_map *map, u32 asid)
917 {
918 struct vdpa_device *vdpa = v->vdpa;
919 const struct vdpa_config_ops *ops = vdpa->config;
920 if (ops->dma_map) {
921 ops->dma_unmap(vdpa, asid, map->start, map->size);
922 } else if (ops->set_map == NULL) {
923 iommu_unmap(v->domain, map->start, map->size);
924 }
925 }
926
vhost_vdpa_pa_unmap(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 start,u64 last,u32 asid)927 static void vhost_vdpa_pa_unmap(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
928 u64 start, u64 last, u32 asid)
929 {
930 struct vhost_dev *dev = &v->vdev;
931 struct vhost_iotlb_map *map;
932 struct page *page;
933 unsigned long pfn, pinned;
934
935 while ((map = vhost_iotlb_itree_first(iotlb, start, last)) != NULL) {
936 pinned = PFN_DOWN(map->size);
937 for (pfn = PFN_DOWN(map->addr);
938 pinned > 0; pfn++, pinned--) {
939 page = pfn_to_page(pfn);
940 if (map->perm & VHOST_ACCESS_WO)
941 set_page_dirty_lock(page);
942 unpin_user_page(page);
943 }
944 atomic64_sub(PFN_DOWN(map->size), &dev->mm->pinned_vm);
945 vhost_vdpa_general_unmap(v, map, asid);
946 vhost_iotlb_map_free(iotlb, map);
947 }
948 }
949
vhost_vdpa_va_unmap(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 start,u64 last,u32 asid)950 static void vhost_vdpa_va_unmap(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
951 u64 start, u64 last, u32 asid)
952 {
953 struct vhost_iotlb_map *map;
954 struct vdpa_map_file *map_file;
955
956 while ((map = vhost_iotlb_itree_first(iotlb, start, last)) != NULL) {
957 map_file = (struct vdpa_map_file *)map->opaque;
958 fput(map_file->file);
959 kfree(map_file);
960 vhost_vdpa_general_unmap(v, map, asid);
961 vhost_iotlb_map_free(iotlb, map);
962 }
963 }
964
vhost_vdpa_iotlb_unmap(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 start,u64 last,u32 asid)965 static void vhost_vdpa_iotlb_unmap(struct vhost_vdpa *v,
966 struct vhost_iotlb *iotlb, u64 start,
967 u64 last, u32 asid)
968 {
969 struct vdpa_device *vdpa = v->vdpa;
970
971 if (vdpa->use_va)
972 return vhost_vdpa_va_unmap(v, iotlb, start, last, asid);
973
974 return vhost_vdpa_pa_unmap(v, iotlb, start, last, asid);
975 }
976
perm_to_iommu_flags(u32 perm)977 static int perm_to_iommu_flags(u32 perm)
978 {
979 int flags = 0;
980
981 switch (perm) {
982 case VHOST_ACCESS_WO:
983 flags |= IOMMU_WRITE;
984 break;
985 case VHOST_ACCESS_RO:
986 flags |= IOMMU_READ;
987 break;
988 case VHOST_ACCESS_RW:
989 flags |= (IOMMU_WRITE | IOMMU_READ);
990 break;
991 default:
992 WARN(1, "invalidate vhost IOTLB permission\n");
993 break;
994 }
995
996 return flags | IOMMU_CACHE;
997 }
998
vhost_vdpa_map(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 iova,u64 size,u64 pa,u32 perm,void * opaque)999 static int vhost_vdpa_map(struct vhost_vdpa *v, struct vhost_iotlb *iotlb,
1000 u64 iova, u64 size, u64 pa, u32 perm, void *opaque)
1001 {
1002 struct vhost_dev *dev = &v->vdev;
1003 struct vdpa_device *vdpa = v->vdpa;
1004 const struct vdpa_config_ops *ops = vdpa->config;
1005 u32 asid = iotlb_to_asid(iotlb);
1006 int r = 0;
1007
1008 r = vhost_iotlb_add_range_ctx(iotlb, iova, iova + size - 1,
1009 pa, perm, opaque);
1010 if (r)
1011 return r;
1012
1013 if (ops->dma_map) {
1014 r = ops->dma_map(vdpa, asid, iova, size, pa, perm, opaque);
1015 } else if (ops->set_map) {
1016 if (!v->in_batch)
1017 r = ops->set_map(vdpa, asid, iotlb);
1018 } else {
1019 r = iommu_map(v->domain, iova, pa, size,
1020 perm_to_iommu_flags(perm),
1021 GFP_KERNEL_ACCOUNT);
1022 }
1023 if (r) {
1024 vhost_iotlb_del_range(iotlb, iova, iova + size - 1);
1025 return r;
1026 }
1027
1028 if (!vdpa->use_va)
1029 atomic64_add(PFN_DOWN(size), &dev->mm->pinned_vm);
1030
1031 return 0;
1032 }
1033
vhost_vdpa_unmap(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 iova,u64 size)1034 static void vhost_vdpa_unmap(struct vhost_vdpa *v,
1035 struct vhost_iotlb *iotlb,
1036 u64 iova, u64 size)
1037 {
1038 struct vdpa_device *vdpa = v->vdpa;
1039 const struct vdpa_config_ops *ops = vdpa->config;
1040 u32 asid = iotlb_to_asid(iotlb);
1041
1042 vhost_vdpa_iotlb_unmap(v, iotlb, iova, iova + size - 1, asid);
1043
1044 if (ops->set_map) {
1045 if (!v->in_batch)
1046 ops->set_map(vdpa, asid, iotlb);
1047 }
1048
1049 }
1050
vhost_vdpa_va_map(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 iova,u64 size,u64 uaddr,u32 perm)1051 static int vhost_vdpa_va_map(struct vhost_vdpa *v,
1052 struct vhost_iotlb *iotlb,
1053 u64 iova, u64 size, u64 uaddr, u32 perm)
1054 {
1055 struct vhost_dev *dev = &v->vdev;
1056 u64 offset, map_size, map_iova = iova;
1057 struct vdpa_map_file *map_file;
1058 struct vm_area_struct *vma;
1059 int ret = 0;
1060
1061 mmap_read_lock(dev->mm);
1062
1063 while (size) {
1064 vma = find_vma(dev->mm, uaddr);
1065 if (!vma) {
1066 ret = -EINVAL;
1067 break;
1068 }
1069 map_size = min(size, vma->vm_end - uaddr);
1070 if (!(vma->vm_file && (vma->vm_flags & VM_SHARED) &&
1071 !(vma->vm_flags & (VM_IO | VM_PFNMAP))))
1072 goto next;
1073
1074 map_file = kzalloc_obj(*map_file);
1075 if (!map_file) {
1076 ret = -ENOMEM;
1077 break;
1078 }
1079 offset = (vma->vm_pgoff << PAGE_SHIFT) + uaddr - vma->vm_start;
1080 map_file->offset = offset;
1081 map_file->file = get_file(vma->vm_file);
1082 ret = vhost_vdpa_map(v, iotlb, map_iova, map_size, uaddr,
1083 perm, map_file);
1084 if (ret) {
1085 fput(map_file->file);
1086 kfree(map_file);
1087 break;
1088 }
1089 next:
1090 size -= map_size;
1091 uaddr += map_size;
1092 map_iova += map_size;
1093 }
1094 if (ret)
1095 vhost_vdpa_unmap(v, iotlb, iova, map_iova - iova);
1096
1097 mmap_read_unlock(dev->mm);
1098
1099 return ret;
1100 }
1101
vhost_vdpa_pa_map(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,u64 iova,u64 size,u64 uaddr,u32 perm)1102 static int vhost_vdpa_pa_map(struct vhost_vdpa *v,
1103 struct vhost_iotlb *iotlb,
1104 u64 iova, u64 size, u64 uaddr, u32 perm)
1105 {
1106 struct vhost_dev *dev = &v->vdev;
1107 struct page **page_list;
1108 unsigned long list_size = PAGE_SIZE / sizeof(struct page *);
1109 unsigned int gup_flags = FOLL_LONGTERM;
1110 unsigned long npages, cur_base, map_pfn, last_pfn = 0;
1111 unsigned long lock_limit, sz2pin, nchunks, i;
1112 unsigned long page_offset;
1113 u64 start = iova;
1114 long pinned;
1115 int ret = 0;
1116
1117 /* Limit the use of memory for bookkeeping */
1118 page_list = (struct page **) __get_free_page(GFP_KERNEL);
1119 if (!page_list)
1120 return -ENOMEM;
1121
1122 if (perm & VHOST_ACCESS_WO)
1123 gup_flags |= FOLL_WRITE;
1124
1125 page_offset = iova & ~PAGE_MASK;
1126 if (size > ULONG_MAX - page_offset) {
1127 ret = -EINVAL;
1128 goto free;
1129 }
1130
1131 npages = PFN_UP(size + page_offset);
1132 if (!npages) {
1133 ret = -EINVAL;
1134 goto free;
1135 }
1136
1137 mmap_read_lock(dev->mm);
1138
1139 lock_limit = PFN_DOWN(rlimit(RLIMIT_MEMLOCK));
1140 if (npages + atomic64_read(&dev->mm->pinned_vm) > lock_limit) {
1141 ret = -ENOMEM;
1142 goto unlock;
1143 }
1144
1145 cur_base = uaddr & PAGE_MASK;
1146 iova &= PAGE_MASK;
1147 nchunks = 0;
1148
1149 while (npages) {
1150 sz2pin = min_t(unsigned long, npages, list_size);
1151 pinned = pin_user_pages(cur_base, sz2pin,
1152 gup_flags, page_list);
1153 if (sz2pin != pinned) {
1154 if (pinned < 0) {
1155 ret = pinned;
1156 } else {
1157 unpin_user_pages(page_list, pinned);
1158 ret = -ENOMEM;
1159 }
1160 goto out;
1161 }
1162 nchunks++;
1163
1164 if (!last_pfn)
1165 map_pfn = page_to_pfn(page_list[0]);
1166
1167 for (i = 0; i < pinned; i++) {
1168 unsigned long this_pfn = page_to_pfn(page_list[i]);
1169 u64 csize;
1170
1171 if (last_pfn && (this_pfn != last_pfn + 1)) {
1172 /* Pin a contiguous chunk of memory */
1173 csize = PFN_PHYS(last_pfn - map_pfn + 1);
1174 ret = vhost_vdpa_map(v, iotlb, iova, csize,
1175 PFN_PHYS(map_pfn),
1176 perm, NULL);
1177 if (ret) {
1178 /*
1179 * Unpin the pages that are left unmapped
1180 * from this point on in the current
1181 * page_list. The remaining outstanding
1182 * ones which may stride across several
1183 * chunks will be covered in the common
1184 * error path subsequently.
1185 */
1186 unpin_user_pages(&page_list[i],
1187 pinned - i);
1188 goto out;
1189 }
1190
1191 map_pfn = this_pfn;
1192 iova += csize;
1193 nchunks = 0;
1194 }
1195
1196 last_pfn = this_pfn;
1197 }
1198
1199 cur_base += PFN_PHYS(pinned);
1200 npages -= pinned;
1201 }
1202
1203 /* Pin the rest chunk */
1204 ret = vhost_vdpa_map(v, iotlb, iova, PFN_PHYS(last_pfn - map_pfn + 1),
1205 PFN_PHYS(map_pfn), perm, NULL);
1206 out:
1207 if (ret) {
1208 if (nchunks) {
1209 unsigned long pfn;
1210
1211 /*
1212 * Unpin the outstanding pages which are yet to be
1213 * mapped but haven't due to vdpa_map() or
1214 * pin_user_pages() failure.
1215 *
1216 * Mapped pages are accounted in vdpa_map(), hence
1217 * the corresponding unpinning will be handled by
1218 * vdpa_unmap().
1219 */
1220 WARN_ON(!last_pfn);
1221 for (pfn = map_pfn; pfn <= last_pfn; pfn++)
1222 unpin_user_page(pfn_to_page(pfn));
1223 }
1224 vhost_vdpa_unmap(v, iotlb, start, size);
1225 }
1226 unlock:
1227 mmap_read_unlock(dev->mm);
1228 free:
1229 free_page((unsigned long)page_list);
1230 return ret;
1231
1232 }
1233
vhost_vdpa_process_iotlb_update(struct vhost_vdpa * v,struct vhost_iotlb * iotlb,struct vhost_iotlb_msg * msg)1234 static int vhost_vdpa_process_iotlb_update(struct vhost_vdpa *v,
1235 struct vhost_iotlb *iotlb,
1236 struct vhost_iotlb_msg *msg)
1237 {
1238 struct vdpa_device *vdpa = v->vdpa;
1239
1240 if (msg->iova < v->range.first || !msg->size ||
1241 msg->iova > U64_MAX - msg->size + 1 ||
1242 msg->iova + msg->size - 1 > v->range.last)
1243 return -EINVAL;
1244
1245 if (vhost_iotlb_itree_first(iotlb, msg->iova,
1246 msg->iova + msg->size - 1))
1247 return -EEXIST;
1248
1249 if (vdpa->use_va)
1250 return vhost_vdpa_va_map(v, iotlb, msg->iova, msg->size,
1251 msg->uaddr, msg->perm);
1252
1253 return vhost_vdpa_pa_map(v, iotlb, msg->iova, msg->size, msg->uaddr,
1254 msg->perm);
1255 }
1256
vhost_vdpa_process_iotlb_msg(struct vhost_dev * dev,u32 asid,struct vhost_iotlb_msg * msg)1257 static int vhost_vdpa_process_iotlb_msg(struct vhost_dev *dev, u32 asid,
1258 struct vhost_iotlb_msg *msg)
1259 {
1260 struct vhost_vdpa *v = container_of(dev, struct vhost_vdpa, vdev);
1261 struct vdpa_device *vdpa = v->vdpa;
1262 const struct vdpa_config_ops *ops = vdpa->config;
1263 struct vhost_iotlb *iotlb = NULL;
1264 struct vhost_vdpa_as *as = NULL;
1265 int r = 0;
1266
1267 mutex_lock(&dev->mutex);
1268
1269 r = vhost_dev_check_owner(dev);
1270 if (r)
1271 goto unlock;
1272
1273 if (msg->type == VHOST_IOTLB_UPDATE ||
1274 msg->type == VHOST_IOTLB_BATCH_BEGIN) {
1275 as = vhost_vdpa_find_alloc_as(v, asid);
1276 if (!as) {
1277 dev_err(&v->dev, "can't find and alloc asid %d\n",
1278 asid);
1279 r = -EINVAL;
1280 goto unlock;
1281 }
1282 iotlb = &as->iotlb;
1283 } else
1284 iotlb = asid_to_iotlb(v, asid);
1285
1286 if ((v->in_batch && v->batch_asid != asid) || !iotlb) {
1287 if (v->in_batch && v->batch_asid != asid) {
1288 dev_info(&v->dev, "batch id %d asid %d\n",
1289 v->batch_asid, asid);
1290 }
1291 if (!iotlb)
1292 dev_err(&v->dev, "no iotlb for asid %d\n", asid);
1293 r = -EINVAL;
1294 goto unlock;
1295 }
1296
1297 switch (msg->type) {
1298 case VHOST_IOTLB_UPDATE:
1299 r = vhost_vdpa_process_iotlb_update(v, iotlb, msg);
1300 break;
1301 case VHOST_IOTLB_INVALIDATE:
1302 vhost_vdpa_unmap(v, iotlb, msg->iova, msg->size);
1303 break;
1304 case VHOST_IOTLB_BATCH_BEGIN:
1305 v->batch_asid = asid;
1306 v->in_batch = true;
1307 break;
1308 case VHOST_IOTLB_BATCH_END:
1309 if (v->in_batch && ops->set_map)
1310 ops->set_map(vdpa, asid, iotlb);
1311 v->in_batch = false;
1312 break;
1313 default:
1314 r = -EINVAL;
1315 break;
1316 }
1317 unlock:
1318 mutex_unlock(&dev->mutex);
1319
1320 return r;
1321 }
1322
vhost_vdpa_chr_write_iter(struct kiocb * iocb,struct iov_iter * from)1323 static ssize_t vhost_vdpa_chr_write_iter(struct kiocb *iocb,
1324 struct iov_iter *from)
1325 {
1326 struct file *file = iocb->ki_filp;
1327 struct vhost_vdpa *v = file->private_data;
1328 struct vhost_dev *dev = &v->vdev;
1329
1330 return vhost_chr_write_iter(dev, from);
1331 }
1332
vhost_vdpa_alloc_domain(struct vhost_vdpa * v)1333 static int vhost_vdpa_alloc_domain(struct vhost_vdpa *v)
1334 {
1335 struct vdpa_device *vdpa = v->vdpa;
1336 const struct vdpa_config_ops *ops = vdpa->config;
1337 union virtio_map map = vdpa_get_map(vdpa);
1338 struct device *dma_dev = map.dma_dev;
1339 int ret;
1340
1341 /* Device want to do DMA by itself */
1342 if (ops->set_map || ops->dma_map)
1343 return 0;
1344
1345 if (!device_iommu_capable(dma_dev, IOMMU_CAP_CACHE_COHERENCY)) {
1346 dev_warn_once(&v->dev,
1347 "Failed to allocate domain, device is not IOMMU cache coherent capable\n");
1348 return -ENOTSUPP;
1349 }
1350
1351 v->domain = iommu_paging_domain_alloc(dma_dev);
1352 if (IS_ERR(v->domain)) {
1353 ret = PTR_ERR(v->domain);
1354 v->domain = NULL;
1355 return ret;
1356 }
1357
1358 ret = iommu_attach_device(v->domain, dma_dev);
1359 if (ret)
1360 goto err_attach;
1361
1362 return 0;
1363
1364 err_attach:
1365 iommu_domain_free(v->domain);
1366 v->domain = NULL;
1367 return ret;
1368 }
1369
vhost_vdpa_free_domain(struct vhost_vdpa * v)1370 static void vhost_vdpa_free_domain(struct vhost_vdpa *v)
1371 {
1372 struct vdpa_device *vdpa = v->vdpa;
1373 union virtio_map map = vdpa_get_map(vdpa);
1374 struct device *dma_dev = map.dma_dev;
1375
1376 if (v->domain) {
1377 iommu_detach_device(v->domain, dma_dev);
1378 iommu_domain_free(v->domain);
1379 }
1380
1381 v->domain = NULL;
1382 }
1383
vhost_vdpa_set_iova_range(struct vhost_vdpa * v)1384 static void vhost_vdpa_set_iova_range(struct vhost_vdpa *v)
1385 {
1386 struct vdpa_iova_range *range = &v->range;
1387 struct vdpa_device *vdpa = v->vdpa;
1388 const struct vdpa_config_ops *ops = vdpa->config;
1389
1390 if (ops->get_iova_range) {
1391 *range = ops->get_iova_range(vdpa);
1392 } else if (v->domain && v->domain->geometry.force_aperture) {
1393 range->first = v->domain->geometry.aperture_start;
1394 range->last = v->domain->geometry.aperture_end;
1395 } else {
1396 range->first = 0;
1397 range->last = ULLONG_MAX;
1398 }
1399 }
1400
vhost_vdpa_cleanup(struct vhost_vdpa * v)1401 static void vhost_vdpa_cleanup(struct vhost_vdpa *v)
1402 {
1403 struct vhost_vdpa_as *as;
1404 u32 asid;
1405
1406 for (asid = 0; asid < v->vdpa->nas; asid++) {
1407 as = asid_to_as(v, asid);
1408 if (as)
1409 vhost_vdpa_remove_as(v, asid);
1410 }
1411
1412 vhost_vdpa_free_domain(v);
1413 vhost_dev_cleanup(&v->vdev);
1414 kfree(v->vdev.vqs);
1415 v->vdev.vqs = NULL;
1416 }
1417
vhost_vdpa_open(struct inode * inode,struct file * filep)1418 static int vhost_vdpa_open(struct inode *inode, struct file *filep)
1419 {
1420 struct vhost_vdpa *v;
1421 struct vhost_dev *dev;
1422 struct vhost_virtqueue **vqs;
1423 int r, opened;
1424 u32 i, nvqs;
1425
1426 v = container_of(inode->i_cdev, struct vhost_vdpa, cdev);
1427
1428 opened = atomic_cmpxchg(&v->opened, 0, 1);
1429 if (opened)
1430 return -EBUSY;
1431
1432 nvqs = v->nvqs;
1433 r = vhost_vdpa_reset(v);
1434 if (r)
1435 goto err;
1436
1437 vqs = kmalloc_objs(*vqs, nvqs);
1438 if (!vqs) {
1439 r = -ENOMEM;
1440 goto err;
1441 }
1442
1443 dev = &v->vdev;
1444 for (i = 0; i < nvqs; i++) {
1445 vqs[i] = &v->vqs[i];
1446 vqs[i]->handle_kick = handle_vq_kick;
1447 vqs[i]->call_ctx.ctx = NULL;
1448 }
1449 vhost_dev_init(dev, vqs, nvqs, 0, 0, 0, false,
1450 vhost_vdpa_process_iotlb_msg);
1451
1452 r = vhost_vdpa_alloc_domain(v);
1453 if (r)
1454 goto err_alloc_domain;
1455
1456 vhost_vdpa_set_iova_range(v);
1457
1458 filep->private_data = v;
1459
1460 return 0;
1461
1462 err_alloc_domain:
1463 vhost_vdpa_cleanup(v);
1464 err:
1465 atomic_dec(&v->opened);
1466 return r;
1467 }
1468
vhost_vdpa_clean_irq(struct vhost_vdpa * v)1469 static void vhost_vdpa_clean_irq(struct vhost_vdpa *v)
1470 {
1471 u32 i;
1472
1473 for (i = 0; i < v->nvqs; i++)
1474 vhost_vdpa_unsetup_vq_irq(v, i);
1475 }
1476
vhost_vdpa_release(struct inode * inode,struct file * filep)1477 static int vhost_vdpa_release(struct inode *inode, struct file *filep)
1478 {
1479 struct vhost_vdpa *v = filep->private_data;
1480 struct vhost_dev *d = &v->vdev;
1481
1482 mutex_lock(&d->mutex);
1483 filep->private_data = NULL;
1484 vhost_vdpa_clean_irq(v);
1485 vhost_vdpa_reset(v);
1486 vhost_dev_stop(&v->vdev);
1487 vhost_vdpa_unbind_mm(v);
1488 vhost_vdpa_config_put(v);
1489 vhost_vdpa_cleanup(v);
1490 mutex_unlock(&d->mutex);
1491
1492 atomic_dec(&v->opened);
1493 complete(&v->completion);
1494
1495 return 0;
1496 }
1497
1498 #ifdef CONFIG_MMU
1499 static int
vhost_vdpa_get_vq_notification(struct vhost_vdpa * v,unsigned long index,struct vdpa_notification_area * notify)1500 vhost_vdpa_get_vq_notification(struct vhost_vdpa *v, unsigned long index,
1501 struct vdpa_notification_area *notify)
1502 {
1503 struct vdpa_device *vdpa = v->vdpa;
1504 const struct vdpa_config_ops *ops = vdpa->config;
1505
1506 if (index > 65535 || index >= v->nvqs)
1507 return -EINVAL;
1508
1509 index = array_index_nospec(index, v->nvqs);
1510
1511 *notify = ops->get_vq_notification(vdpa, index);
1512
1513 return 0;
1514 }
1515
vhost_vdpa_fault(struct vm_fault * vmf)1516 static vm_fault_t vhost_vdpa_fault(struct vm_fault *vmf)
1517 {
1518 struct vhost_vdpa *v = vmf->vma->vm_file->private_data;
1519 struct vdpa_notification_area notify;
1520 struct vm_area_struct *vma = vmf->vma;
1521 unsigned long index = vma->vm_pgoff;
1522
1523 if (vhost_vdpa_get_vq_notification(v, index, ¬ify))
1524 return VM_FAULT_SIGBUS;
1525
1526 return vmf_insert_pfn(vma, vmf->address & PAGE_MASK, PFN_DOWN(notify.addr));
1527 }
1528
1529 static const struct vm_operations_struct vhost_vdpa_vm_ops = {
1530 .fault = vhost_vdpa_fault,
1531 };
1532
vhost_vdpa_mmap(struct file * file,struct vm_area_struct * vma)1533 static int vhost_vdpa_mmap(struct file *file, struct vm_area_struct *vma)
1534 {
1535 struct vhost_vdpa *v = vma->vm_file->private_data;
1536 struct vdpa_device *vdpa = v->vdpa;
1537 const struct vdpa_config_ops *ops = vdpa->config;
1538 struct vdpa_notification_area notify;
1539 unsigned long index = vma->vm_pgoff;
1540
1541 if (vma->vm_end - vma->vm_start != PAGE_SIZE)
1542 return -EINVAL;
1543 if ((vma->vm_flags & VM_SHARED) == 0)
1544 return -EINVAL;
1545 if (vma->vm_flags & VM_READ)
1546 return -EINVAL;
1547 if (!ops->get_vq_notification)
1548 return -ENOTSUPP;
1549
1550 /* To be safe and easily modelled by userspace, We only
1551 * support the doorbell which sits on the page boundary and
1552 * does not share the page with other registers.
1553 */
1554 if (vhost_vdpa_get_vq_notification(v, index, ¬ify))
1555 return -EINVAL;
1556 if (notify.addr & (PAGE_SIZE - 1))
1557 return -EINVAL;
1558 if (vma->vm_end - vma->vm_start != notify.size)
1559 return -ENOTSUPP;
1560
1561 vma->vm_page_prot = pgprot_noncached(vma->vm_page_prot);
1562 vm_flags_set(vma, VM_IO | VM_PFNMAP | VM_DONTEXPAND | VM_DONTDUMP);
1563 vma->vm_ops = &vhost_vdpa_vm_ops;
1564 return 0;
1565 }
1566 #endif /* CONFIG_MMU */
1567
1568 static const struct file_operations vhost_vdpa_fops = {
1569 .owner = THIS_MODULE,
1570 .open = vhost_vdpa_open,
1571 .release = vhost_vdpa_release,
1572 .write_iter = vhost_vdpa_chr_write_iter,
1573 .unlocked_ioctl = vhost_vdpa_unlocked_ioctl,
1574 #ifdef CONFIG_MMU
1575 .mmap = vhost_vdpa_mmap,
1576 #endif /* CONFIG_MMU */
1577 .compat_ioctl = compat_ptr_ioctl,
1578 };
1579
vhost_vdpa_release_dev(struct device * device)1580 static void vhost_vdpa_release_dev(struct device *device)
1581 {
1582 struct vhost_vdpa *v =
1583 container_of(device, struct vhost_vdpa, dev);
1584
1585 ida_free(&vhost_vdpa_ida, v->minor);
1586 kfree(v->vqs);
1587 kfree(v);
1588 }
1589
vhost_vdpa_probe(struct vdpa_device * vdpa)1590 static int vhost_vdpa_probe(struct vdpa_device *vdpa)
1591 {
1592 const struct vdpa_config_ops *ops = vdpa->config;
1593 struct vhost_vdpa *v;
1594 int minor;
1595 int i, r;
1596
1597 /* We can't support platform IOMMU device with more than 1
1598 * group or as
1599 */
1600 if (!ops->set_map && !ops->dma_map &&
1601 (vdpa->ngroups > 1 || vdpa->nas > 1))
1602 return -EOPNOTSUPP;
1603
1604 v = kzalloc_obj(*v, GFP_KERNEL | __GFP_RETRY_MAYFAIL);
1605 if (!v)
1606 return -ENOMEM;
1607
1608 minor = ida_alloc_max(&vhost_vdpa_ida, VHOST_VDPA_DEV_MAX - 1,
1609 GFP_KERNEL);
1610 if (minor < 0) {
1611 kfree(v);
1612 return minor;
1613 }
1614
1615 atomic_set(&v->opened, 0);
1616 v->minor = minor;
1617 v->vdpa = vdpa;
1618 v->nvqs = vdpa->nvqs;
1619 v->virtio_id = ops->get_device_id(vdpa);
1620
1621 device_initialize(&v->dev);
1622 v->dev.release = vhost_vdpa_release_dev;
1623 v->dev.parent = &vdpa->dev;
1624 v->dev.devt = MKDEV(MAJOR(vhost_vdpa_major), minor);
1625 v->vqs = kmalloc_objs(struct vhost_virtqueue, v->nvqs);
1626 if (!v->vqs) {
1627 r = -ENOMEM;
1628 goto err;
1629 }
1630
1631 r = dev_set_name(&v->dev, "vhost-vdpa-%u", minor);
1632 if (r)
1633 goto err;
1634
1635 cdev_init(&v->cdev, &vhost_vdpa_fops);
1636 v->cdev.owner = THIS_MODULE;
1637
1638 r = cdev_device_add(&v->cdev, &v->dev);
1639 if (r)
1640 goto err;
1641
1642 init_completion(&v->completion);
1643 vdpa_set_drvdata(vdpa, v);
1644
1645 for (i = 0; i < VHOST_VDPA_IOTLB_BUCKETS; i++)
1646 INIT_HLIST_HEAD(&v->as[i]);
1647
1648 return 0;
1649
1650 err:
1651 put_device(&v->dev);
1652 return r;
1653 }
1654
vhost_vdpa_remove(struct vdpa_device * vdpa)1655 static void vhost_vdpa_remove(struct vdpa_device *vdpa)
1656 {
1657 struct vhost_vdpa *v = vdpa_get_drvdata(vdpa);
1658 int opened;
1659
1660 cdev_device_del(&v->cdev, &v->dev);
1661
1662 do {
1663 opened = atomic_cmpxchg(&v->opened, 0, 1);
1664 if (!opened)
1665 break;
1666 wait_for_completion(&v->completion);
1667 } while (1);
1668
1669 put_device(&v->dev);
1670 }
1671
1672 static struct vdpa_driver vhost_vdpa_driver = {
1673 .driver = {
1674 .name = "vhost_vdpa",
1675 },
1676 .probe = vhost_vdpa_probe,
1677 .remove = vhost_vdpa_remove,
1678 };
1679
vhost_vdpa_init(void)1680 static int __init vhost_vdpa_init(void)
1681 {
1682 int r;
1683
1684 r = alloc_chrdev_region(&vhost_vdpa_major, 0, VHOST_VDPA_DEV_MAX,
1685 "vhost-vdpa");
1686 if (r)
1687 goto err_alloc_chrdev;
1688
1689 r = vdpa_register_driver(&vhost_vdpa_driver);
1690 if (r)
1691 goto err_vdpa_register_driver;
1692
1693 return 0;
1694
1695 err_vdpa_register_driver:
1696 unregister_chrdev_region(vhost_vdpa_major, VHOST_VDPA_DEV_MAX);
1697 err_alloc_chrdev:
1698 return r;
1699 }
1700 module_init(vhost_vdpa_init);
1701
vhost_vdpa_exit(void)1702 static void __exit vhost_vdpa_exit(void)
1703 {
1704 vdpa_unregister_driver(&vhost_vdpa_driver);
1705 unregister_chrdev_region(vhost_vdpa_major, VHOST_VDPA_DEV_MAX);
1706 }
1707 module_exit(vhost_vdpa_exit);
1708
1709 MODULE_VERSION("0.0.1");
1710 MODULE_LICENSE("GPL v2");
1711 MODULE_AUTHOR("Intel Corporation");
1712 MODULE_DESCRIPTION("vDPA-based vhost backend for virtio");
1713