mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/herbert/cryptodev-2.6.git
synced 2026-04-18 03:23:53 -04:00
binder: Store lru freelist in binder_alloc
Store a pointer to the free pages list that the binder allocator should use for a process inside of struct binder_alloc. This change allows binder allocator code to be tested and debugged deterministically while a system is using binder; i.e., without interfering with other binder processes and independently of the shrinker. This is necessary to convert the current binder_alloc_selftest into a kunit test that does not rely on hijacking an existing binder_proc to run. A binder process's binder_alloc->freelist should not be changed after it is initialized. A sole exception is the process that runs the existing binder_alloc selftest. Its freelist can be temporarily replaced for the duration of the test because it runs as a single thread before any pages can be added to the global binder freelist, and the test frees every page it allocates before dropping the binder_selftest_lock. This exception allows the existing selftest to be used to check for regressions, but it will be dropped when the binder_alloc tests are converted to kunit in a subsequent patch in this series. Signed-off-by: Tiffany Yang <ynaffit@google.com> Acked-by: Carlos Llamas <cmllamas@google.com> Link: https://lore.kernel.org/r/20250714185321.2417234-3-ynaffit@google.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
bea3e7bfa2
commit
4328a52642
@@ -26,7 +26,7 @@
|
||||
#include "binder_alloc.h"
|
||||
#include "binder_trace.h"
|
||||
|
||||
struct list_lru binder_freelist;
|
||||
static struct list_lru binder_freelist;
|
||||
|
||||
static DEFINE_MUTEX(binder_alloc_mmap_lock);
|
||||
|
||||
@@ -206,7 +206,7 @@ static void binder_lru_freelist_add(struct binder_alloc *alloc,
|
||||
|
||||
trace_binder_free_lru_start(alloc, index);
|
||||
|
||||
ret = list_lru_add(&binder_freelist,
|
||||
ret = list_lru_add(alloc->freelist,
|
||||
page_to_lru(page),
|
||||
page_to_nid(page),
|
||||
NULL);
|
||||
@@ -405,7 +405,7 @@ static void binder_lru_freelist_del(struct binder_alloc *alloc,
|
||||
if (page) {
|
||||
trace_binder_alloc_lru_start(alloc, index);
|
||||
|
||||
on_lru = list_lru_del(&binder_freelist,
|
||||
on_lru = list_lru_del(alloc->freelist,
|
||||
page_to_lru(page),
|
||||
page_to_nid(page),
|
||||
NULL);
|
||||
@@ -1003,7 +1003,7 @@ void binder_alloc_deferred_release(struct binder_alloc *alloc)
|
||||
if (!page)
|
||||
continue;
|
||||
|
||||
on_lru = list_lru_del(&binder_freelist,
|
||||
on_lru = list_lru_del(alloc->freelist,
|
||||
page_to_lru(page),
|
||||
page_to_nid(page),
|
||||
NULL);
|
||||
@@ -1223,6 +1223,17 @@ binder_shrink_scan(struct shrinker *shrink, struct shrink_control *sc)
|
||||
|
||||
static struct shrinker *binder_shrinker;
|
||||
|
||||
static void __binder_alloc_init(struct binder_alloc *alloc,
|
||||
struct list_lru *freelist)
|
||||
{
|
||||
alloc->pid = current->group_leader->pid;
|
||||
alloc->mm = current->mm;
|
||||
mmgrab(alloc->mm);
|
||||
mutex_init(&alloc->mutex);
|
||||
INIT_LIST_HEAD(&alloc->buffers);
|
||||
alloc->freelist = freelist;
|
||||
}
|
||||
|
||||
/**
|
||||
* binder_alloc_init() - called by binder_open() for per-proc initialization
|
||||
* @alloc: binder_alloc for this proc
|
||||
@@ -1232,11 +1243,7 @@ static struct shrinker *binder_shrinker;
|
||||
*/
|
||||
void binder_alloc_init(struct binder_alloc *alloc)
|
||||
{
|
||||
alloc->pid = current->group_leader->pid;
|
||||
alloc->mm = current->mm;
|
||||
mmgrab(alloc->mm);
|
||||
mutex_init(&alloc->mutex);
|
||||
INIT_LIST_HEAD(&alloc->buffers);
|
||||
__binder_alloc_init(alloc, &binder_freelist);
|
||||
}
|
||||
|
||||
int binder_alloc_shrinker_init(void)
|
||||
|
||||
Reference in New Issue
Block a user