devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes
@ 2022-09-02 13:13 Abel Vesa
  2022-09-02 13:13 ` [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find Abel Vesa
                   ` (14 more replies)
  0 siblings, 15 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

This patchset's main goal is adding the audiopd support to fastrpc.
There are also some fixes and reworks.

Abel Vesa (13):
  misc: fastrpc: Fix use-after-free and race in fastrpc_map_find
  misc: fastrpc: Don't remove map on creater_process and device_release
  misc: fastrpc: Rename audio protection domain to root
  misc: fastrpc: Add reserved mem support
  dt-bindings: misc: fastrpc: Document memory-region property
  misc: fastrpc: Add fastrpc_remote_heap_alloc
  misc: fastrpc: Use fastrpc_map_put in fastrpc_map_create on fail
  misc: fastrpc: Rework fastrpc_req_munmap
  misc: fastrpc: Add support for audiopd
  misc: fastrpc: Safekeep mmaps on interrupted invoke
  misc: fastrpc: Add mmap request assigning for static PD pool
  misc: fastrpc: Remove unnecessary if braces in fastrpc_internal_invoke
  misc: fastrpc: Add dma_mask to fastrpc_channel_ctx

Ola Jeppsson (1):
  misc: fastrpc: Fix use-after-free race condition for maps

 .../devicetree/bindings/misc/qcom,fastrpc.txt |   5 +
 drivers/misc/fastrpc.c                        | 337 ++++++++++++++----
 include/uapi/misc/fastrpc.h                   |   7 +
 3 files changed, 284 insertions(+), 65 deletions(-)

-- 
2.34.1


^ permalink raw reply	[flat|nested] 19+ messages in thread

* [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:25   ` Greg Kroah-Hartman
  2022-09-02 13:13 ` [PATCH 02/14] misc: fastrpc: Don't remove map on creater_process and device_release Abel Vesa
                   ` (13 subsequent siblings)
  14 siblings, 1 reply; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List, Ola Jeppsson

Currently, there is a race window between the point when the mutex is
unlocked in fastrpc_map_lookup and the reference count increasing
(fastrpc_map_get) in fastrpc_map_find, which can also lead to
use-after-free.

So lets merge fastrpc_map_find into fastrpc_map_lookup which allows us
to both protect the maps list by also taking the &fl->lock spinlock and
the reference count, since the spinlock will be released only after.
Add take_ref argument to make this suitable for all callers.

Co-developed-by: Ola Jeppsson <ola@snap.com>
Signed-off-by: Ola Jeppsson <ola@snap.com>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 41 +++++++++++++++++++++--------------------
 1 file changed, 21 insertions(+), 20 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 93ebd174d848..0c816a11eeec 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -333,30 +333,31 @@ static void fastrpc_map_get(struct fastrpc_map *map)
 
 
 static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
-			    struct fastrpc_map **ppmap)
+			    struct fastrpc_map **ppmap, bool take_ref)
 {
+	struct fastrpc_session_ctx *sess = fl->sctx;
 	struct fastrpc_map *map = NULL;
+	int ret = -ENOENT;
 
-	mutex_lock(&fl->mutex);
+	spin_lock(&fl->lock);
 	list_for_each_entry(map, &fl->maps, node) {
-		if (map->fd == fd) {
-			*ppmap = map;
-			mutex_unlock(&fl->mutex);
-			return 0;
-		}
-	}
-	mutex_unlock(&fl->mutex);
-
-	return -ENOENT;
-}
+		if (map->fd != fd)
+			continue;
 
-static int fastrpc_map_find(struct fastrpc_user *fl, int fd,
-			    struct fastrpc_map **ppmap)
-{
-	int ret = fastrpc_map_lookup(fl, fd, ppmap);
+		if (take_ref) {
+			ret = fastrpc_map_get(map);
+			if (ret) {
+				dev_dbg(sess->dev, "%s: Failed to get map fd=%d ret=%d\n",
+					__func__, fd, ret);
+				break;
+			}
+		}
 
-	if (!ret)
-		fastrpc_map_get(*ppmap);
+		*ppmap = map;
+		ret = 0;
+		break;
+	}
+	spin_unlock(&fl->lock);
 
 	return ret;
 }
@@ -703,7 +704,7 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
 	struct fastrpc_map *map = NULL;
 	int err = 0;
 
-	if (!fastrpc_map_find(fl, fd, ppmap))
+	if (!fastrpc_map_lookup(fl, fd, ppmap, true))
 		return 0;
 
 	map = kzalloc(sizeof(*map), GFP_KERNEL);
@@ -1026,7 +1027,7 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
 	for (i = 0; i < FASTRPC_MAX_FDLIST; i++) {
 		if (!fdlist[i])
 			break;
-		if (!fastrpc_map_lookup(fl, (int)fdlist[i], &mmap))
+		if (!fastrpc_map_lookup(fl, (int)fdlist[i], &mmap, false))
 			fastrpc_map_put(mmap);
 	}
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 02/14] misc: fastrpc: Don't remove map on creater_process and device_release
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
  2022-09-02 13:13 ` [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 03/14] misc: fastrpc: Fix use-after-free race condition for maps Abel Vesa
                   ` (12 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List, Ola Jeppsson

Do not remove the map from the list on error path in
fastrpc_init_create_process, instead call fastrpc_map_put, to avoid
use-after-free. Do not remove it on fastrpc_device_release either,
call fastrpc_map_put instead.

The fastrpc_free_map is the only proper place to remove the map.
This is called only after the reference count is 0.

Co-developed-by: Ola Jeppsson <ola@snap.com>
Signed-off-by: Ola Jeppsson <ola@snap.com>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 0c816a11eeec..50c17f5da3a8 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -316,6 +316,13 @@ static void fastrpc_free_map(struct kref *ref)
 		dma_buf_put(map->buf);
 	}
 
+	if (map->fl) {
+		spin_lock(&map->fl->lock);
+		list_del(&map->node);
+		spin_unlock(&map->fl->lock);
+		map->fl = NULL;
+	}
+
 	kfree(map);
 }
 
@@ -1266,12 +1273,7 @@ static int fastrpc_init_create_process(struct fastrpc_user *fl,
 	fl->init_mem = NULL;
 	fastrpc_buf_free(imem);
 err_alloc:
-	if (map) {
-		spin_lock(&fl->lock);
-		list_del(&map->node);
-		spin_unlock(&fl->lock);
-		fastrpc_map_put(map);
-	}
+	fastrpc_map_put(map);
 err:
 	kfree(args);
 
@@ -1347,10 +1349,8 @@ static int fastrpc_device_release(struct inode *inode, struct file *file)
 		fastrpc_context_put(ctx);
 	}
 
-	list_for_each_entry_safe(map, m, &fl->maps, node) {
-		list_del(&map->node);
+	list_for_each_entry_safe(map, m, &fl->maps, node)
 		fastrpc_map_put(map);
-	}
 
 	list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
 		list_del(&buf->node);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 03/14] misc: fastrpc: Fix use-after-free race condition for maps
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
  2022-09-02 13:13 ` [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find Abel Vesa
  2022-09-02 13:13 ` [PATCH 02/14] misc: fastrpc: Don't remove map on creater_process and device_release Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 04/14] misc: fastrpc: Rename audio protection domain to root Abel Vesa
                   ` (11 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List, Ola Jeppsson

From: Ola Jeppsson <ola@snap.com>

It is possible that in between calling fastrpc_map_get() until
map->fl->lock is taken in fastrpc_free_map(), another thread can call
fastrpc_map_lookup() and get a reference to a map that is about to be
deleted.

Rewrite fastrpc_map_get() to only increase the reference count of a map
if it's non-zero. Propagate this to callers so they can know if a map is
about to be deleted.

Fixes this warning:
refcount_t: addition on 0; use-after-free.
WARNING: CPU: 5 PID: 10100 at lib/refcount.c:25 refcount_warn_saturate
...
Call trace:
 refcount_warn_saturate
 [fastrpc_map_get inlined]
 [fastrpc_map_lookup inlined]
 fastrpc_map_create
 fastrpc_internal_invoke
 fastrpc_device_ioctl
 __arm64_sys_ioctl
 invoke_syscall

Signed-off-by: Ola Jeppsson <ola@snap.com>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 50c17f5da3a8..58654d394d17 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -332,10 +332,12 @@ static void fastrpc_map_put(struct fastrpc_map *map)
 		kref_put(&map->refcount, fastrpc_free_map);
 }
 
-static void fastrpc_map_get(struct fastrpc_map *map)
+static int fastrpc_map_get(struct fastrpc_map *map)
 {
-	if (map)
-		kref_get(&map->refcount);
+	if (!map)
+		return -ENOENT;
+
+	return kref_get_unless_zero(&map->refcount) ? 0 : -ENOENT;
 }
 
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 04/14] misc: fastrpc: Rename audio protection domain to root
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (2 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 03/14] misc: fastrpc: Fix use-after-free race condition for maps Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 05/14] misc: fastrpc: Add reserved mem support Abel Vesa
                   ` (10 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

The AUDIO_PD will be done via static pd, so the proper name here is
actually ROOT_PD.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 58654d394d17..8d803ee33904 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -83,7 +83,7 @@
 #define FASTRPC_RMID_INIT_MEM_UNMAP    11
 
 /* Protection Domain(PD) ids */
-#define AUDIO_PD	(0) /* also GUEST_OS PD? */
+#define ROOT_PD		(0) /* also GUEST_OS PD? */
 #define USER_PD		(1)
 #define SENSORS_PD	(2)
 
@@ -1889,7 +1889,7 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int cmd,
 		err = fastrpc_invoke(fl, argp);
 		break;
 	case FASTRPC_IOCTL_INIT_ATTACH:
-		err = fastrpc_init_attach(fl, AUDIO_PD);
+		err = fastrpc_init_attach(fl, ROOT_PD);
 		break;
 	case FASTRPC_IOCTL_INIT_ATTACH_SNS:
 		err = fastrpc_init_attach(fl, SENSORS_PD);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 05/14] misc: fastrpc: Add reserved mem support
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (3 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 04/14] misc: fastrpc: Rename audio protection domain to root Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 06/14] dt-bindings: misc: fastrpc: Document memory-region property Abel Vesa
                   ` (9 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

The reserved mem support is needed for CMA heap support, which will be
used by AUDIOPD.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 8d803ee33904..52271f51800d 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -19,6 +19,7 @@
 #include <linux/slab.h>
 #include <linux/qcom_scm.h>
 #include <uapi/misc/fastrpc.h>
+#include <linux/of_reserved_mem.h>
 
 #define ADSP_DOMAIN_ID (0)
 #define MDSP_DOMAIN_ID (1)
@@ -2064,6 +2065,9 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
 		return -EINVAL;
 	}
 
+	if (of_reserved_mem_device_init_by_idx(rdev, rdev->of_node, 0))
+		dev_info(rdev, "no reserved DMA memory for FASTRPC\n");
+
 	vmcount = of_property_read_variable_u32_array(rdev->of_node,
 				"qcom,vmids", &vmids[0], 0, FASTRPC_MAX_VMIDS);
 	if (vmcount < 0)
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 06/14] dt-bindings: misc: fastrpc: Document memory-region property
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (4 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 05/14] misc: fastrpc: Add reserved mem support Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 07/14] misc: fastrpc: Add fastrpc_remote_heap_alloc Abel Vesa
                   ` (8 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

Add memory-region property to the list of optional properties, specify
the value type and a definition

Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 Documentation/devicetree/bindings/misc/qcom,fastrpc.txt | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/Documentation/devicetree/bindings/misc/qcom,fastrpc.txt b/Documentation/devicetree/bindings/misc/qcom,fastrpc.txt
index 5ec124b138a6..3dd02aaa7ba7 100644
--- a/Documentation/devicetree/bindings/misc/qcom,fastrpc.txt
+++ b/Documentation/devicetree/bindings/misc/qcom,fastrpc.txt
@@ -17,6 +17,11 @@ other tasks.
 	Definition: should specify the dsp domain name this fastrpc
 	corresponds to. must be one of this: "adsp", "mdsp", "sdsp", "cdsp"
 
+- memory-region:
+	Usage: optional
+	Value type: <phandle>
+	Definition: reference to the reserved-memory for the region
+
 - qcom,non-secure-domain:
 	Usage: required
 	Value type: <boolean>
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 07/14] misc: fastrpc: Add fastrpc_remote_heap_alloc
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (5 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 06/14] dt-bindings: misc: fastrpc: Document memory-region property Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 08/14] misc: fastrpc: Use fastrpc_map_put in fastrpc_map_create on fail Abel Vesa
                   ` (7 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

Split fastrpc_buf_alloc in such a way it allows allocation of remote
heap too and add fastrpc_remote_heap_alloc to do so.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 29 ++++++++++++++++++++++++++---
 1 file changed, 26 insertions(+), 3 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 52271f51800d..6730aa324e10 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -379,7 +379,7 @@ static void fastrpc_buf_free(struct fastrpc_buf *buf)
 	kfree(buf);
 }
 
-static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
+static int __fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
 			     u64 size, struct fastrpc_buf **obuf)
 {
 	struct fastrpc_buf *buf;
@@ -407,14 +407,37 @@ static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
 		return -ENOMEM;
 	}
 
+	*obuf = buf;
+
+	return 0;
+}
+
+static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
+			     u64 size, struct fastrpc_buf **obuf)
+{
+	int ret;
+	struct fastrpc_buf *buf;
+
+	ret = __fastrpc_buf_alloc(fl, dev, size, obuf);
+	if (ret)
+		return ret;
+
+	buf = *obuf;
+
 	if (fl->sctx && fl->sctx->sid)
 		buf->phys += ((u64)fl->sctx->sid << 32);
 
-	*obuf = buf;
-
 	return 0;
 }
 
+static int fastrpc_remote_heap_alloc(struct fastrpc_user *fl, struct device *dev,
+				     u64 size, struct fastrpc_buf **obuf)
+{
+	struct device *rdev = &fl->cctx->rpdev->dev;
+
+	return  __fastrpc_buf_alloc(fl, rdev, size, obuf);
+}
+
 static void fastrpc_channel_ctx_free(struct kref *ref)
 {
 	struct fastrpc_channel_ctx *cctx;
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 08/14] misc: fastrpc: Use fastrpc_map_put in fastrpc_map_create on fail
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (6 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 07/14] misc: fastrpc: Add fastrpc_remote_heap_alloc Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 09/14] misc: fastrpc: Rework fastrpc_req_munmap Abel Vesa
                   ` (6 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

Move the kref_init right after the allocation so that we can use
fastrpc_map_put on any following error case.

Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 6730aa324e10..5eececd9b6bd 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -745,6 +745,8 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
 		return -ENOMEM;
 
 	INIT_LIST_HEAD(&map->node);
+	kref_init(&map->refcount);
+
 	map->fl = fl;
 	map->fd = fd;
 	map->buf = dma_buf_get(fd);
@@ -771,7 +773,6 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
 	map->size = len;
 	map->va = sg_virt(map->table->sgl);
 	map->len = len;
-	kref_init(&map->refcount);
 
 	if (attr & FASTRPC_ATTR_SECUREMAP) {
 		/*
@@ -801,7 +802,7 @@ static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
 attach_err:
 	dma_buf_put(map->buf);
 get_err:
-	kfree(map);
+	fastrpc_map_put(map);
 
 	return err;
 }
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 09/14] misc: fastrpc: Rework fastrpc_req_munmap
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (7 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 08/14] misc: fastrpc: Use fastrpc_map_put in fastrpc_map_create on fail Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 10/14] misc: fastrpc: Add support for audiopd Abel Vesa
                   ` (5 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

Move the lookup of the munmap request to the fastrpc_req_munmap and pass
on only the buf to the lower level fastrpc_req_munmap_impl. That way
we can use the lower level fastrpc_req_munmap_impl on error path in
fastrpc_req_mmap to free the buf without searching for the munmap
request it belongs to.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 47 +++++++++++++++++++++---------------------
 1 file changed, 23 insertions(+), 24 deletions(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 5eececd9b6bd..7c364c58e379 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -1630,30 +1630,14 @@ static int fastrpc_get_dsp_info(struct fastrpc_user *fl, char __user *argp)
 	return 0;
 }
 
-static int fastrpc_req_munmap_impl(struct fastrpc_user *fl,
-				   struct fastrpc_req_munmap *req)
+static int fastrpc_req_munmap_impl(struct fastrpc_user *fl, struct fastrpc_buf *buf)
 {
 	struct fastrpc_invoke_args args[1] = { [0] = { 0 } };
-	struct fastrpc_buf *buf = NULL, *iter, *b;
 	struct fastrpc_munmap_req_msg req_msg;
 	struct device *dev = fl->sctx->dev;
 	int err;
 	u32 sc;
 
-	spin_lock(&fl->lock);
-	list_for_each_entry_safe(iter, b, &fl->mmaps, node) {
-		if ((iter->raddr == req->vaddrout) && (iter->size == req->size)) {
-			buf = iter;
-			break;
-		}
-	}
-	spin_unlock(&fl->lock);
-
-	if (!buf) {
-		dev_err(dev, "mmap not in list\n");
-		return -EINVAL;
-	}
-
 	req_msg.pgid = fl->tgid;
 	req_msg.size = buf->size;
 	req_msg.vaddr = buf->raddr;
@@ -1679,12 +1663,29 @@ static int fastrpc_req_munmap_impl(struct fastrpc_user *fl,
 
 static int fastrpc_req_munmap(struct fastrpc_user *fl, char __user *argp)
 {
+	struct fastrpc_buf *buf = NULL, *iter, *b;
 	struct fastrpc_req_munmap req;
+	struct device *dev = fl->sctx->dev;
 
 	if (copy_from_user(&req, argp, sizeof(req)))
 		return -EFAULT;
 
-	return fastrpc_req_munmap_impl(fl, &req);
+	spin_lock(&fl->lock);
+	list_for_each_entry_safe(iter, b, &fl->mmaps, node) {
+		if ((iter->raddr == req.vaddrout) && (iter->size == req.size)) {
+			buf = iter;
+			break;
+		}
+	}
+	spin_unlock(&fl->lock);
+
+	if (!buf) {
+		dev_err(dev, "mmap\t\tpt 0x%09llx [len 0x%08llx] not in list\n",
+			req.vaddrout, req.size);
+		return -EINVAL;
+	}
+
+	return fastrpc_req_munmap_impl(fl, buf);
 }
 
 static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
@@ -1693,7 +1694,6 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
 	struct fastrpc_buf *buf = NULL;
 	struct fastrpc_mmap_req_msg req_msg;
 	struct fastrpc_mmap_rsp_msg rsp_msg;
-	struct fastrpc_req_munmap req_unmap;
 	struct fastrpc_phy_page pages;
 	struct fastrpc_req_mmap req;
 	struct device *dev = fl->sctx->dev;
@@ -1755,11 +1755,8 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
 	spin_unlock(&fl->lock);
 
 	if (copy_to_user((void __user *)argp, &req, sizeof(req))) {
-		/* unmap the memory and release the buffer */
-		req_unmap.vaddrout = buf->raddr;
-		req_unmap.size = buf->size;
-		fastrpc_req_munmap_impl(fl, &req_unmap);
-		return -EFAULT;
+		err = -EFAULT;
+		goto err_assign;
 	}
 
 	dev_dbg(dev, "mmap\t\tpt 0x%09lx OK [len 0x%08llx]\n",
@@ -1767,6 +1764,8 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
 
 	return 0;
 
+err_assign:
+	fastrpc_req_munmap_impl(fl, buf);
 err_invoke:
 	fastrpc_buf_free(buf);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 10/14] misc: fastrpc: Add support for audiopd
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (8 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 09/14] misc: fastrpc: Rework fastrpc_req_munmap Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-04  4:02   ` kernel test robot
  2022-09-02 13:13 ` [PATCH 11/14] misc: fastrpc: Safekeep mmaps on interrupted invoke Abel Vesa
                   ` (4 subsequent siblings)
  14 siblings, 1 reply; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

In order to be able to start the adsp listener for audiopd using adsprpcd,
we need to add the corresponding ioctl for creating a static process.
On that ioctl call we need to allocate the heap. Allocating the heap needs
to be happening only once and needs to be kept between different device
open calls, so attach it to the channel context to make sure that remains
until the RPMSG driver is removed. Then, if there are any VMIDs associated
with the static ADSP process, do a call to SCM to assign it.
And then, send all the necessary info related to heap to the DSP.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c      | 126 ++++++++++++++++++++++++++++++++++++
 include/uapi/misc/fastrpc.h |   7 ++
 2 files changed, 133 insertions(+)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 7c364c58e379..2c656da4ca5e 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -37,8 +37,20 @@
 #define FASTRPC_DSP_UTILITIES_HANDLE	2
 #define FASTRPC_CTXID_MASK (0xFF0)
 #define INIT_FILELEN_MAX (2 * 1024 * 1024)
+#define INIT_FILE_NAMELEN_MAX (128)
 #define FASTRPC_DEVICE_NAME	"fastrpc"
+
+/* Add memory to static PD pool, protection thru XPU */
+#define ADSP_MMAP_HEAP_ADDR  4
+/* MAP static DMA buffer on DSP User PD */
+#define ADSP_MMAP_DMA_BUFFER  6
+/* Add memory to static PD pool protection thru hypervisor */
+#define ADSP_MMAP_REMOTE_HEAP_ADDR  8
+/* Add memory to userPD pool, for user heap */
 #define ADSP_MMAP_ADD_PAGES 0x1000
+/* Add memory to userPD pool, for LLC heap */
+#define ADSP_MMAP_ADD_PAGES_LLC 0x3000,
+
 #define DSP_UNSUPPORTED_API (0x80000414)
 /* MAX NUMBER of DSP ATTRIBUTES SUPPORTED */
 #define FASTRPC_MAX_DSP_ATTRIBUTES (256)
@@ -72,6 +84,7 @@
 		FASTRPC_BUILD_SCALARS(0, method, in, out, 0, 0)
 
 #define FASTRPC_CREATE_PROCESS_NARGS	6
+#define FASTRPC_CREATE_STATIC_PROCESS_NARGS	3
 /* Remote Method id table */
 #define FASTRPC_RMID_INIT_ATTACH	0
 #define FASTRPC_RMID_INIT_RELEASE	1
@@ -261,6 +274,7 @@ struct fastrpc_channel_ctx {
 	u32 dsp_attributes[FASTRPC_MAX_DSP_ATTRIBUTES];
 	struct fastrpc_device *secure_fdevice;
 	struct fastrpc_device *fdevice;
+	struct fastrpc_buf *remote_heap;
 	bool secure;
 	bool unsigned_support;
 };
@@ -1167,6 +1181,7 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
 		spin_unlock(&fl->lock);
 		fastrpc_context_put(ctx);
 	}
+
 	if (err)
 		dev_dbg(fl->sctx->dev, "Error: Invoke Failed %d\n", err);
 
@@ -1191,6 +1206,111 @@ static bool is_session_rejected(struct fastrpc_user *fl, bool unsigned_pd_reques
 	return false;
 }
 
+static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
+					      char __user *argp)
+{
+	struct fastrpc_init_create_static init;
+	struct fastrpc_invoke_args *args;
+	struct fastrpc_phy_page pages[1];
+	char *name;
+	int err;
+	struct {
+		int pgid;
+		u32 namelen;
+		u32 pageslen;
+	} inbuf;
+	u32 sc;
+
+	args = kcalloc(FASTRPC_CREATE_STATIC_PROCESS_NARGS, sizeof(*args), GFP_KERNEL);
+	if (!args)
+		return -ENOMEM;
+
+	if (copy_from_user(&init, argp, sizeof(init))) {
+		err = -EFAULT;
+		goto err;
+	}
+
+	if (init.namelen > INIT_FILE_NAMELEN_MAX) {
+		err = -EINVAL;
+		goto err;
+	}
+
+	name = kzalloc(init.namelen, GFP_KERNEL);
+	if (!name) {
+		err = -ENOMEM;
+		goto err;
+	}
+
+	if (copy_from_user(name, (void __user *)(uintptr_t)init.name, init.namelen)) {
+		err = -EFAULT;
+		goto err_name;
+	}
+
+	if (!fl->cctx->remote_heap) {
+		err = fastrpc_remote_heap_alloc(fl, fl->sctx->dev, init.memlen,
+						&fl->cctx->remote_heap);
+		if (err)
+			goto err_name;
+
+		/* Map if we have any heap VMIDs associated with this ADSP Static Process. */
+		if (fl->cctx->vmcount) {
+			unsigned int perms = BIT(QCOM_SCM_VMID_HLOS);
+
+			dev_dbg(fl->sctx->dev, "Assinging memory with phys 0x%llx size 0x%llx perms 0x%x, vmperms %x, vmcount %x\n",
+				fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size,
+				perms, fl->cctx->vmperms, fl->cctx->vmcount);
+			err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
+							(u64)fl->cctx->remote_heap->size, &perms,
+							fl->cctx->vmperms, fl->cctx->vmcount);
+			if (err) {
+				dev_err(fl->sctx->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d",
+					fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
+				goto err_map;
+			}
+		}
+	}
+
+	inbuf.pgid = fl->tgid;
+	inbuf.namelen = init.namelen;
+	inbuf.pageslen = 0;
+	fl->pd = USER_PD;
+
+	args[0].ptr = (u64)(uintptr_t)&inbuf;
+	args[0].length = sizeof(inbuf);
+	args[0].fd = -1;
+
+	args[1].ptr = (u64)(uintptr_t)name;
+	args[1].length = inbuf.namelen;
+	args[1].fd = -1;
+
+	pages[0].addr = fl->cctx->remote_heap->phys;
+	pages[0].size = fl->cctx->remote_heap->size;
+
+	args[2].ptr = (u64)(uintptr_t) pages;
+	args[2].length = sizeof(*pages);
+	args[2].fd = -1;
+
+	sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_STATIC, 3, 0);
+
+	err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
+				      sc, args);
+	if (err)
+		goto err_invoke;
+
+	kfree(args);
+
+	return 0;
+err_invoke:
+err_map:
+	fastrpc_buf_free(fl->cctx->remote_heap);
+err_name:
+	kfree(name);
+err:
+	kfree(args);
+
+	return err;
+}
+
 static int fastrpc_init_create_process(struct fastrpc_user *fl,
 					char __user *argp)
 {
@@ -1918,6 +2038,9 @@ static long fastrpc_device_ioctl(struct file *file, unsigned int cmd,
 	case FASTRPC_IOCTL_INIT_ATTACH_SNS:
 		err = fastrpc_init_attach(fl, SENSORS_PD);
 		break;
+	case FASTRPC_IOCTL_INIT_CREATE_STATIC:
+		err = fastrpc_init_create_static_process(fl, argp);
+		break;
 	case FASTRPC_IOCTL_INIT_CREATE:
 		err = fastrpc_init_create_process(fl, argp);
 		break;
@@ -2183,6 +2306,9 @@ static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev)
 	if (cctx->secure_fdevice)
 		misc_deregister(&cctx->secure_fdevice->miscdev);
 
+	if (cctx->remote_heap)
+		fastrpc_buf_free(cctx->remote_heap);
+
 	of_platform_depopulate(&rpdev->dev);
 
 	cctx->rpdev = NULL;
diff --git a/include/uapi/misc/fastrpc.h b/include/uapi/misc/fastrpc.h
index 5e29f2cfa42d..2cdf2f137d33 100644
--- a/include/uapi/misc/fastrpc.h
+++ b/include/uapi/misc/fastrpc.h
@@ -16,6 +16,7 @@
 #define FASTRPC_IOCTL_MEM_MAP		_IOWR('R', 10, struct fastrpc_mem_map)
 #define FASTRPC_IOCTL_MEM_UNMAP		_IOWR('R', 11, struct fastrpc_mem_unmap)
 #define FASTRPC_IOCTL_GET_DSP_INFO	_IOWR('R', 13, struct fastrpc_ioctl_capability)
+#define FASTRPC_IOCTL_INIT_CREATE_STATIC _IOWR('R', 15, struct fastrpc_init_create_static)
 
 /**
  * enum fastrpc_map_flags - control flags for mapping memory on DSP user process
@@ -87,6 +88,12 @@ struct fastrpc_init_create {
 	__u64 file;	/* pointer to elf file */
 };
 
+struct fastrpc_init_create_static {
+	__u32 namelen;	/* length of pd process name */
+	__u32 memlen;
+	__u64 name;	/* pd process name */
+};
+
 struct fastrpc_alloc_dma_buf {
 	__s32 fd;	/* fd */
 	__u32 flags;	/* flags to map with */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 11/14] misc: fastrpc: Safekeep mmaps on interrupted invoke
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (9 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 10/14] misc: fastrpc: Add support for audiopd Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 12/14] misc: fastrpc: Add mmap request assigning for static PD pool Abel Vesa
                   ` (3 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

If the userspace daemon is killed in the middle of an invoke (e.g.
audiopd listerner invoke), we need to skip the unmapping on device
release, otherwise the DSP will crash. So lets safekeep all the maps
only if there is in invoke interrupted, by attaching them to the channel
context (which is resident until RPMSG driver is removed), and restore
them back to the fastrpc user on the next device open call.

Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 2c656da4ca5e..41eabdf0a256 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -275,6 +275,7 @@ struct fastrpc_channel_ctx {
 	struct fastrpc_device *secure_fdevice;
 	struct fastrpc_device *fdevice;
 	struct fastrpc_buf *remote_heap;
+	struct list_head invoke_interrupted_mmaps;
 	bool secure;
 	bool unsigned_support;
 };
@@ -1114,6 +1115,26 @@ static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx,
 
 }
 
+static void fastrpc_invoke_interrupted_restore_mmaps(struct fastrpc_user *fl)
+{
+	struct fastrpc_buf *buf, *b;
+
+	list_for_each_entry_safe(buf, b, &fl->cctx->invoke_interrupted_mmaps, node) {
+		list_del(&buf->node);
+		list_add(&buf->node, &fl->mmaps);
+	}
+}
+
+static void fastrpc_invoke_interrupted_save_mmaps(struct fastrpc_user *fl)
+{
+	struct fastrpc_buf *buf, *b;
+
+	list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
+		list_del(&buf->node);
+		list_add_tail(&buf->node, &fl->cctx->invoke_interrupted_mmaps);
+	}
+}
+
 static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
 				   u32 handle, u32 sc,
 				   struct fastrpc_invoke_args *args)
@@ -1182,6 +1203,9 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
 		fastrpc_context_put(ctx);
 	}
 
+	if (err == -ERESTARTSYS)
+		fastrpc_invoke_interrupted_save_mmaps(fl);
+
 	if (err)
 		dev_dbg(fl->sctx->dev, "Error: Invoke Failed %d\n", err);
 
@@ -1551,6 +1575,8 @@ static int fastrpc_device_open(struct inode *inode, struct file *filp)
 		return -EBUSY;
 	}
 
+	fastrpc_invoke_interrupted_restore_mmaps(fl);
+
 	spin_lock_irqsave(&cctx->lock, flags);
 	list_add_tail(&fl->user, &cctx->users);
 	spin_unlock_irqrestore(&cctx->lock, flags);
@@ -2268,6 +2294,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
 	dev_set_drvdata(&rpdev->dev, data);
 	dma_set_mask_and_coherent(rdev, DMA_BIT_MASK(32));
 	INIT_LIST_HEAD(&data->users);
+	INIT_LIST_HEAD(&data->invoke_interrupted_mmaps);
 	spin_lock_init(&data->lock);
 	idr_init(&data->ctx_idr);
 	data->domain_id = domain_id;
@@ -2292,6 +2319,7 @@ static void fastrpc_notify_users(struct fastrpc_user *user)
 static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev)
 {
 	struct fastrpc_channel_ctx *cctx = dev_get_drvdata(&rpdev->dev);
+	struct fastrpc_buf *buf, *b;
 	struct fastrpc_user *user;
 	unsigned long flags;
 
@@ -2306,6 +2334,9 @@ static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev)
 	if (cctx->secure_fdevice)
 		misc_deregister(&cctx->secure_fdevice->miscdev);
 
+	list_for_each_entry_safe(buf, b, &cctx->invoke_interrupted_mmaps, node)
+		list_del(&buf->node);
+
 	if (cctx->remote_heap)
 		fastrpc_buf_free(cctx->remote_heap);
 
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 12/14] misc: fastrpc: Add mmap request assigning for static PD pool
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (10 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 11/14] misc: fastrpc: Safekeep mmaps on interrupted invoke Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 13/14] misc: fastrpc: Remove unnecessary if braces in fastrpc_internal_invoke Abel Vesa
                   ` (2 subsequent siblings)
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

If the mmap request is to add pages and thre are VMIDs associated with
that context, do a call to SCM to reassign that memory. Do not do this
for remote heap allocation, that is done on init create static process
only.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 19 ++++++++++++++++++-
 1 file changed, 18 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 41eabdf0a256..66dc71e20e4f 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -1849,8 +1849,9 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
 	if (copy_from_user(&req, argp, sizeof(req)))
 		return -EFAULT;
 
-	if (req.flags != ADSP_MMAP_ADD_PAGES) {
+	if (req.flags != ADSP_MMAP_ADD_PAGES && req.flags != ADSP_MMAP_REMOTE_HEAP_ADDR) {
 		dev_err(dev, "flag not supported 0x%x\n", req.flags);
+
 		return -EINVAL;
 	}
 
@@ -1896,6 +1897,22 @@ static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
 	/* let the client know the address to use */
 	req.vaddrout = rsp_msg.vaddr;
 
+	/* Add memory to static PD pool, protection thru hypervisor */
+	if (req.flags != ADSP_MMAP_REMOTE_HEAP_ADDR && fl->cctx->vmcount) {
+		struct qcom_scm_vmperm perm;
+		int err = 0;
+
+		perm.vmid = QCOM_SCM_VMID_HLOS;
+		perm.perm = QCOM_SCM_PERM_RWX;
+		err = qcom_scm_assign_mem(buf->phys, buf->size,
+			&(fl->cctx->vmperms[0].vmid), &perm, 1);
+		if (err) {
+			dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
+					buf->phys, buf->size, err);
+			goto err_assign;
+		}
+	}
+
 	spin_lock(&fl->lock);
 	list_add_tail(&buf->node, &fl->mmaps);
 	spin_unlock(&fl->lock);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 13/14] misc: fastrpc: Remove unnecessary if braces in fastrpc_internal_invoke
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (11 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 12/14] misc: fastrpc: Add mmap request assigning for static PD pool Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 13:13 ` [PATCH 14/14] misc: fastrpc: Add dma_mask to fastrpc_channel_ctx Abel Vesa
  2022-09-02 15:06 ` [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

Remove braces for single statement block in fastrpc_internal_invoke for
remote dsp response check.

Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index 66dc71e20e4f..cd7c6cf269a1 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -1182,8 +1182,9 @@ static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
 
 	/* Check the response from remote dsp */
 	err = ctx->retval;
-	if (err)
+	if (err) {
 		goto bail;
+	}
 
 	if (ctx->nscalars) {
 		/* make sure that all memory writes by DSP are seen by CPU */
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* [PATCH 14/14] misc: fastrpc: Add dma_mask to fastrpc_channel_ctx
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (12 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 13/14] misc: fastrpc: Remove unnecessary if braces in fastrpc_internal_invoke Abel Vesa
@ 2022-09-02 13:13 ` Abel Vesa
  2022-09-02 15:06 ` [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 13:13 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

dma_set_mask_and_coherent only updates the mask to which the device
dma_mask pointer points to. Add a dma_mask to the channel ctx and set
the device dma_mask to point to that, otherwise the dma_set_mask will
return an error and the dma_set_coherent_mask will be skipped too.

Co-developed-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@linaro.org>
Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
---
 drivers/misc/fastrpc.c | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c
index cd7c6cf269a1..3e0dbb5e9548 100644
--- a/drivers/misc/fastrpc.c
+++ b/drivers/misc/fastrpc.c
@@ -278,6 +278,7 @@ struct fastrpc_channel_ctx {
 	struct list_head invoke_interrupted_mmaps;
 	bool secure;
 	bool unsigned_support;
+	u64 dma_mask;
 };
 
 struct fastrpc_device {
@@ -2310,6 +2311,7 @@ static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
 	kref_init(&data->refcount);
 
 	dev_set_drvdata(&rpdev->dev, data);
+	rdev->dma_mask = &data->dma_mask;
 	dma_set_mask_and_coherent(rdev, DMA_BIT_MASK(32));
 	INIT_LIST_HEAD(&data->users);
 	INIT_LIST_HEAD(&data->invoke_interrupted_mmaps);
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find
  2022-09-02 13:13 ` [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find Abel Vesa
@ 2022-09-02 13:25   ` Greg Kroah-Hartman
  2022-09-02 14:25     ` Abel Vesa
  0 siblings, 1 reply; 19+ messages in thread
From: Greg Kroah-Hartman @ 2022-09-02 13:25 UTC (permalink / raw)
  To: Abel Vesa
  Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta,
	Arnd Bergmann, linux-arm-msm, devicetree,
	Linux Kernel Mailing List, Ola Jeppsson

On Fri, Sep 02, 2022 at 04:13:31PM +0300, Abel Vesa wrote:
> Currently, there is a race window between the point when the mutex is
> unlocked in fastrpc_map_lookup and the reference count increasing
> (fastrpc_map_get) in fastrpc_map_find, which can also lead to
> use-after-free.
> 
> So lets merge fastrpc_map_find into fastrpc_map_lookup which allows us
> to both protect the maps list by also taking the &fl->lock spinlock and
> the reference count, since the spinlock will be released only after.
> Add take_ref argument to make this suitable for all callers.
> 
> Co-developed-by: Ola Jeppsson <ola@snap.com>
> Signed-off-by: Ola Jeppsson <ola@snap.com>
> Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
> ---
>  drivers/misc/fastrpc.c | 41 +++++++++++++++++++++--------------------
>  1 file changed, 21 insertions(+), 20 deletions(-)

What commit does this fix?  Should it go to stable trees?

Try splitting this series up into 2, one for 6.0-final with bugfixes to
resolve issues found, and the next one on top of that for new features.

thanks,

greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find
  2022-09-02 13:25   ` Greg Kroah-Hartman
@ 2022-09-02 14:25     ` Abel Vesa
  0 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 14:25 UTC (permalink / raw)
  To: Greg Kroah-Hartman
  Cc: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta,
	Arnd Bergmann, linux-arm-msm, devicetree,
	Linux Kernel Mailing List, Ola Jeppsson

On 22-09-02 15:25:10, Greg Kroah-Hartman wrote:
> On Fri, Sep 02, 2022 at 04:13:31PM +0300, Abel Vesa wrote:
> > Currently, there is a race window between the point when the mutex is
> > unlocked in fastrpc_map_lookup and the reference count increasing
> > (fastrpc_map_get) in fastrpc_map_find, which can also lead to
> > use-after-free.
> > 
> > So lets merge fastrpc_map_find into fastrpc_map_lookup which allows us
> > to both protect the maps list by also taking the &fl->lock spinlock and
> > the reference count, since the spinlock will be released only after.
> > Add take_ref argument to make this suitable for all callers.
> > 
> > Co-developed-by: Ola Jeppsson <ola@snap.com>
> > Signed-off-by: Ola Jeppsson <ola@snap.com>
> > Signed-off-by: Abel Vesa <abel.vesa@linaro.org>
> > ---
> >  drivers/misc/fastrpc.c | 41 +++++++++++++++++++++--------------------
> >  1 file changed, 21 insertions(+), 20 deletions(-)
> 
> What commit does this fix?  Should it go to stable trees?

Will specify in the next version.

> 
> Try splitting this series up into 2, one for 6.0-final with bugfixes to
> resolve issues found, and the next one on top of that for new features.

Fair point. Will do in the next version.

> 
> thanks,
> 
> greg k-h

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes
  2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
                   ` (13 preceding siblings ...)
  2022-09-02 13:13 ` [PATCH 14/14] misc: fastrpc: Add dma_mask to fastrpc_channel_ctx Abel Vesa
@ 2022-09-02 15:06 ` Abel Vesa
  14 siblings, 0 replies; 19+ messages in thread
From: Abel Vesa @ 2022-09-02 15:06 UTC (permalink / raw)
  To: Andy Gross, Bjorn Andersson, Konrad Dybcio, Srinivas Kandagatla,
	Amol Maheshwari, Rob Herring, Krzysztof Kozlowski, Ekansh Gupta
  Cc: Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm, devicetree,
	Linux Kernel Mailing List

On 22-09-02 16:13:30, Abel Vesa wrote:
> This patchset's main goal is adding the audiopd support to fastrpc.
> There are also some fixes and reworks.
> 

Please ignore this entire patchset. Will resend.

> Abel Vesa (13):
>   misc: fastrpc: Fix use-after-free and race in fastrpc_map_find
>   misc: fastrpc: Don't remove map on creater_process and device_release
>   misc: fastrpc: Rename audio protection domain to root
>   misc: fastrpc: Add reserved mem support
>   dt-bindings: misc: fastrpc: Document memory-region property
>   misc: fastrpc: Add fastrpc_remote_heap_alloc
>   misc: fastrpc: Use fastrpc_map_put in fastrpc_map_create on fail
>   misc: fastrpc: Rework fastrpc_req_munmap
>   misc: fastrpc: Add support for audiopd
>   misc: fastrpc: Safekeep mmaps on interrupted invoke
>   misc: fastrpc: Add mmap request assigning for static PD pool
>   misc: fastrpc: Remove unnecessary if braces in fastrpc_internal_invoke
>   misc: fastrpc: Add dma_mask to fastrpc_channel_ctx
> 
> Ola Jeppsson (1):
>   misc: fastrpc: Fix use-after-free race condition for maps
> 
>  .../devicetree/bindings/misc/qcom,fastrpc.txt |   5 +
>  drivers/misc/fastrpc.c                        | 337 ++++++++++++++----
>  include/uapi/misc/fastrpc.h                   |   7 +
>  3 files changed, 284 insertions(+), 65 deletions(-)
> 
> -- 
> 2.34.1
> 

^ permalink raw reply	[flat|nested] 19+ messages in thread

* Re: [PATCH 10/14] misc: fastrpc: Add support for audiopd
  2022-09-02 13:13 ` [PATCH 10/14] misc: fastrpc: Add support for audiopd Abel Vesa
@ 2022-09-04  4:02   ` kernel test robot
  0 siblings, 0 replies; 19+ messages in thread
From: kernel test robot @ 2022-09-04  4:02 UTC (permalink / raw)
  To: Abel Vesa, Andy Gross, Bjorn Andersson, Konrad Dybcio,
	Srinivas Kandagatla, Amol Maheshwari, Rob Herring,
	Krzysztof Kozlowski, Ekansh Gupta
  Cc: kbuild-all, Arnd Bergmann, Greg Kroah-Hartman, linux-arm-msm,
	devicetree, Linux Kernel Mailing List

Hi Abel,

I love your patch! Perhaps something to improve:

[auto build test WARNING on char-misc/char-misc-testing]
[also build test WARNING on robh/for-next linus/master v6.0-rc3 next-20220901]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch#_base_tree_information]

url:    https://github.com/intel-lab-lkp/linux/commits/Abel-Vesa/misc-fastrpc-Add-audiopd-support-and-some-fixes/20220902-215548
base:   https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc.git 4ec7ac90ff399b7d9af81cc8afd430a22786c61b
config: ia64-allyesconfig (https://download.01.org/0day-ci/archive/20220904/202209041138.pdoIATKj-lkp@intel.com/config)
compiler: ia64-linux-gcc (GCC) 12.1.0
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # https://github.com/intel-lab-lkp/linux/commit/40e5982368fa8e5eeb1a3ff7b955d0c0b54656d1
        git remote add linux-review https://github.com/intel-lab-lkp/linux
        git fetch --no-tags linux-review Abel-Vesa/misc-fastrpc-Add-audiopd-support-and-some-fixes/20220902-215548
        git checkout 40e5982368fa8e5eeb1a3ff7b955d0c0b54656d1
        # save the config file
        mkdir build_dir && cp config build_dir/.config
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-12.1.0 make.cross W=1 O=build_dir ARCH=ia64 SHELL=/bin/bash drivers/misc/

If you fix the issue, kindly add following tag where applicable
Reported-by: kernel test robot <lkp@intel.com>

All warnings (new ones prefixed by >>):

   In file included from include/linux/printk.h:573,
                    from include/asm-generic/bug.h:22,
                    from arch/ia64/include/asm/bug.h:17,
                    from include/linux/bug.h:5,
                    from include/linux/thread_info.h:13,
                    from include/asm-generic/preempt.h:5,
                    from ./arch/ia64/include/generated/asm/preempt.h:1,
                    from include/linux/preempt.h:78,
                    from include/linux/spinlock.h:55,
                    from include/linux/swait.h:7,
                    from include/linux/completion.h:12,
                    from drivers/misc/fastrpc.c:5:
   drivers/misc/fastrpc.c: In function 'fastrpc_init_create_static_process':
>> drivers/misc/fastrpc.c:1259:48: warning: format '%x' expects argument of type 'unsigned int', but argument 7 has type 'struct qcom_scm_vmperm *' [-Wformat=]
    1259 |                         dev_dbg(fl->sctx->dev, "Assinging memory with phys 0x%llx size 0x%llx perms 0x%x, vmperms %x, vmcount %x\n",
         |                                                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
   include/linux/dynamic_debug.h:134:29: note: in definition of macro '__dynamic_func_call'
     134 |                 func(&id, ##__VA_ARGS__);               \
         |                             ^~~~~~~~~~~
   include/linux/dynamic_debug.h:166:9: note: in expansion of macro '_dynamic_func_call'
     166 |         _dynamic_func_call(fmt,__dynamic_dev_dbg,               \
         |         ^~~~~~~~~~~~~~~~~~
   include/linux/dev_printk.h:155:9: note: in expansion of macro 'dynamic_dev_dbg'
     155 |         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
         |         ^~~~~~~~~~~~~~~
   include/linux/dev_printk.h:155:30: note: in expansion of macro 'dev_fmt'
     155 |         dynamic_dev_dbg(dev, dev_fmt(fmt), ##__VA_ARGS__)
         |                              ^~~~~~~
   drivers/misc/fastrpc.c:1259:25: note: in expansion of macro 'dev_dbg'
    1259 |                         dev_dbg(fl->sctx->dev, "Assinging memory with phys 0x%llx size 0x%llx perms 0x%x, vmperms %x, vmcount %x\n",
         |                         ^~~~~~~
   drivers/misc/fastrpc.c:1259:116: note: format string is defined here
    1259 |                         dev_dbg(fl->sctx->dev, "Assinging memory with phys 0x%llx size 0x%llx perms 0x%x, vmperms %x, vmcount %x\n",
         |                                                                                                                   ~^
         |                                                                                                                    |
         |                                                                                                                    unsigned int
   {standard input}: Assembler messages:
   {standard input}:1031: Error: Register number out of range 0..4
   {standard input}:1032: Error: Register number out of range 0..4
   {standard input}:1032: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 44
   {standard input}:1032: Warning: Only the first path encountering the conflict is reported
   {standard input}:1031: Warning: This is the location of the conflicting usage
   {standard input}:1036: Error: Register number out of range 0..4
   {standard input}:1193: Error: Register number out of range 0..2
   {standard input}:1193: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1193: Warning: Only the first path encountering the conflict is reported
   {standard input}:1189: Warning: This is the location of the conflicting usage
   {standard input}:1194: Error: Register number out of range 0..2
   {standard input}:1194: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1194: Warning: Only the first path encountering the conflict is reported
   {standard input}:1189: Warning: This is the location of the conflicting usage
   {standard input}:1194: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1194: Warning: Only the first path encountering the conflict is reported
   {standard input}:1193: Warning: This is the location of the conflicting usage
   {standard input}:1195: Error: Register number out of range 0..2
   {standard input}:1195: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1195: Warning: Only the first path encountering the conflict is reported
   {standard input}:1189: Warning: This is the location of the conflicting usage
   {standard input}:1195: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1195: Warning: Only the first path encountering the conflict is reported
   {standard input}:1193: Warning: This is the location of the conflicting usage
   {standard input}:1195: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1195: Warning: Only the first path encountering the conflict is reported
   {standard input}:1194: Warning: This is the location of the conflicting usage
   {standard input}:1198: Error: Register number out of range 0..2
   {standard input}:1199: Error: Register number out of range 0..2
   {standard input}:1199: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 38
   {standard input}:1199: Warning: Only the first path encountering the conflict is reported
   {standard input}:1198: Warning: This is the location of the conflicting usage
   {standard input}:2810: Error: Register number out of range 0..3
   {standard input}:2811: Error: Register number out of range 0..3
   {standard input}:2811: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 46
   {standard input}:2811: Warning: Only the first path encountering the conflict is reported
   {standard input}:2810: Warning: This is the location of the conflicting usage
   {standard input}:2812: Error: Register number out of range 0..3
   {standard input}:2812: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 46
   {standard input}:2812: Warning: Only the first path encountering the conflict is reported
   {standard input}:2810: Warning: This is the location of the conflicting usage
   {standard input}:2812: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 46
   {standard input}:2812: Warning: Only the first path encountering the conflict is reported
   {standard input}:2811: Warning: This is the location of the conflicting usage
   {standard input}:2816: Error: Register number out of range 0..3
   {standard input}:3634: Error: Register number out of range 0..3
   {standard input}:3635: Error: Register number out of range 0..3
   {standard input}:3635: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 51
   {standard input}:3635: Warning: Only the first path encountering the conflict is reported
   {standard input}:3634: Warning: This is the location of the conflicting usage
   {standard input}:3636: Error: Register number out of range 0..3
   {standard input}:3636: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 51
   {standard input}:3636: Warning: Only the first path encountering the conflict is reported
   {standard input}:3634: Warning: This is the location of the conflicting usage
   {standard input}:3636: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 51
   {standard input}:3636: Warning: Only the first path encountering the conflict is reported
   {standard input}:3635: Warning: This is the location of the conflicting usage
   {standard input}:3640: Error: Register number out of range 0..3
   {standard input}:3955: Error: Register number out of range 0..4
   {standard input}:3955: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 44
   {standard input}:3955: Warning: Only the first path encountering the conflict is reported
   {standard input}:3949: Warning: This is the location of the conflicting usage
   {standard input}:3958: Error: Register number out of range 0..4
   {standard input}:3959: Error: Register number out of range 0..4
   {standard input}:3959: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 44
   {standard input}:3959: Warning: Only the first path encountering the conflict is reported
   {standard input}:3958: Warning: This is the location of the conflicting usage
   {standard input}:4343: Error: Register number out of range 0..4
   {standard input}:4343: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 43
   {standard input}:4343: Warning: Only the first path encountering the conflict is reported
   {standard input}:4337: Warning: This is the location of the conflicting usage
   {standard input}:4346: Error: Register number out of range 0..4
   {standard input}:4347: Error: Register number out of range 0..4
   {standard input}:4347: Warning: Use of 'mov' violates WAW dependency 'GR%, % in 1 - 127' (impliedf), specific resource number is 43
   {standard input}:4347: Warning: Only the first path encountering the conflict is reported
   {standard input}:4346: Warning: This is the location of the conflicting usage
   {standard input}:4497: Error: Register number out of range 0..2


vim +1259 drivers/misc/fastrpc.c

  1208	
  1209	static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
  1210						      char __user *argp)
  1211	{
  1212		struct fastrpc_init_create_static init;
  1213		struct fastrpc_invoke_args *args;
  1214		struct fastrpc_phy_page pages[1];
  1215		char *name;
  1216		int err;
  1217		struct {
  1218			int pgid;
  1219			u32 namelen;
  1220			u32 pageslen;
  1221		} inbuf;
  1222		u32 sc;
  1223	
  1224		args = kcalloc(FASTRPC_CREATE_STATIC_PROCESS_NARGS, sizeof(*args), GFP_KERNEL);
  1225		if (!args)
  1226			return -ENOMEM;
  1227	
  1228		if (copy_from_user(&init, argp, sizeof(init))) {
  1229			err = -EFAULT;
  1230			goto err;
  1231		}
  1232	
  1233		if (init.namelen > INIT_FILE_NAMELEN_MAX) {
  1234			err = -EINVAL;
  1235			goto err;
  1236		}
  1237	
  1238		name = kzalloc(init.namelen, GFP_KERNEL);
  1239		if (!name) {
  1240			err = -ENOMEM;
  1241			goto err;
  1242		}
  1243	
  1244		if (copy_from_user(name, (void __user *)(uintptr_t)init.name, init.namelen)) {
  1245			err = -EFAULT;
  1246			goto err_name;
  1247		}
  1248	
  1249		if (!fl->cctx->remote_heap) {
  1250			err = fastrpc_remote_heap_alloc(fl, fl->sctx->dev, init.memlen,
  1251							&fl->cctx->remote_heap);
  1252			if (err)
  1253				goto err_name;
  1254	
  1255			/* Map if we have any heap VMIDs associated with this ADSP Static Process. */
  1256			if (fl->cctx->vmcount) {
  1257				unsigned int perms = BIT(QCOM_SCM_VMID_HLOS);
  1258	
> 1259				dev_dbg(fl->sctx->dev, "Assinging memory with phys 0x%llx size 0x%llx perms 0x%x, vmperms %x, vmcount %x\n",
  1260					fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size,
  1261					perms, fl->cctx->vmperms, fl->cctx->vmcount);
  1262				err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
  1263								(u64)fl->cctx->remote_heap->size, &perms,
  1264								fl->cctx->vmperms, fl->cctx->vmcount);
  1265				if (err) {
  1266					dev_err(fl->sctx->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d",
  1267						fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
  1268					goto err_map;
  1269				}
  1270			}
  1271		}
  1272	
  1273		inbuf.pgid = fl->tgid;
  1274		inbuf.namelen = init.namelen;
  1275		inbuf.pageslen = 0;
  1276		fl->pd = USER_PD;
  1277	
  1278		args[0].ptr = (u64)(uintptr_t)&inbuf;
  1279		args[0].length = sizeof(inbuf);
  1280		args[0].fd = -1;
  1281	
  1282		args[1].ptr = (u64)(uintptr_t)name;
  1283		args[1].length = inbuf.namelen;
  1284		args[1].fd = -1;
  1285	
  1286		pages[0].addr = fl->cctx->remote_heap->phys;
  1287		pages[0].size = fl->cctx->remote_heap->size;
  1288	
  1289		args[2].ptr = (u64)(uintptr_t) pages;
  1290		args[2].length = sizeof(*pages);
  1291		args[2].fd = -1;
  1292	
  1293		sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_STATIC, 3, 0);
  1294	
  1295		err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
  1296					      sc, args);
  1297		if (err)
  1298			goto err_invoke;
  1299	
  1300		kfree(args);
  1301	
  1302		return 0;
  1303	err_invoke:
  1304	err_map:
  1305		fastrpc_buf_free(fl->cctx->remote_heap);
  1306	err_name:
  1307		kfree(name);
  1308	err:
  1309		kfree(args);
  1310	
  1311		return err;
  1312	}
  1313	

-- 
0-DAY CI Kernel Test Service
https://01.org/lkp

^ permalink raw reply	[flat|nested] 19+ messages in thread

end of thread, other threads:[~2022-09-04  4:02 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2022-09-02 13:13 [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa
2022-09-02 13:13 ` [PATCH 01/14] misc: fastrpc: Fix use-after-free and race in fastrpc_map_find Abel Vesa
2022-09-02 13:25   ` Greg Kroah-Hartman
2022-09-02 14:25     ` Abel Vesa
2022-09-02 13:13 ` [PATCH 02/14] misc: fastrpc: Don't remove map on creater_process and device_release Abel Vesa
2022-09-02 13:13 ` [PATCH 03/14] misc: fastrpc: Fix use-after-free race condition for maps Abel Vesa
2022-09-02 13:13 ` [PATCH 04/14] misc: fastrpc: Rename audio protection domain to root Abel Vesa
2022-09-02 13:13 ` [PATCH 05/14] misc: fastrpc: Add reserved mem support Abel Vesa
2022-09-02 13:13 ` [PATCH 06/14] dt-bindings: misc: fastrpc: Document memory-region property Abel Vesa
2022-09-02 13:13 ` [PATCH 07/14] misc: fastrpc: Add fastrpc_remote_heap_alloc Abel Vesa
2022-09-02 13:13 ` [PATCH 08/14] misc: fastrpc: Use fastrpc_map_put in fastrpc_map_create on fail Abel Vesa
2022-09-02 13:13 ` [PATCH 09/14] misc: fastrpc: Rework fastrpc_req_munmap Abel Vesa
2022-09-02 13:13 ` [PATCH 10/14] misc: fastrpc: Add support for audiopd Abel Vesa
2022-09-04  4:02   ` kernel test robot
2022-09-02 13:13 ` [PATCH 11/14] misc: fastrpc: Safekeep mmaps on interrupted invoke Abel Vesa
2022-09-02 13:13 ` [PATCH 12/14] misc: fastrpc: Add mmap request assigning for static PD pool Abel Vesa
2022-09-02 13:13 ` [PATCH 13/14] misc: fastrpc: Remove unnecessary if braces in fastrpc_internal_invoke Abel Vesa
2022-09-02 13:13 ` [PATCH 14/14] misc: fastrpc: Add dma_mask to fastrpc_channel_ctx Abel Vesa
2022-09-02 15:06 ` [PATCH 00/14] misc: fastrpc: Add audiopd support and some fixes Abel Vesa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).