Skip to content

Commit 0311f34

Browse files
author
Flavio Ceolin
committed
kernel: userspace: Use only list for dynamic objs
Since the rbtree is using as list because we no longer can assume that the object pointer is the address of the data field in the dynamic object struct, lets just use the already existent dlist for tracking dynamic kernel objects. Signed-off-by: Flavio Ceolin <[email protected]>
1 parent dddf77e commit 0311f34

File tree

1 file changed

+8
-30
lines changed

1 file changed

+8
-30
lines changed

kernel/userspace.c

+8-30
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ LOG_MODULE_DECLARE(os, CONFIG_KERNEL_LOG_LEVEL);
4747
* not.
4848
*/
4949
#ifdef CONFIG_DYNAMIC_OBJECTS
50-
static struct k_spinlock lists_lock; /* kobj rbtree/dlist */
50+
static struct k_spinlock lists_lock; /* kobj dlist */
5151
static struct k_spinlock objfree_lock; /* k_object_free */
5252

5353
#ifdef CONFIG_GEN_PRIV_STACKS
@@ -167,8 +167,7 @@ uint8_t *z_priv_stack_find(k_thread_stack_t *stack)
167167

168168
struct dyn_obj_base {
169169
struct z_object kobj;
170-
sys_dnode_t dobj_list;
171-
struct rbnode node; /* must be immediately before data member */
170+
sys_dnode_t dobj_list; /* must be immediately before data member */
172171
};
173172

174173
struct dyn_obj {
@@ -192,25 +191,14 @@ extern struct z_object *z_object_gperf_find(const void *obj);
192191
extern void z_object_gperf_wordlist_foreach(_wordlist_cb_func_t func,
193192
void *context);
194193

195-
static bool node_lessthan(struct rbnode *a, struct rbnode *b);
196-
197-
/*
198-
* Red/black tree of allocated kernel objects, for reasonably fast lookups
199-
* based on object pointer values.
200-
*/
201-
static struct rbtree obj_rb_tree = {
202-
.lessthan_fn = node_lessthan
203-
};
204-
205194
/*
206195
* Linked list of allocated kernel objects, for iteration over all allocated
207196
* objects (and potentially deleting them during iteration).
208197
*/
209198
static sys_dlist_t obj_list = SYS_DLIST_STATIC_INIT(&obj_list);
210199

211200
/*
212-
* TODO: Write some hash table code that will replace both obj_rb_tree
213-
* and obj_list.
201+
* TODO: Write some hash table code that will replace obj_list.
214202
*/
215203

216204
static size_t obj_size_get(enum k_objects otype)
@@ -250,15 +238,9 @@ static size_t obj_align_get(enum k_objects otype)
250238
return ret;
251239
}
252240

253-
static bool node_lessthan(struct rbnode *a, struct rbnode *b)
254-
{
255-
return a < b;
256-
}
257-
258241
static struct dyn_obj_base *dyn_object_find(void *obj)
259242
{
260-
struct rbnode *node;
261-
struct dyn_obj_base *ret;
243+
struct dyn_obj_base *node;
262244
k_spinlock_key_t key;
263245

264246
/* For any dynamically allocated kernel object, the object
@@ -268,20 +250,19 @@ static struct dyn_obj_base *dyn_object_find(void *obj)
268250
*/
269251
key = k_spin_lock(&lists_lock);
270252

271-
RB_FOR_EACH(&obj_rb_tree, node) {
272-
ret = CONTAINER_OF(node, struct dyn_obj_base, node);
273-
if (ret->kobj.name == obj) {
253+
SYS_DLIST_FOR_EACH_CONTAINER(&obj_list, node, dobj_list) {
254+
if (node->kobj.name == obj) {
274255
goto end;
275256
}
276257
}
277258

278259
/* No object found */
279-
ret = NULL;
260+
node = NULL;
280261

281262
end:
282263
k_spin_unlock(&lists_lock, key);
283264

284-
return ret;
265+
return node;
285266
}
286267

287268
/**
@@ -407,7 +388,6 @@ static struct z_object *dynamic_object_create(enum k_objects otype, size_t align
407388

408389
k_spinlock_key_t key = k_spin_lock(&lists_lock);
409390

410-
rb_insert(&obj_rb_tree, &dyn->node);
411391
sys_dlist_append(&obj_list, &dyn->dobj_list);
412392
k_spin_unlock(&lists_lock, key);
413393

@@ -502,7 +482,6 @@ void k_object_free(void *obj)
502482

503483
dyn = dyn_object_find(obj);
504484
if (dyn != NULL) {
505-
rb_remove(&obj_rb_tree, &dyn->node);
506485
sys_dlist_remove(&dyn->dobj_list);
507486

508487
if (dyn->kobj.type == K_OBJ_THREAD) {
@@ -612,7 +591,6 @@ static void unref_check(struct z_object *ko, uintptr_t index)
612591
break;
613592
}
614593

615-
rb_remove(&obj_rb_tree, &dyn->node);
616594
sys_dlist_remove(&dyn->dobj_list);
617595
k_free(dyn);
618596
out:

0 commit comments

Comments
 (0)