forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/virt/vboxguest/vboxguest_utils.c
....@@ -7,6 +7,7 @@
77 */
88
99 #include <linux/errno.h>
10
+#include <linux/io.h>
1011 #include <linux/kernel.h>
1112 #include <linux/mm.h>
1213 #include <linux/module.h>
....@@ -58,11 +59,13 @@
5859 VBG_LOG(vbg_info, pr_info);
5960 VBG_LOG(vbg_warn, pr_warn);
6061 VBG_LOG(vbg_err, pr_err);
62
+VBG_LOG(vbg_err_ratelimited, pr_err_ratelimited);
6163 #if defined(DEBUG) && !defined(CONFIG_DYNAMIC_DEBUG)
6264 VBG_LOG(vbg_debug, pr_debug);
6365 #endif
6466
65
-void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type)
67
+void *vbg_req_alloc(size_t len, enum vmmdev_request_type req_type,
68
+ u32 requestor)
6669 {
6770 struct vmmdev_request_header *req;
6871 int order = get_order(PAGE_ALIGN(len));
....@@ -78,7 +81,7 @@
7881 req->request_type = req_type;
7982 req->rc = VERR_GENERAL_FAILURE;
8083 req->reserved1 = 0;
81
- req->reserved2 = 0;
84
+ req->requestor = requestor;
8285
8386 return req;
8487 }
....@@ -119,7 +122,7 @@
119122 return done;
120123 }
121124
122
-int vbg_hgcm_connect(struct vbg_dev *gdev,
125
+int vbg_hgcm_connect(struct vbg_dev *gdev, u32 requestor,
123126 struct vmmdev_hgcm_service_location *loc,
124127 u32 *client_id, int *vbox_status)
125128 {
....@@ -127,7 +130,7 @@
127130 int rc;
128131
129132 hgcm_connect = vbg_req_alloc(sizeof(*hgcm_connect),
130
- VMMDEVREQ_HGCM_CONNECT);
133
+ VMMDEVREQ_HGCM_CONNECT, requestor);
131134 if (!hgcm_connect)
132135 return -ENOMEM;
133136
....@@ -153,13 +156,15 @@
153156 }
154157 EXPORT_SYMBOL(vbg_hgcm_connect);
155158
156
-int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 client_id, int *vbox_status)
159
+int vbg_hgcm_disconnect(struct vbg_dev *gdev, u32 requestor,
160
+ u32 client_id, int *vbox_status)
157161 {
158162 struct vmmdev_hgcm_disconnect *hgcm_disconnect = NULL;
159163 int rc;
160164
161165 hgcm_disconnect = vbg_req_alloc(sizeof(*hgcm_disconnect),
162
- VMMDEVREQ_HGCM_DISCONNECT);
166
+ VMMDEVREQ_HGCM_DISCONNECT,
167
+ requestor);
163168 if (!hgcm_disconnect)
164169 return -ENOMEM;
165170
....@@ -307,7 +312,7 @@
307312 switch (type) {
308313 default:
309314 WARN_ON(1);
310
- /* Fall through */
315
+ fallthrough;
311316 case VMMDEV_HGCM_PARM_TYPE_LINADDR:
312317 case VMMDEV_HGCM_PARM_TYPE_LINADDR_KERNEL:
313318 return VMMDEV_HGCM_F_PARM_DIRECTION_BOTH;
....@@ -463,7 +468,7 @@
463468 * Cancellation fun.
464469 */
465470 static int vbg_hgcm_do_call(struct vbg_dev *gdev, struct vmmdev_hgcm_call *call,
466
- u32 timeout_ms, bool *leak_it)
471
+ u32 timeout_ms, bool interruptible, bool *leak_it)
467472 {
468473 int rc, cancel_rc, ret;
469474 long timeout;
....@@ -490,10 +495,15 @@
490495 else
491496 timeout = msecs_to_jiffies(timeout_ms);
492497
493
- timeout = wait_event_interruptible_timeout(
494
- gdev->hgcm_wq,
495
- hgcm_req_done(gdev, &call->header),
496
- timeout);
498
+ if (interruptible) {
499
+ timeout = wait_event_interruptible_timeout(gdev->hgcm_wq,
500
+ hgcm_req_done(gdev, &call->header),
501
+ timeout);
502
+ } else {
503
+ timeout = wait_event_timeout(gdev->hgcm_wq,
504
+ hgcm_req_done(gdev, &call->header),
505
+ timeout);
506
+ }
497507
498508 /* timeout > 0 means hgcm_req_done has returned true, so success */
499509 if (timeout > 0)
....@@ -594,9 +604,10 @@
594604 return 0;
595605 }
596606
597
-int vbg_hgcm_call(struct vbg_dev *gdev, u32 client_id, u32 function,
598
- u32 timeout_ms, struct vmmdev_hgcm_function_parameter *parms,
599
- u32 parm_count, int *vbox_status)
607
+int vbg_hgcm_call(struct vbg_dev *gdev, u32 requestor, u32 client_id,
608
+ u32 function, u32 timeout_ms,
609
+ struct vmmdev_hgcm_function_parameter *parms, u32 parm_count,
610
+ int *vbox_status)
600611 {
601612 struct vmmdev_hgcm_call *call;
602613 void **bounce_bufs = NULL;
....@@ -616,7 +627,7 @@
616627 goto free_bounce_bufs;
617628 }
618629
619
- call = vbg_req_alloc(size, VMMDEVREQ_HGCM_CALL);
630
+ call = vbg_req_alloc(size, VMMDEVREQ_HGCM_CALL, requestor);
620631 if (!call) {
621632 ret = -ENOMEM;
622633 goto free_bounce_bufs;
....@@ -625,7 +636,8 @@
625636 hgcm_call_init_call(call, client_id, function, parms, parm_count,
626637 bounce_bufs);
627638
628
- ret = vbg_hgcm_do_call(gdev, call, timeout_ms, &leak_it);
639
+ ret = vbg_hgcm_do_call(gdev, call, timeout_ms,
640
+ requestor & VMMDEV_REQUESTOR_USERMODE, &leak_it);
629641 if (ret == 0) {
630642 *vbox_status = call->header.result;
631643 ret = hgcm_call_copy_back_result(call, parms, parm_count,
....@@ -648,9 +660,9 @@
648660
649661 #ifdef CONFIG_COMPAT
650662 int vbg_hgcm_call32(
651
- struct vbg_dev *gdev, u32 client_id, u32 function, u32 timeout_ms,
652
- struct vmmdev_hgcm_function_parameter32 *parm32, u32 parm_count,
653
- int *vbox_status)
663
+ struct vbg_dev *gdev, u32 requestor, u32 client_id, u32 function,
664
+ u32 timeout_ms, struct vmmdev_hgcm_function_parameter32 *parm32,
665
+ u32 parm_count, int *vbox_status)
654666 {
655667 struct vmmdev_hgcm_function_parameter *parm64 = NULL;
656668 u32 i, size;
....@@ -690,7 +702,7 @@
690702 goto out_free;
691703 }
692704
693
- ret = vbg_hgcm_call(gdev, client_id, function, timeout_ms,
705
+ ret = vbg_hgcm_call(gdev, requestor, client_id, function, timeout_ms,
694706 parm64, parm_count, vbox_status);
695707 if (ret < 0)
696708 goto out_free;