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 WRITE_ONCE(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 /*
571 * This runs in the context of the vdpa kick_vq op, which may be
572 * atomic (e.g. virtio-blk kicks from blk-mq dispatch under
573 * rcu_read_lock()), so dev->rwsem must not be taken here.
574 * dev->suspended is checked under kick_lock instead and
575 * vduse_vdpa_suspend() cycles every kick_lock after setting it.
576 */
577 guard(spinlock)(&vq->kick_lock);
578 if (READ_ONCE(vq->dev->suspended))
579 return;
580
581 scoped_guard(spinlock_bh, &vq->ready_lock)
582 if (!vq->ready)
583 return;
584
585 if (vq->kickfd)
586 eventfd_signal(vq->kickfd);
587 else
588 vq->kicked = true;
589 }
590
vduse_vq_kick_work(struct work_struct * work)591 static void vduse_vq_kick_work(struct work_struct *work)
592 {
593 struct vduse_virtqueue *vq = container_of(work,
594 struct vduse_virtqueue, kick);
595
596 vduse_vq_kick(vq);
597 }
598
vduse_vdpa_kick_vq(struct vdpa_device * vdpa,u16 idx)599 static void vduse_vdpa_kick_vq(struct vdpa_device *vdpa, u16 idx)
600 {
601 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
602 struct vduse_virtqueue *vq = dev->vqs[idx];
603
604 if (!eventfd_signal_allowed()) {
605 schedule_work(&vq->kick);
606 return;
607 }
608 vduse_vq_kick(vq);
609 }
610
vduse_vdpa_set_vq_cb(struct vdpa_device * vdpa,u16 idx,struct vdpa_callback * cb)611 static void vduse_vdpa_set_vq_cb(struct vdpa_device *vdpa, u16 idx,
612 struct vdpa_callback *cb)
613 {
614 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
615 struct vduse_virtqueue *vq = dev->vqs[idx];
616
617 spin_lock(&vq->irq_lock);
618 vq->cb.callback = cb->callback;
619 vq->cb.private = cb->private;
620 vq->cb.trigger = cb->trigger;
621 spin_unlock(&vq->irq_lock);
622 }
623
vduse_vdpa_set_vq_num(struct vdpa_device * vdpa,u16 idx,u32 num)624 static void vduse_vdpa_set_vq_num(struct vdpa_device *vdpa, u16 idx, u32 num)
625 {
626 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
627 struct vduse_virtqueue *vq = dev->vqs[idx];
628
629 vq->num = num;
630 }
631
vduse_vdpa_get_vq_size(struct vdpa_device * vdpa,u16 idx)632 static u16 vduse_vdpa_get_vq_size(struct vdpa_device *vdpa, u16 idx)
633 {
634 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
635 struct vduse_virtqueue *vq = dev->vqs[idx];
636
637 if (vq->num)
638 return vq->num;
639 else
640 return vq->num_max;
641 }
642
vduse_vdpa_set_vq_ready(struct vdpa_device * vdpa,u16 idx,bool ready)643 static void vduse_vdpa_set_vq_ready(struct vdpa_device *vdpa,
644 u16 idx, bool ready)
645 {
646 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
647 struct vduse_virtqueue *vq = dev->vqs[idx];
648 struct vduse_dev_msg msg = { 0 };
649 int r;
650
651 if (dev->vduse_features & BIT_U64(VDUSE_F_QUEUE_READY)) {
652 msg.req.type = VDUSE_SET_VQ_READY;
653 msg.req.vq_ready.num = idx;
654 msg.req.vq_ready.ready = !!ready;
655
656 r = vduse_dev_msg_sync(dev, &msg);
657
658 if (r < 0) {
659 dev_dbg(&vdpa->dev, "device refuses to set vq %u ready %u",
660 idx, ready);
661
662 /* We can't do better than break the device in this case */
663 spin_lock(&dev->msg_lock);
664 vduse_dev_broken(dev);
665 spin_unlock(&dev->msg_lock);
666
667 return;
668 }
669 }
670
671 guard(spinlock_bh)(&vq->ready_lock);
672 vq->ready = ready;
673 }
674
vduse_vdpa_get_vq_ready(struct vdpa_device * vdpa,u16 idx)675 static bool vduse_vdpa_get_vq_ready(struct vdpa_device *vdpa, u16 idx)
676 {
677 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
678 struct vduse_virtqueue *vq = dev->vqs[idx];
679
680 guard(spinlock_bh)(&vq->ready_lock);
681 return vq->ready;
682 }
683
vduse_vdpa_set_vq_state(struct vdpa_device * vdpa,u16 idx,const struct vdpa_vq_state * state)684 static int vduse_vdpa_set_vq_state(struct vdpa_device *vdpa, u16 idx,
685 const struct vdpa_vq_state *state)
686 {
687 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
688 struct vduse_virtqueue *vq = dev->vqs[idx];
689
690 if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED)) {
691 vq->state.packed.last_avail_counter =
692 state->packed.last_avail_counter;
693 vq->state.packed.last_avail_idx = state->packed.last_avail_idx;
694 vq->state.packed.last_used_counter =
695 state->packed.last_used_counter;
696 vq->state.packed.last_used_idx = state->packed.last_used_idx;
697 } else
698 vq->state.split.avail_index = state->split.avail_index;
699
700 return 0;
701 }
702
vduse_get_vq_group(struct vdpa_device * vdpa,u16 idx)703 static u32 vduse_get_vq_group(struct vdpa_device *vdpa, u16 idx)
704 {
705 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
706
707 if (dev->api_version < VDUSE_API_VERSION_1)
708 return 0;
709
710 return dev->vqs[idx]->group;
711 }
712
vduse_get_vq_map(struct vdpa_device * vdpa,u16 idx)713 static union virtio_map vduse_get_vq_map(struct vdpa_device *vdpa, u16 idx)
714 {
715 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
716 u32 vq_group = vduse_get_vq_group(vdpa, idx);
717 union virtio_map ret = {
718 .group = &dev->groups[vq_group],
719 };
720
721 return ret;
722 }
723
724 DEFINE_GUARD(vq_group_as_read_lock, struct vduse_vq_group *,
725 if (_T->dev->nas > 1)
726 read_lock(&_T->as_lock),
727 if (_T->dev->nas > 1)
728 read_unlock(&_T->as_lock))
729
730 DEFINE_GUARD(vq_group_as_write_lock, struct vduse_vq_group *,
731 if (_T->dev->nas > 1)
732 write_lock(&_T->as_lock),
733 if (_T->dev->nas > 1)
734 write_unlock(&_T->as_lock))
735
vduse_set_group_asid(struct vdpa_device * vdpa,unsigned int group,unsigned int asid)736 static int vduse_set_group_asid(struct vdpa_device *vdpa, unsigned int group,
737 unsigned int asid)
738 {
739 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
740 struct vduse_dev_msg msg = { 0 };
741 int r;
742
743 if (dev->api_version < VDUSE_API_VERSION_1)
744 return -EINVAL;
745
746 msg.req.type = VDUSE_SET_VQ_GROUP_ASID;
747 msg.req.vq_group_asid.group = group;
748 msg.req.vq_group_asid.asid = asid;
749
750 r = vduse_dev_msg_sync(dev, &msg);
751 if (r < 0)
752 return r;
753
754 guard(vq_group_as_write_lock)(&dev->groups[group]);
755 dev->groups[group].as = &dev->as[asid];
756
757 return 0;
758 }
759
vduse_vdpa_get_vq_state(struct vdpa_device * vdpa,u16 idx,struct vdpa_vq_state * state)760 static int vduse_vdpa_get_vq_state(struct vdpa_device *vdpa, u16 idx,
761 struct vdpa_vq_state *state)
762 {
763 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
764 struct vduse_virtqueue *vq = dev->vqs[idx];
765
766 if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED))
767 return vduse_dev_get_vq_state_packed(dev, vq, &state->packed);
768
769 return vduse_dev_get_vq_state_split(dev, vq, &state->split);
770 }
771
vduse_vdpa_get_vq_align(struct vdpa_device * vdpa)772 static u32 vduse_vdpa_get_vq_align(struct vdpa_device *vdpa)
773 {
774 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
775
776 return dev->vq_align;
777 }
778
vduse_vdpa_get_device_features(struct vdpa_device * vdpa)779 static u64 vduse_vdpa_get_device_features(struct vdpa_device *vdpa)
780 {
781 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
782
783 return dev->device_features;
784 }
785
vduse_vdpa_set_driver_features(struct vdpa_device * vdpa,u64 features)786 static int vduse_vdpa_set_driver_features(struct vdpa_device *vdpa, u64 features)
787 {
788 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
789
790 dev->driver_features = features;
791 return 0;
792 }
793
vduse_vdpa_get_driver_features(struct vdpa_device * vdpa)794 static u64 vduse_vdpa_get_driver_features(struct vdpa_device *vdpa)
795 {
796 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
797
798 return dev->driver_features;
799 }
800
vduse_vdpa_set_config_cb(struct vdpa_device * vdpa,struct vdpa_callback * cb)801 static void vduse_vdpa_set_config_cb(struct vdpa_device *vdpa,
802 struct vdpa_callback *cb)
803 {
804 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
805
806 spin_lock(&dev->irq_lock);
807 dev->config_cb.callback = cb->callback;
808 dev->config_cb.private = cb->private;
809 spin_unlock(&dev->irq_lock);
810 }
811
vduse_vdpa_get_vq_num_max(struct vdpa_device * vdpa)812 static u16 vduse_vdpa_get_vq_num_max(struct vdpa_device *vdpa)
813 {
814 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
815 u16 num_max = 0;
816 int i;
817
818 for (i = 0; i < dev->vq_num; i++)
819 if (num_max < dev->vqs[i]->num_max)
820 num_max = dev->vqs[i]->num_max;
821
822 return num_max;
823 }
824
vduse_vdpa_get_device_id(struct vdpa_device * vdpa)825 static u32 vduse_vdpa_get_device_id(struct vdpa_device *vdpa)
826 {
827 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
828
829 return dev->device_id;
830 }
831
vduse_vdpa_get_vendor_id(struct vdpa_device * vdpa)832 static u32 vduse_vdpa_get_vendor_id(struct vdpa_device *vdpa)
833 {
834 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
835
836 return dev->vendor_id;
837 }
838
vduse_vdpa_get_status(struct vdpa_device * vdpa)839 static u8 vduse_vdpa_get_status(struct vdpa_device *vdpa)
840 {
841 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
842
843 return dev->status;
844 }
845
vduse_vdpa_set_status(struct vdpa_device * vdpa,u8 status)846 static void vduse_vdpa_set_status(struct vdpa_device *vdpa, u8 status)
847 {
848 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
849
850 if (vduse_dev_set_status(dev, status))
851 return;
852
853 dev->status = status;
854 }
855
vduse_vdpa_get_config_size(struct vdpa_device * vdpa)856 static size_t vduse_vdpa_get_config_size(struct vdpa_device *vdpa)
857 {
858 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
859
860 return dev->config_size;
861 }
862
vduse_vdpa_get_config(struct vdpa_device * vdpa,unsigned int offset,void * buf,unsigned int len)863 static void vduse_vdpa_get_config(struct vdpa_device *vdpa, unsigned int offset,
864 void *buf, unsigned int len)
865 {
866 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
867
868 /* Initialize the buffer in case of partial copy. */
869 memset(buf, 0, len);
870
871 if (offset > dev->config_size)
872 return;
873
874 if (len > dev->config_size - offset)
875 len = dev->config_size - offset;
876
877 memcpy(buf, dev->config + offset, len);
878 }
879
vduse_vdpa_set_config(struct vdpa_device * vdpa,unsigned int offset,const void * buf,unsigned int len)880 static void vduse_vdpa_set_config(struct vdpa_device *vdpa, unsigned int offset,
881 const void *buf, unsigned int len)
882 {
883 /* Now we only support read-only configuration space */
884 }
885
vduse_vdpa_reset(struct vdpa_device * vdpa)886 static int vduse_vdpa_reset(struct vdpa_device *vdpa)
887 {
888 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
889 int ret = vduse_dev_set_status(dev, 0);
890
891 vduse_dev_reset(dev);
892
893 return ret;
894 }
895
vduse_vdpa_get_generation(struct vdpa_device * vdpa)896 static u32 vduse_vdpa_get_generation(struct vdpa_device *vdpa)
897 {
898 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
899
900 return dev->generation;
901 }
902
vduse_vdpa_set_vq_affinity(struct vdpa_device * vdpa,u16 idx,const struct cpumask * cpu_mask)903 static int vduse_vdpa_set_vq_affinity(struct vdpa_device *vdpa, u16 idx,
904 const struct cpumask *cpu_mask)
905 {
906 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
907
908 if (cpu_mask)
909 cpumask_copy(&dev->vqs[idx]->irq_affinity, cpu_mask);
910 else
911 cpumask_setall(&dev->vqs[idx]->irq_affinity);
912
913 return 0;
914 }
915
916 static const struct cpumask *
vduse_vdpa_get_vq_affinity(struct vdpa_device * vdpa,u16 idx)917 vduse_vdpa_get_vq_affinity(struct vdpa_device *vdpa, u16 idx)
918 {
919 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
920
921 return &dev->vqs[idx]->irq_affinity;
922 }
923
vduse_vdpa_set_map(struct vdpa_device * vdpa,unsigned int asid,struct vhost_iotlb * iotlb)924 static int vduse_vdpa_set_map(struct vdpa_device *vdpa,
925 unsigned int asid,
926 struct vhost_iotlb *iotlb)
927 {
928 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
929 int ret;
930
931 ret = vduse_domain_set_map(dev->as[asid].domain, iotlb);
932 if (ret)
933 return ret;
934
935 ret = vduse_dev_update_iotlb(dev, asid, 0ULL, ULLONG_MAX);
936 if (ret) {
937 vduse_domain_clear_map(dev->as[asid].domain, iotlb);
938 return ret;
939 }
940
941 return 0;
942 }
943
vduse_vdpa_suspend(struct vdpa_device * vdpa)944 static int vduse_vdpa_suspend(struct vdpa_device *vdpa)
945 {
946 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
947 struct vduse_dev_msg msg = { 0 };
948 int ret;
949
950 msg.req.type = VDUSE_SUSPEND;
951
952 ret = vduse_dev_msg_sync(dev, &msg);
953 if (ret == 0) {
954 scoped_guard(rwsem_write, &dev->rwsem)
955 WRITE_ONCE(dev->suspended, true);
956
957 /*
958 * Kicks check dev->suspended under kick_lock without taking
959 * the rwsem: cycle each kick_lock so that no kick that has
960 * already passed the check is still in flight after this.
961 */
962 for (u32 i = 0; i < dev->vq_num; i++) {
963 spin_lock(&dev->vqs[i]->kick_lock);
964 spin_unlock(&dev->vqs[i]->kick_lock);
965 }
966
967 cancel_work_sync(&dev->inject);
968 for (u32 i = 0; i < dev->vq_num; i++)
969 cancel_work_sync(&dev->vqs[i]->inject);
970 }
971
972 return ret;
973 }
974
vduse_vdpa_free(struct vdpa_device * vdpa)975 static void vduse_vdpa_free(struct vdpa_device *vdpa)
976 {
977 struct vduse_dev *dev = vdpa_to_vduse(vdpa);
978
979 dev->vdev = NULL;
980 }
981
982 static const struct vdpa_config_ops vduse_vdpa_config_ops = {
983 .set_vq_address = vduse_vdpa_set_vq_address,
984 .kick_vq = vduse_vdpa_kick_vq,
985 .set_vq_cb = vduse_vdpa_set_vq_cb,
986 .set_vq_num = vduse_vdpa_set_vq_num,
987 .get_vq_size = vduse_vdpa_get_vq_size,
988 .get_vq_group = vduse_get_vq_group,
989 .set_vq_ready = vduse_vdpa_set_vq_ready,
990 .get_vq_ready = vduse_vdpa_get_vq_ready,
991 .set_vq_state = vduse_vdpa_set_vq_state,
992 .get_vq_state = vduse_vdpa_get_vq_state,
993 .get_vq_align = vduse_vdpa_get_vq_align,
994 .get_device_features = vduse_vdpa_get_device_features,
995 .set_driver_features = vduse_vdpa_set_driver_features,
996 .get_driver_features = vduse_vdpa_get_driver_features,
997 .set_config_cb = vduse_vdpa_set_config_cb,
998 .get_vq_num_max = vduse_vdpa_get_vq_num_max,
999 .get_device_id = vduse_vdpa_get_device_id,
1000 .get_vendor_id = vduse_vdpa_get_vendor_id,
1001 .get_status = vduse_vdpa_get_status,
1002 .set_status = vduse_vdpa_set_status,
1003 .get_config_size = vduse_vdpa_get_config_size,
1004 .get_config = vduse_vdpa_get_config,
1005 .set_config = vduse_vdpa_set_config,
1006 .get_generation = vduse_vdpa_get_generation,
1007 .set_vq_affinity = vduse_vdpa_set_vq_affinity,
1008 .get_vq_affinity = vduse_vdpa_get_vq_affinity,
1009 .reset = vduse_vdpa_reset,
1010 .set_map = vduse_vdpa_set_map,
1011 .set_group_asid = vduse_set_group_asid,
1012 .get_vq_map = vduse_get_vq_map,
1013 .free = vduse_vdpa_free,
1014 };
1015
1016 static const struct vdpa_config_ops vduse_vdpa_config_ops_with_suspend = {
1017 .set_vq_address = vduse_vdpa_set_vq_address,
1018 .kick_vq = vduse_vdpa_kick_vq,
1019 .set_vq_cb = vduse_vdpa_set_vq_cb,
1020 .set_vq_num = vduse_vdpa_set_vq_num,
1021 .get_vq_size = vduse_vdpa_get_vq_size,
1022 .get_vq_group = vduse_get_vq_group,
1023 .set_vq_ready = vduse_vdpa_set_vq_ready,
1024 .get_vq_ready = vduse_vdpa_get_vq_ready,
1025 .set_vq_state = vduse_vdpa_set_vq_state,
1026 .get_vq_state = vduse_vdpa_get_vq_state,
1027 .get_vq_align = vduse_vdpa_get_vq_align,
1028 .get_device_features = vduse_vdpa_get_device_features,
1029 .set_driver_features = vduse_vdpa_set_driver_features,
1030 .get_driver_features = vduse_vdpa_get_driver_features,
1031 .set_config_cb = vduse_vdpa_set_config_cb,
1032 .get_vq_num_max = vduse_vdpa_get_vq_num_max,
1033 .get_device_id = vduse_vdpa_get_device_id,
1034 .get_vendor_id = vduse_vdpa_get_vendor_id,
1035 .get_status = vduse_vdpa_get_status,
1036 .set_status = vduse_vdpa_set_status,
1037 .get_config_size = vduse_vdpa_get_config_size,
1038 .get_config = vduse_vdpa_get_config,
1039 .set_config = vduse_vdpa_set_config,
1040 .get_generation = vduse_vdpa_get_generation,
1041 .set_vq_affinity = vduse_vdpa_set_vq_affinity,
1042 .get_vq_affinity = vduse_vdpa_get_vq_affinity,
1043 .reset = vduse_vdpa_reset,
1044 .set_map = vduse_vdpa_set_map,
1045 .set_group_asid = vduse_set_group_asid,
1046 .get_vq_map = vduse_get_vq_map,
1047 .suspend = vduse_vdpa_suspend,
1048 .free = vduse_vdpa_free,
1049 };
1050
vduse_dev_sync_single_for_device(union virtio_map token,dma_addr_t dma_addr,size_t size,enum dma_data_direction dir)1051 static void vduse_dev_sync_single_for_device(union virtio_map token,
1052 dma_addr_t dma_addr, size_t size,
1053 enum dma_data_direction dir)
1054 {
1055 struct vduse_iova_domain *domain;
1056
1057 if (!token.group)
1058 return;
1059
1060 guard(vq_group_as_read_lock)(token.group);
1061 domain = token.group->as->domain;
1062 vduse_domain_sync_single_for_device(domain, dma_addr, size, dir);
1063 }
1064
vduse_dev_sync_single_for_cpu(union virtio_map token,dma_addr_t dma_addr,size_t size,enum dma_data_direction dir)1065 static void vduse_dev_sync_single_for_cpu(union virtio_map token,
1066 dma_addr_t dma_addr, size_t size,
1067 enum dma_data_direction dir)
1068 {
1069 struct vduse_iova_domain *domain;
1070
1071 if (!token.group)
1072 return;
1073
1074 guard(vq_group_as_read_lock)(token.group);
1075 domain = token.group->as->domain;
1076 vduse_domain_sync_single_for_cpu(domain, dma_addr, size, dir);
1077 }
1078
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)1079 static dma_addr_t vduse_dev_map_page(union virtio_map token, struct page *page,
1080 unsigned long offset, size_t size,
1081 enum dma_data_direction dir,
1082 unsigned long attrs)
1083 {
1084 struct vduse_iova_domain *domain;
1085
1086 if (!token.group)
1087 return DMA_MAPPING_ERROR;
1088
1089 guard(vq_group_as_read_lock)(token.group);
1090 domain = token.group->as->domain;
1091 return vduse_domain_map_page(domain, page, offset, size, dir, attrs);
1092 }
1093
vduse_dev_unmap_page(union virtio_map token,dma_addr_t dma_addr,size_t size,enum dma_data_direction dir,unsigned long attrs)1094 static void vduse_dev_unmap_page(union virtio_map token, dma_addr_t dma_addr,
1095 size_t size, enum dma_data_direction dir,
1096 unsigned long attrs)
1097 {
1098 struct vduse_iova_domain *domain;
1099
1100 if (!token.group)
1101 return;
1102
1103 guard(vq_group_as_read_lock)(token.group);
1104 domain = token.group->as->domain;
1105 vduse_domain_unmap_page(domain, dma_addr, size, dir, attrs);
1106 }
1107
vduse_dev_alloc_coherent(union virtio_map token,size_t size,dma_addr_t * dma_addr,gfp_t flag)1108 static void *vduse_dev_alloc_coherent(union virtio_map token, size_t size,
1109 dma_addr_t *dma_addr, gfp_t flag)
1110 {
1111 void *addr;
1112
1113 *dma_addr = DMA_MAPPING_ERROR;
1114 if (!token.group)
1115 return NULL;
1116
1117 addr = alloc_pages_exact(size, flag | __GFP_ZERO);
1118 if (!addr)
1119 return NULL;
1120
1121 {
1122 struct vduse_iova_domain *domain;
1123
1124 guard(vq_group_as_read_lock)(token.group);
1125 domain = token.group->as->domain;
1126 *dma_addr = vduse_domain_alloc_coherent(domain, size, addr);
1127 if (*dma_addr == DMA_MAPPING_ERROR)
1128 goto err;
1129 }
1130
1131 return addr;
1132
1133 err:
1134 free_pages_exact(addr, size);
1135 return NULL;
1136 }
1137
vduse_dev_free_coherent(union virtio_map token,size_t size,void * vaddr,dma_addr_t dma_addr,unsigned long attrs)1138 static void vduse_dev_free_coherent(union virtio_map token, size_t size,
1139 void *vaddr, dma_addr_t dma_addr,
1140 unsigned long attrs)
1141 {
1142 if (!token.group)
1143 return;
1144
1145 {
1146 struct vduse_iova_domain *domain;
1147
1148 guard(vq_group_as_read_lock)(token.group);
1149 domain = token.group->as->domain;
1150 vduse_domain_free_coherent(domain, size, dma_addr, attrs);
1151 }
1152
1153 free_pages_exact(vaddr, size);
1154 }
1155
vduse_dev_need_sync(union virtio_map token,dma_addr_t dma_addr)1156 static bool vduse_dev_need_sync(union virtio_map token, dma_addr_t dma_addr)
1157 {
1158 if (!token.group)
1159 return false;
1160
1161 guard(vq_group_as_read_lock)(token.group);
1162 return dma_addr < token.group->as->domain->bounce_size;
1163 }
1164
vduse_dev_mapping_error(union virtio_map token,dma_addr_t dma_addr)1165 static int vduse_dev_mapping_error(union virtio_map token, dma_addr_t dma_addr)
1166 {
1167 if (unlikely(dma_addr == DMA_MAPPING_ERROR))
1168 return -ENOMEM;
1169 return 0;
1170 }
1171
vduse_dev_max_mapping_size(union virtio_map token)1172 static size_t vduse_dev_max_mapping_size(union virtio_map token)
1173 {
1174 if (!token.group)
1175 return 0;
1176
1177 guard(vq_group_as_read_lock)(token.group);
1178 return token.group->as->domain->bounce_size;
1179 }
1180
1181 static const struct virtio_map_ops vduse_map_ops = {
1182 .sync_single_for_device = vduse_dev_sync_single_for_device,
1183 .sync_single_for_cpu = vduse_dev_sync_single_for_cpu,
1184 .map_page = vduse_dev_map_page,
1185 .unmap_page = vduse_dev_unmap_page,
1186 .alloc = vduse_dev_alloc_coherent,
1187 .free = vduse_dev_free_coherent,
1188 .need_sync = vduse_dev_need_sync,
1189 .mapping_error = vduse_dev_mapping_error,
1190 .max_mapping_size = vduse_dev_max_mapping_size,
1191 };
1192
perm_to_file_flags(u8 perm)1193 static unsigned int perm_to_file_flags(u8 perm)
1194 {
1195 unsigned int flags = 0;
1196
1197 switch (perm) {
1198 case VDUSE_ACCESS_WO:
1199 flags |= O_WRONLY;
1200 break;
1201 case VDUSE_ACCESS_RO:
1202 flags |= O_RDONLY;
1203 break;
1204 case VDUSE_ACCESS_RW:
1205 flags |= O_RDWR;
1206 break;
1207 default:
1208 WARN(1, "invalidate vhost IOTLB permission\n");
1209 break;
1210 }
1211
1212 return flags;
1213 }
1214
vduse_kickfd_setup(struct vduse_dev * dev,struct vduse_vq_eventfd * eventfd)1215 static int vduse_kickfd_setup(struct vduse_dev *dev,
1216 struct vduse_vq_eventfd *eventfd)
1217 {
1218 struct eventfd_ctx *ctx = NULL;
1219 struct vduse_virtqueue *vq;
1220 u32 index;
1221
1222 if (eventfd->index >= dev->vq_num)
1223 return -EINVAL;
1224
1225 index = array_index_nospec(eventfd->index, dev->vq_num);
1226 vq = dev->vqs[index];
1227 if (eventfd->fd >= 0) {
1228 ctx = eventfd_ctx_fdget(eventfd->fd);
1229 if (IS_ERR(ctx))
1230 return PTR_ERR(ctx);
1231 } else if (eventfd->fd != VDUSE_EVENTFD_DEASSIGN)
1232 return 0;
1233
1234 guard(spinlock)(&vq->kick_lock);
1235 if (vq->kickfd)
1236 eventfd_ctx_put(vq->kickfd);
1237 vq->kickfd = ctx;
1238
1239 guard(spinlock_bh)(&vq->ready_lock);
1240 if (vq->ready && vq->kicked && vq->kickfd) {
1241 eventfd_signal(vq->kickfd);
1242 vq->kicked = false;
1243 }
1244
1245 return 0;
1246 }
1247
vduse_dev_is_ready(struct vduse_dev * dev)1248 static bool vduse_dev_is_ready(struct vduse_dev *dev)
1249 {
1250 int i;
1251
1252 for (i = 0; i < dev->vq_num; i++)
1253 if (!dev->vqs[i]->num_max)
1254 return false;
1255
1256 return true;
1257 }
1258
vduse_dev_irq_inject(struct work_struct * work)1259 static void vduse_dev_irq_inject(struct work_struct *work)
1260 {
1261 struct vduse_dev *dev = container_of(work, struct vduse_dev, inject);
1262
1263 guard(rwsem_read)(&dev->rwsem);
1264 if (dev->suspended)
1265 return;
1266
1267 spin_lock_bh(&dev->irq_lock);
1268 if (dev->config_cb.callback)
1269 dev->config_cb.callback(dev->config_cb.private);
1270 spin_unlock_bh(&dev->irq_lock);
1271 }
1272
vduse_vq_irq_inject(struct work_struct * work)1273 static void vduse_vq_irq_inject(struct work_struct *work)
1274 {
1275 struct vduse_virtqueue *vq = container_of(work,
1276 struct vduse_virtqueue, inject);
1277
1278 guard(rwsem_read)(&vq->dev->rwsem);
1279 if (vq->dev->suspended)
1280 return;
1281
1282 guard(spinlock_bh)(&vq->irq_lock);
1283 guard(spinlock_bh)(&vq->ready_lock);
1284 if (vq->ready && vq->cb.callback)
1285 vq->cb.callback(vq->cb.private);
1286 }
1287
vduse_vq_signal_irqfd(struct vduse_virtqueue * vq)1288 static bool vduse_vq_signal_irqfd(struct vduse_virtqueue *vq)
1289 {
1290 bool signal = false;
1291
1292 guard(rwsem_read)(&vq->dev->rwsem);
1293 if (vq->dev->suspended)
1294 return false;
1295
1296 if (!vq->cb.trigger)
1297 return false;
1298
1299 guard(spinlock_irq)(&vq->irq_lock);
1300 guard(spinlock_irq)(&vq->ready_lock);
1301 if (vq->ready && vq->cb.trigger) {
1302 eventfd_signal(vq->cb.trigger);
1303 signal = true;
1304 }
1305
1306 return signal;
1307 }
1308
vduse_dev_queue_irq_work(struct vduse_dev * dev,struct work_struct * irq_work,int irq_effective_cpu)1309 static int vduse_dev_queue_irq_work(struct vduse_dev *dev,
1310 struct work_struct *irq_work,
1311 int irq_effective_cpu)
1312 {
1313 int ret = -EINVAL;
1314
1315 guard(rwsem_read)(&dev->rwsem);
1316 if (dev->suspended || !(dev->status & VIRTIO_CONFIG_S_DRIVER_OK))
1317 return ret;
1318
1319 ret = 0;
1320 if (irq_effective_cpu == IRQ_UNBOUND)
1321 queue_work(vduse_irq_wq, irq_work);
1322 else
1323 queue_work_on(irq_effective_cpu,
1324 vduse_irq_bound_wq, irq_work);
1325
1326 return ret;
1327 }
1328
vduse_dev_dereg_umem(struct vduse_dev * dev,u32 asid,u64 iova,u64 size)1329 static int vduse_dev_dereg_umem(struct vduse_dev *dev, u32 asid,
1330 u64 iova, u64 size)
1331 {
1332 int ret;
1333
1334 mutex_lock(&dev->as[asid].mem_lock);
1335 ret = -ENOENT;
1336 if (!dev->as[asid].umem)
1337 goto unlock;
1338
1339 ret = -EINVAL;
1340 if (!dev->as[asid].domain)
1341 goto unlock;
1342
1343 if (dev->as[asid].umem->iova != iova ||
1344 size != dev->as[asid].domain->bounce_size)
1345 goto unlock;
1346
1347 vduse_domain_remove_user_bounce_pages(dev->as[asid].domain);
1348 unpin_user_pages_dirty_lock(dev->as[asid].umem->pages,
1349 dev->as[asid].umem->npages, true);
1350 atomic64_sub(dev->as[asid].umem->npages, &dev->as[asid].umem->mm->pinned_vm);
1351 mmdrop(dev->as[asid].umem->mm);
1352 vfree(dev->as[asid].umem->pages);
1353 kfree(dev->as[asid].umem);
1354 dev->as[asid].umem = NULL;
1355 ret = 0;
1356 unlock:
1357 mutex_unlock(&dev->as[asid].mem_lock);
1358 return ret;
1359 }
1360
vduse_dev_reg_umem(struct vduse_dev * dev,u32 asid,u64 iova,u64 uaddr,u64 size)1361 static int vduse_dev_reg_umem(struct vduse_dev *dev,
1362 u32 asid, u64 iova, u64 uaddr, u64 size)
1363 {
1364 struct page **page_list = NULL;
1365 struct vduse_umem *umem = NULL;
1366 long pinned = 0;
1367 unsigned long npages, lock_limit;
1368 int ret;
1369
1370 if (!dev->as[asid].domain || !dev->as[asid].domain->bounce_map ||
1371 size != dev->as[asid].domain->bounce_size ||
1372 iova != 0 || uaddr & ~PAGE_MASK)
1373 return -EINVAL;
1374
1375 mutex_lock(&dev->as[asid].mem_lock);
1376 ret = -EEXIST;
1377 if (dev->as[asid].umem)
1378 goto unlock;
1379
1380 ret = -ENOMEM;
1381 npages = size >> PAGE_SHIFT;
1382 page_list = __vmalloc(array_size(npages, sizeof(struct page *)),
1383 GFP_KERNEL_ACCOUNT);
1384 umem = kzalloc_obj(*umem);
1385 if (!page_list || !umem)
1386 goto unlock;
1387
1388 mmap_read_lock(current->mm);
1389
1390 lock_limit = PFN_DOWN(rlimit(RLIMIT_MEMLOCK));
1391 if (npages + atomic64_read(¤t->mm->pinned_vm) > lock_limit)
1392 goto out;
1393
1394 pinned = pin_user_pages(uaddr, npages, FOLL_LONGTERM | FOLL_WRITE,
1395 page_list);
1396 if (pinned != npages) {
1397 ret = pinned < 0 ? pinned : -ENOMEM;
1398 goto out;
1399 }
1400
1401 ret = vduse_domain_add_user_bounce_pages(dev->as[asid].domain,
1402 page_list, pinned);
1403 if (ret)
1404 goto out;
1405
1406 atomic64_add(npages, ¤t->mm->pinned_vm);
1407
1408 umem->pages = page_list;
1409 umem->npages = pinned;
1410 umem->iova = iova;
1411 umem->mm = current->mm;
1412 mmgrab(current->mm);
1413
1414 dev->as[asid].umem = umem;
1415 out:
1416 if (ret && pinned > 0)
1417 unpin_user_pages(page_list, pinned);
1418
1419 mmap_read_unlock(current->mm);
1420 unlock:
1421 if (ret) {
1422 vfree(page_list);
1423 kfree(umem);
1424 }
1425 mutex_unlock(&dev->as[asid].mem_lock);
1426 return ret;
1427 }
1428
vduse_vq_update_effective_cpu(struct vduse_virtqueue * vq)1429 static void vduse_vq_update_effective_cpu(struct vduse_virtqueue *vq)
1430 {
1431 int curr_cpu = vq->irq_effective_cpu;
1432
1433 while (true) {
1434 curr_cpu = cpumask_next(curr_cpu, &vq->irq_affinity);
1435 if (cpu_online(curr_cpu))
1436 break;
1437
1438 if (curr_cpu >= nr_cpu_ids)
1439 curr_cpu = IRQ_UNBOUND;
1440 }
1441
1442 vq->irq_effective_cpu = curr_cpu;
1443 }
1444
vduse_dev_iotlb_entry(struct vduse_dev * dev,struct vduse_iotlb_entry_v2 * entry,struct file ** f,uint64_t * capability)1445 static int vduse_dev_iotlb_entry(struct vduse_dev *dev,
1446 struct vduse_iotlb_entry_v2 *entry,
1447 struct file **f, uint64_t *capability)
1448 {
1449 u32 asid;
1450 int r = -EINVAL;
1451 struct vhost_iotlb_map *map;
1452
1453 if (entry->start > entry->last || entry->asid >= dev->nas)
1454 return -EINVAL;
1455
1456 asid = array_index_nospec(entry->asid, dev->nas);
1457 mutex_lock(&dev->domain_lock);
1458
1459 if (!dev->as[asid].domain)
1460 goto out;
1461
1462 spin_lock(&dev->as[asid].domain->iotlb_lock);
1463 map = vhost_iotlb_itree_first(dev->as[asid].domain->iotlb,
1464 entry->start, entry->last);
1465 if (map) {
1466 if (f) {
1467 const struct vdpa_map_file *map_file;
1468
1469 map_file = (struct vdpa_map_file *)map->opaque;
1470 entry->offset = map_file->offset;
1471 *f = get_file(map_file->file);
1472 }
1473 entry->start = map->start;
1474 entry->last = map->last;
1475 entry->perm = map->perm;
1476 if (capability) {
1477 *capability = 0;
1478
1479 if (dev->as[asid].domain->bounce_map && map->start == 0 &&
1480 map->last == dev->as[asid].domain->bounce_size - 1)
1481 *capability |= VDUSE_IOVA_CAP_UMEM;
1482 }
1483
1484 r = 0;
1485 }
1486 spin_unlock(&dev->as[asid].domain->iotlb_lock);
1487
1488 out:
1489 mutex_unlock(&dev->domain_lock);
1490 return r;
1491 }
1492
vduse_dev_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1493 static long vduse_dev_ioctl(struct file *file, unsigned int cmd,
1494 unsigned long arg)
1495 {
1496 struct vduse_dev *dev = file->private_data;
1497 void __user *argp = (void __user *)arg;
1498 int ret;
1499
1500 if (unlikely(dev->broken))
1501 return -EPERM;
1502
1503 switch (cmd) {
1504 case VDUSE_IOTLB_GET_FD:
1505 case VDUSE_IOTLB_GET_FD2: {
1506 struct vduse_iotlb_entry_v2 entry = {0};
1507 struct file *f = NULL;
1508
1509 ret = -ENOIOCTLCMD;
1510 if (dev->api_version < VDUSE_API_VERSION_1 &&
1511 cmd == VDUSE_IOTLB_GET_FD2)
1512 break;
1513
1514 ret = -EFAULT;
1515 if (copy_from_user(&entry, argp, _IOC_SIZE(cmd)))
1516 break;
1517
1518 ret = -EINVAL;
1519 if (!is_mem_zero((const char *)entry.reserved,
1520 sizeof(entry.reserved)))
1521 break;
1522
1523 ret = vduse_dev_iotlb_entry(dev, &entry, &f, NULL);
1524 if (ret)
1525 break;
1526
1527 ret = -EINVAL;
1528 if (!f)
1529 break;
1530
1531 ret = copy_to_user(argp, &entry, _IOC_SIZE(cmd));
1532 if (ret) {
1533 ret = -EFAULT;
1534 fput(f);
1535 break;
1536 }
1537 ret = receive_fd(f, NULL, perm_to_file_flags(entry.perm));
1538 fput(f);
1539 break;
1540 }
1541 case VDUSE_DEV_GET_FEATURES:
1542 /*
1543 * Just mirror what driver wrote here.
1544 * The driver is expected to check FEATURE_OK later.
1545 */
1546 ret = put_user(dev->driver_features, (u64 __user *)argp);
1547 break;
1548 case VDUSE_DEV_SET_CONFIG: {
1549 struct vduse_config_data config;
1550 unsigned long size = offsetof(struct vduse_config_data,
1551 buffer);
1552
1553 ret = -EFAULT;
1554 if (copy_from_user(&config, argp, size))
1555 break;
1556
1557 ret = -EINVAL;
1558 if (config.offset > dev->config_size ||
1559 config.length == 0 ||
1560 config.length > dev->config_size - config.offset)
1561 break;
1562
1563 ret = -EFAULT;
1564 if (copy_from_user(dev->config + config.offset, argp + size,
1565 config.length))
1566 break;
1567
1568 ret = 0;
1569 break;
1570 }
1571 case VDUSE_DEV_INJECT_CONFIG_IRQ:
1572 ret = vduse_dev_queue_irq_work(dev, &dev->inject, IRQ_UNBOUND);
1573 break;
1574 case VDUSE_VQ_SETUP: {
1575 struct vduse_vq_config config;
1576 u32 index;
1577
1578 ret = -EFAULT;
1579 if (copy_from_user(&config, argp, sizeof(config)))
1580 break;
1581
1582 ret = -EINVAL;
1583 if (config.index >= dev->vq_num)
1584 break;
1585
1586 if (dev->api_version < VDUSE_API_VERSION_1) {
1587 if (config.group)
1588 break;
1589 } else {
1590 if (config.group >= dev->ngroups)
1591 break;
1592 if (dev->status & VIRTIO_CONFIG_S_DRIVER_OK)
1593 break;
1594 }
1595
1596 if (config.reserved1 ||
1597 !is_mem_zero((const char *)config.reserved2,
1598 sizeof(config.reserved2)))
1599 break;
1600
1601 index = array_index_nospec(config.index, dev->vq_num);
1602 dev->vqs[index]->num_max = config.max_size;
1603 dev->vqs[index]->group = config.group;
1604 ret = 0;
1605 break;
1606 }
1607 case VDUSE_VQ_GET_INFO: {
1608 struct vduse_vq_info vq_info;
1609 struct vduse_virtqueue *vq;
1610 u32 index;
1611
1612 ret = -EFAULT;
1613 if (copy_from_user(&vq_info, argp, sizeof(vq_info)))
1614 break;
1615
1616 ret = -EINVAL;
1617 if (vq_info.index >= dev->vq_num)
1618 break;
1619
1620 index = array_index_nospec(vq_info.index, dev->vq_num);
1621 vq = dev->vqs[index];
1622 vq_info.desc_addr = vq->desc_addr;
1623 vq_info.driver_addr = vq->driver_addr;
1624 vq_info.device_addr = vq->device_addr;
1625 vq_info.num = vq->num;
1626
1627 if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED)) {
1628 vq_info.packed.last_avail_counter =
1629 vq->state.packed.last_avail_counter;
1630 vq_info.packed.last_avail_idx =
1631 vq->state.packed.last_avail_idx;
1632 vq_info.packed.last_used_counter =
1633 vq->state.packed.last_used_counter;
1634 vq_info.packed.last_used_idx =
1635 vq->state.packed.last_used_idx;
1636 } else
1637 vq_info.split.avail_index =
1638 vq->state.split.avail_index;
1639
1640 scoped_guard(spinlock_bh, &vq->ready_lock) {
1641 vq_info.ready = vq->ready;
1642 }
1643
1644 ret = -EFAULT;
1645 if (copy_to_user(argp, &vq_info, sizeof(vq_info)))
1646 break;
1647
1648 ret = 0;
1649 break;
1650 }
1651 case VDUSE_VQ_SETUP_KICKFD: {
1652 struct vduse_vq_eventfd eventfd;
1653
1654 ret = -EFAULT;
1655 if (copy_from_user(&eventfd, argp, sizeof(eventfd)))
1656 break;
1657
1658 ret = vduse_kickfd_setup(dev, &eventfd);
1659 break;
1660 }
1661 case VDUSE_VQ_INJECT_IRQ: {
1662 u32 index;
1663
1664 ret = -EFAULT;
1665 if (get_user(index, (u32 __user *)argp))
1666 break;
1667
1668 ret = -EINVAL;
1669 if (index >= dev->vq_num)
1670 break;
1671
1672 ret = 0;
1673 index = array_index_nospec(index, dev->vq_num);
1674 if (!vduse_vq_signal_irqfd(dev->vqs[index])) {
1675 vduse_vq_update_effective_cpu(dev->vqs[index]);
1676 ret = vduse_dev_queue_irq_work(dev,
1677 &dev->vqs[index]->inject,
1678 dev->vqs[index]->irq_effective_cpu);
1679 }
1680 break;
1681 }
1682 case VDUSE_IOTLB_REG_UMEM: {
1683 struct vduse_iova_umem umem;
1684 u32 asid;
1685
1686 ret = -EFAULT;
1687 if (copy_from_user(&umem, argp, sizeof(umem)))
1688 break;
1689
1690 ret = -EINVAL;
1691 if (!is_mem_zero((const char *)umem.reserved,
1692 sizeof(umem.reserved)) ||
1693 (dev->api_version < VDUSE_API_VERSION_1 &&
1694 umem.asid != 0) || umem.asid >= dev->nas)
1695 break;
1696
1697 mutex_lock(&dev->domain_lock);
1698 asid = array_index_nospec(umem.asid, dev->nas);
1699 ret = vduse_dev_reg_umem(dev, asid, umem.iova,
1700 umem.uaddr, umem.size);
1701 mutex_unlock(&dev->domain_lock);
1702 break;
1703 }
1704 case VDUSE_IOTLB_DEREG_UMEM: {
1705 struct vduse_iova_umem umem;
1706 u32 asid;
1707
1708 ret = -EFAULT;
1709 if (copy_from_user(&umem, argp, sizeof(umem)))
1710 break;
1711
1712 ret = -EINVAL;
1713 if (!is_mem_zero((const char *)umem.reserved,
1714 sizeof(umem.reserved)) ||
1715 (dev->api_version < VDUSE_API_VERSION_1 &&
1716 umem.asid != 0) ||
1717 umem.asid >= dev->nas)
1718 break;
1719
1720 mutex_lock(&dev->domain_lock);
1721 asid = array_index_nospec(umem.asid, dev->nas);
1722 ret = vduse_dev_dereg_umem(dev, asid, umem.iova,
1723 umem.size);
1724 mutex_unlock(&dev->domain_lock);
1725 break;
1726 }
1727 case VDUSE_IOTLB_GET_INFO: {
1728 struct vduse_iova_info info;
1729 struct vduse_iotlb_entry_v2 entry;
1730
1731 ret = -EFAULT;
1732 if (copy_from_user(&info, argp, sizeof(info)))
1733 break;
1734
1735 if (!is_mem_zero((const char *)info.reserved,
1736 sizeof(info.reserved)))
1737 break;
1738
1739 if (dev->api_version < VDUSE_API_VERSION_1) {
1740 if (info.asid)
1741 break;
1742 } else if (info.asid >= dev->nas)
1743 break;
1744
1745 entry.start = info.start;
1746 entry.last = info.last;
1747 entry.asid = info.asid;
1748 ret = vduse_dev_iotlb_entry(dev, &entry, NULL,
1749 &info.capability);
1750 if (ret < 0)
1751 break;
1752
1753 info.start = entry.start;
1754 info.last = entry.last;
1755 info.asid = entry.asid;
1756
1757 ret = -EFAULT;
1758 if (copy_to_user(argp, &info, sizeof(info)))
1759 break;
1760
1761 ret = 0;
1762 break;
1763 }
1764 default:
1765 ret = -ENOIOCTLCMD;
1766 break;
1767 }
1768
1769 return ret;
1770 }
1771
1772 #ifdef CONFIG_COMPAT_FOR_U64_ALIGNMENT
1773 /*
1774 * i386 has different alignment constraints than x86_64,
1775 * so there are only 3 bytes of padding instead of 7.
1776 */
1777 struct compat_vduse_iotlb_entry {
1778 compat_u64 offset;
1779 compat_u64 start;
1780 compat_u64 last;
1781 __u8 perm;
1782 __u8 padding[3];
1783 };
1784 #define COMPAT_VDUSE_IOTLB_GET_FD _IOWR(VDUSE_BASE, 0x10, struct compat_vduse_iotlb_entry)
1785
1786 struct compat_vduse_vq_info {
1787 __u32 index;
1788 __u32 num;
1789 compat_u64 desc_addr;
1790 compat_u64 driver_addr;
1791 compat_u64 device_addr;
1792 union {
1793 struct vduse_vq_state_split split;
1794 struct vduse_vq_state_packed packed;
1795 };
1796 __u8 ready;
1797 __u8 padding[3];
1798 };
1799 #define COMPAT_VDUSE_VQ_GET_INFO _IOWR(VDUSE_BASE, 0x15, struct compat_vduse_vq_info)
1800
vduse_dev_compat_ioctl(struct file * file,unsigned int cmd,unsigned long arg)1801 static long vduse_dev_compat_ioctl(struct file *file, unsigned int cmd,
1802 unsigned long arg)
1803 {
1804 struct vduse_dev *dev = file->private_data;
1805 void __user *argp = (void __user *)arg;
1806 int ret;
1807
1808 if (unlikely(dev->broken))
1809 return -EPERM;
1810
1811 switch (cmd) {
1812 case COMPAT_VDUSE_IOTLB_GET_FD: {
1813 struct vduse_iotlb_entry_v2 entry = {0};
1814 struct file *f = NULL;
1815
1816 ret = -EFAULT;
1817 if (copy_from_user(&entry, argp, _IOC_SIZE(cmd)))
1818 break;
1819
1820 ret = vduse_dev_iotlb_entry(dev, &entry, &f, NULL);
1821 if (ret)
1822 break;
1823
1824 ret = -EINVAL;
1825 if (!f)
1826 break;
1827
1828 ret = copy_to_user(argp, &entry, _IOC_SIZE(cmd));
1829 if (ret) {
1830 ret = -EFAULT;
1831 fput(f);
1832 break;
1833 }
1834 ret = receive_fd(f, NULL, perm_to_file_flags(entry.perm));
1835 fput(f);
1836 break;
1837 }
1838 case COMPAT_VDUSE_VQ_GET_INFO: {
1839 struct vduse_vq_info vq_info = {};
1840 struct vduse_virtqueue *vq;
1841 u32 index;
1842
1843 ret = -EFAULT;
1844 if (copy_from_user(&vq_info, argp,
1845 sizeof(struct compat_vduse_vq_info)))
1846 break;
1847
1848 ret = -EINVAL;
1849 if (vq_info.index >= dev->vq_num)
1850 break;
1851
1852 index = array_index_nospec(vq_info.index, dev->vq_num);
1853 vq = dev->vqs[index];
1854 vq_info.desc_addr = vq->desc_addr;
1855 vq_info.driver_addr = vq->driver_addr;
1856 vq_info.device_addr = vq->device_addr;
1857 vq_info.num = vq->num;
1858
1859 if (dev->driver_features & BIT_ULL(VIRTIO_F_RING_PACKED)) {
1860 vq_info.packed.last_avail_counter =
1861 vq->state.packed.last_avail_counter;
1862 vq_info.packed.last_avail_idx =
1863 vq->state.packed.last_avail_idx;
1864 vq_info.packed.last_used_counter =
1865 vq->state.packed.last_used_counter;
1866 vq_info.packed.last_used_idx =
1867 vq->state.packed.last_used_idx;
1868 } else
1869 vq_info.split.avail_index =
1870 vq->state.split.avail_index;
1871
1872 scoped_guard(spinlock_bh, &vq->ready_lock) {
1873 vq_info.ready = vq->ready;
1874 }
1875
1876 ret = -EFAULT;
1877 if (copy_to_user(argp, &vq_info,
1878 sizeof(struct compat_vduse_vq_info)))
1879 break;
1880
1881 ret = 0;
1882 break;
1883 }
1884 default:
1885 return vduse_dev_ioctl(file, cmd,
1886 (unsigned long)compat_ptr(arg));
1887 }
1888
1889 return ret;
1890 }
1891 #else
1892 #define vduse_dev_compat_ioctl compat_ptr_ioctl
1893 #endif
1894
vduse_dev_release(struct inode * inode,struct file * file)1895 static int vduse_dev_release(struct inode *inode, struct file *file)
1896 {
1897 struct vduse_dev *dev = file->private_data;
1898
1899 mutex_lock(&dev->domain_lock);
1900 for (int i = 0; i < dev->nas; i++)
1901 if (dev->as[i].domain)
1902 vduse_dev_dereg_umem(dev, i, 0,
1903 dev->as[i].domain->bounce_size);
1904 mutex_unlock(&dev->domain_lock);
1905 spin_lock(&dev->msg_lock);
1906 /* Make sure the inflight messages can processed after reconncection */
1907 list_splice_init(&dev->recv_list, &dev->send_list);
1908 spin_unlock(&dev->msg_lock);
1909 dev->connected = false;
1910
1911 return 0;
1912 }
1913
vduse_dev_open(struct inode * inode,struct file * file)1914 static int vduse_dev_open(struct inode *inode, struct file *file)
1915 {
1916 int ret = -EBUSY;
1917 struct vduse_dev *dev;
1918
1919 mutex_lock(&vduse_lock);
1920 dev = idr_find(&vduse_idr, iminor(inode));
1921 if (!dev) {
1922 mutex_unlock(&vduse_lock);
1923 return -ENODEV;
1924 }
1925
1926 mutex_lock(&dev->lock);
1927 if (dev->connected)
1928 goto unlock;
1929
1930 ret = 0;
1931 dev->connected = true;
1932 file->private_data = dev;
1933 unlock:
1934 mutex_unlock(&dev->lock);
1935 mutex_unlock(&vduse_lock);
1936
1937 return ret;
1938 }
1939
1940 static const struct file_operations vduse_dev_fops = {
1941 .owner = THIS_MODULE,
1942 .open = vduse_dev_open,
1943 .release = vduse_dev_release,
1944 .read_iter = vduse_dev_read_iter,
1945 .write_iter = vduse_dev_write_iter,
1946 .poll = vduse_dev_poll,
1947 .unlocked_ioctl = vduse_dev_ioctl,
1948 .compat_ioctl = vduse_dev_compat_ioctl,
1949 .llseek = noop_llseek,
1950 };
1951
irq_cb_affinity_show(struct vduse_virtqueue * vq,char * buf)1952 static ssize_t irq_cb_affinity_show(struct vduse_virtqueue *vq, char *buf)
1953 {
1954 return sprintf(buf, "%*pb\n", cpumask_pr_args(&vq->irq_affinity));
1955 }
1956
irq_cb_affinity_store(struct vduse_virtqueue * vq,const char * buf,size_t count)1957 static ssize_t irq_cb_affinity_store(struct vduse_virtqueue *vq,
1958 const char *buf, size_t count)
1959 {
1960 cpumask_var_t new_value;
1961 int ret;
1962
1963 if (!zalloc_cpumask_var(&new_value, GFP_KERNEL))
1964 return -ENOMEM;
1965
1966 ret = cpumask_parse(buf, new_value);
1967 if (ret)
1968 goto free_mask;
1969
1970 ret = -EINVAL;
1971 if (!cpumask_intersects(new_value, cpu_online_mask))
1972 goto free_mask;
1973
1974 cpumask_copy(&vq->irq_affinity, new_value);
1975 ret = count;
1976 free_mask:
1977 free_cpumask_var(new_value);
1978 return ret;
1979 }
1980
1981 struct vq_sysfs_entry {
1982 struct attribute attr;
1983 ssize_t (*show)(struct vduse_virtqueue *vq, char *buf);
1984 ssize_t (*store)(struct vduse_virtqueue *vq, const char *buf,
1985 size_t count);
1986 };
1987
1988 static struct vq_sysfs_entry irq_cb_affinity_attr = __ATTR_RW(irq_cb_affinity);
1989
1990 static struct attribute *vq_attrs[] = {
1991 &irq_cb_affinity_attr.attr,
1992 NULL,
1993 };
1994 ATTRIBUTE_GROUPS(vq);
1995
vq_attr_show(struct kobject * kobj,struct attribute * attr,char * buf)1996 static ssize_t vq_attr_show(struct kobject *kobj, struct attribute *attr,
1997 char *buf)
1998 {
1999 struct vduse_virtqueue *vq = container_of(kobj,
2000 struct vduse_virtqueue, kobj);
2001 struct vq_sysfs_entry *entry = container_of(attr,
2002 struct vq_sysfs_entry, attr);
2003
2004 if (!entry->show)
2005 return -EIO;
2006
2007 return entry->show(vq, buf);
2008 }
2009
vq_attr_store(struct kobject * kobj,struct attribute * attr,const char * buf,size_t count)2010 static ssize_t vq_attr_store(struct kobject *kobj, struct attribute *attr,
2011 const char *buf, size_t count)
2012 {
2013 struct vduse_virtqueue *vq = container_of(kobj,
2014 struct vduse_virtqueue, kobj);
2015 struct vq_sysfs_entry *entry = container_of(attr,
2016 struct vq_sysfs_entry, attr);
2017
2018 if (!entry->store)
2019 return -EIO;
2020
2021 return entry->store(vq, buf, count);
2022 }
2023
2024 static const struct sysfs_ops vq_sysfs_ops = {
2025 .show = vq_attr_show,
2026 .store = vq_attr_store,
2027 };
2028
vq_release(struct kobject * kobj)2029 static void vq_release(struct kobject *kobj)
2030 {
2031 struct vduse_virtqueue *vq = container_of(kobj,
2032 struct vduse_virtqueue, kobj);
2033 kfree(vq);
2034 }
2035
2036 static const struct kobj_type vq_type = {
2037 .release = vq_release,
2038 .sysfs_ops = &vq_sysfs_ops,
2039 .default_groups = vq_groups,
2040 };
2041
vduse_devnode(const struct device * dev,umode_t * mode)2042 static char *vduse_devnode(const struct device *dev, umode_t *mode)
2043 {
2044 return kasprintf(GFP_KERNEL, "vduse/%s", dev_name(dev));
2045 }
2046
2047 static const struct class vduse_class = {
2048 .name = "vduse",
2049 .devnode = vduse_devnode,
2050 };
2051
vduse_dev_deinit_vqs(struct vduse_dev * dev)2052 static void vduse_dev_deinit_vqs(struct vduse_dev *dev)
2053 {
2054 int i;
2055
2056 if (!dev->vqs)
2057 return;
2058
2059 for (i = 0; i < dev->vq_num; i++)
2060 kobject_put(&dev->vqs[i]->kobj);
2061 kfree(dev->vqs);
2062 }
2063
vduse_dev_init_vqs(struct vduse_dev * dev,u32 vq_align,u32 vq_num)2064 static int vduse_dev_init_vqs(struct vduse_dev *dev, u32 vq_align, u32 vq_num)
2065 {
2066 int ret, i;
2067
2068 dev->vq_align = vq_align;
2069 dev->vq_num = vq_num;
2070 dev->vqs = kzalloc_objs(*dev->vqs, dev->vq_num);
2071 if (!dev->vqs)
2072 return -ENOMEM;
2073
2074 for (i = 0; i < vq_num; i++) {
2075 dev->vqs[i] = kzalloc_obj(*dev->vqs[i]);
2076 if (!dev->vqs[i]) {
2077 ret = -ENOMEM;
2078 goto err;
2079 }
2080
2081 dev->vqs[i]->index = i;
2082 dev->vqs[i]->dev = dev;
2083 dev->vqs[i]->irq_effective_cpu = IRQ_UNBOUND;
2084 INIT_WORK(&dev->vqs[i]->inject, vduse_vq_irq_inject);
2085 INIT_WORK(&dev->vqs[i]->kick, vduse_vq_kick_work);
2086 spin_lock_init(&dev->vqs[i]->kick_lock);
2087 spin_lock_init(&dev->vqs[i]->irq_lock);
2088 spin_lock_init(&dev->vqs[i]->ready_lock);
2089 cpumask_setall(&dev->vqs[i]->irq_affinity);
2090
2091 kobject_init(&dev->vqs[i]->kobj, &vq_type);
2092 ret = kobject_add(&dev->vqs[i]->kobj,
2093 &dev->dev->kobj, "vq%d", i);
2094 if (ret) {
2095 kfree(dev->vqs[i]);
2096 goto err;
2097 }
2098 }
2099
2100 return 0;
2101 err:
2102 while (i--)
2103 kobject_put(&dev->vqs[i]->kobj);
2104 kfree(dev->vqs);
2105 dev->vqs = NULL;
2106 return ret;
2107 }
2108
vduse_dev_create(void)2109 static struct vduse_dev *vduse_dev_create(void)
2110 {
2111 struct vduse_dev *dev = kzalloc_obj(*dev);
2112
2113 if (!dev)
2114 return NULL;
2115
2116 mutex_init(&dev->lock);
2117 mutex_init(&dev->domain_lock);
2118 spin_lock_init(&dev->msg_lock);
2119 INIT_LIST_HEAD(&dev->send_list);
2120 INIT_LIST_HEAD(&dev->recv_list);
2121 spin_lock_init(&dev->irq_lock);
2122 init_rwsem(&dev->rwsem);
2123
2124 INIT_WORK(&dev->inject, vduse_dev_irq_inject);
2125 init_waitqueue_head(&dev->waitq);
2126
2127 return dev;
2128 }
2129
vduse_dev_destroy(struct vduse_dev * dev)2130 static void vduse_dev_destroy(struct vduse_dev *dev)
2131 {
2132 kfree(dev);
2133 }
2134
vduse_find_dev(const char * name)2135 static struct vduse_dev *vduse_find_dev(const char *name)
2136 {
2137 struct vduse_dev *dev;
2138 int id;
2139
2140 idr_for_each_entry(&vduse_idr, dev, id)
2141 if (!strcmp(dev->name, name))
2142 return dev;
2143
2144 return NULL;
2145 }
2146
vduse_destroy_dev(char * name)2147 static int vduse_destroy_dev(char *name)
2148 {
2149 struct vduse_dev *dev = vduse_find_dev(name);
2150
2151 if (!dev)
2152 return -EINVAL;
2153
2154 mutex_lock(&dev->lock);
2155 if (dev->vdev || dev->connected) {
2156 mutex_unlock(&dev->lock);
2157 return -EBUSY;
2158 }
2159 dev->connected = true;
2160 mutex_unlock(&dev->lock);
2161
2162 vduse_dev_reset(dev);
2163 device_destroy(&vduse_class, MKDEV(MAJOR(vduse_major), dev->minor));
2164 idr_remove(&vduse_idr, dev->minor);
2165 kvfree(dev->config);
2166 vduse_dev_deinit_vqs(dev);
2167 for (int i = 0; i < dev->nas; i++) {
2168 if (dev->as[i].domain)
2169 vduse_domain_destroy(dev->as[i].domain);
2170 }
2171 kfree(dev->as);
2172 kfree(dev->name);
2173 kfree(dev->groups);
2174 vduse_dev_destroy(dev);
2175 module_put(THIS_MODULE);
2176
2177 return 0;
2178 }
2179
device_is_allowed(u32 device_id)2180 static bool device_is_allowed(u32 device_id)
2181 {
2182 int i;
2183
2184 for (i = 0; i < ARRAY_SIZE(allowed_device_id); i++)
2185 if (allowed_device_id[i] == device_id)
2186 return true;
2187
2188 return false;
2189 }
2190
features_is_valid(struct vduse_dev_config * config)2191 static bool features_is_valid(struct vduse_dev_config *config)
2192 {
2193 if (!(config->features & BIT_ULL(VIRTIO_F_ACCESS_PLATFORM)))
2194 return false;
2195
2196 /* Now we only support read-only configuration space */
2197 if ((config->device_id == VIRTIO_ID_BLOCK) &&
2198 (config->features & BIT_ULL(VIRTIO_BLK_F_CONFIG_WCE)))
2199 return false;
2200 else if ((config->device_id == VIRTIO_ID_NET) &&
2201 (config->features & BIT_ULL(VIRTIO_NET_F_CTRL_VQ)))
2202 return false;
2203
2204 if ((config->device_id == VIRTIO_ID_NET) &&
2205 !(config->features & BIT_ULL(VIRTIO_F_VERSION_1)))
2206 return false;
2207
2208 return true;
2209 }
2210
vduse_validate_config(struct vduse_dev_config * config,u64 api_version)2211 static bool vduse_validate_config(struct vduse_dev_config *config,
2212 u64 api_version)
2213 {
2214 if (!is_mem_zero((const char *)config->reserved,
2215 sizeof(config->reserved)))
2216 return false;
2217
2218 if (api_version < VDUSE_API_VERSION_1 &&
2219 (config->ngroups || config->nas))
2220 return false;
2221
2222 if (api_version >= VDUSE_API_VERSION_1) {
2223 if (!config->ngroups || config->ngroups > VDUSE_DEV_MAX_GROUPS)
2224 return false;
2225
2226 if (!config->nas || config->nas > VDUSE_DEV_MAX_AS)
2227 return false;
2228 }
2229
2230 if (config->vq_align < VRING_USED_ALIGN_SIZE ||
2231 !is_power_of_2(config->vq_align) ||
2232 config->vq_align > PAGE_SIZE)
2233 return false;
2234
2235 if (config->config_size > PAGE_SIZE)
2236 return false;
2237
2238 if (config->vq_num > 0xffff)
2239 return false;
2240
2241 if (!config->name[0])
2242 return false;
2243
2244 if (!device_is_allowed(config->device_id))
2245 return false;
2246
2247 if (!features_is_valid(config))
2248 return false;
2249
2250 return true;
2251 }
2252
msg_timeout_show(struct device * device,struct device_attribute * attr,char * buf)2253 static ssize_t msg_timeout_show(struct device *device,
2254 struct device_attribute *attr, char *buf)
2255 {
2256 struct vduse_dev *dev = dev_get_drvdata(device);
2257
2258 return sysfs_emit(buf, "%u\n", dev->msg_timeout);
2259 }
2260
msg_timeout_store(struct device * device,struct device_attribute * attr,const char * buf,size_t count)2261 static ssize_t msg_timeout_store(struct device *device,
2262 struct device_attribute *attr,
2263 const char *buf, size_t count)
2264 {
2265 struct vduse_dev *dev = dev_get_drvdata(device);
2266 int ret;
2267
2268 ret = kstrtouint(buf, 10, &dev->msg_timeout);
2269 if (ret < 0)
2270 return ret;
2271
2272 return count;
2273 }
2274
2275 static DEVICE_ATTR_RW(msg_timeout);
2276
bounce_size_show(struct device * device,struct device_attribute * attr,char * buf)2277 static ssize_t bounce_size_show(struct device *device,
2278 struct device_attribute *attr, char *buf)
2279 {
2280 struct vduse_dev *dev = dev_get_drvdata(device);
2281
2282 return sysfs_emit(buf, "%u\n", dev->bounce_size);
2283 }
2284
bounce_size_store(struct device * device,struct device_attribute * attr,const char * buf,size_t count)2285 static ssize_t bounce_size_store(struct device *device,
2286 struct device_attribute *attr,
2287 const char *buf, size_t count)
2288 {
2289 struct vduse_dev *dev = dev_get_drvdata(device);
2290 unsigned int bounce_size;
2291 int ret;
2292
2293 ret = -EPERM;
2294 mutex_lock(&dev->domain_lock);
2295 /* Assuming that if the first domain is allocated, all are allocated */
2296 if (dev->as[0].domain)
2297 goto unlock;
2298
2299 ret = kstrtouint(buf, 10, &bounce_size);
2300 if (ret < 0)
2301 goto unlock;
2302
2303 ret = -EINVAL;
2304 if (bounce_size > VDUSE_MAX_BOUNCE_SIZE ||
2305 bounce_size < VDUSE_MIN_BOUNCE_SIZE)
2306 goto unlock;
2307
2308 dev->bounce_size = bounce_size & PAGE_MASK;
2309 ret = count;
2310 unlock:
2311 mutex_unlock(&dev->domain_lock);
2312 return ret;
2313 }
2314
2315 static DEVICE_ATTR_RW(bounce_size);
2316
2317 static struct attribute *vduse_dev_attrs[] = {
2318 &dev_attr_msg_timeout.attr,
2319 &dev_attr_bounce_size.attr,
2320 NULL
2321 };
2322
2323 ATTRIBUTE_GROUPS(vduse_dev);
2324
vduse_create_dev(struct vduse_dev_config * config,void * config_buf,u64 api_version,uint64_t vduse_features)2325 static int vduse_create_dev(struct vduse_dev_config *config,
2326 void *config_buf, u64 api_version,
2327 uint64_t vduse_features)
2328 {
2329 int ret;
2330 struct vduse_dev *dev;
2331
2332 ret = -EPERM;
2333 if ((config->device_id == VIRTIO_ID_NET) && !capable(CAP_NET_ADMIN))
2334 goto err;
2335
2336 ret = -EEXIST;
2337 if (vduse_find_dev(config->name))
2338 goto err;
2339
2340 ret = -ENOMEM;
2341 dev = vduse_dev_create();
2342 if (!dev)
2343 goto err;
2344
2345 dev->api_version = api_version;
2346 dev->device_features = config->features;
2347 dev->device_id = config->device_id;
2348 dev->vendor_id = config->vendor_id;
2349 dev->vduse_features = vduse_features;
2350 dev_dbg(vduse_ctrl_dev, "Creating device %s with features 0x%llx",
2351 config->name, vduse_features);
2352
2353 dev->nas = (dev->api_version < VDUSE_API_VERSION_1) ? 1 : config->nas;
2354 dev->as = kzalloc_objs(dev->as[0], dev->nas);
2355 if (!dev->as)
2356 goto err_as;
2357 for (int i = 0; i < dev->nas; i++)
2358 mutex_init(&dev->as[i].mem_lock);
2359
2360 dev->ngroups = (dev->api_version < VDUSE_API_VERSION_1)
2361 ? 1
2362 : config->ngroups;
2363 dev->groups = kzalloc_objs(dev->groups[0], dev->ngroups);
2364 if (!dev->groups)
2365 goto err_vq_groups;
2366 for (u32 i = 0; i < dev->ngroups; ++i) {
2367 dev->groups[i].dev = dev;
2368 rwlock_init(&dev->groups[i].as_lock);
2369 dev->groups[i].as = &dev->as[0];
2370 }
2371
2372 dev->name = kstrdup(config->name, GFP_KERNEL);
2373 if (!dev->name)
2374 goto err_str;
2375
2376 dev->bounce_size = VDUSE_BOUNCE_SIZE;
2377 dev->config = config_buf;
2378 dev->config_size = config->config_size;
2379
2380 ret = idr_alloc(&vduse_idr, dev, 1, VDUSE_DEV_MAX, GFP_KERNEL);
2381 if (ret < 0)
2382 goto err_idr;
2383
2384 dev->minor = ret;
2385 dev->msg_timeout = VDUSE_MSG_DEFAULT_TIMEOUT;
2386 dev->dev = device_create_with_groups(&vduse_class, NULL,
2387 MKDEV(MAJOR(vduse_major), dev->minor),
2388 dev, vduse_dev_groups, "%s", config->name);
2389 if (IS_ERR(dev->dev)) {
2390 ret = PTR_ERR(dev->dev);
2391 goto err_dev;
2392 }
2393
2394 ret = vduse_dev_init_vqs(dev, config->vq_align, config->vq_num);
2395 if (ret)
2396 goto err_vqs;
2397
2398 __module_get(THIS_MODULE);
2399
2400 return 0;
2401 err_vqs:
2402 device_destroy(&vduse_class, MKDEV(MAJOR(vduse_major), dev->minor));
2403 err_dev:
2404 idr_remove(&vduse_idr, dev->minor);
2405 err_idr:
2406 kfree(dev->name);
2407 err_str:
2408 kfree(dev->groups);
2409 err_vq_groups:
2410 kfree(dev->as);
2411 err_as:
2412 vduse_dev_destroy(dev);
2413 err:
2414 return ret;
2415 }
2416
vduse_ioctl(struct file * file,unsigned int cmd,unsigned long arg)2417 static long vduse_ioctl(struct file *file, unsigned int cmd,
2418 unsigned long arg)
2419 {
2420 int ret;
2421 void __user *argp = (void __user *)arg;
2422 struct vduse_control *control = file->private_data;
2423
2424 mutex_lock(&vduse_lock);
2425 switch (cmd) {
2426 case VDUSE_GET_API_VERSION:
2427 if (control->api_version == VDUSE_API_VERSION_NOT_ASKED)
2428 control->api_version = VDUSE_API_VERSION_1;
2429 ret = put_user(control->api_version, (u64 __user *)argp);
2430 break;
2431 case VDUSE_SET_API_VERSION: {
2432 u64 api_version;
2433
2434 ret = -EFAULT;
2435 if (get_user(api_version, (u64 __user *)argp))
2436 break;
2437
2438 ret = -EINVAL;
2439 if (api_version > VDUSE_API_VERSION_1)
2440 break;
2441
2442 ret = 0;
2443 control->api_version = api_version;
2444 break;
2445 }
2446 case VDUSE_CREATE_DEV: {
2447 struct vduse_dev_config config;
2448 unsigned long size = offsetof(struct vduse_dev_config, config);
2449 void *buf;
2450
2451 ret = -EFAULT;
2452 if (copy_from_user(&config, argp, size))
2453 break;
2454
2455 ret = -EINVAL;
2456 if (control->api_version == VDUSE_API_VERSION_NOT_ASKED)
2457 control->api_version = VDUSE_API_VERSION;
2458 if (!vduse_validate_config(&config, control->api_version))
2459 break;
2460
2461 buf = vmemdup_user(argp + size, config.config_size);
2462 if (IS_ERR(buf)) {
2463 ret = PTR_ERR(buf);
2464 break;
2465 }
2466 config.name[VDUSE_NAME_MAX - 1] = '\0';
2467 ret = vduse_create_dev(&config, buf, control->api_version,
2468 control->vduse_features);
2469 if (ret)
2470 kvfree(buf);
2471 break;
2472 }
2473 case VDUSE_DESTROY_DEV: {
2474 char name[VDUSE_NAME_MAX];
2475
2476 ret = -EFAULT;
2477 if (copy_from_user(name, argp, VDUSE_NAME_MAX))
2478 break;
2479
2480 name[VDUSE_NAME_MAX - 1] = '\0';
2481 ret = vduse_destroy_dev(name);
2482 break;
2483 }
2484 case VDUSE_GET_FEATURES:
2485 ret = put_user(vduse_features, (u64 __user *)argp);
2486 break;
2487 case VDUSE_SET_FEATURES: {
2488 u64 features;
2489
2490 ret = -EFAULT;
2491 if (get_user(features, (u64 __user *)argp)) {
2492 dev_dbg(vduse_ctrl_dev, "Could not get vduse features");
2493 break;
2494 }
2495
2496 ret = -EINVAL;
2497 if (features & ~vduse_features) {
2498 dev_dbg(vduse_ctrl_dev,
2499 "Invalid features in %llx, expected %llx",
2500 features, vduse_features);
2501 break;
2502 }
2503
2504 ret = 0;
2505 control->vduse_features = features;
2506 dev_dbg(vduse_ctrl_dev, "Set features %llx", features);
2507
2508 break;
2509 }
2510 default:
2511 ret = -EINVAL;
2512 break;
2513 }
2514 mutex_unlock(&vduse_lock);
2515
2516 return ret;
2517 }
2518
vduse_release(struct inode * inode,struct file * file)2519 static int vduse_release(struct inode *inode, struct file *file)
2520 {
2521 struct vduse_control *control = file->private_data;
2522
2523 kfree(control);
2524 return 0;
2525 }
2526
vduse_open(struct inode * inode,struct file * file)2527 static int vduse_open(struct inode *inode, struct file *file)
2528 {
2529 struct vduse_control *control;
2530
2531 control = kmalloc_obj(struct vduse_control);
2532 if (!control)
2533 return -ENOMEM;
2534
2535 control->api_version = VDUSE_API_VERSION_NOT_ASKED;
2536 control->vduse_features = 0;
2537 file->private_data = control;
2538
2539 return 0;
2540 }
2541
2542 static const struct file_operations vduse_ctrl_fops = {
2543 .owner = THIS_MODULE,
2544 .open = vduse_open,
2545 .release = vduse_release,
2546 .unlocked_ioctl = vduse_ioctl,
2547 .compat_ioctl = compat_ptr_ioctl,
2548 .llseek = noop_llseek,
2549 };
2550
2551 struct vduse_mgmt_dev {
2552 struct vdpa_mgmt_dev mgmt_dev;
2553 struct device dev;
2554 };
2555
2556 static struct vduse_mgmt_dev *vduse_mgmt;
2557
vduse_dev_init_vdpa(struct vduse_dev * dev,const char * name)2558 static int vduse_dev_init_vdpa(struct vduse_dev *dev, const char *name)
2559 {
2560 struct vduse_vdpa *vdev;
2561 const struct vdpa_config_ops *ops;
2562
2563 if (dev->vdev)
2564 return -EEXIST;
2565
2566 if (dev->vduse_features & BIT_U64(VDUSE_F_SUSPEND))
2567 ops = &vduse_vdpa_config_ops_with_suspend;
2568 else
2569 ops = &vduse_vdpa_config_ops;
2570
2571 vdev = vdpa_alloc_device(struct vduse_vdpa, vdpa, dev->dev,
2572 ops, &vduse_map_ops,
2573 dev->ngroups, dev->nas, name, true);
2574 if (IS_ERR(vdev))
2575 return PTR_ERR(vdev);
2576
2577 dev->vdev = vdev;
2578 vdev->dev = dev;
2579 vdev->vdpa.mdev = &vduse_mgmt->mgmt_dev;
2580
2581 return 0;
2582 }
2583
vdpa_dev_add(struct vdpa_mgmt_dev * mdev,const char * name,const struct vdpa_dev_set_config * config)2584 static int vdpa_dev_add(struct vdpa_mgmt_dev *mdev, const char *name,
2585 const struct vdpa_dev_set_config *config)
2586 {
2587 struct vduse_dev *dev;
2588 size_t domain_bounce_size;
2589 int ret, i;
2590
2591 mutex_lock(&vduse_lock);
2592 dev = vduse_find_dev(name);
2593 if (!dev || !vduse_dev_is_ready(dev)) {
2594 mutex_unlock(&vduse_lock);
2595 return -EINVAL;
2596 }
2597 ret = vduse_dev_init_vdpa(dev, name);
2598 mutex_unlock(&vduse_lock);
2599 if (ret)
2600 return ret;
2601
2602 mutex_lock(&dev->domain_lock);
2603 ret = 0;
2604
2605 domain_bounce_size = dev->bounce_size / dev->nas;
2606 for (i = 0; i < dev->nas; ++i) {
2607 dev->as[i].domain = vduse_domain_create(VDUSE_IOVA_SIZE - 1,
2608 domain_bounce_size);
2609 if (!dev->as[i].domain) {
2610 ret = -ENOMEM;
2611 goto err;
2612 }
2613 }
2614
2615 mutex_unlock(&dev->domain_lock);
2616
2617 ret = _vdpa_register_device(&dev->vdev->vdpa, dev->vq_num);
2618 if (ret)
2619 goto err_register;
2620
2621 return 0;
2622
2623 err_register:
2624 mutex_lock(&dev->domain_lock);
2625
2626 err:
2627 for (int j = 0; j < i; j++) {
2628 if (dev->as[j].domain) {
2629 vduse_domain_destroy(dev->as[j].domain);
2630 dev->as[j].domain = NULL;
2631 }
2632 }
2633 mutex_unlock(&dev->domain_lock);
2634
2635 put_device(&dev->vdev->vdpa.dev);
2636
2637 return ret;
2638 }
2639
vdpa_dev_del(struct vdpa_mgmt_dev * mdev,struct vdpa_device * dev)2640 static void vdpa_dev_del(struct vdpa_mgmt_dev *mdev, struct vdpa_device *dev)
2641 {
2642 _vdpa_unregister_device(dev);
2643 }
2644
2645 static const struct vdpa_mgmtdev_ops vdpa_dev_mgmtdev_ops = {
2646 .dev_add = vdpa_dev_add,
2647 .dev_del = vdpa_dev_del,
2648 };
2649
2650 static struct virtio_device_id id_table[] = {
2651 { VIRTIO_ID_BLOCK, VIRTIO_DEV_ANY_ID },
2652 { VIRTIO_ID_NET, VIRTIO_DEV_ANY_ID },
2653 { 0 },
2654 };
2655
vduse_mgmtdev_release(struct device * dev)2656 static void vduse_mgmtdev_release(struct device *dev)
2657 {
2658 struct vduse_mgmt_dev *mgmt_dev;
2659
2660 mgmt_dev = container_of(dev, struct vduse_mgmt_dev, dev);
2661 kfree(mgmt_dev);
2662 }
2663
vduse_mgmtdev_init(void)2664 static int vduse_mgmtdev_init(void)
2665 {
2666 int ret;
2667
2668 vduse_mgmt = kzalloc_obj(*vduse_mgmt);
2669 if (!vduse_mgmt)
2670 return -ENOMEM;
2671
2672 ret = dev_set_name(&vduse_mgmt->dev, "vduse");
2673 if (ret) {
2674 kfree(vduse_mgmt);
2675 return ret;
2676 }
2677
2678 vduse_mgmt->dev.release = vduse_mgmtdev_release;
2679
2680 ret = device_register(&vduse_mgmt->dev);
2681 if (ret)
2682 goto dev_reg_err;
2683
2684 vduse_mgmt->mgmt_dev.id_table = id_table;
2685 vduse_mgmt->mgmt_dev.ops = &vdpa_dev_mgmtdev_ops;
2686 vduse_mgmt->mgmt_dev.device = &vduse_mgmt->dev;
2687 ret = vdpa_mgmtdev_register(&vduse_mgmt->mgmt_dev);
2688 if (ret)
2689 device_unregister(&vduse_mgmt->dev);
2690
2691 return ret;
2692
2693 dev_reg_err:
2694 put_device(&vduse_mgmt->dev);
2695 return ret;
2696 }
2697
vduse_mgmtdev_exit(void)2698 static void vduse_mgmtdev_exit(void)
2699 {
2700 vdpa_mgmtdev_unregister(&vduse_mgmt->mgmt_dev);
2701 device_unregister(&vduse_mgmt->dev);
2702 }
2703
vduse_init(void)2704 static int vduse_init(void)
2705 {
2706 int ret;
2707
2708 ret = class_register(&vduse_class);
2709 if (ret)
2710 return ret;
2711
2712 ret = alloc_chrdev_region(&vduse_major, 0, VDUSE_DEV_MAX, "vduse");
2713 if (ret)
2714 goto err_chardev_region;
2715
2716 /* /dev/vduse/control */
2717 cdev_init(&vduse_ctrl_cdev, &vduse_ctrl_fops);
2718 vduse_ctrl_cdev.owner = THIS_MODULE;
2719 ret = cdev_add(&vduse_ctrl_cdev, vduse_major, 1);
2720 if (ret)
2721 goto err_ctrl_cdev;
2722
2723 vduse_ctrl_dev = device_create(&vduse_class, NULL, vduse_major, NULL, "control");
2724 if (IS_ERR(vduse_ctrl_dev)) {
2725 ret = PTR_ERR(vduse_ctrl_dev);
2726 vduse_ctrl_dev = NULL;
2727 goto err_device;
2728 }
2729
2730 /* /dev/vduse/$DEVICE */
2731 cdev_init(&vduse_cdev, &vduse_dev_fops);
2732 vduse_cdev.owner = THIS_MODULE;
2733 ret = cdev_add(&vduse_cdev, MKDEV(MAJOR(vduse_major), 1),
2734 VDUSE_DEV_MAX - 1);
2735 if (ret)
2736 goto err_cdev;
2737
2738 ret = -ENOMEM;
2739 vduse_irq_wq = alloc_workqueue("vduse-irq",
2740 WQ_HIGHPRI | WQ_SYSFS | WQ_UNBOUND, 0);
2741 if (!vduse_irq_wq)
2742 goto err_wq;
2743
2744 vduse_irq_bound_wq = alloc_workqueue("vduse-irq-bound",
2745 WQ_HIGHPRI | WQ_PERCPU, 0);
2746 if (!vduse_irq_bound_wq)
2747 goto err_bound_wq;
2748
2749 ret = vduse_domain_init();
2750 if (ret)
2751 goto err_domain;
2752
2753 ret = vduse_mgmtdev_init();
2754 if (ret)
2755 goto err_mgmtdev;
2756
2757 return 0;
2758 err_mgmtdev:
2759 vduse_domain_exit();
2760 err_domain:
2761 destroy_workqueue(vduse_irq_bound_wq);
2762 err_bound_wq:
2763 destroy_workqueue(vduse_irq_wq);
2764 err_wq:
2765 cdev_del(&vduse_cdev);
2766 err_cdev:
2767 device_destroy(&vduse_class, vduse_major);
2768 err_device:
2769 cdev_del(&vduse_ctrl_cdev);
2770 err_ctrl_cdev:
2771 unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX);
2772 err_chardev_region:
2773 class_unregister(&vduse_class);
2774 return ret;
2775 }
2776 module_init(vduse_init);
2777
vduse_exit(void)2778 static void vduse_exit(void)
2779 {
2780 vduse_mgmtdev_exit();
2781 vduse_domain_exit();
2782 destroy_workqueue(vduse_irq_bound_wq);
2783 destroy_workqueue(vduse_irq_wq);
2784 cdev_del(&vduse_cdev);
2785 device_destroy(&vduse_class, vduse_major);
2786 cdev_del(&vduse_ctrl_cdev);
2787 unregister_chrdev_region(vduse_major, VDUSE_DEV_MAX);
2788 class_unregister(&vduse_class);
2789 idr_destroy(&vduse_idr);
2790 }
2791 module_exit(vduse_exit);
2792
2793 MODULE_LICENSE(DRV_LICENSE);
2794 MODULE_AUTHOR(DRV_AUTHOR);
2795 MODULE_DESCRIPTION(DRV_DESC);
2796