mirror of
https://github.com/nyanmisaka/mpp.git
synced 2025-10-04 00:36:23 +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"
|
||||
|
||||
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);
|
||||
|
||||
#ifdef __cplusplus
|
||||
@@ -29,7 +29,7 @@ rk_s32 kmpp_objdef_add_deinit(KmppObjDef def, KmppObjDeinit deinit);
|
||||
/* userspace object dump function register */
|
||||
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 */
|
||||
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 */
|
||||
rk_s32 kmpp_obj_to_shm_size(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 = KmppShmPtr->uaddr + entry_offset
|
||||
|
@@ -288,6 +288,10 @@ void CONCAT_US(KMPP_OBJ_NAME, register)(void)
|
||||
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)
|
||||
kmpp_objdef_add_init(KMPP_OBJ_DEF(KMPP_OBJ_NAME), KMPP_OBJ_FUNC_INIT);
|
||||
#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_EXTRA_SIZE
|
||||
#undef KMPP_OBJ_ENTRY_TABLE
|
||||
#undef KMPP_OBJ_PRIV_SIZE
|
||||
#undef KMPP_OBJ_FUNC_INIT
|
||||
#undef KMPP_OBJ_FUNC_DEINIT
|
||||
#undef KMPP_OBJ_FUNC_IOCTL
|
||||
|
@@ -120,6 +120,7 @@ typedef struct KmppObjDefImpl_t {
|
||||
|
||||
/* properties */
|
||||
rk_s32 disable_mismatch_log;
|
||||
rk_s32 priv_size;
|
||||
|
||||
const char *name;
|
||||
} KmppObjDefImpl;
|
||||
@@ -130,6 +131,7 @@ typedef struct KmppObjImpl_t {
|
||||
KmppObjDefImpl *def;
|
||||
/* trie for fast access */
|
||||
MppTrie trie;
|
||||
void *priv;
|
||||
KmppShmPtr *shm;
|
||||
void *entry;
|
||||
} KmppObjImpl;
|
||||
@@ -405,6 +407,9 @@ static void kmpp_objs_init(void)
|
||||
info = mpp_trie_get_info_next(trie, info);
|
||||
obj_dbg_share("%2d:%2d - %s offset %d entry_size %d\n",
|
||||
count, i, name, offset, impl->entry_size);
|
||||
|
||||
obj_dbg_flow("objdef %-16s in kernel size %4d\n",
|
||||
name, impl->entry_size);
|
||||
}
|
||||
|
||||
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->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;
|
||||
|
||||
@@ -615,13 +620,33 @@ rk_s32 kmpp_objdef_add_dump(KmppObjDef def, KmppObjDump dump)
|
||||
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) {
|
||||
KmppObjDefImpl *impl = (KmppObjDefImpl *)def;
|
||||
|
||||
if (strcmp(op, "disable_mismatch_log"))
|
||||
impl->disable_mismatch_log = (prop && !strcmp(prop, "yes"));
|
||||
if (!strcmp(op, "disable_mismatch_log"))
|
||||
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;
|
||||
}
|
||||
@@ -788,6 +813,36 @@ MppTrie kmpp_objdef_get_trie(KmppObjDef def)
|
||||
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)
|
||||
{
|
||||
KmppObjs *p;
|
||||
@@ -810,7 +865,7 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
||||
mpp_assert(def_impl->pool);
|
||||
|
||||
/* userspace objdef path */
|
||||
if (def_impl->buf_size) {
|
||||
if (!def_impl->is_kobj) {
|
||||
impl = mpp_mem_pool_get(def_impl->pool, caller);
|
||||
if (!impl) {
|
||||
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;
|
||||
}
|
||||
|
||||
impl->name = def_impl->name;
|
||||
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);
|
||||
setup_obj(impl, NULL, def_impl, NULL, caller);
|
||||
|
||||
*obj = impl;
|
||||
|
||||
@@ -858,17 +906,11 @@ rk_s32 kmpp_obj_get(KmppObj *obj, KmppObjDef def, const char *caller)
|
||||
}
|
||||
|
||||
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,
|
||||
impl, uaddr, ioc->obj_sptr[0].kaddr, caller);
|
||||
|
||||
/* write userspace object address to share memory userspace private value */
|
||||
*(RK_U64 *)U64_TO_PTR(uaddr + p->priv_offset) = (RK_U64)(intptr_t)impl;
|
||||
setup_obj(impl, p, def_impl, (rk_u8 *)U64_TO_PTR(uaddr), caller);
|
||||
|
||||
*obj = impl;
|
||||
|
||||
@@ -953,17 +995,10 @@ rk_s32 kmpp_obj_get_by_sptr(KmppObj *obj, KmppShmPtr *sptr, const char *caller)
|
||||
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,
|
||||
impl, sptr->uaddr, sptr->kaddr, caller);
|
||||
|
||||
/* write userspace object address to share memory userspace private value */
|
||||
*(RK_U64 *)U64_TO_PTR(sptr->uaddr + p->priv_offset) = (RK_U64)(intptr_t)impl;
|
||||
setup_obj(impl, p, def, uptr, caller);
|
||||
|
||||
*obj = impl;
|
||||
|
||||
@@ -977,44 +1012,34 @@ rk_s32 kmpp_obj_put(KmppObj obj, const char *caller)
|
||||
KmppObjDefImpl *def = impl->def;
|
||||
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 */
|
||||
/* userspace objdef path */
|
||||
if (!impl->shm) {
|
||||
mpp_assert(def);
|
||||
if (impl->shm) {
|
||||
p = get_objs(caller);
|
||||
if (p && p->fd >= 0) {
|
||||
KmppObjIocArg *ioc = alloca(sizeof(KmppObjIocArg) + sizeof(KmppShmPtr));
|
||||
rk_s32 ret;
|
||||
|
||||
if (def) {
|
||||
if (def->deinit)
|
||||
def->deinit(impl->entry, caller);
|
||||
ioc->count = 1;
|
||||
ioc->flag = 0;
|
||||
ioc->obj_sptr[0].uaddr = impl->shm->uaddr;
|
||||
ioc->obj_sptr[0].kaddr = impl->shm->kaddr;
|
||||
|
||||
mpp_assert(def->pool);
|
||||
mpp_mem_pool_put(def->pool, impl, caller);
|
||||
return rk_ok;
|
||||
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);
|
||||
}
|
||||
|
||||
mpp_free(impl);
|
||||
return rk_ok;
|
||||
impl->shm = NULL;
|
||||
}
|
||||
|
||||
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);
|
||||
|
||||
return rk_ok;
|
||||
@@ -1033,7 +1058,7 @@ rk_s32 kmpp_obj_put_impl(KmppObj obj, const char *caller)
|
||||
|
||||
if (def) {
|
||||
if (def->deinit)
|
||||
def->deinit(impl->entry, caller);
|
||||
def->deinit(impl->entry, impl, caller);
|
||||
|
||||
mpp_assert(def->pool);
|
||||
mpp_mem_pool_put(def->pool, impl, caller);
|
||||
@@ -1157,6 +1182,13 @@ const char *kmpp_obj_get_name(KmppObj obj)
|
||||
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)
|
||||
{
|
||||
KmppObjImpl *impl = (KmppObjImpl *)obj;
|
||||
|
Reference in New Issue
Block a user