1 // SPDX-License-Identifier: GPL-2.0-or-later 2 /* 3 * Virtio vhost-user driver 4 * 5 * Copyright(c) 2019 Intel Corporation 6 * 7 * This driver allows virtio devices to be used over a vhost-user socket. 8 * 9 * Guest devices can be instantiated by kernel module or command line 10 * parameters. One device will be created for each parameter. Syntax: 11 * 12 * virtio_uml.device=<socket>:<virtio_id>[:<platform_id>] 13 * where: 14 * <socket> := vhost-user socket path to connect 15 * <virtio_id> := virtio device id (as in virtio_ids.h) 16 * <platform_id> := (optional) platform device id 17 * 18 * example: 19 * virtio_uml.device=/var/uml.socket:1 20 * 21 * Based on Virtio MMIO driver by Pawel Moll, copyright 2011-2014, ARM Ltd. 22 */ 23 #include <linux/module.h> 24 #include <linux/of.h> 25 #include <linux/platform_device.h> 26 #include <linux/slab.h> 27 #include <linux/virtio.h> 28 #include <linux/virtio_config.h> 29 #include <linux/virtio_ring.h> 30 #include <linux/time-internal.h> 31 #include <linux/virtio-uml.h> 32 #include <shared/as-layout.h> 33 #include <irq_kern.h> 34 #include <init.h> 35 #include <os.h> 36 #include "vhost_user.h" 37 38 #define MAX_SUPPORTED_QUEUE_SIZE 256 39 40 #define to_virtio_uml_device(_vdev) \ 41 container_of(_vdev, struct virtio_uml_device, vdev) 42 43 struct virtio_uml_platform_data { 44 u32 virtio_device_id; 45 const char *socket_path; 46 struct work_struct conn_broken_wk; 47 struct platform_device *pdev; 48 }; 49 50 struct virtio_uml_device { 51 struct virtio_device vdev; 52 struct platform_device *pdev; 53 struct virtio_uml_platform_data *pdata; 54 55 spinlock_t sock_lock; 56 int sock, req_fd, irq; 57 u64 features; 58 u64 protocol_features; 59 u8 status; 60 u8 registered:1; 61 u8 suspended:1; 62 u8 no_vq_suspend:1; 63 64 u8 config_changed_irq:1; 65 uint64_t vq_irq_vq_map; 66 }; 67 68 struct virtio_uml_vq_info { 69 int kick_fd, call_fd; 70 char name[32]; 71 bool suspended; 72 }; 73 74 extern unsigned long long physmem_size, highmem; 75 76 #define vu_err(vu_dev, ...) dev_err(&(vu_dev)->pdev->dev, ##__VA_ARGS__) 77 78 /* Vhost-user protocol */ 79 80 static int full_sendmsg_fds(int fd, const void *buf, unsigned int len, 81 const int *fds, unsigned int fds_num) 82 { 83 int rc; 84 85 do { 86 rc = os_sendmsg_fds(fd, buf, len, fds, fds_num); 87 if (rc > 0) { 88 buf += rc; 89 len -= rc; 90 fds = NULL; 91 fds_num = 0; 92 } 93 } while (len && (rc >= 0 || rc == -EINTR)); 94 95 if (rc < 0) 96 return rc; 97 return 0; 98 } 99 100 static int full_read(int fd, void *buf, int len, bool abortable) 101 { 102 int rc; 103 104 if (!len) 105 return 0; 106 107 do { 108 rc = os_read_file(fd, buf, len); 109 if (rc > 0) { 110 buf += rc; 111 len -= rc; 112 } 113 } while (len && (rc > 0 || rc == -EINTR || (!abortable && rc == -EAGAIN))); 114 115 if (rc < 0) 116 return rc; 117 if (rc == 0) 118 return -ECONNRESET; 119 return 0; 120 } 121 122 static int vhost_user_recv_header(int fd, struct vhost_user_msg *msg) 123 { 124 return full_read(fd, msg, sizeof(msg->header), true); 125 } 126 127 static int vhost_user_recv(struct virtio_uml_device *vu_dev, 128 int fd, struct vhost_user_msg *msg, 129 size_t max_payload_size, bool wait) 130 { 131 size_t size; 132 int rc; 133 134 /* 135 * In virtio time-travel mode, we're handling all the vhost-user 136 * FDs by polling them whenever appropriate. However, we may get 137 * into a situation where we're sending out an interrupt message 138 * to a device (e.g. a net device) and need to handle a simulation 139 * time message while doing so, e.g. one that tells us to update 140 * our idea of how long we can run without scheduling. 141 * 142 * Thus, we need to not just read() from the given fd, but need 143 * to also handle messages for the simulation time - this function 144 * does that for us while waiting for the given fd to be readable. 145 */ 146 if (wait) 147 time_travel_wait_readable(fd); 148 149 rc = vhost_user_recv_header(fd, msg); 150 151 if (rc == -ECONNRESET && vu_dev->registered) { 152 struct virtio_uml_platform_data *pdata; 153 154 pdata = vu_dev->pdata; 155 156 virtio_break_device(&vu_dev->vdev); 157 schedule_work(&pdata->conn_broken_wk); 158 } 159 if (rc) 160 return rc; 161 size = msg->header.size; 162 if (size > max_payload_size) 163 return -EPROTO; 164 return full_read(fd, &msg->payload, size, false); 165 } 166 167 static int vhost_user_recv_resp(struct virtio_uml_device *vu_dev, 168 struct vhost_user_msg *msg, 169 size_t max_payload_size) 170 { 171 int rc = vhost_user_recv(vu_dev, vu_dev->sock, msg, 172 max_payload_size, true); 173 174 if (rc) 175 return rc; 176 177 if (msg->header.flags != (VHOST_USER_FLAG_REPLY | VHOST_USER_VERSION)) 178 return -EPROTO; 179 180 return 0; 181 } 182 183 static int vhost_user_recv_u64(struct virtio_uml_device *vu_dev, 184 u64 *value) 185 { 186 struct vhost_user_msg msg; 187 int rc = vhost_user_recv_resp(vu_dev, &msg, 188 sizeof(msg.payload.integer)); 189 190 if (rc) 191 return rc; 192 if (msg.header.size != sizeof(msg.payload.integer)) 193 return -EPROTO; 194 *value = msg.payload.integer; 195 return 0; 196 } 197 198 static int vhost_user_recv_req(struct virtio_uml_device *vu_dev, 199 struct vhost_user_msg *msg, 200 size_t max_payload_size) 201 { 202 int rc = vhost_user_recv(vu_dev, vu_dev->req_fd, msg, 203 max_payload_size, false); 204 205 if (rc) 206 return rc; 207 208 if ((msg->header.flags & ~VHOST_USER_FLAG_NEED_REPLY) != 209 VHOST_USER_VERSION) 210 return -EPROTO; 211 212 return 0; 213 } 214 215 static int vhost_user_send(struct virtio_uml_device *vu_dev, 216 bool need_response, struct vhost_user_msg *msg, 217 int *fds, size_t num_fds) 218 { 219 size_t size = sizeof(msg->header) + msg->header.size; 220 unsigned long flags; 221 bool request_ack; 222 int rc; 223 224 msg->header.flags |= VHOST_USER_VERSION; 225 226 /* 227 * The need_response flag indicates that we already need a response, 228 * e.g. to read the features. In these cases, don't request an ACK as 229 * it is meaningless. Also request an ACK only if supported. 230 */ 231 request_ack = !need_response; 232 if (!(vu_dev->protocol_features & 233 BIT_ULL(VHOST_USER_PROTOCOL_F_REPLY_ACK))) 234 request_ack = false; 235 236 if (request_ack) 237 msg->header.flags |= VHOST_USER_FLAG_NEED_REPLY; 238 239 spin_lock_irqsave(&vu_dev->sock_lock, flags); 240 rc = full_sendmsg_fds(vu_dev->sock, msg, size, fds, num_fds); 241 if (rc < 0) 242 goto out; 243 244 if (request_ack) { 245 uint64_t status; 246 247 rc = vhost_user_recv_u64(vu_dev, &status); 248 if (rc) 249 goto out; 250 251 if (status) { 252 vu_err(vu_dev, "slave reports error: %llu\n", status); 253 rc = -EIO; 254 goto out; 255 } 256 } 257 258 out: 259 spin_unlock_irqrestore(&vu_dev->sock_lock, flags); 260 return rc; 261 } 262 263 static int vhost_user_send_no_payload(struct virtio_uml_device *vu_dev, 264 bool need_response, u32 request) 265 { 266 struct vhost_user_msg msg = { 267 .header.request = request, 268 }; 269 270 return vhost_user_send(vu_dev, need_response, &msg, NULL, 0); 271 } 272 273 static int vhost_user_send_no_payload_fd(struct virtio_uml_device *vu_dev, 274 u32 request, int fd) 275 { 276 struct vhost_user_msg msg = { 277 .header.request = request, 278 }; 279 280 return vhost_user_send(vu_dev, false, &msg, &fd, 1); 281 } 282 283 static int vhost_user_send_u64(struct virtio_uml_device *vu_dev, 284 u32 request, u64 value) 285 { 286 struct vhost_user_msg msg = { 287 .header.request = request, 288 .header.size = sizeof(msg.payload.integer), 289 .payload.integer = value, 290 }; 291 292 return vhost_user_send(vu_dev, false, &msg, NULL, 0); 293 } 294 295 static int vhost_user_set_owner(struct virtio_uml_device *vu_dev) 296 { 297 return vhost_user_send_no_payload(vu_dev, false, VHOST_USER_SET_OWNER); 298 } 299 300 static int vhost_user_get_features(struct virtio_uml_device *vu_dev, 301 u64 *features) 302 { 303 int rc = vhost_user_send_no_payload(vu_dev, true, 304 VHOST_USER_GET_FEATURES); 305 306 if (rc) 307 return rc; 308 return vhost_user_recv_u64(vu_dev, features); 309 } 310 311 static int vhost_user_set_features(struct virtio_uml_device *vu_dev, 312 u64 features) 313 { 314 return vhost_user_send_u64(vu_dev, VHOST_USER_SET_FEATURES, features); 315 } 316 317 static int vhost_user_get_protocol_features(struct virtio_uml_device *vu_dev, 318 u64 *protocol_features) 319 { 320 int rc = vhost_user_send_no_payload(vu_dev, true, 321 VHOST_USER_GET_PROTOCOL_FEATURES); 322 323 if (rc) 324 return rc; 325 return vhost_user_recv_u64(vu_dev, protocol_features); 326 } 327 328 static int vhost_user_set_protocol_features(struct virtio_uml_device *vu_dev, 329 u64 protocol_features) 330 { 331 return vhost_user_send_u64(vu_dev, VHOST_USER_SET_PROTOCOL_FEATURES, 332 protocol_features); 333 } 334 335 static void vhost_user_reply(struct virtio_uml_device *vu_dev, 336 struct vhost_user_msg *msg, int response) 337 { 338 struct vhost_user_msg reply = { 339 .payload.integer = response, 340 }; 341 size_t size = sizeof(reply.header) + sizeof(reply.payload.integer); 342 int rc; 343 344 reply.header = msg->header; 345 reply.header.flags &= ~VHOST_USER_FLAG_NEED_REPLY; 346 reply.header.flags |= VHOST_USER_FLAG_REPLY; 347 reply.header.size = sizeof(reply.payload.integer); 348 349 rc = full_sendmsg_fds(vu_dev->req_fd, &reply, size, NULL, 0); 350 351 if (rc) 352 vu_err(vu_dev, 353 "sending reply to slave request failed: %d (size %zu)\n", 354 rc, size); 355 } 356 357 static irqreturn_t vu_req_read_message(struct virtio_uml_device *vu_dev, 358 struct time_travel_event *ev) 359 { 360 struct virtqueue *vq; 361 int response = 1; 362 struct { 363 struct vhost_user_msg msg; 364 u8 extra_payload[512]; 365 } msg; 366 int rc; 367 368 rc = vhost_user_recv_req(vu_dev, &msg.msg, 369 sizeof(msg.msg.payload) + 370 sizeof(msg.extra_payload)); 371 372 if (rc) 373 return IRQ_NONE; 374 375 switch (msg.msg.header.request) { 376 case VHOST_USER_SLAVE_CONFIG_CHANGE_MSG: 377 vu_dev->config_changed_irq = true; 378 response = 0; 379 break; 380 case VHOST_USER_SLAVE_VRING_CALL: 381 virtio_device_for_each_vq((&vu_dev->vdev), vq) { 382 if (vq->index == msg.msg.payload.vring_state.index) { 383 response = 0; 384 vu_dev->vq_irq_vq_map |= BIT_ULL(vq->index); 385 break; 386 } 387 } 388 break; 389 case VHOST_USER_SLAVE_IOTLB_MSG: 390 /* not supported - VIRTIO_F_ACCESS_PLATFORM */ 391 case VHOST_USER_SLAVE_VRING_HOST_NOTIFIER_MSG: 392 /* not supported - VHOST_USER_PROTOCOL_F_HOST_NOTIFIER */ 393 default: 394 vu_err(vu_dev, "unexpected slave request %d\n", 395 msg.msg.header.request); 396 } 397 398 if (ev && !vu_dev->suspended) 399 time_travel_add_irq_event(ev); 400 401 if (msg.msg.header.flags & VHOST_USER_FLAG_NEED_REPLY) 402 vhost_user_reply(vu_dev, &msg.msg, response); 403 404 return IRQ_HANDLED; 405 } 406 407 static irqreturn_t vu_req_interrupt(int irq, void *data) 408 { 409 struct virtio_uml_device *vu_dev = data; 410 irqreturn_t ret = IRQ_HANDLED; 411 412 if (!um_irq_timetravel_handler_used()) 413 ret = vu_req_read_message(vu_dev, NULL); 414 415 if (vu_dev->vq_irq_vq_map) { 416 struct virtqueue *vq; 417 418 virtio_device_for_each_vq((&vu_dev->vdev), vq) { 419 if (vu_dev->vq_irq_vq_map & BIT_ULL(vq->index)) 420 vring_interrupt(0 /* ignored */, vq); 421 } 422 vu_dev->vq_irq_vq_map = 0; 423 } else if (vu_dev->config_changed_irq) { 424 virtio_config_changed(&vu_dev->vdev); 425 vu_dev->config_changed_irq = false; 426 } 427 428 return ret; 429 } 430 431 static void vu_req_interrupt_comm_handler(int irq, int fd, void *data, 432 struct time_travel_event *ev) 433 { 434 vu_req_read_message(data, ev); 435 } 436 437 static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev) 438 { 439 int rc, req_fds[2]; 440 441 /* Use a pipe for slave req fd, SIGIO is not supported for eventfd */ 442 rc = os_pipe(req_fds, true, true); 443 if (rc < 0) 444 return rc; 445 vu_dev->req_fd = req_fds[0]; 446 447 rc = um_request_irq_tt(UM_IRQ_ALLOC, vu_dev->req_fd, IRQ_READ, 448 vu_req_interrupt, IRQF_SHARED, 449 vu_dev->pdev->name, vu_dev, 450 vu_req_interrupt_comm_handler); 451 if (rc < 0) 452 goto err_close; 453 454 vu_dev->irq = rc; 455 456 rc = vhost_user_send_no_payload_fd(vu_dev, VHOST_USER_SET_SLAVE_REQ_FD, 457 req_fds[1]); 458 if (rc) 459 goto err_free_irq; 460 461 goto out; 462 463 err_free_irq: 464 um_free_irq(vu_dev->irq, vu_dev); 465 err_close: 466 os_close_file(req_fds[0]); 467 out: 468 /* Close unused write end of request fds */ 469 os_close_file(req_fds[1]); 470 return rc; 471 } 472 473 static int vhost_user_init(struct virtio_uml_device *vu_dev) 474 { 475 int rc = vhost_user_set_owner(vu_dev); 476 477 if (rc) 478 return rc; 479 rc = vhost_user_get_features(vu_dev, &vu_dev->features); 480 if (rc) 481 return rc; 482 483 if (vu_dev->features & BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES)) { 484 rc = vhost_user_get_protocol_features(vu_dev, 485 &vu_dev->protocol_features); 486 if (rc) 487 return rc; 488 vu_dev->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_F; 489 rc = vhost_user_set_protocol_features(vu_dev, 490 vu_dev->protocol_features); 491 if (rc) 492 return rc; 493 } 494 495 if (vu_dev->protocol_features & 496 BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ)) { 497 rc = vhost_user_init_slave_req(vu_dev); 498 if (rc) 499 return rc; 500 } 501 502 return 0; 503 } 504 505 static void vhost_user_get_config(struct virtio_uml_device *vu_dev, 506 u32 offset, void *buf, u32 len) 507 { 508 u32 cfg_size = offset + len; 509 struct vhost_user_msg *msg; 510 size_t payload_size = sizeof(msg->payload.config) + cfg_size; 511 size_t msg_size = sizeof(msg->header) + payload_size; 512 int rc; 513 514 if (!(vu_dev->protocol_features & 515 BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG))) 516 return; 517 518 msg = kzalloc(msg_size, GFP_KERNEL); 519 if (!msg) 520 return; 521 msg->header.request = VHOST_USER_GET_CONFIG; 522 msg->header.size = payload_size; 523 msg->payload.config.offset = 0; 524 msg->payload.config.size = cfg_size; 525 526 rc = vhost_user_send(vu_dev, true, msg, NULL, 0); 527 if (rc) { 528 vu_err(vu_dev, "sending VHOST_USER_GET_CONFIG failed: %d\n", 529 rc); 530 goto free; 531 } 532 533 rc = vhost_user_recv_resp(vu_dev, msg, msg_size); 534 if (rc) { 535 vu_err(vu_dev, 536 "receiving VHOST_USER_GET_CONFIG response failed: %d\n", 537 rc); 538 goto free; 539 } 540 541 if (msg->header.size != payload_size || 542 msg->payload.config.size != cfg_size) { 543 rc = -EPROTO; 544 vu_err(vu_dev, 545 "Invalid VHOST_USER_GET_CONFIG sizes (payload %d expected %zu, config %u expected %u)\n", 546 msg->header.size, payload_size, 547 msg->payload.config.size, cfg_size); 548 goto free; 549 } 550 memcpy(buf, msg->payload.config.payload + offset, len); 551 552 free: 553 kfree(msg); 554 } 555 556 static void vhost_user_set_config(struct virtio_uml_device *vu_dev, 557 u32 offset, const void *buf, u32 len) 558 { 559 struct vhost_user_msg *msg; 560 size_t payload_size = sizeof(msg->payload.config) + len; 561 size_t msg_size = sizeof(msg->header) + payload_size; 562 int rc; 563 564 if (!(vu_dev->protocol_features & 565 BIT_ULL(VHOST_USER_PROTOCOL_F_CONFIG))) 566 return; 567 568 msg = kzalloc(msg_size, GFP_KERNEL); 569 if (!msg) 570 return; 571 msg->header.request = VHOST_USER_SET_CONFIG; 572 msg->header.size = payload_size; 573 msg->payload.config.offset = offset; 574 msg->payload.config.size = len; 575 memcpy(msg->payload.config.payload, buf, len); 576 577 rc = vhost_user_send(vu_dev, false, msg, NULL, 0); 578 if (rc) 579 vu_err(vu_dev, "sending VHOST_USER_SET_CONFIG failed: %d\n", 580 rc); 581 582 kfree(msg); 583 } 584 585 static int vhost_user_init_mem_region(u64 addr, u64 size, int *fd_out, 586 struct vhost_user_mem_region *region_out) 587 { 588 unsigned long long mem_offset; 589 int rc = phys_mapping(addr, &mem_offset); 590 591 if (WARN(rc < 0, "phys_mapping of 0x%llx returned %d\n", addr, rc)) 592 return -EFAULT; 593 *fd_out = rc; 594 region_out->guest_addr = addr; 595 region_out->user_addr = addr; 596 region_out->size = size; 597 region_out->mmap_offset = mem_offset; 598 599 /* Ensure mapping is valid for the entire region */ 600 rc = phys_mapping(addr + size - 1, &mem_offset); 601 if (WARN(rc != *fd_out, "phys_mapping of 0x%llx failed: %d != %d\n", 602 addr + size - 1, rc, *fd_out)) 603 return -EFAULT; 604 return 0; 605 } 606 607 static int vhost_user_set_mem_table(struct virtio_uml_device *vu_dev) 608 { 609 struct vhost_user_msg msg = { 610 .header.request = VHOST_USER_SET_MEM_TABLE, 611 .header.size = sizeof(msg.payload.mem_regions), 612 .payload.mem_regions.num = 1, 613 }; 614 unsigned long reserved = uml_reserved - uml_physmem; 615 int fds[2]; 616 int rc; 617 618 /* 619 * This is a bit tricky, see also the comment with setup_physmem(). 620 * 621 * Essentially, setup_physmem() uses a file to mmap() our physmem, 622 * but the code and data we *already* have is omitted. To us, this 623 * is no difference, since they both become part of our address 624 * space and memory consumption. To somebody looking in from the 625 * outside, however, it is different because the part of our memory 626 * consumption that's already part of the binary (code/data) is not 627 * mapped from the file, so it's not visible to another mmap from 628 * the file descriptor. 629 * 630 * Thus, don't advertise this space to the vhost-user slave. This 631 * means that the slave will likely abort or similar when we give 632 * it an address from the hidden range, since it's not marked as 633 * a valid address, but at least that way we detect the issue and 634 * don't just have the slave read an all-zeroes buffer from the 635 * shared memory file, or write something there that we can never 636 * see (depending on the direction of the virtqueue traffic.) 637 * 638 * Since we usually don't want to use .text for virtio buffers, 639 * this effectively means that you cannot use 640 * 1) global variables, which are in the .bss and not in the shm 641 * file-backed memory 642 * 2) the stack in some processes, depending on where they have 643 * their stack (or maybe only no interrupt stack?) 644 * 645 * The stack is already not typically valid for DMA, so this isn't 646 * much of a restriction, but global variables might be encountered. 647 * 648 * It might be possible to fix it by copying around the data that's 649 * between bss_start and where we map the file now, but it's not 650 * something that you typically encounter with virtio drivers, so 651 * it didn't seem worthwhile. 652 */ 653 rc = vhost_user_init_mem_region(reserved, physmem_size - reserved, 654 &fds[0], 655 &msg.payload.mem_regions.regions[0]); 656 657 if (rc < 0) 658 return rc; 659 if (highmem) { 660 msg.payload.mem_regions.num++; 661 rc = vhost_user_init_mem_region(__pa(end_iomem), highmem, 662 &fds[1], &msg.payload.mem_regions.regions[1]); 663 if (rc < 0) 664 return rc; 665 } 666 667 return vhost_user_send(vu_dev, false, &msg, fds, 668 msg.payload.mem_regions.num); 669 } 670 671 static int vhost_user_set_vring_state(struct virtio_uml_device *vu_dev, 672 u32 request, u32 index, u32 num) 673 { 674 struct vhost_user_msg msg = { 675 .header.request = request, 676 .header.size = sizeof(msg.payload.vring_state), 677 .payload.vring_state.index = index, 678 .payload.vring_state.num = num, 679 }; 680 681 return vhost_user_send(vu_dev, false, &msg, NULL, 0); 682 } 683 684 static int vhost_user_set_vring_num(struct virtio_uml_device *vu_dev, 685 u32 index, u32 num) 686 { 687 return vhost_user_set_vring_state(vu_dev, VHOST_USER_SET_VRING_NUM, 688 index, num); 689 } 690 691 static int vhost_user_set_vring_base(struct virtio_uml_device *vu_dev, 692 u32 index, u32 offset) 693 { 694 return vhost_user_set_vring_state(vu_dev, VHOST_USER_SET_VRING_BASE, 695 index, offset); 696 } 697 698 static int vhost_user_set_vring_addr(struct virtio_uml_device *vu_dev, 699 u32 index, u64 desc, u64 used, u64 avail, 700 u64 log) 701 { 702 struct vhost_user_msg msg = { 703 .header.request = VHOST_USER_SET_VRING_ADDR, 704 .header.size = sizeof(msg.payload.vring_addr), 705 .payload.vring_addr.index = index, 706 .payload.vring_addr.desc = desc, 707 .payload.vring_addr.used = used, 708 .payload.vring_addr.avail = avail, 709 .payload.vring_addr.log = log, 710 }; 711 712 return vhost_user_send(vu_dev, false, &msg, NULL, 0); 713 } 714 715 static int vhost_user_set_vring_fd(struct virtio_uml_device *vu_dev, 716 u32 request, int index, int fd) 717 { 718 struct vhost_user_msg msg = { 719 .header.request = request, 720 .header.size = sizeof(msg.payload.integer), 721 .payload.integer = index, 722 }; 723 724 if (index & ~VHOST_USER_VRING_INDEX_MASK) 725 return -EINVAL; 726 if (fd < 0) { 727 msg.payload.integer |= VHOST_USER_VRING_POLL_MASK; 728 return vhost_user_send(vu_dev, false, &msg, NULL, 0); 729 } 730 return vhost_user_send(vu_dev, false, &msg, &fd, 1); 731 } 732 733 static int vhost_user_set_vring_call(struct virtio_uml_device *vu_dev, 734 int index, int fd) 735 { 736 return vhost_user_set_vring_fd(vu_dev, VHOST_USER_SET_VRING_CALL, 737 index, fd); 738 } 739 740 static int vhost_user_set_vring_kick(struct virtio_uml_device *vu_dev, 741 int index, int fd) 742 { 743 return vhost_user_set_vring_fd(vu_dev, VHOST_USER_SET_VRING_KICK, 744 index, fd); 745 } 746 747 static int vhost_user_set_vring_enable(struct virtio_uml_device *vu_dev, 748 u32 index, bool enable) 749 { 750 if (!(vu_dev->features & BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES))) 751 return 0; 752 753 return vhost_user_set_vring_state(vu_dev, VHOST_USER_SET_VRING_ENABLE, 754 index, enable); 755 } 756 757 758 /* Virtio interface */ 759 760 static bool vu_notify(struct virtqueue *vq) 761 { 762 struct virtio_uml_vq_info *info = vq->priv; 763 const uint64_t n = 1; 764 int rc; 765 766 if (info->suspended) 767 return true; 768 769 time_travel_propagate_time(); 770 771 if (info->kick_fd < 0) { 772 struct virtio_uml_device *vu_dev; 773 774 vu_dev = to_virtio_uml_device(vq->vdev); 775 776 return vhost_user_set_vring_state(vu_dev, VHOST_USER_VRING_KICK, 777 vq->index, 0) == 0; 778 } 779 780 do { 781 rc = os_write_file(info->kick_fd, &n, sizeof(n)); 782 } while (rc == -EINTR); 783 return !WARN(rc != sizeof(n), "write returned %d\n", rc); 784 } 785 786 static irqreturn_t vu_interrupt(int irq, void *opaque) 787 { 788 struct virtqueue *vq = opaque; 789 struct virtio_uml_vq_info *info = vq->priv; 790 uint64_t n; 791 int rc; 792 irqreturn_t ret = IRQ_NONE; 793 794 do { 795 rc = os_read_file(info->call_fd, &n, sizeof(n)); 796 if (rc == sizeof(n)) 797 ret |= vring_interrupt(irq, vq); 798 } while (rc == sizeof(n) || rc == -EINTR); 799 WARN(rc != -EAGAIN, "read returned %d\n", rc); 800 return ret; 801 } 802 803 804 static void vu_get(struct virtio_device *vdev, unsigned offset, 805 void *buf, unsigned len) 806 { 807 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 808 809 vhost_user_get_config(vu_dev, offset, buf, len); 810 } 811 812 static void vu_set(struct virtio_device *vdev, unsigned offset, 813 const void *buf, unsigned len) 814 { 815 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 816 817 vhost_user_set_config(vu_dev, offset, buf, len); 818 } 819 820 static u8 vu_get_status(struct virtio_device *vdev) 821 { 822 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 823 824 return vu_dev->status; 825 } 826 827 static void vu_set_status(struct virtio_device *vdev, u8 status) 828 { 829 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 830 831 vu_dev->status = status; 832 } 833 834 static void vu_reset(struct virtio_device *vdev) 835 { 836 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 837 838 vu_dev->status = 0; 839 } 840 841 static void vu_del_vq(struct virtqueue *vq) 842 { 843 struct virtio_uml_vq_info *info = vq->priv; 844 845 if (info->call_fd >= 0) { 846 struct virtio_uml_device *vu_dev; 847 848 vu_dev = to_virtio_uml_device(vq->vdev); 849 850 um_free_irq(vu_dev->irq, vq); 851 os_close_file(info->call_fd); 852 } 853 854 if (info->kick_fd >= 0) 855 os_close_file(info->kick_fd); 856 857 vring_del_virtqueue(vq); 858 kfree(info); 859 } 860 861 static void vu_del_vqs(struct virtio_device *vdev) 862 { 863 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 864 struct virtqueue *vq, *n; 865 u64 features; 866 867 /* Note: reverse order as a workaround to a decoding bug in snabb */ 868 list_for_each_entry_reverse(vq, &vdev->vqs, list) 869 WARN_ON(vhost_user_set_vring_enable(vu_dev, vq->index, false)); 870 871 /* Ensure previous messages have been processed */ 872 WARN_ON(vhost_user_get_features(vu_dev, &features)); 873 874 list_for_each_entry_safe(vq, n, &vdev->vqs, list) 875 vu_del_vq(vq); 876 } 877 878 static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev, 879 struct virtqueue *vq) 880 { 881 struct virtio_uml_vq_info *info = vq->priv; 882 int call_fds[2]; 883 int rc; 884 885 /* no call FD needed/desired in this case */ 886 if (vu_dev->protocol_features & 887 BIT_ULL(VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS) && 888 vu_dev->protocol_features & 889 BIT_ULL(VHOST_USER_PROTOCOL_F_SLAVE_REQ)) { 890 info->call_fd = -1; 891 return 0; 892 } 893 894 /* Use a pipe for call fd, since SIGIO is not supported for eventfd */ 895 rc = os_pipe(call_fds, true, true); 896 if (rc < 0) 897 return rc; 898 899 info->call_fd = call_fds[0]; 900 rc = um_request_irq(vu_dev->irq, info->call_fd, IRQ_READ, 901 vu_interrupt, IRQF_SHARED, info->name, vq); 902 if (rc < 0) 903 goto close_both; 904 905 rc = vhost_user_set_vring_call(vu_dev, vq->index, call_fds[1]); 906 if (rc) 907 goto release_irq; 908 909 goto out; 910 911 release_irq: 912 um_free_irq(vu_dev->irq, vq); 913 close_both: 914 os_close_file(call_fds[0]); 915 out: 916 /* Close (unused) write end of call fds */ 917 os_close_file(call_fds[1]); 918 919 return rc; 920 } 921 922 static struct virtqueue *vu_setup_vq(struct virtio_device *vdev, 923 unsigned index, vq_callback_t *callback, 924 const char *name, bool ctx) 925 { 926 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 927 struct platform_device *pdev = vu_dev->pdev; 928 struct virtio_uml_vq_info *info; 929 struct virtqueue *vq; 930 int num = MAX_SUPPORTED_QUEUE_SIZE; 931 int rc; 932 933 info = kzalloc(sizeof(*info), GFP_KERNEL); 934 if (!info) { 935 rc = -ENOMEM; 936 goto error_kzalloc; 937 } 938 snprintf(info->name, sizeof(info->name), "%s.%d-%s", pdev->name, 939 pdev->id, name); 940 941 vq = vring_create_virtqueue(index, num, PAGE_SIZE, vdev, true, true, 942 ctx, vu_notify, callback, info->name); 943 if (!vq) { 944 rc = -ENOMEM; 945 goto error_create; 946 } 947 vq->priv = info; 948 num = virtqueue_get_vring_size(vq); 949 950 if (vu_dev->protocol_features & 951 BIT_ULL(VHOST_USER_PROTOCOL_F_INBAND_NOTIFICATIONS)) { 952 info->kick_fd = -1; 953 } else { 954 rc = os_eventfd(0, 0); 955 if (rc < 0) 956 goto error_kick; 957 info->kick_fd = rc; 958 } 959 960 rc = vu_setup_vq_call_fd(vu_dev, vq); 961 if (rc) 962 goto error_call; 963 964 rc = vhost_user_set_vring_num(vu_dev, index, num); 965 if (rc) 966 goto error_setup; 967 968 rc = vhost_user_set_vring_base(vu_dev, index, 0); 969 if (rc) 970 goto error_setup; 971 972 rc = vhost_user_set_vring_addr(vu_dev, index, 973 virtqueue_get_desc_addr(vq), 974 virtqueue_get_used_addr(vq), 975 virtqueue_get_avail_addr(vq), 976 (u64) -1); 977 if (rc) 978 goto error_setup; 979 980 return vq; 981 982 error_setup: 983 if (info->call_fd >= 0) { 984 um_free_irq(vu_dev->irq, vq); 985 os_close_file(info->call_fd); 986 } 987 error_call: 988 if (info->kick_fd >= 0) 989 os_close_file(info->kick_fd); 990 error_kick: 991 vring_del_virtqueue(vq); 992 error_create: 993 kfree(info); 994 error_kzalloc: 995 return ERR_PTR(rc); 996 } 997 998 static int vu_find_vqs(struct virtio_device *vdev, unsigned nvqs, 999 struct virtqueue *vqs[], vq_callback_t *callbacks[], 1000 const char * const names[], const bool *ctx, 1001 struct irq_affinity *desc) 1002 { 1003 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 1004 int i, queue_idx = 0, rc; 1005 struct virtqueue *vq; 1006 1007 /* not supported for now */ 1008 if (WARN_ON(nvqs > 64)) 1009 return -EINVAL; 1010 1011 rc = vhost_user_set_mem_table(vu_dev); 1012 if (rc) 1013 return rc; 1014 1015 for (i = 0; i < nvqs; ++i) { 1016 if (!names[i]) { 1017 vqs[i] = NULL; 1018 continue; 1019 } 1020 1021 vqs[i] = vu_setup_vq(vdev, queue_idx++, callbacks[i], names[i], 1022 ctx ? ctx[i] : false); 1023 if (IS_ERR(vqs[i])) { 1024 rc = PTR_ERR(vqs[i]); 1025 goto error_setup; 1026 } 1027 } 1028 1029 list_for_each_entry(vq, &vdev->vqs, list) { 1030 struct virtio_uml_vq_info *info = vq->priv; 1031 1032 if (info->kick_fd >= 0) { 1033 rc = vhost_user_set_vring_kick(vu_dev, vq->index, 1034 info->kick_fd); 1035 if (rc) 1036 goto error_setup; 1037 } 1038 1039 rc = vhost_user_set_vring_enable(vu_dev, vq->index, true); 1040 if (rc) 1041 goto error_setup; 1042 } 1043 1044 return 0; 1045 1046 error_setup: 1047 vu_del_vqs(vdev); 1048 return rc; 1049 } 1050 1051 static u64 vu_get_features(struct virtio_device *vdev) 1052 { 1053 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 1054 1055 return vu_dev->features; 1056 } 1057 1058 static int vu_finalize_features(struct virtio_device *vdev) 1059 { 1060 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 1061 u64 supported = vdev->features & VHOST_USER_SUPPORTED_F; 1062 1063 vring_transport_features(vdev); 1064 vu_dev->features = vdev->features | supported; 1065 1066 return vhost_user_set_features(vu_dev, vu_dev->features); 1067 } 1068 1069 static const char *vu_bus_name(struct virtio_device *vdev) 1070 { 1071 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 1072 1073 return vu_dev->pdev->name; 1074 } 1075 1076 static const struct virtio_config_ops virtio_uml_config_ops = { 1077 .get = vu_get, 1078 .set = vu_set, 1079 .get_status = vu_get_status, 1080 .set_status = vu_set_status, 1081 .reset = vu_reset, 1082 .find_vqs = vu_find_vqs, 1083 .del_vqs = vu_del_vqs, 1084 .get_features = vu_get_features, 1085 .finalize_features = vu_finalize_features, 1086 .bus_name = vu_bus_name, 1087 }; 1088 1089 static void virtio_uml_release_dev(struct device *d) 1090 { 1091 struct virtio_device *vdev = 1092 container_of(d, struct virtio_device, dev); 1093 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 1094 1095 time_travel_propagate_time(); 1096 1097 /* might not have been opened due to not negotiating the feature */ 1098 if (vu_dev->req_fd >= 0) { 1099 um_free_irq(vu_dev->irq, vu_dev); 1100 os_close_file(vu_dev->req_fd); 1101 } 1102 1103 os_close_file(vu_dev->sock); 1104 kfree(vu_dev); 1105 } 1106 1107 void virtio_uml_set_no_vq_suspend(struct virtio_device *vdev, 1108 bool no_vq_suspend) 1109 { 1110 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); 1111 1112 if (WARN_ON(vdev->config != &virtio_uml_config_ops)) 1113 return; 1114 1115 vu_dev->no_vq_suspend = no_vq_suspend; 1116 dev_info(&vdev->dev, "%sabled VQ suspend\n", 1117 no_vq_suspend ? "dis" : "en"); 1118 } 1119 1120 static void vu_of_conn_broken(struct work_struct *wk) 1121 { 1122 /* 1123 * We can't remove the device from the devicetree so the only thing we 1124 * can do is warn. 1125 */ 1126 WARN_ON(1); 1127 } 1128 1129 /* Platform device */ 1130 1131 static struct virtio_uml_platform_data * 1132 virtio_uml_create_pdata(struct platform_device *pdev) 1133 { 1134 struct device_node *np = pdev->dev.of_node; 1135 struct virtio_uml_platform_data *pdata; 1136 int ret; 1137 1138 if (!np) 1139 return ERR_PTR(-EINVAL); 1140 1141 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); 1142 if (!pdata) 1143 return ERR_PTR(-ENOMEM); 1144 1145 INIT_WORK(&pdata->conn_broken_wk, vu_of_conn_broken); 1146 pdata->pdev = pdev; 1147 1148 ret = of_property_read_string(np, "socket-path", &pdata->socket_path); 1149 if (ret) 1150 return ERR_PTR(ret); 1151 1152 ret = of_property_read_u32(np, "virtio-device-id", 1153 &pdata->virtio_device_id); 1154 if (ret) 1155 return ERR_PTR(ret); 1156 1157 return pdata; 1158 } 1159 1160 static int virtio_uml_probe(struct platform_device *pdev) 1161 { 1162 struct virtio_uml_platform_data *pdata = pdev->dev.platform_data; 1163 struct virtio_uml_device *vu_dev; 1164 int rc; 1165 1166 if (!pdata) { 1167 pdata = virtio_uml_create_pdata(pdev); 1168 if (IS_ERR(pdata)) 1169 return PTR_ERR(pdata); 1170 } 1171 1172 vu_dev = kzalloc(sizeof(*vu_dev), GFP_KERNEL); 1173 if (!vu_dev) 1174 return -ENOMEM; 1175 1176 vu_dev->pdata = pdata; 1177 vu_dev->vdev.dev.parent = &pdev->dev; 1178 vu_dev->vdev.dev.release = virtio_uml_release_dev; 1179 vu_dev->vdev.config = &virtio_uml_config_ops; 1180 vu_dev->vdev.id.device = pdata->virtio_device_id; 1181 vu_dev->vdev.id.vendor = VIRTIO_DEV_ANY_ID; 1182 vu_dev->pdev = pdev; 1183 vu_dev->req_fd = -1; 1184 1185 time_travel_propagate_time(); 1186 1187 do { 1188 rc = os_connect_socket(pdata->socket_path); 1189 } while (rc == -EINTR); 1190 if (rc < 0) 1191 goto error_free; 1192 vu_dev->sock = rc; 1193 1194 spin_lock_init(&vu_dev->sock_lock); 1195 1196 rc = vhost_user_init(vu_dev); 1197 if (rc) 1198 goto error_init; 1199 1200 platform_set_drvdata(pdev, vu_dev); 1201 1202 device_set_wakeup_capable(&vu_dev->vdev.dev, true); 1203 1204 rc = register_virtio_device(&vu_dev->vdev); 1205 if (rc) 1206 put_device(&vu_dev->vdev.dev); 1207 vu_dev->registered = 1; 1208 return rc; 1209 1210 error_init: 1211 os_close_file(vu_dev->sock); 1212 error_free: 1213 kfree(vu_dev); 1214 return rc; 1215 } 1216 1217 static int virtio_uml_remove(struct platform_device *pdev) 1218 { 1219 struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev); 1220 1221 unregister_virtio_device(&vu_dev->vdev); 1222 return 0; 1223 } 1224 1225 /* Command line device list */ 1226 1227 static void vu_cmdline_release_dev(struct device *d) 1228 { 1229 } 1230 1231 static struct device vu_cmdline_parent = { 1232 .init_name = "virtio-uml-cmdline", 1233 .release = vu_cmdline_release_dev, 1234 }; 1235 1236 static bool vu_cmdline_parent_registered; 1237 static int vu_cmdline_id; 1238 1239 static int vu_unregister_cmdline_device(struct device *dev, void *data) 1240 { 1241 struct platform_device *pdev = to_platform_device(dev); 1242 struct virtio_uml_platform_data *pdata = pdev->dev.platform_data; 1243 1244 kfree(pdata->socket_path); 1245 platform_device_unregister(pdev); 1246 return 0; 1247 } 1248 1249 static void vu_conn_broken(struct work_struct *wk) 1250 { 1251 struct virtio_uml_platform_data *pdata; 1252 1253 pdata = container_of(wk, struct virtio_uml_platform_data, conn_broken_wk); 1254 vu_unregister_cmdline_device(&pdata->pdev->dev, NULL); 1255 } 1256 1257 static int vu_cmdline_set(const char *device, const struct kernel_param *kp) 1258 { 1259 const char *ids = strchr(device, ':'); 1260 unsigned int virtio_device_id; 1261 int processed, consumed, err; 1262 char *socket_path; 1263 struct virtio_uml_platform_data pdata, *ppdata; 1264 struct platform_device *pdev; 1265 1266 if (!ids || ids == device) 1267 return -EINVAL; 1268 1269 processed = sscanf(ids, ":%u%n:%d%n", 1270 &virtio_device_id, &consumed, 1271 &vu_cmdline_id, &consumed); 1272 1273 if (processed < 1 || ids[consumed]) 1274 return -EINVAL; 1275 1276 if (!vu_cmdline_parent_registered) { 1277 err = device_register(&vu_cmdline_parent); 1278 if (err) { 1279 pr_err("Failed to register parent device!\n"); 1280 put_device(&vu_cmdline_parent); 1281 return err; 1282 } 1283 vu_cmdline_parent_registered = true; 1284 } 1285 1286 socket_path = kmemdup_nul(device, ids - device, GFP_KERNEL); 1287 if (!socket_path) 1288 return -ENOMEM; 1289 1290 pdata.virtio_device_id = (u32) virtio_device_id; 1291 pdata.socket_path = socket_path; 1292 1293 pr_info("Registering device virtio-uml.%d id=%d at %s\n", 1294 vu_cmdline_id, virtio_device_id, socket_path); 1295 1296 pdev = platform_device_register_data(&vu_cmdline_parent, "virtio-uml", 1297 vu_cmdline_id++, &pdata, 1298 sizeof(pdata)); 1299 err = PTR_ERR_OR_ZERO(pdev); 1300 if (err) 1301 goto free; 1302 1303 ppdata = pdev->dev.platform_data; 1304 ppdata->pdev = pdev; 1305 INIT_WORK(&ppdata->conn_broken_wk, vu_conn_broken); 1306 1307 return 0; 1308 1309 free: 1310 kfree(socket_path); 1311 return err; 1312 } 1313 1314 static int vu_cmdline_get_device(struct device *dev, void *data) 1315 { 1316 struct platform_device *pdev = to_platform_device(dev); 1317 struct virtio_uml_platform_data *pdata = pdev->dev.platform_data; 1318 char *buffer = data; 1319 unsigned int len = strlen(buffer); 1320 1321 snprintf(buffer + len, PAGE_SIZE - len, "%s:%d:%d\n", 1322 pdata->socket_path, pdata->virtio_device_id, pdev->id); 1323 return 0; 1324 } 1325 1326 static int vu_cmdline_get(char *buffer, const struct kernel_param *kp) 1327 { 1328 buffer[0] = '\0'; 1329 if (vu_cmdline_parent_registered) 1330 device_for_each_child(&vu_cmdline_parent, buffer, 1331 vu_cmdline_get_device); 1332 return strlen(buffer) + 1; 1333 } 1334 1335 static const struct kernel_param_ops vu_cmdline_param_ops = { 1336 .set = vu_cmdline_set, 1337 .get = vu_cmdline_get, 1338 }; 1339 1340 device_param_cb(device, &vu_cmdline_param_ops, NULL, S_IRUSR); 1341 __uml_help(vu_cmdline_param_ops, 1342 "virtio_uml.device=<socket>:<virtio_id>[:<platform_id>]\n" 1343 " Configure a virtio device over a vhost-user socket.\n" 1344 " See virtio_ids.h for a list of possible virtio device id values.\n" 1345 " Optionally use a specific platform_device id.\n\n" 1346 ); 1347 1348 1349 static void vu_unregister_cmdline_devices(void) 1350 { 1351 if (vu_cmdline_parent_registered) { 1352 device_for_each_child(&vu_cmdline_parent, NULL, 1353 vu_unregister_cmdline_device); 1354 device_unregister(&vu_cmdline_parent); 1355 vu_cmdline_parent_registered = false; 1356 } 1357 } 1358 1359 /* Platform driver */ 1360 1361 static const struct of_device_id virtio_uml_match[] = { 1362 { .compatible = "virtio,uml", }, 1363 { } 1364 }; 1365 MODULE_DEVICE_TABLE(of, virtio_uml_match); 1366 1367 static int virtio_uml_suspend(struct platform_device *pdev, pm_message_t state) 1368 { 1369 struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev); 1370 1371 if (!vu_dev->no_vq_suspend) { 1372 struct virtqueue *vq; 1373 1374 virtio_device_for_each_vq((&vu_dev->vdev), vq) { 1375 struct virtio_uml_vq_info *info = vq->priv; 1376 1377 info->suspended = true; 1378 vhost_user_set_vring_enable(vu_dev, vq->index, false); 1379 } 1380 } 1381 1382 if (!device_may_wakeup(&vu_dev->vdev.dev)) { 1383 vu_dev->suspended = true; 1384 return 0; 1385 } 1386 1387 return irq_set_irq_wake(vu_dev->irq, 1); 1388 } 1389 1390 static int virtio_uml_resume(struct platform_device *pdev) 1391 { 1392 struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev); 1393 1394 if (!vu_dev->no_vq_suspend) { 1395 struct virtqueue *vq; 1396 1397 virtio_device_for_each_vq((&vu_dev->vdev), vq) { 1398 struct virtio_uml_vq_info *info = vq->priv; 1399 1400 info->suspended = false; 1401 vhost_user_set_vring_enable(vu_dev, vq->index, true); 1402 } 1403 } 1404 1405 vu_dev->suspended = false; 1406 1407 if (!device_may_wakeup(&vu_dev->vdev.dev)) 1408 return 0; 1409 1410 return irq_set_irq_wake(vu_dev->irq, 0); 1411 } 1412 1413 static struct platform_driver virtio_uml_driver = { 1414 .probe = virtio_uml_probe, 1415 .remove = virtio_uml_remove, 1416 .driver = { 1417 .name = "virtio-uml", 1418 .of_match_table = virtio_uml_match, 1419 }, 1420 .suspend = virtio_uml_suspend, 1421 .resume = virtio_uml_resume, 1422 }; 1423 1424 static int __init virtio_uml_init(void) 1425 { 1426 return platform_driver_register(&virtio_uml_driver); 1427 } 1428 1429 static void __exit virtio_uml_exit(void) 1430 { 1431 platform_driver_unregister(&virtio_uml_driver); 1432 vu_unregister_cmdline_devices(); 1433 } 1434 1435 module_init(virtio_uml_init); 1436 module_exit(virtio_uml_exit); 1437 __uml_exitcall(virtio_uml_exit); 1438 1439 MODULE_DESCRIPTION("UML driver for vhost-user virtio devices"); 1440 MODULE_LICENSE("GPL"); 1441