From 29521e7f4a1f36e3ce2c4c2d9a3713d20c62923c Mon Sep 17 00:00:00 2001 From: Herman Chen Date: Mon, 22 Sep 2025 16:29:36 +0800 Subject: [PATCH] chore[kmpp_obj]: Change kmpp_shm get / put input 1. Use KmppShm to replace KmppShmPtr as input. 2. Add kmpp_shm_to_entry to get valid access address. 3. Add more test case. Signed-off-by: Herman Chen Change-Id: Id554e4e60f8e11e08578c91a9c30c7b173f10ab9 --- inc/rk_type.h | 2 ++ kmpp/base/inc/kmpp_obj.h | 7 +++++-- kmpp/base/kmpp_obj.c | 29 +++++++++++++++++++++++------ kmpp/base/test/kmpp_obj_test.c | 33 ++++++++++++++++++++++++++++----- 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/inc/rk_type.h b/inc/rk_type.h index cc3dc42d..42c61eaf 100644 --- a/inc/rk_type.h +++ b/inc/rk_type.h @@ -186,6 +186,8 @@ typedef void* MppMeta; typedef void* KmppObjDef; /* KmppObj - mpp object for string name access and function access */ typedef void* KmppObj; +/* KmppShm - mpp share memory for kernel / userspace transaction */ +typedef void* KmppShm; /* kmpp transaction object */ typedef void* KmppMeta; diff --git a/kmpp/base/inc/kmpp_obj.h b/kmpp/base/inc/kmpp_obj.h index 42a654de..ebef94ee 100644 --- a/kmpp/base/inc/kmpp_obj.h +++ b/kmpp/base/inc/kmpp_obj.h @@ -164,11 +164,14 @@ rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller); #define kmpp_obj_udump(obj) kmpp_obj_udump_f(obj, __FUNCTION__) #define kmpp_obj_kdump(obj) kmpp_obj_kdump_f(obj, __FUNCTION__) -rk_s32 kmpp_shm_get(KmppShmPtr **shm, rk_s32 size, const char *caller); -rk_s32 kmpp_shm_put(KmppShmPtr *shm, const char *caller); +rk_s32 kmpp_shm_get(KmppShm *shm, rk_s32 size, const char *caller); +rk_s32 kmpp_shm_put(KmppShm shm, const char *caller); + +void *kmpp_shm_to_entry(KmppShm shm, const char *caller); #define kmpp_shm_get_f(shm, size) kmpp_shm_get(shm, size, __FUNCTION__) #define kmpp_shm_put_f(shm) kmpp_shm_put(shm, __FUNCTION__) +#define kmpp_shm_to_entry_f(shm) kmpp_shm_to_entry(shm, __FUNCTION__) const char *strof_elem_type(ElemType type); diff --git a/kmpp/base/kmpp_obj.c b/kmpp/base/kmpp_obj.c index dfe6f863..23ce1db0 100644 --- a/kmpp/base/kmpp_obj.c +++ b/kmpp/base/kmpp_obj.c @@ -1893,7 +1893,7 @@ rk_s32 kmpp_obj_kdump_f(KmppObj obj, const char *caller) return ret ? rk_nok : rk_ok; } -rk_s32 kmpp_shm_get(KmppShmPtr **shm, rk_s32 size, const char *caller) +rk_s32 kmpp_shm_get(KmppShm *shm, rk_s32 size, const char *caller) { KmppObjs *p; KmppObjIocArg *ioc; @@ -1926,12 +1926,12 @@ rk_s32 kmpp_shm_get(KmppShmPtr **shm, rk_s32 size, const char *caller) return ret; } - *shm = (KmppShmPtr *)U64_TO_PTR(ioc->obj_sptr[0].uaddr); + *shm = U64_TO_PTR(ioc->obj_sptr[0].uaddr); return *shm ? rk_ok : rk_nok; } -rk_s32 kmpp_shm_put(KmppShmPtr *shm, const char *caller) +rk_s32 kmpp_shm_put(KmppShm shm, const char *caller) { KmppObjs *p = get_objs(caller); rk_s32 ret = rk_nok; @@ -1945,15 +1945,19 @@ rk_s32 kmpp_shm_put(KmppShmPtr *shm, const char *caller) return ret; if (p && p->fd >= 0) { + KmppShmPtr *sptr = (KmppShmPtr *)shm; KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr)); ioc->count = 1; ioc->flag = 0; - ioc->obj_sptr[0].uaddr = shm->uaddr; - ioc->obj_sptr[0].kaddr = shm->kaddr; + + ioc->count = 1; + ioc->flag = 0; + ioc->obj_sptr[0].uaddr = sptr->uaddr; + ioc->obj_sptr[0].kaddr = sptr->kaddr; obj_dbg_flow("put shm %p entry [u:k] %llx:%llx at %s\n", - shm, shm->uaddr, shm->kaddr, caller); + sptr, sptr->uaddr, sptr->kaddr, caller); ret = ioctl(p->fd, KMPP_SHM_IOC_PUT_SHM, ioc); if (ret) @@ -1962,3 +1966,16 @@ rk_s32 kmpp_shm_put(KmppShmPtr *shm, const char *caller) return ret; } + +void *kmpp_shm_to_entry(KmppShm shm, const char *caller) +{ + KmppObjs *p = get_objs(caller); + KmppShmPtr *sptr = (KmppShmPtr *)shm; + + if (!shm) { + mpp_loge_f("invalid param shm %p at %s\n", shm, caller); + return NULL; + } + + return sptr->uptr + p->entry_offset; +} diff --git a/kmpp/base/test/kmpp_obj_test.c b/kmpp/base/test/kmpp_obj_test.c index 74cd383d..77c6675d 100644 --- a/kmpp/base/test/kmpp_obj_test.c +++ b/kmpp/base/test/kmpp_obj_test.c @@ -236,22 +236,26 @@ done: static rk_s32 kmpp_shm_test(const char *name, rk_u32 flag) { - KmppShmPtr *shm[4]; - rk_u32 sizes[4] = {512, 4096, 4096 * 4, 4096 * 4096}; + rk_u32 sizes[] = {512, SZ_4K, SZ_16K, SZ_128K, SZ_256K, SZ_1M, SZ_4M, SZ_16M}; + rk_u32 count = sizeof(sizes) / sizeof(sizes[0]); + KmppShm shm[count]; + void *ptr; rk_s32 ret = rk_ok; - rk_u32 i; + rk_s32 i; (void)name; (void)flag; - for (i = 0; i < MPP_ARRAY_ELEMS(sizes); i++) { + for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(sizes); i++) { kmpp_shm_get_f(&shm[i], sizes[i]); if (!shm[i]) { mpp_log_f("shm get size %d failed\n", sizes[i]); ret = rk_nok; } + + test_detail("shm get size %d addr %p\n", sizes[i], kmpp_shm_to_entry_f(shm[i])); } - for (i = 0; i < MPP_ARRAY_ELEMS(sizes); i++) { + for (i = 0; i < (RK_S32)MPP_ARRAY_ELEMS(sizes); i++) { if (kmpp_shm_put_f(shm[i])) { mpp_log_f("shm put size %d failed\n", sizes[i]); ret = rk_nok; @@ -259,6 +263,25 @@ static rk_s32 kmpp_shm_test(const char *name, rk_u32 flag) shm[i] = NULL; } + for (i = (RK_S32)MPP_ARRAY_ELEMS(sizes) - 1; i >= 0; i--) { + kmpp_shm_get_f(&shm[i], sizes[i]); + if (!shm[i]) { + mpp_log_f("shm get size %d failed\n", sizes[i]); + ret = rk_nok; + } + + ptr = kmpp_shm_to_entry_f(shm[i]); + + test_detail("shm get size %d addr %p\n", sizes[i], ptr); + + memset(ptr, 0, sizes[i]); + + if (kmpp_shm_put_f(shm[i])) { + mpp_log_f("shm put size %d failed\n", sizes[i]); + ret = rk_nok; + } + } + return ret; }