xref: /linux/drivers/vdpa/vdpa_user/vduse_dev.c (revision 7f063b2f17eaba2a35e251aa53627f2a70d536e2)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * VDUSE: vDPA Device in Userspace
4  *
5  * Copyright (C) 2020-2021 Bytedance Inc. and/or its affiliates. All rights reserved.
6  *
7  * Author: Xie Yongji <xieyongji@bytedance.com>
8  *
9  */
10 
11 #include "linux/virtio_net.h"
12 #include <linux/bits.h>
13 #include <linux/cleanup.h>
14 #include <linux/init.h>
15 #include <linux/module.h>
16 #include <linux/cdev.h>
17 #include <linux/device.h>
18 #include <linux/eventfd.h>
19 #include <linux/slab.h>
20 #include <linux/wait.h>
21 #include <linux/dma-map-ops.h>
22 #include <linux/poll.h>
23 #include <linux/file.h>
24 #include <linux/uio.h>
25 #include <linux/vdpa.h>
26 #include <linux/nospec.h>
27 #include <linux/virtio.h>
28 #include <linux/vmalloc.h>
29 #include <linux/sched/mm.h>
30 #include <uapi/linux/vduse.h>
31 #include <uapi/linux/vdpa.h>
32 #include <uapi/linux/virtio_config.h>
33 #include <uapi/linux/virtio_ids.h>
34 #include <uapi/linux/virtio_blk.h>
35 #include <uapi/linux/virtio_ring.h>
36 
37 #include "iova_domain.h"
38 
39 #define DRV_AUTHOR   "Yongji Xie <xieyongji@bytedance.com>"
40 #define DRV_DESC     "vDPA Device in Userspace"
41 #define DRV_LICENSE  "GPL v2"
42 
43 #define VDUSE_DEV_MAX (1U << MINORBITS)
44 #define VDUSE_DEV_MAX_GROUPS 0xffff
45 #define VDUSE_DEV_MAX_AS 0xffff
46 #define VDUSE_MAX_BOUNCE_SIZE (1024 * 1024 * 1024)
47 #define VDUSE_MIN_BOUNCE_SIZE (1024 * 1024)
48 #define VDUSE_BOUNCE_SIZE (64 * 1024 * 1024)
49 /* 128 MB reserved for virtqueue creation */
50 #define VDUSE_IOVA_SIZE (VDUSE_MAX_BOUNCE_SIZE + 128 * 1024 * 1024)
51 #define VDUSE_MSG_DEFAULT_TIMEOUT 30
52 
53 #define IRQ_UNBOUND -1
54 
55 /* Supported VDUSE features */
56 static const uint64_t vduse_features = BIT_U64(VDUSE_F_QUEUE_READY) |
57 				       BIT_U64(VDUSE_F_SUSPEND);
58 
59 /*
60  * VDUSE instance have not asked the vduse API version, so assume 0.
61  *
62  * Old devices may not ask for the device version and assume it is 0.  Keep
63  * this value for these.  From the moment the VDUSE instance ask for the
64  * version, convert to the latests supported one and continue regular flow
65  */
66 #define VDUSE_API_VERSION_NOT_ASKED U64_MAX
67 
68 struct vduse_virtqueue {
69 	u16 index;
70 	u16 num_max;
71 	u32 num;
72 	u64 desc_addr;
73 	u64 driver_addr;
74 	u64 device_addr;
75 	struct vdpa_vq_state state;
76 	bool ready;
77 	bool kicked;
78 	u32 group;
79 	spinlock_t kick_lock;
80 	spinlock_t irq_lock;
81 	spinlock_t ready_lock;
82 	struct eventfd_ctx *kickfd;
83 	struct vdpa_callback cb;
84 	struct work_struct inject;
85 	struct work_struct kick;
86 	int irq_effective_cpu;
87 	struct cpumask irq_affinity;
88 	struct kobject kobj;
89 	struct vduse_dev *dev;
90 };
91 
92 struct vduse_dev;
93 
94 struct vduse_vdpa {
95 	struct vdpa_device vdpa;
96 	struct vduse_dev *dev;
97 };
98 
99 struct vduse_umem {
100 	unsigned long iova;
101 	unsigned long npages;
102 	struct page **pages;
103 	struct mm_struct *mm;
104 };
105 
106 struct vduse_as {
107 	struct vduse_iova_domain *domain;
108 	struct vduse_umem *umem;
109 	struct mutex mem_lock;
110 };
111 
112 struct vduse_vq_group {
113 	rwlock_t as_lock;
114 	struct vduse_as *as; /* Protected by as_lock */
115 	struct vduse_dev *dev;
116 };
117 
118 struct vduse_dev {
119 	struct vduse_vdpa *vdev;
120 	struct device *dev;
121 	struct vduse_virtqueue **vqs;
122 	struct vduse_as *as;
123 	char *name;
124 	struct mutex lock;
125 	spinlock_t msg_lock;
126 	u64 vduse_features;
127 	u64 msg_unique;
128 	u32 msg_timeout;
129 	wait_queue_head_t waitq;
130 	struct list_head send_list;
131 	struct list_head recv_list;
132 	struct vdpa_callback config_cb;
133 	struct work_struct inject;
134 	spinlock_t irq_lock;
135 	struct rw_semaphore rwsem;
136 	int minor;
137 	bool broken;
138 	bool connected;
139 	bool suspended;
140 	u64 api_version;
141 	u64 device_features;
142 	u64 driver_features;
143 	u32 device_id;
144 	u32 vendor_id;
145 	u32 generation;
146 	u32 config_size;
147 	void *config;
148 	u8 status;
149 	u32 vq_num;
150 	u32 vq_align;
151 	u32 ngroups;
152 	u32 nas;
153 	struct vduse_vq_group *groups;
154 	unsigned int bounce_size;
155 	struct mutex domain_lock;
156 };
157 
158 struct vduse_dev_msg {
159 	struct vduse_dev_request req;
160 	struct vduse_dev_response resp;
161 	struct list_head list;
162 	wait_queue_head_t waitq;
163 	bool completed;
164 };
165 
166 struct vduse_control {
167 	u64 api_version;
168 	u64 vduse_features;
169 };
170 
171 static DEFINE_MUTEX(vduse_lock);
172 static DEFINE_IDR(vduse_idr);
173 
174 static dev_t vduse_major;
175 static struct cdev vduse_ctrl_cdev;
176 static const struct device *vduse_ctrl_dev;
177 static struct cdev vduse_cdev;
178 static struct workqueue_struct *vduse_irq_wq;
179 static struct workqueue_struct *vduse_irq_bound_wq;
180 
181 static u32 allowed_device_id[] = {
182 	VIRTIO_ID_BLOCK,
183 	VIRTIO_ID_NET,
184 	VIRTIO_ID_FS,
185 };
186 
vdpa_to_vduse(struct vdpa_device * vdpa)187 static inline struct vduse_dev *vdpa_to_vduse(struct vdpa_device *vdpa)
188 {
189 	struct vduse_vdpa *vdev = container_of(vdpa, struct vduse_vdpa, vdpa);
190 
191 	return vdev->dev;
192 }
193 
dev_to_vduse(struct device * dev)194 static inline struct vduse_dev *dev_to_vduse(struct device *dev)
195 {
196 	struct vdpa_device *vdpa = dev_to_vdpa(dev);
197 
198 	return vdpa_to_vduse(vdpa);
199 }
200 
vduse_find_msg(struct list_head * head,uint32_t request_id)201 static struct vduse_dev_msg *vduse_find_msg(struct list_head *head,
202 					    uint32_t request_id)
203 {
204 	struct vduse_dev_msg *msg;
205 
206 	list_for_each_entry(msg, head, list) {
207 		if (msg->req.request_id == request_id) {
208 			list_del(&msg->list);
209 			return msg;
210 		}
211 	}
212 
213 	return NULL;
214 }
215 
vduse_dequeue_msg(struct list_head * head)216 static struct vduse_dev_msg *vduse_dequeue_msg(struct list_head *head)
217 {
218 	struct vduse_dev_msg *msg = NULL;
219 
220 	if (!list_empty(head)) {
221 		msg = list_first_entry(head, struct vduse_dev_msg, list);
222 		list_del(&msg->list);
223 	}
224 
225 	return msg;
226 }
227 
vduse_enqueue_msg(struct list_head * head,struct vduse_dev_msg * msg)228 static void vduse_enqueue_msg(struct list_head *head,
229 			      struct vduse_dev_msg *msg)
230 {
231 	list_add_tail(&msg->list, head);
232 }
233 
vduse_enqueue_msg_head(struct list_head * head,struct vduse_dev_msg * msg)234 static void vduse_enqueue_msg_head(struct list_head *head,
235 				   struct vduse_dev_msg *msg)
236 {
237 	list_add(&msg->list, head);
238 }
239 
vduse_dev_broken(struct vduse_dev * dev)240 static void vduse_dev_broken(struct vduse_dev *dev)
241 {
242 	struct vduse_dev_msg *msg, *tmp;
243 
244 	if (unlikely(dev->broken))
245 		return;
246 
247 	list_splice_init(&dev->recv_list, &dev->send_list);
248 	list_for_each_entry_safe(msg, tmp, &dev->send_list, list) {
249 		list_del(&msg->list);
250 		msg->completed = 1;
251 		msg->resp.result = VDUSE_REQ_RESULT_FAILED;
252 		wake_up(&msg->waitq);
253 	}
254 	dev->broken = true;
255 	wake_up(&dev->waitq);
256 }
257 
vduse_dev_msg_sync(struct vduse_dev * dev,struct vduse_dev_msg * msg)258 static int vduse_dev_msg_sync(struct vduse_dev *dev,
259 			      struct vduse_dev_msg *msg)
260 {
261 	int ret;
262 
263 	if (unlikely(dev->broken))
264 		return -EIO;
265 
266 	init_waitqueue_head(&msg->waitq);
267 	spin_lock(&dev->msg_lock);
268 	if (unlikely(dev->broken)) {
269 		spin_unlock(&dev->msg_lock);
270 		return -EIO;
271 	}
272 	msg->req.request_id = dev->msg_unique++;
273 	vduse_enqueue_msg(&dev->send_list, msg);
274 	wake_up(&dev->waitq);
275 	spin_unlock(&dev->msg_lock);
276 	if (dev->msg_timeout)
277 		ret = wait_event_killable_timeout(msg->waitq, msg->completed,
278 						  (long)dev->msg_timeout * HZ);
279 	else
280 		ret = wait_event_killable(msg->waitq, msg->completed);
281 
282 	spin_lock(&dev->msg_lock);
283 	if (!msg->completed) {
284 		list_del(&msg->list);
285 		msg->resp.result = VDUSE_REQ_RESULT_FAILED;
286 		/* Mark the device as malfunction when there is a timeout */
287 		if (!ret)
288 			vduse_dev_broken(dev);
289 	}
290 	ret = (msg->resp.result == VDUSE_REQ_RESULT_OK) ? 0 : -EIO;
291 	spin_unlock(&dev->msg_lock);
292 
293 	return ret;
294 }
295 
vduse_dev_get_vq_state_packed(struct vduse_dev * dev,struct vduse_virtqueue * vq,struct vdpa_vq_state_packed * packed)296 static int vduse_dev_get_vq_state_packed(struct vduse_dev *dev,
297 					 struct vduse_virtqueue *vq,
298 					 struct vdpa_vq_state_packed *packed)
299 {
300 	struct vduse_dev_msg msg = { 0 };
301 	int ret;
302 
303 	msg.req.type = VDUSE_GET_VQ_STATE;
304 	msg.req.vq_state.index = vq->index;
305 
306 	ret = vduse_dev_msg_sync(dev, &msg);
307 	if (ret)
308 		return ret;
309 
310 	packed->last_avail_counter =
311 			msg.resp.vq_state.packed.last_avail_counter & 0x0001;
312 	packed->last_avail_idx =
313 			msg.resp.vq_state.packed.last_avail_idx & 0x7FFF;
314 	packed->last_used_counter =
315 			msg.resp.vq_state.packed.last_used_counter & 0x0001;
316 	packed->last_used_idx =
317 			msg.resp.vq_state.packed.last_used_idx & 0x7FFF;
318 
319 	return 0;
320 }
321 
vduse_dev_get_vq_state_split(struct vduse_dev * dev,struct vduse_virtqueue * vq,struct vdpa_vq_state_split * split)322 static int vduse_dev_get_vq_state_split(struct vduse_dev *dev,
323 					struct vduse_virtqueue *vq,
324 					struct vdpa_vq_state_split *split)
325 {
326 	struct vduse_dev_msg msg = { 0 };
327 	int ret;
328 
329 	msg.req.type = VDUSE_GET_VQ_STATE;
330 	msg.req.vq_state.index = vq->index;
331 
332 	ret = vduse_dev_msg_sync(dev, &msg);
333 	if (ret)
334 		return ret;
335 
336 	split->avail_index = msg.resp.vq_state.split.avail_index;
337 
338 	return 0;
339 }
340 
vduse_dev_set_status(struct vduse_dev * dev,u8 status)341 static int vduse_dev_set_status(struct vduse_dev *dev, u8 status)
342 {
343 	struct vduse_dev_msg msg = { 0 };
344 
345 	msg.req.type = VDUSE_SET_STATUS;
346 	msg.req.s.status = status;
347 
348 	return vduse_dev_msg_sync(dev, &msg);
349 }
350 
vduse_dev_update_iotlb(struct vduse_dev * dev,u32 asid,u64 start,u64 last)351 static int vduse_dev_update_iotlb(struct vduse_dev *dev, u32 asid,
352 				  u64 start, u64 last)
353 {
354 	struct vduse_dev_msg msg = { 0 };
355 
356 	if (last < start)
357 		return -EINVAL;
358 
359 	msg.req.type = VDUSE_UPDATE_IOTLB;
360 	if (dev->api_version < VDUSE_API_VERSION_1) {
361 		msg.req.iova.start = start;
362 		msg.req.iova.last = last;
363 	} else {
364 		msg.req.iova_v2.start = start;
365 		msg.req.iova_v2.last = last;
366 		msg.req.iova_v2.asid = asid;
367 	}
368 
369 	return vduse_dev_msg_sync(dev, &msg);
370 }
371 
vduse_dev_read_iter(struct kiocb * iocb,struct iov_iter * to)372 static ssize_t vduse_dev_read_iter(struct kiocb *iocb, struct iov_iter *to)
373 {
374 	struct file *file = iocb->ki_filp;
375 	struct vduse_dev *dev = file->private_data;
376 	struct vduse_dev_msg *msg;
377 	struct vduse_dev_request req;
378 	int size = sizeof(struct vduse_dev_request);
379 	ssize_t ret;
380 
381 	if (iov_iter_count(to) < size)
382 		return -EINVAL;
383 
384 	spin_lock(&dev->msg_lock);
385 	while (1) {
386 		msg = vduse_dequeue_msg(&dev->send_list);
387 		if (msg)
388 			break;
389 		spin_unlock(&dev->msg_lock);
390 
391 		if (file->f_flags & O_NONBLOCK)
392 			return -EAGAIN;
393 
394 		ret = wait_event_interruptible_exclusive(dev->waitq,
395 					!list_empty(&dev->send_list));
396 		if (ret)
397 			return ret;
398 
399 		spin_lock(&dev->msg_lock);
400 	}
401 
402 	memcpy(&req, &msg->req, sizeof(req));
403 	/*
404 	 * We must ensure vduse_msg is on send_list or recv_list before unlock
405 	 * dev->msg_lock. Because vduse_dev_msg_sync() may be timeout when we
406 	 * copy data to userspace, and will call list_del() for this msg.
407 	 */
408 	vduse_enqueue_msg(&dev->recv_list, msg);
409 	spin_unlock(&dev->msg_lock);
410 
411 	ret = copy_to_iter(&req, size, to);
412 	if (ret != size) {
413 		/*
414 		 * Roll back: move msg back to send_list if still pending.
415 		 *
416 		 * NOTE:
417 		 * vduse_find_msg() must use req.request_id instead of `msg`.
418 		 * A malicious userspace may reply to this request, and wake up
419 		 * the caller, after which `msg` will have already been freed.
420 		 * And here vduse_find_msg() will return NULL then do nothing.
421 		 */
422 		spin_lock(&dev->msg_lock);
423 		msg = vduse_find_msg(&dev->recv_list, req.request_id);
424 		if (msg)
425 			vduse_enqueue_msg_head(&dev->send_list, msg);
426 		spin_unlock(&dev->msg_lock);
427 		ret = -EFAULT;
428 	}
429 
430 	return ret;
431 }
432 
is_mem_zero(const char * ptr,int size)433 static bool is_mem_zero(const char *ptr, int size)
434 {
435 	int i;
436 
437 	for (i = 0; i < size; i++) {
438 		if (ptr[i])
439 			return false;
440 	}
441 	return true;
442 }
443 
vduse_dev_write_iter(struct kiocb * iocb,struct iov_iter * from)444 static ssize_t vduse_dev_write_iter(struct kiocb *iocb, struct iov_iter *from)
445 {
446 	struct file *file = iocb->ki_filp;
447 	struct vduse_dev *dev = file->private_data;
448 	struct vduse_dev_response resp;
449 	struct vduse_dev_msg *msg;
450 	size_t ret;
451 
452 	ret = copy_from_iter(&resp, sizeof(resp), from);
453 	if (ret != sizeof(resp))
454 		return -EINVAL;
455 
456 	if (!is_mem_zero((const char *)resp.reserved, sizeof(resp.reserved)))
457 		return -EINVAL;
458 
459 	spin_lock(&dev->msg_lock);
460 	msg = vduse_find_msg(&dev->recv_list, resp.request_id);
461 	if (!msg) {
462 		ret = -ENOENT;
463 		goto unlock;
464 	}
465 
466 	memcpy(&msg->resp, &resp, sizeof(resp));
467 	msg->completed = 1;
468 	wake_up(&msg->waitq);
469 unlock:
470 	spin_unlock(&dev->msg_lock);
471 
472 	return ret;
473 }
474 
vduse_dev_poll(struct file * file,poll_table * wait)475 static __poll_t vduse_dev_poll(struct file *file, poll_table *wait)
476 {
477 	struct vduse_dev *dev = file->private_data;
478 	__poll_t mask = 0;
479 
480 	poll_wait(file, &dev->waitq, wait);
481 
482 	spin_lock(&dev->msg_lock);
483 
484 	if (unlikely(dev->broken))
485 		mask |= EPOLLERR;
486 	if (!list_empty(&dev->send_list))
487 		mask |= EPOLLIN | EPOLLRDNORM;
488 	if (!list_empty(&dev->recv_list))
489 		mask |= EPOLLOUT | EPOLLWRNORM;
490 
491 	spin_unlock(&dev->msg_lock);
492 
493 	return mask;
494 }
495 
vduse_dev_reset(struct vduse_dev * dev)496 static void vduse_dev_reset(struct vduse_dev *dev)
497 {
498 	int i;
499 
500 	/* The coherent mappings are handled in vduse_dev_free_coherent() */
501 	for (i = 0; i < dev->nas; i++) {
502 		struct vduse_iova_domain *domain = dev->as[i].domain;
503 
504 		if (domain && domain->bounce_map)
505 			vduse_domain_reset_bounce_map(domain);
506 	}
507 
508 	scoped_guard(rwsem_write, &dev->rwsem) {
509 		dev->suspended = false;
510 		dev->status = 0;
511 		dev->driver_features = 0;
512 		dev->generation++;
513 		spin_lock(&dev->irq_lock);
514 		dev->config_cb.callback = NULL;
515 		dev->config_cb.private = NULL;
516 		spin_unlock(&dev->irq_lock);
517 
518 		for (i = 0; i < dev->vq_num; i++) {
519 			struct vduse_virtqueue *vq = dev->vqs[i];
520 
521 			scoped_guard(spinlock_bh, &vq->ready_lock) {
522 				vq->ready = false;
523 			}
524 			vq->desc_addr = 0;
525 			vq->driver_addr = 0;
526 			vq->device_addr = 0;
527 			vq->num = 0;
528 			memset(&vq->state, 0, sizeof(vq->state));
529 
530 			spin_lock(&vq->kick_lock);
531 			vq->kicked = false;
532 			if (vq->kickfd)
533 				eventfd_ctx_put(vq->kickfd);
534 			vq->kickfd = NULL;
535 			spin_unlock(&vq->kick_lock);
536 
537 			spin_lock(&vq->irq_lock);
538 			vq->cb.callback = NULL;
539 			vq->cb.private = NULL;
540 			vq->cb.trigger = NULL;
541 			spin_unlock(&vq->irq_lock);
542 		}
543 	}
544 
545 	flush_work(&dev->inject);
546 	for (i = 0; i < dev->vq_num; i++) {
547 		struct vduse_virtqueue *vq = dev->vqs[i];
548 
549 		flush_work(&vq->inject);
550 		flush_work(&vq->kick);
551 	}
552 }
553 
vduse_vdpa_set_vq_address(struct vdpa_device * vdpa,u16 idx,u64 desc_area,u64 driver_area,u64 device_area)554 static int vduse_vdpa_set_vq_address(struct vdpa_device *vdpa, u16 idx,
555 				u64 desc_area, u64 driver_area,
556 				u64 device_area)
557 {
558 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
559 	struct vduse_virtqueue *vq = dev->vqs[idx];
560 
561 	vq->desc_addr = desc_area;
562 	vq->driver_addr = driver_area;
563 	vq->device_addr = device_area;
564 
565 	return 0;
566 }
567 
vduse_vq_kick(struct vduse_virtqueue * vq)568 static void vduse_vq_kick(struct vduse_virtqueue *vq)
569 {
570 	guard(rwsem_read)(&vq->dev->rwsem);
571 	if (vq->dev->suspended)
572 		return;
573 
574 	guard(spinlock)(&vq->kick_lock);
575 	scoped_guard(spinlock_bh, &vq->ready_lock)
576 		if (!vq->ready)
577 			return;
578 
579 	if (vq->kickfd)
580 		eventfd_signal(vq->kickfd);
581 	else
582 		vq->kicked = true;
583 }
584 
vduse_vq_kick_work(struct work_struct * work)585 static void vduse_vq_kick_work(struct work_struct *work)
586 {
587 	struct vduse_virtqueue *vq = container_of(work,
588 					struct vduse_virtqueue, kick);
589 
590 	vduse_vq_kick(vq);
591 }
592 
vduse_vdpa_kick_vq(struct vdpa_device * vdpa,u16 idx)593 static void vduse_vdpa_kick_vq(struct vdpa_device *vdpa, u16 idx)
594 {
595 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
596 	struct vduse_virtqueue *vq = dev->vqs[idx];
597 
598 	if (!eventfd_signal_allowed()) {
599 		schedule_work(&vq->kick);
600 		return;
601 	}
602 	vduse_vq_kick(vq);
603 }
604 
vduse_vdpa_set_vq_cb(struct vdpa_device * vdpa,u16 idx,struct vdpa_callback * cb)605 static void vduse_vdpa_set_vq_cb(struct vdpa_device *vdpa, u16 idx,
606 			      struct vdpa_callback *cb)
607 {
608 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
609 	struct vduse_virtqueue *vq = dev->vqs[idx];
610 
611 	spin_lock(&vq->irq_lock);
612 	vq->cb.callback = cb->callback;
613 	vq->cb.private = cb->private;
614 	vq->cb.trigger = cb->trigger;
615 	spin_unlock(&vq->irq_lock);
616 }
617 
vduse_vdpa_set_vq_num(struct vdpa_device * vdpa,u16 idx,u32 num)618 static void vduse_vdpa_set_vq_num(struct vdpa_device *vdpa, u16 idx, u32 num)
619 {
620 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
621 	struct vduse_virtqueue *vq = dev->vqs[idx];
622 
623 	vq->num = num;
624 }
625 
vduse_vdpa_get_vq_size(struct vdpa_device * vdpa,u16 idx)626 static u16 vduse_vdpa_get_vq_size(struct vdpa_device *vdpa, u16 idx)
627 {
628 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
629 	struct vduse_virtqueue *vq = dev->vqs[idx];
630 
631 	if (vq->num)
632 		return vq->num;
633 	else
634 		return vq->num_max;
635 }
636 
vduse_vdpa_set_vq_ready(struct vdpa_device * vdpa,u16 idx,bool ready)637 static void vduse_vdpa_set_vq_ready(struct vdpa_device *vdpa,
638 					u16 idx, bool ready)
639 {
640 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
641 	struct vduse_virtqueue *vq = dev->vqs[idx];
642 	struct vduse_dev_msg msg = { 0 };
643 	int r;
644 
645 	if (dev->vduse_features & BIT_U64(VDUSE_F_QUEUE_READY)) {
646 		msg.req.type = VDUSE_SET_VQ_READY;
647 		msg.req.vq_ready.num = idx;
648 		msg.req.vq_ready.ready = !!ready;
649 
650 		r = vduse_dev_msg_sync(dev, &msg);
651 
652 		if (r < 0) {
653 			dev_dbg(&vdpa->dev, "device refuses to set vq %u ready %u",
654 					idx, ready);
655 
656 			/* We can't do better than break the device in this case */
657 			spin_lock(&dev->msg_lock);
658 			vduse_dev_broken(dev);
659 			spin_unlock(&dev->msg_lock);
660 
661 			return;
662 		}
663 	}
664 
665 	guard(spinlock_bh)(&vq->ready_lock);
666 	vq->ready = ready;
667 }
668 
vduse_vdpa_get_vq_ready(struct vdpa_device * vdpa,u16 idx)669 static bool vduse_vdpa_get_vq_ready(struct vdpa_device *vdpa, u16 idx)
670 {
671 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
672 	struct vduse_virtqueue *vq = dev->vqs[idx];
673 
674 	guard(spinlock_bh)(&vq->ready_lock);
675 	return vq->ready;
676 }
677 
vduse_vdpa_set_vq_state(struct vdpa_device * vdpa,u16 idx,const struct vdpa_vq_state * state)678 static int vduse_vdpa_set_vq_state(struct vdpa_device *vdpa, u16 idx,
679 				const struct vdpa_vq_state *state)
680 {
681 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
682 	struct vduse_virtqueue *vq = dev->vqs[idx];
683 
684 	if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED)) {
685 		vq->state.packed.last_avail_counter =
686 				state->packed.last_avail_counter;
687 		vq->state.packed.last_avail_idx = state->packed.last_avail_idx;
688 		vq->state.packed.last_used_counter =
689 				state->packed.last_used_counter;
690 		vq->state.packed.last_used_idx = state->packed.last_used_idx;
691 	} else
692 		vq->state.split.avail_index = state->split.avail_index;
693 
694 	return 0;
695 }
696 
vduse_get_vq_group(struct vdpa_device * vdpa,u16 idx)697 static u32 vduse_get_vq_group(struct vdpa_device *vdpa, u16 idx)
698 {
699 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
700 
701 	if (dev->api_version < VDUSE_API_VERSION_1)
702 		return 0;
703 
704 	return dev->vqs[idx]->group;
705 }
706 
vduse_get_vq_map(struct vdpa_device * vdpa,u16 idx)707 static union virtio_map vduse_get_vq_map(struct vdpa_device *vdpa, u16 idx)
708 {
709 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
710 	u32 vq_group = vduse_get_vq_group(vdpa, idx);
711 	union virtio_map ret = {
712 		.group = &dev->groups[vq_group],
713 	};
714 
715 	return ret;
716 }
717 
718 DEFINE_GUARD(vq_group_as_read_lock, struct vduse_vq_group *,
719 	if (_T->dev->nas > 1)
720 		read_lock(&_T->as_lock),
721 	if (_T->dev->nas > 1)
722 		read_unlock(&_T->as_lock))
723 
724 DEFINE_GUARD(vq_group_as_write_lock, struct vduse_vq_group *,
725 	if (_T->dev->nas > 1)
726 		write_lock(&_T->as_lock),
727 	if (_T->dev->nas > 1)
728 		write_unlock(&_T->as_lock))
729 
vduse_set_group_asid(struct vdpa_device * vdpa,unsigned int group,unsigned int asid)730 static int vduse_set_group_asid(struct vdpa_device *vdpa, unsigned int group,
731 				unsigned int asid)
732 {
733 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
734 	struct vduse_dev_msg msg = { 0 };
735 	int r;
736 
737 	if (dev->api_version < VDUSE_API_VERSION_1)
738 		return -EINVAL;
739 
740 	msg.req.type = VDUSE_SET_VQ_GROUP_ASID;
741 	msg.req.vq_group_asid.group = group;
742 	msg.req.vq_group_asid.asid = asid;
743 
744 	r = vduse_dev_msg_sync(dev, &msg);
745 	if (r < 0)
746 		return r;
747 
748 	guard(vq_group_as_write_lock)(&dev->groups[group]);
749 	dev->groups[group].as = &dev->as[asid];
750 
751 	return 0;
752 }
753 
vduse_vdpa_get_vq_state(struct vdpa_device * vdpa,u16 idx,struct vdpa_vq_state * state)754 static int vduse_vdpa_get_vq_state(struct vdpa_device *vdpa, u16 idx,
755 				struct vdpa_vq_state *state)
756 {
757 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
758 	struct vduse_virtqueue *vq = dev->vqs[idx];
759 
760 	if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED))
761 		return vduse_dev_get_vq_state_packed(dev, vq, &state->packed);
762 
763 	return vduse_dev_get_vq_state_split(dev, vq, &state->split);
764 }
765 
vduse_vdpa_get_vq_align(struct vdpa_device * vdpa)766 static u32 vduse_vdpa_get_vq_align(struct vdpa_device *vdpa)
767 {
768 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
769 
770 	return dev->vq_align;
771 }
772 
vduse_vdpa_get_device_features(struct vdpa_device * vdpa)773 static u64 vduse_vdpa_get_device_features(struct vdpa_device *vdpa)
774 {
775 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
776 
777 	return dev->device_features;
778 }
779 
vduse_vdpa_set_driver_features(struct vdpa_device * vdpa,u64 features)780 static int vduse_vdpa_set_driver_features(struct vdpa_device *vdpa, u64 features)
781 {
782 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
783 
784 	dev->driver_features = features;
785 	return 0;
786 }
787 
vduse_vdpa_get_driver_features(struct vdpa_device * vdpa)788 static u64 vduse_vdpa_get_driver_features(struct vdpa_device *vdpa)
789 {
790 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
791 
792 	return dev->driver_features;
793 }
794 
vduse_vdpa_set_config_cb(struct vdpa_device * vdpa,struct vdpa_callback * cb)795 static void vduse_vdpa_set_config_cb(struct vdpa_device *vdpa,
796 				  struct vdpa_callback *cb)
797 {
798 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
799 
800 	spin_lock(&dev->irq_lock);
801 	dev->config_cb.callback = cb->callback;
802 	dev->config_cb.private = cb->private;
803 	spin_unlock(&dev->irq_lock);
804 }
805 
vduse_vdpa_get_vq_num_max(struct vdpa_device * vdpa)806 static u16 vduse_vdpa_get_vq_num_max(struct vdpa_device *vdpa)
807 {
808 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
809 	u16 num_max = 0;
810 	int i;
811 
812 	for (i = 0; i < dev->vq_num; i++)
813 		if (num_max < dev->vqs[i]->num_max)
814 			num_max = dev->vqs[i]->num_max;
815 
816 	return num_max;
817 }
818 
vduse_vdpa_get_device_id(struct vdpa_device * vdpa)819 static u32 vduse_vdpa_get_device_id(struct vdpa_device *vdpa)
820 {
821 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
822 
823 	return dev->device_id;
824 }
825 
vduse_vdpa_get_vendor_id(struct vdpa_device * vdpa)826 static u32 vduse_vdpa_get_vendor_id(struct vdpa_device *vdpa)
827 {
828 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
829 
830 	return dev->vendor_id;
831 }
832 
vduse_vdpa_get_status(struct vdpa_device * vdpa)833 static u8 vduse_vdpa_get_status(struct vdpa_device *vdpa)
834 {
835 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
836 
837 	return dev->status;
838 }
839 
vduse_vdpa_set_status(struct vdpa_device * vdpa,u8 status)840 static void vduse_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
841 {
842 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
843 
844 	if (vduse_dev_set_status(dev, status))
845 		return;
846 
847 	dev->status = status;
848 }
849 
vduse_vdpa_get_config_size(struct vdpa_device * vdpa)850 static size_t vduse_vdpa_get_config_size(struct vdpa_device *vdpa)
851 {
852 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
853 
854 	return dev->config_size;
855 }
856 
vduse_vdpa_get_config(struct vdpa_device * vdpa,unsigned int offset,void * buf,unsigned int len)857 static void vduse_vdpa_get_config(struct vdpa_device *vdpa, unsigned int offset,
858 				  void *buf, unsigned int len)
859 {
860 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
861 
862 	/* Initialize the buffer in case of partial copy. */
863 	memset(buf, 0, len);
864 
865 	if (offset > dev->config_size)
866 		return;
867 
868 	if (len > dev->config_size - offset)
869 		len = dev->config_size - offset;
870 
871 	memcpy(buf, dev->config + offset, len);
872 }
873 
vduse_vdpa_set_config(struct vdpa_device * vdpa,unsigned int offset,const void * buf,unsigned int len)874 static void vduse_vdpa_set_config(struct vdpa_device *vdpa, unsigned int offset,
875 			const void *buf, unsigned int len)
876 {
877 	/* Now we only support read-only configuration space */
878 }
879 
vduse_vdpa_reset(struct vdpa_device * vdpa)880 static int vduse_vdpa_reset(struct vdpa_device *vdpa)
881 {
882 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
883 	int ret = vduse_dev_set_status(dev, 0);
884 
885 	vduse_dev_reset(dev);
886 
887 	return ret;
888 }
889 
vduse_vdpa_get_generation(struct vdpa_device * vdpa)890 static u32 vduse_vdpa_get_generation(struct vdpa_device *vdpa)
891 {
892 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
893 
894 	return dev->generation;
895 }
896 
vduse_vdpa_set_vq_affinity(struct vdpa_device * vdpa,u16 idx,const struct cpumask * cpu_mask)897 static int vduse_vdpa_set_vq_affinity(struct vdpa_device *vdpa, u16 idx,
898 				      const struct cpumask *cpu_mask)
899 {
900 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
901 
902 	if (cpu_mask)
903 		cpumask_copy(&dev->vqs[idx]->irq_affinity, cpu_mask);
904 	else
905 		cpumask_setall(&dev->vqs[idx]->irq_affinity);
906 
907 	return 0;
908 }
909 
910 static const struct cpumask *
vduse_vdpa_get_vq_affinity(struct vdpa_device * vdpa,u16 idx)911 vduse_vdpa_get_vq_affinity(struct vdpa_device *vdpa, u16 idx)
912 {
913 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
914 
915 	return &dev->vqs[idx]->irq_affinity;
916 }
917 
vduse_vdpa_set_map(struct vdpa_device * vdpa,unsigned int asid,struct vhost_iotlb * iotlb)918 static int vduse_vdpa_set_map(struct vdpa_device *vdpa,
919 				unsigned int asid,
920 				struct vhost_iotlb *iotlb)
921 {
922 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
923 	int ret;
924 
925 	ret = vduse_domain_set_map(dev->as[asid].domain, iotlb);
926 	if (ret)
927 		return ret;
928 
929 	ret = vduse_dev_update_iotlb(dev, asid, 0ULL, ULLONG_MAX);
930 	if (ret) {
931 		vduse_domain_clear_map(dev->as[asid].domain, iotlb);
932 		return ret;
933 	}
934 
935 	return 0;
936 }
937 
vduse_vdpa_suspend(struct vdpa_device * vdpa)938 static int vduse_vdpa_suspend(struct vdpa_device *vdpa)
939 {
940 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
941 	struct vduse_dev_msg msg = { 0 };
942 	int ret;
943 
944 	msg.req.type = VDUSE_SUSPEND;
945 
946 	ret = vduse_dev_msg_sync(dev, &msg);
947 	if (ret == 0) {
948 		scoped_guard(rwsem_write, &dev->rwsem)
949 			dev->suspended = true;
950 
951 		cancel_work_sync(&dev->inject);
952 		for (u32 i = 0; i < dev->vq_num; i++)
953 			cancel_work_sync(&dev->vqs[i]->inject);
954 	}
955 
956 	return ret;
957 }
958 
vduse_vdpa_free(struct vdpa_device * vdpa)959 static void vduse_vdpa_free(struct vdpa_device *vdpa)
960 {
961 	struct vduse_dev *dev = vdpa_to_vduse(vdpa);
962 
963 	dev->vdev = NULL;
964 }
965 
966 static const struct vdpa_config_ops vduse_vdpa_config_ops = {
967 	.set_vq_address		= vduse_vdpa_set_vq_address,
968 	.kick_vq		= vduse_vdpa_kick_vq,
969 	.set_vq_cb		= vduse_vdpa_set_vq_cb,
970 	.set_vq_num             = vduse_vdpa_set_vq_num,
971 	.get_vq_size		= vduse_vdpa_get_vq_size,
972 	.get_vq_group		= vduse_get_vq_group,
973 	.set_vq_ready		= vduse_vdpa_set_vq_ready,
974 	.get_vq_ready		= vduse_vdpa_get_vq_ready,
975 	.set_vq_state		= vduse_vdpa_set_vq_state,
976 	.get_vq_state		= vduse_vdpa_get_vq_state,
977 	.get_vq_align		= vduse_vdpa_get_vq_align,
978 	.get_device_features	= vduse_vdpa_get_device_features,
979 	.set_driver_features	= vduse_vdpa_set_driver_features,
980 	.get_driver_features	= vduse_vdpa_get_driver_features,
981 	.set_config_cb		= vduse_vdpa_set_config_cb,
982 	.get_vq_num_max		= vduse_vdpa_get_vq_num_max,
983 	.get_device_id		= vduse_vdpa_get_device_id,
984 	.get_vendor_id		= vduse_vdpa_get_vendor_id,
985 	.get_status		= vduse_vdpa_get_status,
986 	.set_status		= vduse_vdpa_set_status,
987 	.get_config_size	= vduse_vdpa_get_config_size,
988 	.get_config		= vduse_vdpa_get_config,
989 	.set_config		= vduse_vdpa_set_config,
990 	.get_generation		= vduse_vdpa_get_generation,
991 	.set_vq_affinity	= vduse_vdpa_set_vq_affinity,
992 	.get_vq_affinity	= vduse_vdpa_get_vq_affinity,
993 	.reset			= vduse_vdpa_reset,
994 	.set_map		= vduse_vdpa_set_map,
995 	.set_group_asid		= vduse_set_group_asid,
996 	.get_vq_map		= vduse_get_vq_map,
997 	.free			= vduse_vdpa_free,
998 };
999 
1000 static const struct vdpa_config_ops vduse_vdpa_config_ops_with_suspend = {
1001 	.set_vq_address		= vduse_vdpa_set_vq_address,
1002 	.kick_vq		= vduse_vdpa_kick_vq,
1003 	.set_vq_cb		= vduse_vdpa_set_vq_cb,
1004 	.set_vq_num             = vduse_vdpa_set_vq_num,
1005 	.get_vq_size		= vduse_vdpa_get_vq_size,
1006 	.get_vq_group		= vduse_get_vq_group,
1007 	.set_vq_ready		= vduse_vdpa_set_vq_ready,
1008 	.get_vq_ready		= vduse_vdpa_get_vq_ready,
1009 	.set_vq_state		= vduse_vdpa_set_vq_state,
1010 	.get_vq_state		= vduse_vdpa_get_vq_state,
1011 	.get_vq_align		= vduse_vdpa_get_vq_align,
1012 	.get_device_features	= vduse_vdpa_get_device_features,
1013 	.set_driver_features	= vduse_vdpa_set_driver_features,
1014 	.get_driver_features	= vduse_vdpa_get_driver_features,
1015 	.set_config_cb		= vduse_vdpa_set_config_cb,
1016 	.get_vq_num_max		= vduse_vdpa_get_vq_num_max,
1017 	.get_device_id		= vduse_vdpa_get_device_id,
1018 	.get_vendor_id		= vduse_vdpa_get_vendor_id,
1019 	.get_status		= vduse_vdpa_get_status,
1020 	.set_status		= vduse_vdpa_set_status,
1021 	.get_config_size	= vduse_vdpa_get_config_size,
1022 	.get_config		= vduse_vdpa_get_config,
1023 	.set_config		= vduse_vdpa_set_config,
1024 	.get_generation		= vduse_vdpa_get_generation,
1025 	.set_vq_affinity	= vduse_vdpa_set_vq_affinity,
1026 	.get_vq_affinity	= vduse_vdpa_get_vq_affinity,
1027 	.reset			= vduse_vdpa_reset,
1028 	.set_map		= vduse_vdpa_set_map,
1029 	.set_group_asid		= vduse_set_group_asid,
1030 	.get_vq_map		= vduse_get_vq_map,
1031 	.suspend		= vduse_vdpa_suspend,
1032 	.free			= vduse_vdpa_free,
1033 };
1034 
vduse_dev_sync_single_for_device(union virtio_map token,dma_addr_t dma_addr,size_t size,enum dma_data_direction dir)1035 static void vduse_dev_sync_single_for_device(union virtio_map token,
1036 					     dma_addr_t dma_addr, size_t size,
1037 					     enum dma_data_direction dir)
1038 {
1039 	struct vduse_iova_domain *domain;
1040 
1041 	if (!token.group)
1042 		return;
1043 
1044 	guard(vq_group_as_read_lock)(token.group);
1045 	domain = token.group->as->domain;
1046 	vduse_domain_sync_single_for_device(domain, dma_addr, size, dir);
1047 }
1048 
vduse_dev_sync_single_for_cpu(union virtio_map token,dma_addr_t dma_addr,size_t size,enum dma_data_direction dir)1049 static void vduse_dev_sync_single_for_cpu(union virtio_map token,
1050 					     dma_addr_t dma_addr, size_t size,
1051 					     enum dma_data_direction dir)
1052 {
1053 	struct vduse_iova_domain *domain;
1054 
1055 	if (!token.group)
1056 		return;
1057 
1058 	guard(vq_group_as_read_lock)(token.group);
1059 	domain = token.group->as->domain;
1060 	vduse_domain_sync_single_for_cpu(domain, dma_addr, size, dir);
1061 }
1062 
vduse_dev_map_page(union virtio_map token,struct page * page,unsigned long offset,size_t size,enum dma_data_direction dir,unsigned long attrs)1063 static dma_addr_t vduse_dev_map_page(union virtio_map token, struct page *page,
1064 				     unsigned long offset, size_t size,
1065 				     enum dma_data_direction dir,
1066 				     unsigned long attrs)
1067 {
1068 	struct vduse_iova_domain *domain;
1069 
1070 	if (!token.group)
1071 		return DMA_MAPPING_ERROR;
1072 
1073 	guard(vq_group_as_read_lock)(token.group);
1074 	domain = token.group->as->domain;
1075 	return vduse_domain_map_page(domain, page, offset, size, dir, attrs);
1076 }
1077 
vduse_dev_unmap_page(union virtio_map token,dma_addr_t dma_addr,size_t size,enum dma_data_direction dir,unsigned long attrs)1078 static void vduse_dev_unmap_page(union virtio_map token, dma_addr_t dma_addr,
1079 				 size_t size, enum dma_data_direction dir,
1080 				 unsigned long attrs)
1081 {
1082 	struct vduse_iova_domain *domain;
1083 
1084 	if (!token.group)
1085 		return;
1086 
1087 	guard(vq_group_as_read_lock)(token.group);
1088 	domain = token.group->as->domain;
1089 	vduse_domain_unmap_page(domain, dma_addr, size, dir, attrs);
1090 }
1091 
vduse_dev_alloc_coherent(union virtio_map token,size_t size,dma_addr_t * dma_addr,gfp_t flag)1092 static void *vduse_dev_alloc_coherent(union virtio_map token, size_t size,
1093 				      dma_addr_t *dma_addr, gfp_t flag)
1094 {
1095 	void *addr;
1096 
1097 	*dma_addr = DMA_MAPPING_ERROR;
1098 	if (!token.group)
1099 		return NULL;
1100 
1101 	addr = alloc_pages_exact(size, flag | __GFP_ZERO);
1102 	if (!addr)
1103 		return NULL;
1104 
1105 	{
1106 		struct vduse_iova_domain *domain;
1107 
1108 		guard(vq_group_as_read_lock)(token.group);
1109 		domain = token.group->as->domain;
1110 		*dma_addr = vduse_domain_alloc_coherent(domain, size, addr);
1111 		if (*dma_addr == DMA_MAPPING_ERROR)
1112 			goto err;
1113 	}
1114 
1115 	return addr;
1116 
1117 err:
1118 	free_pages_exact(addr, size);
1119 	return NULL;
1120 }
1121 
vduse_dev_free_coherent(union virtio_map token,size_t size,void * vaddr,dma_addr_t dma_addr,unsigned long attrs)1122 static void vduse_dev_free_coherent(union virtio_map token, size_t size,
1123 				    void *vaddr, dma_addr_t dma_addr,
1124 				    unsigned long attrs)
1125 {
1126 	if (!token.group)
1127 		return;
1128 
1129 	{
1130 		struct vduse_iova_domain *domain;
1131 
1132 		guard(vq_group_as_read_lock)(token.group);
1133 		domain = token.group->as->domain;
1134 		vduse_domain_free_coherent(domain, size, dma_addr, attrs);
1135 	}
1136 
1137 	free_pages_exact(vaddr, size);
1138 }
1139 
vduse_dev_need_sync(union virtio_map token,dma_addr_t dma_addr)1140 static bool vduse_dev_need_sync(union virtio_map token, dma_addr_t dma_addr)
1141 {
1142 	if (!token.group)
1143 		return false;
1144 
1145 	guard(vq_group_as_read_lock)(token.group);
1146 	return dma_addr < token.group->as->domain->bounce_size;
1147 }
1148 
vduse_dev_mapping_error(union virtio_map token,dma_addr_t dma_addr)1149 static int vduse_dev_mapping_error(union virtio_map token, dma_addr_t dma_addr)
1150 {
1151 	if (unlikely(dma_addr == DMA_MAPPING_ERROR))
1152 		return -ENOMEM;
1153 	return 0;
1154 }
1155 
vduse_dev_max_mapping_size(union virtio_map token)1156 static size_t vduse_dev_max_mapping_size(union virtio_map token)
1157 {
1158 	if (!token.group)
1159 		return 0;
1160 
1161 	guard(vq_group_as_read_lock)(token.group);
1162 	return token.group->as->domain->bounce_size;
1163 }
1164 
1165 static const struct virtio_map_ops vduse_map_ops = {
1166 	.sync_single_for_device = vduse_dev_sync_single_for_device,
1167 	.sync_single_for_cpu = vduse_dev_sync_single_for_cpu,
1168 	.map_page = vduse_dev_map_page,
1169 	.unmap_page = vduse_dev_unmap_page,
1170 	.alloc = vduse_dev_alloc_coherent,
1171 	.free = vduse_dev_free_coherent,
1172 	.need_sync = vduse_dev_need_sync,
1173 	.mapping_error = vduse_dev_mapping_error,
1174 	.max_mapping_size = vduse_dev_max_mapping_size,
1175 };
1176 
perm_to_file_flags(u8 perm)1177 static unsigned int perm_to_file_flags(u8 perm)
1178 {
1179 	unsigned int flags = 0;
1180 
1181 	switch (perm) {
1182 	case VDUSE_ACCESS_WO:
1183 		flags |= O_WRONLY;
1184 		break;
1185 	case VDUSE_ACCESS_RO:
1186 		flags |= O_RDONLY;
1187 		break;
1188 	case VDUSE_ACCESS_RW:
1189 		flags |= O_RDWR;
1190 		break;
1191 	default:
1192 		WARN(1, "invalidate vhost IOTLB permission\n");
1193 		break;
1194 	}
1195 
1196 	return flags;
1197 }
1198 
vduse_kickfd_setup(struct vduse_dev * dev,struct vduse_vq_eventfd * eventfd)1199 static int vduse_kickfd_setup(struct vduse_dev *dev,
1200 			struct vduse_vq_eventfd *eventfd)
1201 {
1202 	struct eventfd_ctx *ctx = NULL;
1203 	struct vduse_virtqueue *vq;
1204 	u32 index;
1205 
1206 	if (eventfd->index >= dev->vq_num)
1207 		return -EINVAL;
1208 
1209 	index = array_index_nospec(eventfd->index, dev->vq_num);
1210 	vq = dev->vqs[index];
1211 	if (eventfd->fd >= 0) {
1212 		ctx = eventfd_ctx_fdget(eventfd->fd);
1213 		if (IS_ERR(ctx))
1214 			return PTR_ERR(ctx);
1215 	} else if (eventfd->fd != VDUSE_EVENTFD_DEASSIGN)
1216 		return 0;
1217 
1218 	guard(spinlock)(&vq->kick_lock);
1219 	if (vq->kickfd)
1220 		eventfd_ctx_put(vq->kickfd);
1221 	vq->kickfd = ctx;
1222 
1223 	guard(spinlock_bh)(&vq->ready_lock);
1224 	if (vq->ready && vq->kicked && vq->kickfd) {
1225 		eventfd_signal(vq->kickfd);
1226 		vq->kicked = false;
1227 	}
1228 
1229 	return 0;
1230 }
1231 
vduse_dev_is_ready(struct vduse_dev * dev)1232 static bool vduse_dev_is_ready(struct vduse_dev *dev)
1233 {
1234 	int i;
1235 
1236 	for (i = 0; i < dev->vq_num; i++)
1237 		if (!dev->vqs[i]->num_max)
1238 			return false;
1239 
1240 	return true;
1241 }
1242 
vduse_dev_irq_inject(struct work_struct * work)1243 static void vduse_dev_irq_inject(struct work_struct *work)
1244 {
1245 	struct vduse_dev *dev = container_of(work, struct vduse_dev, inject);
1246 
1247 	guard(rwsem_read)(&dev->rwsem);
1248 	if (dev->suspended)
1249 		return;
1250 
1251 	spin_lock_bh(&dev->irq_lock);
1252 	if (dev->config_cb.callback)
1253 		dev->config_cb.callback(dev->config_cb.private);
1254 	spin_unlock_bh(&dev->irq_lock);
1255 }
1256 
vduse_vq_irq_inject(struct work_struct * work)1257 static void vduse_vq_irq_inject(struct work_struct *work)
1258 {
1259 	struct vduse_virtqueue *vq = container_of(work,
1260 					struct vduse_virtqueue, inject);
1261 
1262 	guard(rwsem_read)(&vq->dev->rwsem);
1263 	if (vq->dev->suspended)
1264 		return;
1265 
1266 	guard(spinlock_bh)(&vq->irq_lock);
1267 	guard(spinlock_bh)(&vq->ready_lock);
1268 	if (vq->ready && vq->cb.callback)
1269 		vq->cb.callback(vq->cb.private);
1270 }
1271 
vduse_vq_signal_irqfd(struct vduse_virtqueue * vq)1272 static bool vduse_vq_signal_irqfd(struct vduse_virtqueue *vq)
1273 {
1274 	bool signal = false;
1275 
1276 	guard(rwsem_read)(&vq->dev->rwsem);
1277 	if (vq->dev->suspended)
1278 		return false;
1279 
1280 	if (!vq->cb.trigger)
1281 		return false;
1282 
1283 	guard(spinlock_irq)(&vq->irq_lock);
1284 	guard(spinlock_irq)(&vq->ready_lock);
1285 	if (vq->ready && vq->cb.trigger) {
1286 		eventfd_signal(vq->cb.trigger);
1287 		signal = true;
1288 	}
1289 
1290 	return signal;
1291 }
1292 
vduse_dev_queue_irq_work(struct vduse_dev * dev,struct work_struct * irq_work,int irq_effective_cpu)1293 static int vduse_dev_queue_irq_work(struct vduse_dev *dev,
1294 				    struct work_struct *irq_work,
1295 				    int irq_effective_cpu)
1296 {
1297 	int ret = -EINVAL;
1298 
1299 	guard(rwsem_read)(&dev->rwsem);
1300 	if (dev->suspended || !(dev->status & VIRTIO_CONFIG_S_DRIVER_OK))
1301 		return ret;
1302 
1303 	ret = 0;
1304 	if (irq_effective_cpu == IRQ_UNBOUND)
1305 		queue_work(vduse_irq_wq, irq_work);
1306 	else
1307 		queue_work_on(irq_effective_cpu,
1308 			      vduse_irq_bound_wq, irq_work);
1309 
1310 	return ret;
1311 }
1312 
vduse_dev_dereg_umem(struct vduse_dev * dev,u32 asid,u64 iova,u64 size)1313 static int vduse_dev_dereg_umem(struct vduse_dev *dev, u32 asid,
1314 				u64 iova, u64 size)
1315 {
1316 	int ret;
1317 
1318 	mutex_lock(&dev->as[asid].mem_lock);
1319 	ret = -ENOENT;
1320 	if (!dev->as[asid].umem)
1321 		goto unlock;
1322 
1323 	ret = -EINVAL;
1324 	if (!dev->as[asid].domain)
1325 		goto unlock;
1326 
1327 	if (dev->as[asid].umem->iova != iova ||
1328 	    size != dev->as[asid].domain->bounce_size)
1329 		goto unlock;
1330 
1331 	vduse_domain_remove_user_bounce_pages(dev->as[asid].domain);
1332 	unpin_user_pages_dirty_lock(dev->as[asid].umem->pages,
1333 				    dev->as[asid].umem->npages, true);
1334 	atomic64_sub(dev->as[asid].umem->npages, &dev->as[asid].umem->mm->pinned_vm);
1335 	mmdrop(dev->as[asid].umem->mm);
1336 	vfree(dev->as[asid].umem->pages);
1337 	kfree(dev->as[asid].umem);
1338 	dev->as[asid].umem = NULL;
1339 	ret = 0;
1340 unlock:
1341 	mutex_unlock(&dev->as[asid].mem_lock);
1342 	return ret;
1343 }
1344 
vduse_dev_reg_umem(struct vduse_dev * dev,u32 asid,u64 iova,u64 uaddr,u64 size)1345 static int vduse_dev_reg_umem(struct vduse_dev *dev,
1346 			      u32 asid, u64 iova, u64 uaddr, u64 size)
1347 {
1348 	struct page **page_list = NULL;
1349 	struct vduse_umem *umem = NULL;
1350 	long pinned = 0;
1351 	unsigned long npages, lock_limit;
1352 	int ret;
1353 
1354 	if (!dev->as[asid].domain || !dev->as[asid].domain->bounce_map ||
1355 	    size != dev->as[asid].domain->bounce_size ||
1356 	    iova != 0 || uaddr & ~PAGE_MASK)
1357 		return -EINVAL;
1358 
1359 	mutex_lock(&dev->as[asid].mem_lock);
1360 	ret = -EEXIST;
1361 	if (dev->as[asid].umem)
1362 		goto unlock;
1363 
1364 	ret = -ENOMEM;
1365 	npages = size >> PAGE_SHIFT;
1366 	page_list = __vmalloc(array_size(npages, sizeof(struct page *)),
1367 			      GFP_KERNEL_ACCOUNT);
1368 	umem = kzalloc_obj(*umem);
1369 	if (!page_list || !umem)
1370 		goto unlock;
1371 
1372 	mmap_read_lock(current->mm);
1373 
1374 	lock_limit = PFN_DOWN(rlimit(RLIMIT_MEMLOCK));
1375 	if (npages + atomic64_read(&current->mm->pinned_vm) > lock_limit)
1376 		goto out;
1377 
1378 	pinned = pin_user_pages(uaddr, npages, FOLL_LONGTERM | FOLL_WRITE,
1379 				page_list);
1380 	if (pinned != npages) {
1381 		ret = pinned < 0 ? pinned : -ENOMEM;
1382 		goto out;
1383 	}
1384 
1385 	ret = vduse_domain_add_user_bounce_pages(dev->as[asid].domain,
1386 						 page_list, pinned);
1387 	if (ret)
1388 		goto out;
1389 
1390 	atomic64_add(npages, &current->mm->pinned_vm);
1391 
1392 	umem->pages = page_list;
1393 	umem->npages = pinned;
1394 	umem->iova = iova;
1395 	umem->mm = current->mm;
1396 	mmgrab(current->mm);
1397 
1398 	dev->as[asid].umem = umem;
1399 out:
1400 	if (ret && pinned > 0)
1401 		unpin_user_pages(page_list, pinned);
1402 
1403 	mmap_read_unlock(current->mm);
1404 unlock:
1405 	if (ret) {
1406 		vfree(page_list);
1407 		kfree(umem);
1408 	}
1409 	mutex_unlock(&dev->as[asid].mem_lock);
1410 	return ret;
1411 }
1412 
vduse_vq_update_effective_cpu(struct vduse_virtqueue * vq)1413 static void vduse_vq_update_effective_cpu(struct vduse_virtqueue *vq)
1414 {
1415 	int curr_cpu = vq->irq_effective_cpu;
1416 
1417 	while (true) {
1418 		curr_cpu = cpumask_next(curr_cpu, &vq->irq_affinity);
1419 		if (cpu_online(curr_cpu))
1420 			break;
1421 
1422 		if (curr_cpu >= nr_cpu_ids)
1423 			curr_cpu = IRQ_UNBOUND;
1424 	}
1425 
1426 	vq->irq_effective_cpu = curr_cpu;
1427 }
1428 
vduse_dev_iotlb_entry(struct vduse_dev * dev,struct vduse_iotlb_entry_v2 * entry,struct file ** f,uint64_t * capability)1429 static int vduse_dev_iotlb_entry(struct vduse_dev *dev,
1430 				 struct vduse_iotlb_entry_v2 *entry,
1431 				 struct file **f, uint64_t *capability)
1432 {
1433 	u32 asid;
1434 	int r = -EINVAL;
1435 	struct vhost_iotlb_map *map;
1436 
1437 	if (entry->start > entry->last || entry->asid >= dev->nas)
1438 		return -EINVAL;
1439 
1440 	asid = array_index_nospec(entry->asid, dev->nas);
1441 	mutex_lock(&dev->domain_lock);
1442 
1443 	if (!dev->as[asid].domain)
1444 		goto out;
1445 
1446 	spin_lock(&dev->as[asid].domain->iotlb_lock);
1447 	map = vhost_iotlb_itree_first(dev->as[asid].domain->iotlb,
1448 				      entry->start, entry->last);
1449 	if (map) {
1450 		if (f) {
1451 			const struct vdpa_map_file *map_file;
1452 
1453 			map_file = (struct vdpa_map_file *)map->opaque;
1454 			entry->offset = map_file->offset;
1455 			*f = get_file(map_file->file);
1456 		}
1457 		entry->start = map->start;
1458 		entry->last = map->last;
1459 		entry->perm = map->perm;
1460 		if (capability) {
1461 			*capability = 0;
1462 
1463 			if (dev->as[asid].domain->bounce_map && map->start == 0 &&
1464 			    map->last == dev->as[asid].domain->bounce_size - 1)
1465 				*capability |= VDUSE_IOVA_CAP_UMEM;
1466 		}
1467 
1468 		r = 0;
1469 	}
1470 	spin_unlock(&dev->as[asid].domain->iotlb_lock);
1471 
1472 out:
1473 	mutex_unlock(&dev->domain_lock);
1474 	return r;
1475 }
1476 
vduse_dev_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1477 static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
1478 			    unsigned long arg)
1479 {
1480 	struct vduse_dev *dev = file->private_data;
1481 	void __user *argp = (void __user *)arg;
1482 	int ret;
1483 
1484 	if (unlikely(dev->broken))
1485 		return -EPERM;
1486 
1487 	switch (cmd) {
1488 	case VDUSE_IOTLB_GET_FD:
1489 	case VDUSE_IOTLB_GET_FD2: {
1490 		struct vduse_iotlb_entry_v2 entry = {0};
1491 		struct file *f = NULL;
1492 
1493 		ret = -ENOIOCTLCMD;
1494 		if (dev->api_version < VDUSE_API_VERSION_1 &&
1495 		    cmd == VDUSE_IOTLB_GET_FD2)
1496 			break;
1497 
1498 		ret = -EFAULT;
1499 		if (copy_from_user(&entry, argp, _IOC_SIZE(cmd)))
1500 			break;
1501 
1502 		ret = -EINVAL;
1503 		if (!is_mem_zero((const char *)entry.reserved,
1504 				 sizeof(entry.reserved)))
1505 			break;
1506 
1507 		ret = vduse_dev_iotlb_entry(dev, &entry, &f, NULL);
1508 		if (ret)
1509 			break;
1510 
1511 		ret = -EINVAL;
1512 		if (!f)
1513 			break;
1514 
1515 		ret = copy_to_user(argp, &entry, _IOC_SIZE(cmd));
1516 		if (ret) {
1517 			ret = -EFAULT;
1518 			fput(f);
1519 			break;
1520 		}
1521 		ret = receive_fd(f, NULL, perm_to_file_flags(entry.perm));
1522 		fput(f);
1523 		break;
1524 	}
1525 	case VDUSE_DEV_GET_FEATURES:
1526 		/*
1527 		 * Just mirror what driver wrote here.
1528 		 * The driver is expected to check FEATURE_OK later.
1529 		 */
1530 		ret = put_user(dev->driver_features, (u64 __user *)argp);
1531 		break;
1532 	case VDUSE_DEV_SET_CONFIG: {
1533 		struct vduse_config_data config;
1534 		unsigned long size = offsetof(struct vduse_config_data,
1535 					      buffer);
1536 
1537 		ret = -EFAULT;
1538 		if (copy_from_user(&config, argp, size))
1539 			break;
1540 
1541 		ret = -EINVAL;
1542 		if (config.offset > dev->config_size ||
1543 		    config.length == 0 ||
1544 		    config.length > dev->config_size - config.offset)
1545 			break;
1546 
1547 		ret = -EFAULT;
1548 		if (copy_from_user(dev->config + config.offset, argp + size,
1549 				   config.length))
1550 			break;
1551 
1552 		ret = 0;
1553 		break;
1554 	}
1555 	case VDUSE_DEV_INJECT_CONFIG_IRQ:
1556 		ret = vduse_dev_queue_irq_work(dev, &dev->inject, IRQ_UNBOUND);
1557 		break;
1558 	case VDUSE_VQ_SETUP: {
1559 		struct vduse_vq_config config;
1560 		u32 index;
1561 
1562 		ret = -EFAULT;
1563 		if (copy_from_user(&config, argp, sizeof(config)))
1564 			break;
1565 
1566 		ret = -EINVAL;
1567 		if (config.index >= dev->vq_num)
1568 			break;
1569 
1570 		if (dev->api_version < VDUSE_API_VERSION_1) {
1571 			if (config.group)
1572 				break;
1573 		} else {
1574 			if (config.group >= dev->ngroups)
1575 				break;
1576 			if (dev->status & VIRTIO_CONFIG_S_DRIVER_OK)
1577 				break;
1578 		}
1579 
1580 		if (config.reserved1 ||
1581 		    !is_mem_zero((const char *)config.reserved2,
1582 				 sizeof(config.reserved2)))
1583 			break;
1584 
1585 		index = array_index_nospec(config.index, dev->vq_num);
1586 		dev->vqs[index]->num_max = config.max_size;
1587 		dev->vqs[index]->group = config.group;
1588 		ret = 0;
1589 		break;
1590 	}
1591 	case VDUSE_VQ_GET_INFO: {
1592 		struct vduse_vq_info vq_info;
1593 		struct vduse_virtqueue *vq;
1594 		u32 index;
1595 
1596 		ret = -EFAULT;
1597 		if (copy_from_user(&vq_info, argp, sizeof(vq_info)))
1598 			break;
1599 
1600 		ret = -EINVAL;
1601 		if (vq_info.index >= dev->vq_num)
1602 			break;
1603 
1604 		index = array_index_nospec(vq_info.index, dev->vq_num);
1605 		vq = dev->vqs[index];
1606 		vq_info.desc_addr = vq->desc_addr;
1607 		vq_info.driver_addr = vq->driver_addr;
1608 		vq_info.device_addr = vq->device_addr;
1609 		vq_info.num = vq->num;
1610 
1611 		if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED)) {
1612 			vq_info.packed.last_avail_counter =
1613 				vq->state.packed.last_avail_counter;
1614 			vq_info.packed.last_avail_idx =
1615 				vq->state.packed.last_avail_idx;
1616 			vq_info.packed.last_used_counter =
1617 				vq->state.packed.last_used_counter;
1618 			vq_info.packed.last_used_idx =
1619 				vq->state.packed.last_used_idx;
1620 		} else
1621 			vq_info.split.avail_index =
1622 				vq->state.split.avail_index;
1623 
1624 		scoped_guard(spinlock_bh, &vq->ready_lock) {
1625 			vq_info.ready = vq->ready;
1626 		}
1627 
1628 		ret = -EFAULT;
1629 		if (copy_to_user(argp, &vq_info, sizeof(vq_info)))
1630 			break;
1631 
1632 		ret = 0;
1633 		break;
1634 	}
1635 	case VDUSE_VQ_SETUP_KICKFD: {
1636 		struct vduse_vq_eventfd eventfd;
1637 
1638 		ret = -EFAULT;
1639 		if (copy_from_user(&eventfd, argp, sizeof(eventfd)))
1640 			break;
1641 
1642 		ret = vduse_kickfd_setup(dev, &eventfd);
1643 		break;
1644 	}
1645 	case VDUSE_VQ_INJECT_IRQ: {
1646 		u32 index;
1647 
1648 		ret = -EFAULT;
1649 		if (get_user(index, (u32 __user *)argp))
1650 			break;
1651 
1652 		ret = -EINVAL;
1653 		if (index >= dev->vq_num)
1654 			break;
1655 
1656 		ret = 0;
1657 		index = array_index_nospec(index, dev->vq_num);
1658 		if (!vduse_vq_signal_irqfd(dev->vqs[index])) {
1659 			vduse_vq_update_effective_cpu(dev->vqs[index]);
1660 			ret = vduse_dev_queue_irq_work(dev,
1661 						&dev->vqs[index]->inject,
1662 						dev->vqs[index]->irq_effective_cpu);
1663 		}
1664 		break;
1665 	}
1666 	case VDUSE_IOTLB_REG_UMEM: {
1667 		struct vduse_iova_umem umem;
1668 		u32 asid;
1669 
1670 		ret = -EFAULT;
1671 		if (copy_from_user(&umem, argp, sizeof(umem)))
1672 			break;
1673 
1674 		ret = -EINVAL;
1675 		if (!is_mem_zero((const char *)umem.reserved,
1676 				 sizeof(umem.reserved)) ||
1677 		    (dev->api_version < VDUSE_API_VERSION_1 &&
1678 		     umem.asid != 0) || umem.asid >= dev->nas)
1679 			break;
1680 
1681 		mutex_lock(&dev->domain_lock);
1682 		asid = array_index_nospec(umem.asid, dev->nas);
1683 		ret = vduse_dev_reg_umem(dev, asid, umem.iova,
1684 					 umem.uaddr, umem.size);
1685 		mutex_unlock(&dev->domain_lock);
1686 		break;
1687 	}
1688 	case VDUSE_IOTLB_DEREG_UMEM: {
1689 		struct vduse_iova_umem umem;
1690 		u32 asid;
1691 
1692 		ret = -EFAULT;
1693 		if (copy_from_user(&umem, argp, sizeof(umem)))
1694 			break;
1695 
1696 		ret = -EINVAL;
1697 		if (!is_mem_zero((const char *)umem.reserved,
1698 				 sizeof(umem.reserved)) ||
1699 		    (dev->api_version < VDUSE_API_VERSION_1 &&
1700 		     umem.asid != 0) ||
1701 		     umem.asid >= dev->nas)
1702 			break;
1703 
1704 		mutex_lock(&dev->domain_lock);
1705 		asid = array_index_nospec(umem.asid, dev->nas);
1706 		ret = vduse_dev_dereg_umem(dev, asid, umem.iova,
1707 					   umem.size);
1708 		mutex_unlock(&dev->domain_lock);
1709 		break;
1710 	}
1711 	case VDUSE_IOTLB_GET_INFO: {
1712 		struct vduse_iova_info info;
1713 		struct vduse_iotlb_entry_v2 entry;
1714 
1715 		ret = -EFAULT;
1716 		if (copy_from_user(&info, argp, sizeof(info)))
1717 			break;
1718 
1719 		if (!is_mem_zero((const char *)info.reserved,
1720 				 sizeof(info.reserved)))
1721 			break;
1722 
1723 		if (dev->api_version < VDUSE_API_VERSION_1) {
1724 			if (info.asid)
1725 				break;
1726 		} else if (info.asid >= dev->nas)
1727 			break;
1728 
1729 		entry.start = info.start;
1730 		entry.last = info.last;
1731 		entry.asid = info.asid;
1732 		ret = vduse_dev_iotlb_entry(dev, &entry, NULL,
1733 					    &info.capability);
1734 		if (ret < 0)
1735 			break;
1736 
1737 		info.start = entry.start;
1738 		info.last = entry.last;
1739 		info.asid = entry.asid;
1740 
1741 		ret = -EFAULT;
1742 		if (copy_to_user(argp, &info, sizeof(info)))
1743 			break;
1744 
1745 		ret = 0;
1746 		break;
1747 	}
1748 	default:
1749 		ret = -ENOIOCTLCMD;
1750 		break;
1751 	}
1752 
1753 	return ret;
1754 }
1755 
1756 #ifdef CONFIG_COMPAT_FOR_U64_ALIGNMENT
1757 /*
1758  * i386 has different alignment constraints than x86_64,
1759  * so there are only 3 bytes of padding instead of 7.
1760  */
1761 struct compat_vduse_iotlb_entry {
1762 	compat_u64 offset;
1763 	compat_u64 start;
1764 	compat_u64 last;
1765 	__u8 perm;
1766 	__u8 padding[3];
1767 };
1768 #define COMPAT_VDUSE_IOTLB_GET_FD	_IOWR(VDUSE_BASE, 0x10, struct compat_vduse_iotlb_entry)
1769 
1770 struct compat_vduse_vq_info {
1771 	__u32 index;
1772 	__u32 num;
1773 	compat_u64 desc_addr;
1774 	compat_u64 driver_addr;
1775 	compat_u64 device_addr;
1776 	union {
1777 		struct vduse_vq_state_split split;
1778 		struct vduse_vq_state_packed packed;
1779 	};
1780 	__u8 ready;
1781 	__u8 padding[3];
1782 };
1783 #define COMPAT_VDUSE_VQ_GET_INFO	_IOWR(VDUSE_BASE, 0x15, struct compat_vduse_vq_info)
1784 
vduse_dev_compat_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1785 static long vduse_dev_compat_ioctl(struct file *file, unsigned int cmd,
1786 				   unsigned long arg)
1787 {
1788 	struct vduse_dev *dev = file->private_data;
1789 	void __user *argp = (void __user *)arg;
1790 	int ret;
1791 
1792 	if (unlikely(dev->broken))
1793 		return -EPERM;
1794 
1795 	switch (cmd) {
1796 	case COMPAT_VDUSE_IOTLB_GET_FD: {
1797 		struct vduse_iotlb_entry_v2 entry = {0};
1798 		struct file *f = NULL;
1799 
1800 		ret = -EFAULT;
1801 		if (copy_from_user(&entry, argp, _IOC_SIZE(cmd)))
1802 			break;
1803 
1804 		ret = vduse_dev_iotlb_entry(dev, &entry, &f, NULL);
1805 		if (ret)
1806 			break;
1807 
1808 		ret = -EINVAL;
1809 		if (!f)
1810 			break;
1811 
1812 		ret = copy_to_user(argp, &entry, _IOC_SIZE(cmd));
1813 		if (ret) {
1814 			ret = -EFAULT;
1815 			fput(f);
1816 			break;
1817 		}
1818 		ret = receive_fd(f, NULL, perm_to_file_flags(entry.perm));
1819 		fput(f);
1820 		break;
1821 	}
1822 	case COMPAT_VDUSE_VQ_GET_INFO: {
1823 		struct vduse_vq_info vq_info = {};
1824 		struct vduse_virtqueue *vq;
1825 		u32 index;
1826 
1827 		ret = -EFAULT;
1828 		if (copy_from_user(&vq_info, argp,
1829 				   sizeof(struct compat_vduse_vq_info)))
1830 			break;
1831 
1832 		ret = -EINVAL;
1833 		if (vq_info.index >= dev->vq_num)
1834 			break;
1835 
1836 		index = array_index_nospec(vq_info.index, dev->vq_num);
1837 		vq = dev->vqs[index];
1838 		vq_info.desc_addr = vq->desc_addr;
1839 		vq_info.driver_addr = vq->driver_addr;
1840 		vq_info.device_addr = vq->device_addr;
1841 		vq_info.num = vq->num;
1842 
1843 		if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED)) {
1844 			vq_info.packed.last_avail_counter =
1845 				vq->state.packed.last_avail_counter;
1846 			vq_info.packed.last_avail_idx =
1847 				vq->state.packed.last_avail_idx;
1848 			vq_info.packed.last_used_counter =
1849 				vq->state.packed.last_used_counter;
1850 			vq_info.packed.last_used_idx =
1851 				vq->state.packed.last_used_idx;
1852 		} else
1853 			vq_info.split.avail_index =
1854 				vq->state.split.avail_index;
1855 
1856 		scoped_guard(spinlock_bh, &vq->ready_lock) {
1857 			vq_info.ready = vq->ready;
1858 		}
1859 
1860 		ret = -EFAULT;
1861 		if (copy_to_user(argp, &vq_info,
1862 		    sizeof(struct compat_vduse_vq_info)))
1863 			break;
1864 
1865 		ret = 0;
1866 		break;
1867 	}
1868 	default:
1869 		ret = -ENOIOCTLCMD;
1870 		break;
1871 	}
1872 
1873 	return vduse_dev_ioctl(file, cmd, (unsigned long)compat_ptr(arg));
1874 }
1875 #else
1876 #define vduse_dev_compat_ioctl compat_ptr_ioctl
1877 #endif
1878 
vduse_dev_release(struct inode * inode,struct file * file)1879 static int vduse_dev_release(struct inode *inode, struct file *file)
1880 {
1881 	struct vduse_dev *dev = file->private_data;
1882 
1883 	mutex_lock(&dev->domain_lock);
1884 	for (int i = 0; i < dev->nas; i++)
1885 		if (dev->as[i].domain)
1886 			vduse_dev_dereg_umem(dev, i, 0,
1887 					     dev->as[i].domain->bounce_size);
1888 	mutex_unlock(&dev->domain_lock);
1889 	spin_lock(&dev->msg_lock);
1890 	/* Make sure the inflight messages can processed after reconncection */
1891 	list_splice_init(&dev->recv_list, &dev->send_list);
1892 	spin_unlock(&dev->msg_lock);
1893 	dev->connected = false;
1894 
1895 	return 0;
1896 }
1897 
vduse_dev_open(struct inode * inode,struct file * file)1898 static int vduse_dev_open(struct inode *inode, struct file *file)
1899 {
1900 	int ret = -EBUSY;
1901 	struct vduse_dev *dev;
1902 
1903 	mutex_lock(&vduse_lock);
1904 	dev = idr_find(&vduse_idr, iminor(inode));
1905 	if (!dev) {
1906 		mutex_unlock(&vduse_lock);
1907 		return -ENODEV;
1908 	}
1909 
1910 	mutex_lock(&dev->lock);
1911 	if (dev->connected)
1912 		goto unlock;
1913 
1914 	ret = 0;
1915 	dev->connected = true;
1916 	file->private_data = dev;
1917 unlock:
1918 	mutex_unlock(&dev->lock);
1919 	mutex_unlock(&vduse_lock);
1920 
1921 	return ret;
1922 }
1923 
1924 static const struct file_operations vduse_dev_fops = {
1925 	.owner		= THIS_MODULE,
1926 	.open		= vduse_dev_open,
1927 	.release	= vduse_dev_release,
1928 	.read_iter	= vduse_dev_read_iter,
1929 	.write_iter	= vduse_dev_write_iter,
1930 	.poll		= vduse_dev_poll,
1931 	.unlocked_ioctl	= vduse_dev_ioctl,
1932 	.compat_ioctl	= vduse_dev_compat_ioctl,
1933 	.llseek		= noop_llseek,
1934 };
1935 
irq_cb_affinity_show(struct vduse_virtqueue * vq,char * buf)1936 static ssize_t irq_cb_affinity_show(struct vduse_virtqueue *vq, char *buf)
1937 {
1938 	return sprintf(buf, "%*pb\n", cpumask_pr_args(&vq->irq_affinity));
1939 }
1940 
irq_cb_affinity_store(struct vduse_virtqueue * vq,const char * buf,size_t count)1941 static ssize_t irq_cb_affinity_store(struct vduse_virtqueue *vq,
1942 				     const char *buf, size_t count)
1943 {
1944 	cpumask_var_t new_value;
1945 	int ret;
1946 
1947 	if (!zalloc_cpumask_var(&new_value, GFP_KERNEL))
1948 		return -ENOMEM;
1949 
1950 	ret = cpumask_parse(buf, new_value);
1951 	if (ret)
1952 		goto free_mask;
1953 
1954 	ret = -EINVAL;
1955 	if (!cpumask_intersects(new_value, cpu_online_mask))
1956 		goto free_mask;
1957 
1958 	cpumask_copy(&vq->irq_affinity, new_value);
1959 	ret = count;
1960 free_mask:
1961 	free_cpumask_var(new_value);
1962 	return ret;
1963 }
1964 
1965 struct vq_sysfs_entry {
1966 	struct attribute attr;
1967 	ssize_t (*show)(struct vduse_virtqueue *vq, char *buf);
1968 	ssize_t (*store)(struct vduse_virtqueue *vq, const char *buf,
1969 			 size_t count);
1970 };
1971 
1972 static struct vq_sysfs_entry irq_cb_affinity_attr = __ATTR_RW(irq_cb_affinity);
1973 
1974 static struct attribute *vq_attrs[] = {
1975 	&irq_cb_affinity_attr.attr,
1976 	NULL,
1977 };
1978 ATTRIBUTE_GROUPS(vq);
1979 
vq_attr_show(struct kobject * kobj,struct attribute * attr,char * buf)1980 static ssize_t vq_attr_show(struct kobject *kobj, struct attribute *attr,
1981 			    char *buf)
1982 {
1983 	struct vduse_virtqueue *vq = container_of(kobj,
1984 					struct vduse_virtqueue, kobj);
1985 	struct vq_sysfs_entry *entry = container_of(attr,
1986 					struct vq_sysfs_entry, attr);
1987 
1988 	if (!entry->show)
1989 		return -EIO;
1990 
1991 	return entry->show(vq, buf);
1992 }
1993 
vq_attr_store(struct kobject * kobj,struct attribute * attr,const char * buf,size_t count)1994 static ssize_t vq_attr_store(struct kobject *kobj, struct attribute *attr,
1995 			     const char *buf, size_t count)
1996 {
1997 	struct vduse_virtqueue *vq = container_of(kobj,
1998 					struct vduse_virtqueue, kobj);
1999 	struct vq_sysfs_entry *entry = container_of(attr,
2000 					struct vq_sysfs_entry, attr);
2001 
2002 	if (!entry->store)
2003 		return -EIO;
2004 
2005 	return entry->store(vq, buf, count);
2006 }
2007 
2008 static const struct sysfs_ops vq_sysfs_ops = {
2009 	.show = vq_attr_show,
2010 	.store = vq_attr_store,
2011 };
2012 
vq_release(struct kobject * kobj)2013 static void vq_release(struct kobject *kobj)
2014 {
2015 	struct vduse_virtqueue *vq = container_of(kobj,
2016 					struct vduse_virtqueue, kobj);
2017 	kfree(vq);
2018 }
2019 
2020 static const struct kobj_type vq_type = {
2021 	.release	= vq_release,
2022 	.sysfs_ops	= &vq_sysfs_ops,
2023 	.default_groups	= vq_groups,
2024 };
2025 
vduse_devnode(const struct device * dev,umode_t * mode)2026 static char *vduse_devnode(const struct device *dev, umode_t *mode)
2027 {
2028 	return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev));
2029 }
2030 
2031 static const struct class vduse_class = {
2032 	.name = "vduse",
2033 	.devnode = vduse_devnode,
2034 };
2035 
vduse_dev_deinit_vqs(struct vduse_dev * dev)2036 static void vduse_dev_deinit_vqs(struct vduse_dev *dev)
2037 {
2038 	int i;
2039 
2040 	if (!dev->vqs)
2041 		return;
2042 
2043 	for (i = 0; i < dev->vq_num; i++)
2044 		kobject_put(&dev->vqs[i]->kobj);
2045 	kfree(dev->vqs);
2046 }
2047 
vduse_dev_init_vqs(struct vduse_dev * dev,u32 vq_align,u32 vq_num)2048 static int vduse_dev_init_vqs(struct vduse_dev *dev, u32 vq_align, u32 vq_num)
2049 {
2050 	int ret, i;
2051 
2052 	dev->vq_align = vq_align;
2053 	dev->vq_num = vq_num;
2054 	dev->vqs = kzalloc_objs(*dev->vqs, dev->vq_num);
2055 	if (!dev->vqs)
2056 		return -ENOMEM;
2057 
2058 	for (i = 0; i < vq_num; i++) {
2059 		dev->vqs[i] = kzalloc_obj(*dev->vqs[i]);
2060 		if (!dev->vqs[i]) {
2061 			ret = -ENOMEM;
2062 			goto err;
2063 		}
2064 
2065 		dev->vqs[i]->index = i;
2066 		dev->vqs[i]->dev = dev;
2067 		dev->vqs[i]->irq_effective_cpu = IRQ_UNBOUND;
2068 		INIT_WORK(&dev->vqs[i]->inject, vduse_vq_irq_inject);
2069 		INIT_WORK(&dev->vqs[i]->kick, vduse_vq_kick_work);
2070 		spin_lock_init(&dev->vqs[i]->kick_lock);
2071 		spin_lock_init(&dev->vqs[i]->irq_lock);
2072 		spin_lock_init(&dev->vqs[i]->ready_lock);
2073 		cpumask_setall(&dev->vqs[i]->irq_affinity);
2074 
2075 		kobject_init(&dev->vqs[i]->kobj, &vq_type);
2076 		ret = kobject_add(&dev->vqs[i]->kobj,
2077 				  &dev->dev->kobj, "vq%d", i);
2078 		if (ret) {
2079 			kfree(dev->vqs[i]);
2080 			goto err;
2081 		}
2082 	}
2083 
2084 	return 0;
2085 err:
2086 	while (i--)
2087 		kobject_put(&dev->vqs[i]->kobj);
2088 	kfree(dev->vqs);
2089 	dev->vqs = NULL;
2090 	return ret;
2091 }
2092 
vduse_dev_create(void)2093 static struct vduse_dev *vduse_dev_create(void)
2094 {
2095 	struct vduse_dev *dev = kzalloc_obj(*dev);
2096 
2097 	if (!dev)
2098 		return NULL;
2099 
2100 	mutex_init(&dev->lock);
2101 	mutex_init(&dev->domain_lock);
2102 	spin_lock_init(&dev->msg_lock);
2103 	INIT_LIST_HEAD(&dev->send_list);
2104 	INIT_LIST_HEAD(&dev->recv_list);
2105 	spin_lock_init(&dev->irq_lock);
2106 	init_rwsem(&dev->rwsem);
2107 
2108 	INIT_WORK(&dev->inject, vduse_dev_irq_inject);
2109 	init_waitqueue_head(&dev->waitq);
2110 
2111 	return dev;
2112 }
2113 
vduse_dev_destroy(struct vduse_dev * dev)2114 static void vduse_dev_destroy(struct vduse_dev *dev)
2115 {
2116 	kfree(dev);
2117 }
2118 
vduse_find_dev(const char * name)2119 static struct vduse_dev *vduse_find_dev(const char *name)
2120 {
2121 	struct vduse_dev *dev;
2122 	int id;
2123 
2124 	idr_for_each_entry(&vduse_idr, dev, id)
2125 		if (!strcmp(dev->name, name))
2126 			return dev;
2127 
2128 	return NULL;
2129 }
2130 
vduse_destroy_dev(char * name)2131 static int vduse_destroy_dev(char *name)
2132 {
2133 	struct vduse_dev *dev = vduse_find_dev(name);
2134 
2135 	if (!dev)
2136 		return -EINVAL;
2137 
2138 	mutex_lock(&dev->lock);
2139 	if (dev->vdev || dev->connected) {
2140 		mutex_unlock(&dev->lock);
2141 		return -EBUSY;
2142 	}
2143 	dev->connected = true;
2144 	mutex_unlock(&dev->lock);
2145 
2146 	vduse_dev_reset(dev);
2147 	device_destroy(&vduse_class, MKDEV(MAJOR(vduse_major), dev->minor));
2148 	idr_remove(&vduse_idr, dev->minor);
2149 	kvfree(dev->config);
2150 	vduse_dev_deinit_vqs(dev);
2151 	for (int i = 0; i < dev->nas; i++) {
2152 		if (dev->as[i].domain)
2153 			vduse_domain_destroy(dev->as[i].domain);
2154 	}
2155 	kfree(dev->as);
2156 	kfree(dev->name);
2157 	kfree(dev->groups);
2158 	vduse_dev_destroy(dev);
2159 	module_put(THIS_MODULE);
2160 
2161 	return 0;
2162 }
2163 
device_is_allowed(u32 device_id)2164 static bool device_is_allowed(u32 device_id)
2165 {
2166 	int i;
2167 
2168 	for (i = 0; i < ARRAY_SIZE(allowed_device_id); i++)
2169 		if (allowed_device_id[i] == device_id)
2170 			return true;
2171 
2172 	return false;
2173 }
2174 
features_is_valid(struct vduse_dev_config * config)2175 static bool features_is_valid(struct vduse_dev_config *config)
2176 {
2177 	if (!(config->features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM)))
2178 		return false;
2179 
2180 	/* Now we only support read-only configuration space */
2181 	if ((config->device_id == VIRTIO_ID_BLOCK) &&
2182 			(config->features & BIT_ULL(VIRTIO_BLK_F_CONFIG_WCE)))
2183 		return false;
2184 	else if ((config->device_id == VIRTIO_ID_NET) &&
2185 			(config->features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
2186 		return false;
2187 
2188 	if ((config->device_id == VIRTIO_ID_NET) &&
2189 			!(config->features & BIT_ULL(VIRTIO_F_VERSION_1)))
2190 		return false;
2191 
2192 	return true;
2193 }
2194 
vduse_validate_config(struct vduse_dev_config * config,u64 api_version)2195 static bool vduse_validate_config(struct vduse_dev_config *config,
2196 				  u64 api_version)
2197 {
2198 	if (!is_mem_zero((const char *)config->reserved,
2199 			 sizeof(config->reserved)))
2200 		return false;
2201 
2202 	if (api_version < VDUSE_API_VERSION_1 &&
2203 	    (config->ngroups || config->nas))
2204 		return false;
2205 
2206 	if (api_version >= VDUSE_API_VERSION_1) {
2207 		if (!config->ngroups || config->ngroups > VDUSE_DEV_MAX_GROUPS)
2208 			return false;
2209 
2210 		if (!config->nas || config->nas > VDUSE_DEV_MAX_AS)
2211 			return false;
2212 	}
2213 
2214 	if (config->vq_align > PAGE_SIZE)
2215 		return false;
2216 
2217 	if (config->config_size > PAGE_SIZE)
2218 		return false;
2219 
2220 	if (config->vq_num > 0xffff)
2221 		return false;
2222 
2223 	if (!config->name[0])
2224 		return false;
2225 
2226 	if (!device_is_allowed(config->device_id))
2227 		return false;
2228 
2229 	if (!features_is_valid(config))
2230 		return false;
2231 
2232 	return true;
2233 }
2234 
msg_timeout_show(struct device * device,struct device_attribute * attr,char * buf)2235 static ssize_t msg_timeout_show(struct device *device,
2236 				struct device_attribute *attr, char *buf)
2237 {
2238 	struct vduse_dev *dev = dev_get_drvdata(device);
2239 
2240 	return sysfs_emit(buf, "%u\n", dev->msg_timeout);
2241 }
2242 
msg_timeout_store(struct device * device,struct device_attribute * attr,const char * buf,size_t count)2243 static ssize_t msg_timeout_store(struct device *device,
2244 				 struct device_attribute *attr,
2245 				 const char *buf, size_t count)
2246 {
2247 	struct vduse_dev *dev = dev_get_drvdata(device);
2248 	int ret;
2249 
2250 	ret = kstrtouint(buf, 10, &dev->msg_timeout);
2251 	if (ret < 0)
2252 		return ret;
2253 
2254 	return count;
2255 }
2256 
2257 static DEVICE_ATTR_RW(msg_timeout);
2258 
bounce_size_show(struct device * device,struct device_attribute * attr,char * buf)2259 static ssize_t bounce_size_show(struct device *device,
2260 				struct device_attribute *attr, char *buf)
2261 {
2262 	struct vduse_dev *dev = dev_get_drvdata(device);
2263 
2264 	return sysfs_emit(buf, "%u\n", dev->bounce_size);
2265 }
2266 
bounce_size_store(struct device * device,struct device_attribute * attr,const char * buf,size_t count)2267 static ssize_t bounce_size_store(struct device *device,
2268 				 struct device_attribute *attr,
2269 				 const char *buf, size_t count)
2270 {
2271 	struct vduse_dev *dev = dev_get_drvdata(device);
2272 	unsigned int bounce_size;
2273 	int ret;
2274 
2275 	ret = -EPERM;
2276 	mutex_lock(&dev->domain_lock);
2277 	/* Assuming that if the first domain is allocated, all are allocated */
2278 	if (dev->as[0].domain)
2279 		goto unlock;
2280 
2281 	ret = kstrtouint(buf, 10, &bounce_size);
2282 	if (ret < 0)
2283 		goto unlock;
2284 
2285 	ret = -EINVAL;
2286 	if (bounce_size > VDUSE_MAX_BOUNCE_SIZE ||
2287 	    bounce_size < VDUSE_MIN_BOUNCE_SIZE)
2288 		goto unlock;
2289 
2290 	dev->bounce_size = bounce_size & PAGE_MASK;
2291 	ret = count;
2292 unlock:
2293 	mutex_unlock(&dev->domain_lock);
2294 	return ret;
2295 }
2296 
2297 static DEVICE_ATTR_RW(bounce_size);
2298 
2299 static struct attribute *vduse_dev_attrs[] = {
2300 	&dev_attr_msg_timeout.attr,
2301 	&dev_attr_bounce_size.attr,
2302 	NULL
2303 };
2304 
2305 ATTRIBUTE_GROUPS(vduse_dev);
2306 
vduse_create_dev(struct vduse_dev_config * config,void * config_buf,u64 api_version,uint64_t vduse_features)2307 static int vduse_create_dev(struct vduse_dev_config *config,
2308 			    void *config_buf, u64 api_version,
2309 			    uint64_t vduse_features)
2310 {
2311 	int ret;
2312 	struct vduse_dev *dev;
2313 
2314 	ret = -EPERM;
2315 	if ((config->device_id == VIRTIO_ID_NET) && !capable(CAP_NET_ADMIN))
2316 		goto err;
2317 
2318 	ret = -EEXIST;
2319 	if (vduse_find_dev(config->name))
2320 		goto err;
2321 
2322 	ret = -ENOMEM;
2323 	dev = vduse_dev_create();
2324 	if (!dev)
2325 		goto err;
2326 
2327 	dev->api_version = api_version;
2328 	dev->device_features = config->features;
2329 	dev->device_id = config->device_id;
2330 	dev->vendor_id = config->vendor_id;
2331 	dev->vduse_features = vduse_features;
2332 	dev_dbg(vduse_ctrl_dev, "Creating device %s with features 0x%llx",
2333 		config->name, vduse_features);
2334 
2335 	dev->nas = (dev->api_version < VDUSE_API_VERSION_1) ? 1 : config->nas;
2336 	dev->as = kzalloc_objs(dev->as[0], dev->nas);
2337 	if (!dev->as)
2338 		goto err_as;
2339 	for (int i = 0; i < dev->nas; i++)
2340 		mutex_init(&dev->as[i].mem_lock);
2341 
2342 	dev->ngroups = (dev->api_version < VDUSE_API_VERSION_1)
2343 		       ? 1
2344 		       : config->ngroups;
2345 	dev->groups = kzalloc_objs(dev->groups[0], dev->ngroups);
2346 	if (!dev->groups)
2347 		goto err_vq_groups;
2348 	for (u32 i = 0; i < dev->ngroups; ++i) {
2349 		dev->groups[i].dev = dev;
2350 		rwlock_init(&dev->groups[i].as_lock);
2351 		dev->groups[i].as = &dev->as[0];
2352 	}
2353 
2354 	dev->name = kstrdup(config->name, GFP_KERNEL);
2355 	if (!dev->name)
2356 		goto err_str;
2357 
2358 	dev->bounce_size = VDUSE_BOUNCE_SIZE;
2359 	dev->config = config_buf;
2360 	dev->config_size = config->config_size;
2361 
2362 	ret = idr_alloc(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL);
2363 	if (ret < 0)
2364 		goto err_idr;
2365 
2366 	dev->minor = ret;
2367 	dev->msg_timeout = VDUSE_MSG_DEFAULT_TIMEOUT;
2368 	dev->dev = device_create_with_groups(&vduse_class, NULL,
2369 				MKDEV(MAJOR(vduse_major), dev->minor),
2370 				dev, vduse_dev_groups, "%s", config->name);
2371 	if (IS_ERR(dev->dev)) {
2372 		ret = PTR_ERR(dev->dev);
2373 		goto err_dev;
2374 	}
2375 
2376 	ret = vduse_dev_init_vqs(dev, config->vq_align, config->vq_num);
2377 	if (ret)
2378 		goto err_vqs;
2379 
2380 	__module_get(THIS_MODULE);
2381 
2382 	return 0;
2383 err_vqs:
2384 	device_destroy(&vduse_class, MKDEV(MAJOR(vduse_major), dev->minor));
2385 err_dev:
2386 	idr_remove(&vduse_idr, dev->minor);
2387 err_idr:
2388 	kfree(dev->name);
2389 err_str:
2390 	kfree(dev->groups);
2391 err_vq_groups:
2392 	kfree(dev->as);
2393 err_as:
2394 	vduse_dev_destroy(dev);
2395 err:
2396 	return ret;
2397 }
2398 
vduse_ioctl(struct file * file,unsigned int cmd,unsigned long arg)2399 static long vduse_ioctl(struct file *file, unsigned int cmd,
2400 			unsigned long arg)
2401 {
2402 	int ret;
2403 	void __user *argp = (void __user *)arg;
2404 	struct vduse_control *control = file->private_data;
2405 
2406 	mutex_lock(&vduse_lock);
2407 	switch (cmd) {
2408 	case VDUSE_GET_API_VERSION:
2409 		if (control->api_version == VDUSE_API_VERSION_NOT_ASKED)
2410 			control->api_version = VDUSE_API_VERSION_1;
2411 		ret = put_user(control->api_version, (u64 __user *)argp);
2412 		break;
2413 	case VDUSE_SET_API_VERSION: {
2414 		u64 api_version;
2415 
2416 		ret = -EFAULT;
2417 		if (get_user(api_version, (u64 __user *)argp))
2418 			break;
2419 
2420 		ret = -EINVAL;
2421 		if (api_version > VDUSE_API_VERSION_1)
2422 			break;
2423 
2424 		ret = 0;
2425 		control->api_version = api_version;
2426 		break;
2427 	}
2428 	case VDUSE_CREATE_DEV: {
2429 		struct vduse_dev_config config;
2430 		unsigned long size = offsetof(struct vduse_dev_config, config);
2431 		void *buf;
2432 
2433 		ret = -EFAULT;
2434 		if (copy_from_user(&config, argp, size))
2435 			break;
2436 
2437 		ret = -EINVAL;
2438 		if (control->api_version == VDUSE_API_VERSION_NOT_ASKED)
2439 			control->api_version = VDUSE_API_VERSION;
2440 		if (!vduse_validate_config(&config, control->api_version))
2441 			break;
2442 
2443 		buf = vmemdup_user(argp + size, config.config_size);
2444 		if (IS_ERR(buf)) {
2445 			ret = PTR_ERR(buf);
2446 			break;
2447 		}
2448 		config.name[VDUSE_NAME_MAX - 1] = '\0';
2449 		ret = vduse_create_dev(&config, buf, control->api_version,
2450 				       control->vduse_features);
2451 		if (ret)
2452 			kvfree(buf);
2453 		break;
2454 	}
2455 	case VDUSE_DESTROY_DEV: {
2456 		char name[VDUSE_NAME_MAX];
2457 
2458 		ret = -EFAULT;
2459 		if (copy_from_user(name, argp, VDUSE_NAME_MAX))
2460 			break;
2461 
2462 		name[VDUSE_NAME_MAX - 1] = '\0';
2463 		ret = vduse_destroy_dev(name);
2464 		break;
2465 	}
2466 	case VDUSE_GET_FEATURES:
2467 		ret = put_user(vduse_features, (u64 __user *)argp);
2468 		break;
2469 	case VDUSE_SET_FEATURES: {
2470 		u64 features;
2471 
2472 		ret = -EFAULT;
2473 		if (get_user(features, (u64 __user *)argp)) {
2474 			dev_dbg(vduse_ctrl_dev, "Could not get vduse features");
2475 			break;
2476 		}
2477 
2478 		ret = -EINVAL;
2479 		if (features & ~vduse_features) {
2480 			dev_dbg(vduse_ctrl_dev,
2481 				"Invalid features in %llx, expected %llx",
2482 				features, vduse_features);
2483 			break;
2484 		}
2485 
2486 		ret = 0;
2487 		control->vduse_features = features;
2488 		dev_dbg(vduse_ctrl_dev, "Set features %llx", features);
2489 
2490 		break;
2491 	}
2492 	default:
2493 		ret = -EINVAL;
2494 		break;
2495 	}
2496 	mutex_unlock(&vduse_lock);
2497 
2498 	return ret;
2499 }
2500 
vduse_release(struct inode * inode,struct file * file)2501 static int vduse_release(struct inode *inode, struct file *file)
2502 {
2503 	struct vduse_control *control = file->private_data;
2504 
2505 	kfree(control);
2506 	return 0;
2507 }
2508 
vduse_open(struct inode * inode,struct file * file)2509 static int vduse_open(struct inode *inode, struct file *file)
2510 {
2511 	struct vduse_control *control;
2512 
2513 	control = kmalloc_obj(struct vduse_control);
2514 	if (!control)
2515 		return -ENOMEM;
2516 
2517 	control->api_version = VDUSE_API_VERSION_NOT_ASKED;
2518 	control->vduse_features = 0;
2519 	file->private_data = control;
2520 
2521 	return 0;
2522 }
2523 
2524 static const struct file_operations vduse_ctrl_fops = {
2525 	.owner		= THIS_MODULE,
2526 	.open		= vduse_open,
2527 	.release	= vduse_release,
2528 	.unlocked_ioctl	= vduse_ioctl,
2529 	.compat_ioctl	= compat_ptr_ioctl,
2530 	.llseek		= noop_llseek,
2531 };
2532 
2533 struct vduse_mgmt_dev {
2534 	struct vdpa_mgmt_dev mgmt_dev;
2535 	struct device dev;
2536 };
2537 
2538 static struct vduse_mgmt_dev *vduse_mgmt;
2539 
vduse_dev_init_vdpa(struct vduse_dev * dev,const char * name)2540 static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
2541 {
2542 	struct vduse_vdpa *vdev;
2543 	const struct vdpa_config_ops *ops;
2544 
2545 	if (dev->vdev)
2546 		return -EEXIST;
2547 
2548 	if (dev->vduse_features & BIT_U64(VDUSE_F_SUSPEND))
2549 		ops = &vduse_vdpa_config_ops_with_suspend;
2550 	else
2551 		ops = &vduse_vdpa_config_ops;
2552 
2553 	vdev = vdpa_alloc_device(struct vduse_vdpa, vdpa, dev->dev,
2554 				 ops, &vduse_map_ops,
2555 				 dev->ngroups, dev->nas, name, true);
2556 	if (IS_ERR(vdev))
2557 		return PTR_ERR(vdev);
2558 
2559 	dev->vdev = vdev;
2560 	vdev->dev = dev;
2561 	vdev->vdpa.mdev = &vduse_mgmt->mgmt_dev;
2562 
2563 	return 0;
2564 }
2565 
vdpa_dev_add(struct vdpa_mgmt_dev * mdev,const char * name,const struct vdpa_dev_set_config * config)2566 static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
2567 			const struct vdpa_dev_set_config *config)
2568 {
2569 	struct vduse_dev *dev;
2570 	size_t domain_bounce_size;
2571 	int ret, i;
2572 
2573 	mutex_lock(&vduse_lock);
2574 	dev = vduse_find_dev(name);
2575 	if (!dev || !vduse_dev_is_ready(dev)) {
2576 		mutex_unlock(&vduse_lock);
2577 		return -EINVAL;
2578 	}
2579 	ret = vduse_dev_init_vdpa(dev, name);
2580 	mutex_unlock(&vduse_lock);
2581 	if (ret)
2582 		return ret;
2583 
2584 	mutex_lock(&dev->domain_lock);
2585 	ret = 0;
2586 
2587 	domain_bounce_size = dev->bounce_size / dev->nas;
2588 	for (i = 0; i < dev->nas; ++i) {
2589 		dev->as[i].domain = vduse_domain_create(VDUSE_IOVA_SIZE - 1,
2590 							domain_bounce_size);
2591 		if (!dev->as[i].domain) {
2592 			ret = -ENOMEM;
2593 			goto err;
2594 		}
2595 	}
2596 
2597 	mutex_unlock(&dev->domain_lock);
2598 
2599 	ret = _vdpa_register_device(&dev->vdev->vdpa, dev->vq_num);
2600 	if (ret)
2601 		goto err_register;
2602 
2603 	return 0;
2604 
2605 err_register:
2606 	mutex_lock(&dev->domain_lock);
2607 
2608 err:
2609 	for (int j = 0; j < i; j++) {
2610 		if (dev->as[j].domain) {
2611 			vduse_domain_destroy(dev->as[j].domain);
2612 			dev->as[j].domain = NULL;
2613 		}
2614 	}
2615 	mutex_unlock(&dev->domain_lock);
2616 
2617 	put_device(&dev->vdev->vdpa.dev);
2618 
2619 	return ret;
2620 }
2621 
vdpa_dev_del(struct vdpa_mgmt_dev * mdev,struct vdpa_device * dev)2622 static void vdpa_dev_del(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev)
2623 {
2624 	_vdpa_unregister_device(dev);
2625 }
2626 
2627 static const struct vdpa_mgmtdev_ops vdpa_dev_mgmtdev_ops = {
2628 	.dev_add = vdpa_dev_add,
2629 	.dev_del = vdpa_dev_del,
2630 };
2631 
2632 static struct virtio_device_id id_table[] = {
2633 	{ VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID },
2634 	{ VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
2635 	{ 0 },
2636 };
2637 
vduse_mgmtdev_release(struct device * dev)2638 static void vduse_mgmtdev_release(struct device *dev)
2639 {
2640 	struct vduse_mgmt_dev *mgmt_dev;
2641 
2642 	mgmt_dev = container_of(dev, struct vduse_mgmt_dev, dev);
2643 	kfree(mgmt_dev);
2644 }
2645 
vduse_mgmtdev_init(void)2646 static int vduse_mgmtdev_init(void)
2647 {
2648 	int ret;
2649 
2650 	vduse_mgmt = kzalloc_obj(*vduse_mgmt);
2651 	if (!vduse_mgmt)
2652 		return -ENOMEM;
2653 
2654 	ret = dev_set_name(&vduse_mgmt->dev, "vduse");
2655 	if (ret) {
2656 		kfree(vduse_mgmt);
2657 		return ret;
2658 	}
2659 
2660 	vduse_mgmt->dev.release = vduse_mgmtdev_release;
2661 
2662 	ret = device_register(&vduse_mgmt->dev);
2663 	if (ret)
2664 		goto dev_reg_err;
2665 
2666 	vduse_mgmt->mgmt_dev.id_table = id_table;
2667 	vduse_mgmt->mgmt_dev.ops = &vdpa_dev_mgmtdev_ops;
2668 	vduse_mgmt->mgmt_dev.device = &vduse_mgmt->dev;
2669 	ret = vdpa_mgmtdev_register(&vduse_mgmt->mgmt_dev);
2670 	if (ret)
2671 		device_unregister(&vduse_mgmt->dev);
2672 
2673 	return ret;
2674 
2675 dev_reg_err:
2676 	put_device(&vduse_mgmt->dev);
2677 	return ret;
2678 }
2679 
vduse_mgmtdev_exit(void)2680 static void vduse_mgmtdev_exit(void)
2681 {
2682 	vdpa_mgmtdev_unregister(&vduse_mgmt->mgmt_dev);
2683 	device_unregister(&vduse_mgmt->dev);
2684 }
2685 
vduse_init(void)2686 static int vduse_init(void)
2687 {
2688 	int ret;
2689 
2690 	ret = class_register(&vduse_class);
2691 	if (ret)
2692 		return ret;
2693 
2694 	ret = alloc_chrdev_region(&vduse_major, 0, VDUSE_DEV_MAX, "vduse");
2695 	if (ret)
2696 		goto err_chardev_region;
2697 
2698 	/* /dev/vduse/control */
2699 	cdev_init(&vduse_ctrl_cdev, &vduse_ctrl_fops);
2700 	vduse_ctrl_cdev.owner = THIS_MODULE;
2701 	ret = cdev_add(&vduse_ctrl_cdev, vduse_major, 1);
2702 	if (ret)
2703 		goto err_ctrl_cdev;
2704 
2705 	vduse_ctrl_dev = device_create(&vduse_class, NULL, vduse_major, NULL, "control");
2706 	if (IS_ERR(vduse_ctrl_dev)) {
2707 		ret = PTR_ERR(vduse_ctrl_dev);
2708 		vduse_ctrl_dev = NULL;
2709 		goto err_device;
2710 	}
2711 
2712 	/* /dev/vduse/$DEVICE */
2713 	cdev_init(&vduse_cdev, &vduse_dev_fops);
2714 	vduse_cdev.owner = THIS_MODULE;
2715 	ret = cdev_add(&vduse_cdev, MKDEV(MAJOR(vduse_major), 1),
2716 		       VDUSE_DEV_MAX - 1);
2717 	if (ret)
2718 		goto err_cdev;
2719 
2720 	ret = -ENOMEM;
2721 	vduse_irq_wq = alloc_workqueue("vduse-irq",
2722 				WQ_HIGHPRI | WQ_SYSFS | WQ_UNBOUND, 0);
2723 	if (!vduse_irq_wq)
2724 		goto err_wq;
2725 
2726 	vduse_irq_bound_wq = alloc_workqueue("vduse-irq-bound",
2727 					     WQ_HIGHPRI | WQ_PERCPU, 0);
2728 	if (!vduse_irq_bound_wq)
2729 		goto err_bound_wq;
2730 
2731 	ret = vduse_domain_init();
2732 	if (ret)
2733 		goto err_domain;
2734 
2735 	ret = vduse_mgmtdev_init();
2736 	if (ret)
2737 		goto err_mgmtdev;
2738 
2739 	return 0;
2740 err_mgmtdev:
2741 	vduse_domain_exit();
2742 err_domain:
2743 	destroy_workqueue(vduse_irq_bound_wq);
2744 err_bound_wq:
2745 	destroy_workqueue(vduse_irq_wq);
2746 err_wq:
2747 	cdev_del(&vduse_cdev);
2748 err_cdev:
2749 	device_destroy(&vduse_class, vduse_major);
2750 err_device:
2751 	cdev_del(&vduse_ctrl_cdev);
2752 err_ctrl_cdev:
2753 	unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX);
2754 err_chardev_region:
2755 	class_unregister(&vduse_class);
2756 	return ret;
2757 }
2758 module_init(vduse_init);
2759 
vduse_exit(void)2760 static void vduse_exit(void)
2761 {
2762 	vduse_mgmtdev_exit();
2763 	vduse_domain_exit();
2764 	destroy_workqueue(vduse_irq_bound_wq);
2765 	destroy_workqueue(vduse_irq_wq);
2766 	cdev_del(&vduse_cdev);
2767 	device_destroy(&vduse_class, vduse_major);
2768 	cdev_del(&vduse_ctrl_cdev);
2769 	unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX);
2770 	class_unregister(&vduse_class);
2771 	idr_destroy(&vduse_idr);
2772 }
2773 module_exit(vduse_exit);
2774 
2775 MODULE_LICENSE(DRV_LICENSE);
2776 MODULE_AUTHOR(DRV_AUTHOR);
2777 MODULE_DESCRIPTION(DRV_DESC);
2778