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