mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-06 01:26:49 +08:00
feat[kmpp_obj]: Add priv prop support for objdef
1. Add KMPP_OBJ_PRIV_SIZE for extra priv data to userspace KmppObjImpl. 2. When add private data realloc mempool for KmppObjImpl. Change-Id: Ifc6d210cc77497cc9cbd5d86ad1ddcf2ba0fc4af Signed-off-by: Yanjun Liao <yanjun.liao@rock-chips.com> Signed-off-by: Herman Chen <herman.chen@rock-chips.com>
This commit is contained in:
@@ -9,7 +9,7 @@
|
|||||||
#include "mpp_internal.h"
|
#include "mpp_internal.h"
|
||||||
|
|
||||||
typedef rk_s32 (*KmppObjInit)(void *entry, KmppObj obj, const char *caller);
|
typedef rk_s32 (*KmppObjInit)(void *entry, KmppObj obj, const char *caller);
|
||||||
typedef rk_s32 (*KmppObjDeinit)(void *entry, const char *caller);
|
typedef rk_s32 (*KmppObjDeinit)(void *entry, KmppObj obj, const char *caller);
|
||||||
typedef rk_s32 (*KmppObjDump)(void *entry);
|
typedef rk_s32 (*KmppObjDump)(void *entry);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@@ -29,7 +29,7 @@ rk_s32 kmpp_objdef_add_deinit(KmppObjDef def, KmppObjDeinit deinit);
|
|||||||
/* userspace object dump function register */
|
/* userspace object dump function register */
|
||||||
rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump);
|
rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump);
|
||||||
|
|
||||||
rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, const char *prop);
|
rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value);
|
||||||
|
|
||||||
/* kernel objdef query from /dev/kmpp_objs */
|
/* kernel objdef query from /dev/kmpp_objs */
|
||||||
rk_s32 kmpp_objdef_get(KmppObjDef *def, const char *name);
|
rk_s32 kmpp_objdef_get(KmppObjDef *def, const char *name);
|
||||||
@@ -71,6 +71,11 @@ KmppShmPtr *kmpp_obj_to_shm(KmppObj obj);
|
|||||||
/* KmppShmPtr size defined the copy size for kernel ioctl */
|
/* KmppShmPtr size defined the copy size for kernel ioctl */
|
||||||
rk_s32 kmpp_obj_to_shm_size(KmppObj obj);
|
rk_s32 kmpp_obj_to_shm_size(KmppObj obj);
|
||||||
const char *kmpp_obj_get_name(KmppObj obj);
|
const char *kmpp_obj_get_name(KmppObj obj);
|
||||||
|
/*
|
||||||
|
* priv is the private data in userspace KmppObjImpl struct for kobject transaction
|
||||||
|
* priv = KmppObjImpl->priv
|
||||||
|
*/
|
||||||
|
void *kmpp_obj_to_priv(KmppObj obj);
|
||||||
/*
|
/*
|
||||||
* entry is the userspace address for kernel share object body
|
* entry is the userspace address for kernel share object body
|
||||||
* entry = KmppShmPtr->uaddr + entry_offset
|
* entry = KmppShmPtr->uaddr + entry_offset
|
||||||
|
@@ -288,6 +288,10 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void)
|
|||||||
HOOK_QUERY, HOOK_QUERY, ENTRY_NOTHING);
|
HOOK_QUERY, HOOK_QUERY, ENTRY_NOTHING);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(KMPP_OBJ_PRIV_SIZE)
|
||||||
|
if (KMPP_OBJ_PRIV_SIZE)
|
||||||
|
kmpp_objdef_set_prop(KMPP_OBJ_DEF(KMPP_OBJ_NAME), "priv_size", KMPP_OBJ_PRIV_SIZE);
|
||||||
|
#endif
|
||||||
#if defined(KMPP_OBJ_FUNC_INIT)
|
#if defined(KMPP_OBJ_FUNC_INIT)
|
||||||
kmpp_objdef_add_init(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_INIT);
|
kmpp_objdef_add_init(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_INIT);
|
||||||
#endif
|
#endif
|
||||||
@@ -388,6 +392,7 @@ KMPP_OBJ_ENTRY_TABLE(KMPP_OBJ_NAME, KMPP_OBJ_EXPORT, KMPP_OBJ_EXPORT,
|
|||||||
#undef KMPP_OBJ_IMPL_TYPE
|
#undef KMPP_OBJ_IMPL_TYPE
|
||||||
#undef KMPP_OBJ_EXTRA_SIZE
|
#undef KMPP_OBJ_EXTRA_SIZE
|
||||||
#undef KMPP_OBJ_ENTRY_TABLE
|
#undef KMPP_OBJ_ENTRY_TABLE
|
||||||
|
#undef KMPP_OBJ_PRIV_SIZE
|
||||||
#undef KMPP_OBJ_FUNC_INIT
|
#undef KMPP_OBJ_FUNC_INIT
|
||||||
#undef KMPP_OBJ_FUNC_DEINIT
|
#undef KMPP_OBJ_FUNC_DEINIT
|
||||||
#undef KMPP_OBJ_FUNC_IOCTL
|
#undef KMPP_OBJ_FUNC_IOCTL
|
||||||
|
@@ -120,6 +120,7 @@ typedef struct KmppObjDefImpl_t {
|
|||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
rk_s32 disable_mismatch_log;
|
rk_s32 disable_mismatch_log;
|
||||||
|
rk_s32 priv_size;
|
||||||
|
|
||||||
const char *name;
|
const char *name;
|
||||||
} KmppObjDefImpl;
|
} KmppObjDefImpl;
|
||||||
@@ -130,6 +131,7 @@ typedef struct KmppObjImpl_t {
|
|||||||
KmppObjDefImpl *def;
|
KmppObjDefImpl *def;
|
||||||
/* trie for fast access */
|
/* trie for fast access */
|
||||||
MppTrie trie;
|
MppTrie trie;
|
||||||
|
void *priv;
|
||||||
KmppShmPtr *shm;
|
KmppShmPtr *shm;
|
||||||
void *entry;
|
void *entry;
|
||||||
} KmppObjImpl;
|
} KmppObjImpl;
|
||||||
@@ -405,6 +407,9 @@ static void kmpp_objs_init(void)
|
|||||||
info = mpp_trie_get_info_next(trie, info);
|
info = mpp_trie_get_info_next(trie, info);
|
||||||
obj_dbg_share("%2d:%2d - %s offset %d entry_size %d\n",
|
obj_dbg_share("%2d:%2d - %s offset %d entry_size %d\n",
|
||||||
count, i, name, offset, impl->entry_size);
|
count, i, name, offset, impl->entry_size);
|
||||||
|
|
||||||
|
obj_dbg_flow("objdef %-16s in kernel size %4d\n",
|
||||||
|
name, impl->entry_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
objs = p;
|
objs = p;
|
||||||
@@ -496,7 +501,7 @@ rk_s32 kmpp_objdef_register(KmppObjDef *def, rk_s32 size, const char *name)
|
|||||||
impl->buf_size = size + sizeof(KmppObjImpl);
|
impl->buf_size = size + sizeof(KmppObjImpl);
|
||||||
impl->ref_cnt = 1;
|
impl->ref_cnt = 1;
|
||||||
|
|
||||||
obj_dbg_flow("objdef %-16s registered size %4d - %p\n", name, size, impl);
|
obj_dbg_flow("objdef %-16s registered size %4d\n", name, size, impl);
|
||||||
|
|
||||||
*def = impl;
|
*def = impl;
|
||||||
|
|
||||||
@@ -615,13 +620,33 @@ rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump)
|
|||||||
return rk_nok;
|
return rk_nok;
|
||||||
}
|
}
|
||||||
|
|
||||||
rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, const char *prop)
|
rk_s32 kmpp_objdef_set_prop(KmppObjDef def, const char *op, rk_s32 value)
|
||||||
{
|
{
|
||||||
if (def && op) {
|
if (def && op) {
|
||||||
KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
|
KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
|
||||||
|
|
||||||
if (strcmp(op, "disable_mismatch_log"))
|
if (!strcmp(op, "disable_mismatch_log"))
|
||||||
impl->disable_mismatch_log = (prop && !strcmp(prop, "yes"));
|
impl->disable_mismatch_log = value ? 1 : 0;
|
||||||
|
else if (!strcmp(op, "priv_size")) {
|
||||||
|
rk_s32 priv_size = MPP_ALIGN(value, sizeof(void *));
|
||||||
|
|
||||||
|
/* recreate mem pool when private size is changed */
|
||||||
|
if (impl->priv_size != priv_size) {
|
||||||
|
rk_s32 buf_size = sizeof(KmppObjImpl) + priv_size + impl->buf_size;
|
||||||
|
|
||||||
|
if (impl->pool)
|
||||||
|
mpp_mem_pool_deinit_f(impl->pool);
|
||||||
|
|
||||||
|
impl->pool = mpp_mem_pool_init_f(impl->name, buf_size);
|
||||||
|
|
||||||
|
obj_dbg_flow("objdef %-16s priv size %d -> %d \n",
|
||||||
|
impl->name, impl->priv_size, priv_size);
|
||||||
|
impl->priv_size = priv_size;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
mpp_loge_f("unknown property %s value %d\n", op, value);
|
||||||
|
return rk_nok;
|
||||||
|
}
|
||||||
|
|
||||||
return rk_ok;
|
return rk_ok;
|
||||||
}
|
}
|
||||||
@@ -788,6 +813,36 @@ MppTrie kmpp_objdef_get_trie(KmppObjDef def)
|
|||||||
return impl ? impl->trie : NULL;
|
return impl ? impl->trie : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void setup_obj(KmppObjImpl *impl, KmppObjs *p, KmppObjDefImpl *def, rk_u8 *shm, const char *caller)
|
||||||
|
{
|
||||||
|
rk_u8 *base = (rk_u8 *)(impl + 1);
|
||||||
|
|
||||||
|
impl->name = def->name;
|
||||||
|
impl->def = def;
|
||||||
|
impl->trie = def->trie;
|
||||||
|
|
||||||
|
if (def->priv_size) {
|
||||||
|
impl->priv = base;
|
||||||
|
base += def->priv_size;
|
||||||
|
} else {
|
||||||
|
impl->priv = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shm && p) {
|
||||||
|
impl->shm = (KmppShmPtr *)shm;
|
||||||
|
impl->entry = (void *)(shm + p->entry_offset);
|
||||||
|
|
||||||
|
/* write userspace object address to share memory userspace private value */
|
||||||
|
*(RK_U64 *)(shm + p->priv_offset) = (RK_U64)(intptr_t)impl;
|
||||||
|
} else {
|
||||||
|
impl->shm = NULL;
|
||||||
|
impl->entry = base;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (def->init)
|
||||||
|
def->init(impl->entry, impl, caller);
|
||||||
|
}
|
||||||
|
|
||||||
rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
||||||
{
|
{
|
||||||
KmppObjs *p;
|
KmppObjs *p;
|
||||||
@@ -810,7 +865,7 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
|||||||
mpp_assert(def_impl->pool);
|
mpp_assert(def_impl->pool);
|
||||||
|
|
||||||
/* userspace objdef path */
|
/* userspace objdef path */
|
||||||
if (def_impl->buf_size) {
|
if (!def_impl->is_kobj) {
|
||||||
impl = mpp_mem_pool_get(def_impl->pool, caller);
|
impl = mpp_mem_pool_get(def_impl->pool, caller);
|
||||||
if (!impl) {
|
if (!impl) {
|
||||||
mpp_loge_f("get obj %s impl %d failed at %s\n",
|
mpp_loge_f("get obj %s impl %d failed at %s\n",
|
||||||
@@ -818,14 +873,7 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl->name = def_impl->name;
|
setup_obj(impl, NULL, def_impl, NULL, caller);
|
||||||
impl->def = def;
|
|
||||||
impl->trie = def_impl->trie;
|
|
||||||
impl->shm = NULL;
|
|
||||||
impl->entry = (void *)(impl + 1);
|
|
||||||
|
|
||||||
if (def_impl->init)
|
|
||||||
def_impl->init(impl->entry, impl, caller);
|
|
||||||
|
|
||||||
*obj = impl;
|
*obj = impl;
|
||||||
|
|
||||||
@@ -858,17 +906,11 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
|||||||
}
|
}
|
||||||
|
|
||||||
uaddr = ioc->obj_sptr[0].uaddr;
|
uaddr = ioc->obj_sptr[0].uaddr;
|
||||||
impl->name = def_impl->name;
|
|
||||||
impl->def = def;
|
|
||||||
impl->trie = def_impl->trie;
|
|
||||||
impl->shm = U64_TO_PTR(uaddr);
|
|
||||||
impl->entry = U64_TO_PTR(uaddr + p->entry_offset);
|
|
||||||
|
|
||||||
obj_dbg_flow("get obj %-16s - %p entry [u:k] %llx:%llx at %s\n", def_impl->name,
|
obj_dbg_flow("get obj %-16s - %p entry [u:k] %llx:%llx at %s\n", def_impl->name,
|
||||||
impl, uaddr, ioc->obj_sptr[0].kaddr, caller);
|
impl, uaddr, ioc->obj_sptr[0].kaddr, caller);
|
||||||
|
|
||||||
/* write userspace object address to share memory userspace private value */
|
setup_obj(impl, p, def_impl, (rk_u8 *)U64_TO_PTR(uaddr), caller);
|
||||||
*(RK_U64 *)U64_TO_PTR(uaddr + p->priv_offset) = (RK_U64)(intptr_t)impl;
|
|
||||||
|
|
||||||
*obj = impl;
|
*obj = impl;
|
||||||
|
|
||||||
@@ -953,17 +995,10 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
impl->name = def->name;
|
|
||||||
impl->def = def;
|
|
||||||
impl->trie = def->trie;
|
|
||||||
impl->shm = (KmppShmPtr *)uptr;
|
|
||||||
impl->entry = uptr + p->entry_offset;
|
|
||||||
|
|
||||||
obj_dbg_flow("get obj %-16s - %p by sptr [u:k] %llx:%llx at %s\n", def->name,
|
obj_dbg_flow("get obj %-16s - %p by sptr [u:k] %llx:%llx at %s\n", def->name,
|
||||||
impl, sptr->uaddr, sptr->kaddr, caller);
|
impl, sptr->uaddr, sptr->kaddr, caller);
|
||||||
|
|
||||||
/* write userspace object address to share memory userspace private value */
|
setup_obj(impl, p, def, uptr, caller);
|
||||||
*(RK_U64 *)U64_TO_PTR(sptr->uaddr + p->priv_offset) = (RK_U64)(intptr_t)impl;
|
|
||||||
|
|
||||||
*obj = impl;
|
*obj = impl;
|
||||||
|
|
||||||
@@ -977,44 +1012,34 @@ rk_s32 kmpp_obj_put(KmppObj obj, const char *caller)
|
|||||||
KmppObjDefImpl *def = impl->def;
|
KmppObjDefImpl *def = impl->def;
|
||||||
KmppObjs *p;
|
KmppObjs *p;
|
||||||
|
|
||||||
|
mpp_assert(def && def->pool);
|
||||||
|
|
||||||
|
if (def && def->deinit)
|
||||||
|
def->deinit(impl->entry, impl, caller);
|
||||||
|
|
||||||
/* use shm to check userspace objdef or kernel objdef */
|
/* use shm to check userspace objdef or kernel objdef */
|
||||||
/* userspace objdef path */
|
/* userspace objdef path */
|
||||||
if (!impl->shm) {
|
if (impl->shm) {
|
||||||
mpp_assert(def);
|
p = get_objs(caller);
|
||||||
|
if (p && p->fd >= 0) {
|
||||||
|
KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
|
||||||
|
rk_s32 ret;
|
||||||
|
|
||||||
if (def) {
|
ioc->count = 1;
|
||||||
if (def->deinit)
|
ioc->flag = 0;
|
||||||
def->deinit(impl->entry, caller);
|
ioc->obj_sptr[0].uaddr = impl->shm->uaddr;
|
||||||
|
ioc->obj_sptr[0].kaddr = impl->shm->kaddr;
|
||||||
|
|
||||||
mpp_assert(def->pool);
|
obj_dbg_flow("put obj %-16s - %p entry [u:k] %llx:%llx at %s\n", def ? def->name : NULL,
|
||||||
mpp_mem_pool_put(def->pool, impl, caller);
|
impl, impl->shm->uaddr, impl->shm->kaddr, caller);
|
||||||
return rk_ok;
|
|
||||||
|
ret = ioctl(p->fd, KMPP_SHM_IOC_PUT_SHM, ioc);
|
||||||
|
if (ret)
|
||||||
|
mpp_err("ioctl KMPP_SHM_IOC_PUT_SHM failed ret %d at %s\n", ret, caller);
|
||||||
}
|
}
|
||||||
|
impl->shm = NULL;
|
||||||
mpp_free(impl);
|
|
||||||
return rk_ok;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
p = get_objs(caller);
|
|
||||||
if (p && p->fd >= 0) {
|
|
||||||
KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
|
|
||||||
rk_s32 ret;
|
|
||||||
|
|
||||||
ioc->count = 1;
|
|
||||||
ioc->flag = 0;
|
|
||||||
ioc->obj_sptr[0].uaddr = impl->shm->uaddr;
|
|
||||||
ioc->obj_sptr[0].kaddr = impl->shm->kaddr;
|
|
||||||
|
|
||||||
obj_dbg_flow("put obj %-16s - %p entry [u:k] %llx:%llx at %s\n", def ? def->name : NULL,
|
|
||||||
impl, impl->shm->uaddr, impl->shm->kaddr, caller);
|
|
||||||
|
|
||||||
ret = ioctl(p->fd, KMPP_SHM_IOC_PUT_SHM, ioc);
|
|
||||||
if (ret)
|
|
||||||
mpp_err("ioctl KMPP_SHM_IOC_PUT_SHM failed ret %d at %s\n", ret, caller);
|
|
||||||
}
|
|
||||||
impl->shm = NULL;
|
|
||||||
|
|
||||||
mpp_assert(def->pool);
|
|
||||||
mpp_mem_pool_put(def->pool, impl, caller);
|
mpp_mem_pool_put(def->pool, impl, caller);
|
||||||
|
|
||||||
return rk_ok;
|
return rk_ok;
|
||||||
@@ -1033,7 +1058,7 @@ rk_s32 kmpp_obj_put_impl(KmppObj obj, const char *caller)
|
|||||||
|
|
||||||
if (def) {
|
if (def) {
|
||||||
if (def->deinit)
|
if (def->deinit)
|
||||||
def->deinit(impl->entry, caller);
|
def->deinit(impl->entry, impl, caller);
|
||||||
|
|
||||||
mpp_assert(def->pool);
|
mpp_assert(def->pool);
|
||||||
mpp_mem_pool_put(def->pool, impl, caller);
|
mpp_mem_pool_put(def->pool, impl, caller);
|
||||||
@@ -1157,6 +1182,13 @@ const char *kmpp_obj_get_name(KmppObj obj)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *kmpp_obj_to_priv(KmppObj obj)
|
||||||
|
{
|
||||||
|
KmppObjImpl *impl = (KmppObjImpl *)obj;
|
||||||
|
|
||||||
|
return impl ? impl->priv : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void *kmpp_obj_to_entry(KmppObj obj)
|
void *kmpp_obj_to_entry(KmppObj obj)
|
||||||
{
|
{
|
||||||
KmppObjImpl *impl = (KmppObjImpl *)obj;
|
KmppObjImpl *impl = (KmppObjImpl *)obj;
|
||||||
|
Reference in New Issue
Block a user