forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/drivers/misc/vmw_vmci/vmci_queue_pair.c
....@@ -1,16 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * VMware VMCI Driver
34 *
45 * Copyright (C) 2012 VMware, Inc. All rights reserved.
5
- *
6
- * This program is free software; you can redistribute it and/or modify it
7
- * under the terms of the GNU General Public License as published by the
8
- * Free Software Foundation version 2 and no later version.
9
- *
10
- * This program is distributed in the hope that it will be useful, but
11
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13
- * for more details.
146 */
157
168 #include <linux/vmw_vmci_defs.h>
....@@ -435,8 +427,8 @@
435427 void *cons_q,
436428 u64 num_consume_pages, struct ppn_set *ppn_set)
437429 {
438
- u32 *produce_ppns;
439
- u32 *consume_ppns;
430
+ u64 *produce_ppns;
431
+ u64 *consume_ppns;
440432 struct vmci_queue *produce_q = prod_q;
441433 struct vmci_queue *consume_q = cons_q;
442434 u64 i;
....@@ -462,31 +454,13 @@
462454 return VMCI_ERROR_NO_MEM;
463455 }
464456
465
- for (i = 0; i < num_produce_pages; i++) {
466
- unsigned long pfn;
467
-
457
+ for (i = 0; i < num_produce_pages; i++)
468458 produce_ppns[i] =
469459 produce_q->kernel_if->u.g.pas[i] >> PAGE_SHIFT;
470
- pfn = produce_ppns[i];
471460
472
- /* Fail allocation if PFN isn't supported by hypervisor. */
473
- if (sizeof(pfn) > sizeof(*produce_ppns)
474
- && pfn != produce_ppns[i])
475
- goto ppn_error;
476
- }
477
-
478
- for (i = 0; i < num_consume_pages; i++) {
479
- unsigned long pfn;
480
-
461
+ for (i = 0; i < num_consume_pages; i++)
481462 consume_ppns[i] =
482463 consume_q->kernel_if->u.g.pas[i] >> PAGE_SHIFT;
483
- pfn = consume_ppns[i];
484
-
485
- /* Fail allocation if PFN isn't supported by hypervisor. */
486
- if (sizeof(pfn) > sizeof(*consume_ppns)
487
- && pfn != consume_ppns[i])
488
- goto ppn_error;
489
- }
490464
491465 ppn_set->num_produce_pages = num_produce_pages;
492466 ppn_set->num_consume_pages = num_consume_pages;
....@@ -494,11 +468,6 @@
494468 ppn_set->consume_ppns = consume_ppns;
495469 ppn_set->initialized = true;
496470 return VMCI_SUCCESS;
497
-
498
- ppn_error:
499
- kfree(produce_ppns);
500
- kfree(consume_ppns);
501
- return VMCI_ERROR_INVALID_ARGS;
502471 }
503472
504473 /*
....@@ -520,12 +489,28 @@
520489 */
521490 static int qp_populate_ppn_set(u8 *call_buf, const struct ppn_set *ppn_set)
522491 {
523
- memcpy(call_buf, ppn_set->produce_ppns,
524
- ppn_set->num_produce_pages * sizeof(*ppn_set->produce_ppns));
525
- memcpy(call_buf +
526
- ppn_set->num_produce_pages * sizeof(*ppn_set->produce_ppns),
527
- ppn_set->consume_ppns,
528
- ppn_set->num_consume_pages * sizeof(*ppn_set->consume_ppns));
492
+ if (vmci_use_ppn64()) {
493
+ memcpy(call_buf, ppn_set->produce_ppns,
494
+ ppn_set->num_produce_pages *
495
+ sizeof(*ppn_set->produce_ppns));
496
+ memcpy(call_buf +
497
+ ppn_set->num_produce_pages *
498
+ sizeof(*ppn_set->produce_ppns),
499
+ ppn_set->consume_ppns,
500
+ ppn_set->num_consume_pages *
501
+ sizeof(*ppn_set->consume_ppns));
502
+ } else {
503
+ int i;
504
+ u32 *ppns = (u32 *) call_buf;
505
+
506
+ for (i = 0; i < ppn_set->num_produce_pages; i++)
507
+ ppns[i] = (u32) ppn_set->produce_ppns[i];
508
+
509
+ ppns = &ppns[ppn_set->num_produce_pages];
510
+
511
+ for (i = 0; i < ppn_set->num_consume_pages; i++)
512
+ ppns[i] = (u32) ppn_set->consume_ppns[i];
513
+ }
529514
530515 return VMCI_SUCCESS;
531516 }
....@@ -669,7 +654,8 @@
669654 int err = VMCI_SUCCESS;
670655
671656 retval = get_user_pages_fast((uintptr_t) produce_uva,
672
- produce_q->kernel_if->num_pages, 1,
657
+ produce_q->kernel_if->num_pages,
658
+ FOLL_WRITE,
673659 produce_q->kernel_if->u.h.header_page);
674660 if (retval < (int)produce_q->kernel_if->num_pages) {
675661 pr_debug("get_user_pages_fast(produce) failed (retval=%d)",
....@@ -682,7 +668,8 @@
682668 }
683669
684670 retval = get_user_pages_fast((uintptr_t) consume_uva,
685
- consume_q->kernel_if->num_pages, 1,
671
+ consume_q->kernel_if->num_pages,
672
+ FOLL_WRITE,
686673 consume_q->kernel_if->u.h.header_page);
687674 if (retval < (int)consume_q->kernel_if->num_pages) {
688675 pr_debug("get_user_pages_fast(consume) failed (retval=%d)",
....@@ -865,6 +852,7 @@
865852 u32 context_id = vmci_get_context_id();
866853 struct vmci_event_qp ev;
867854
855
+ memset(&ev, 0, sizeof(ev));
868856 ev.msg.hdr.dst = vmci_make_handle(context_id, VMCI_EVENT_HANDLER);
869857 ev.msg.hdr.src = vmci_make_handle(VMCI_HYPERVISOR_CONTEXT_ID,
870858 VMCI_CONTEXT_RESOURCE_ID);
....@@ -956,13 +944,15 @@
956944 {
957945 struct vmci_qp_alloc_msg *alloc_msg;
958946 size_t msg_size;
947
+ size_t ppn_size;
959948 int result;
960949
961950 if (!entry || entry->num_ppns <= 2)
962951 return VMCI_ERROR_INVALID_ARGS;
963952
953
+ ppn_size = vmci_use_ppn64() ? sizeof(u64) : sizeof(u32);
964954 msg_size = sizeof(*alloc_msg) +
965
- (size_t) entry->num_ppns * sizeof(u32);
955
+ (size_t) entry->num_ppns * ppn_size;
966956 alloc_msg = kmalloc(msg_size, GFP_KERNEL);
967957 if (!alloc_msg)
968958 return VMCI_ERROR_NO_MEM;
....@@ -1476,6 +1466,7 @@
14761466 * kernel.
14771467 */
14781468
1469
+ memset(&ev, 0, sizeof(ev));
14791470 ev.msg.hdr.dst = vmci_make_handle(peer_id, VMCI_EVENT_HANDLER);
14801471 ev.msg.hdr.src = vmci_make_handle(VMCI_HYPERVISOR_CONTEXT_ID,
14811472 VMCI_CONTEXT_RESOURCE_ID);
....@@ -3037,7 +3028,7 @@
30373028 if (!qpair || !buf)
30383029 return VMCI_ERROR_INVALID_ARGS;
30393030
3040
- iov_iter_kvec(&from, WRITE | ITER_KVEC, &v, 1, buf_size);
3031
+ iov_iter_kvec(&from, WRITE, &v, 1, buf_size);
30413032
30423033 qp_lock(qpair);
30433034
....@@ -3081,7 +3072,7 @@
30813072 if (!qpair || !buf)
30823073 return VMCI_ERROR_INVALID_ARGS;
30833074
3084
- iov_iter_kvec(&to, READ | ITER_KVEC, &v, 1, buf_size);
3075
+ iov_iter_kvec(&to, READ, &v, 1, buf_size);
30853076
30863077 qp_lock(qpair);
30873078
....@@ -3126,7 +3117,7 @@
31263117 if (!qpair || !buf)
31273118 return VMCI_ERROR_INVALID_ARGS;
31283119
3129
- iov_iter_kvec(&to, READ | ITER_KVEC, &v, 1, buf_size);
3120
+ iov_iter_kvec(&to, READ, &v, 1, buf_size);
31303121
31313122 qp_lock(qpair);
31323123