Properly implement liballoc_free ()
This commit is contained in:
17
kernel/proc/mem.c
Normal file
17
kernel/proc/mem.c
Normal file
@@ -0,0 +1,17 @@
|
||||
#include <libk/std.h>
|
||||
#include <proc/mem.h>
|
||||
#include <proc/proc.h>
|
||||
#include <proc/resource.h>
|
||||
#include <sync/spin_lock.h>
|
||||
|
||||
void proc_mem_unref (struct proc* proc, struct proc_resource_mem* mem, size_t pages) {
|
||||
spin_lock_ctx_t ctxrs;
|
||||
|
||||
spin_lock (&mem->resource->lock, &ctxrs);
|
||||
mem->alive_pages -= pages;
|
||||
ptrdiff_t current_pages = mem->alive_pages;
|
||||
spin_unlock (&mem->resource->lock, &ctxrs);
|
||||
|
||||
if (current_pages <= 0)
|
||||
proc_drop_resource (proc, mem->resource);
|
||||
}
|
||||
23
kernel/proc/mem.h
Normal file
23
kernel/proc/mem.h
Normal file
@@ -0,0 +1,23 @@
|
||||
#ifndef _KERNEL_PROC_MEM_H
|
||||
#define _KERNEL_PROC_MEM_H
|
||||
|
||||
#include <libk/std.h>
|
||||
|
||||
struct proc;
|
||||
struct proc_resource;
|
||||
|
||||
struct proc_resource_mem {
|
||||
struct proc_resource* resource;
|
||||
|
||||
uintptr_t paddr;
|
||||
size_t pages;
|
||||
ptrdiff_t alive_pages;
|
||||
};
|
||||
|
||||
struct proc_resource_mem_init {
|
||||
size_t pages;
|
||||
};
|
||||
|
||||
void proc_mem_unref (struct proc* proc, struct proc_resource_mem* mem, size_t pages);
|
||||
|
||||
#endif // _KERNEL_PROC_MEM_H
|
||||
@@ -10,16 +10,16 @@ void proc_mutex_lock (struct proc* proc, struct proc_mutex* mutex) {
|
||||
spin_lock_ctx_t ctxmt;
|
||||
|
||||
try:
|
||||
spin_lock (&mutex->lock, &ctxmt);
|
||||
spin_lock (&mutex->resource->lock, &ctxmt);
|
||||
|
||||
if (!mutex->locked || mutex->owner == proc) {
|
||||
mutex->locked = true;
|
||||
mutex->owner = proc;
|
||||
spin_unlock (&mutex->lock, &ctxmt);
|
||||
spin_unlock (&mutex->resource->lock, &ctxmt);
|
||||
return;
|
||||
}
|
||||
|
||||
spin_unlock (&mutex->lock, &ctxmt);
|
||||
spin_unlock (&mutex->resource->lock, &ctxmt);
|
||||
|
||||
proc_suspend (proc, &mutex->suspension_q);
|
||||
|
||||
@@ -29,10 +29,10 @@ try:
|
||||
bool proc_mutex_unlock (struct proc* proc, struct proc_mutex* mutex) {
|
||||
spin_lock_ctx_t ctxmt, ctxsq;
|
||||
|
||||
spin_lock (&mutex->lock, &ctxmt);
|
||||
spin_lock (&mutex->resource->lock, &ctxmt);
|
||||
|
||||
if (mutex->owner != proc) {
|
||||
spin_unlock (&mutex->lock, &ctxmt);
|
||||
spin_unlock (&mutex->resource->lock, &ctxmt);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ bool proc_mutex_unlock (struct proc* proc, struct proc_mutex* mutex) {
|
||||
mutex->owner = resumed_proc;
|
||||
|
||||
spin_unlock (&mutex->suspension_q.lock, &ctxsq);
|
||||
spin_unlock (&mutex->lock, &ctxmt);
|
||||
spin_unlock (&mutex->resource->lock, &ctxmt);
|
||||
proc_resume (resumed_proc);
|
||||
|
||||
return true;
|
||||
@@ -58,7 +58,7 @@ bool proc_mutex_unlock (struct proc* proc, struct proc_mutex* mutex) {
|
||||
mutex->locked = false;
|
||||
mutex->owner = NULL;
|
||||
|
||||
spin_unlock (&mutex->lock, &ctxmt);
|
||||
spin_unlock (&mutex->resource->lock, &ctxmt);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -3,12 +3,13 @@
|
||||
|
||||
#include <libk/std.h>
|
||||
#include <proc/suspension_q.h>
|
||||
#include <sync/spin_lock.h>
|
||||
|
||||
struct proc;
|
||||
struct proc_resource;
|
||||
|
||||
struct proc_mutex {
|
||||
spin_lock_t lock;
|
||||
struct proc_resource* resource;
|
||||
|
||||
bool locked;
|
||||
struct proc_suspension_q suspension_q;
|
||||
struct proc* owner;
|
||||
|
||||
@@ -52,7 +52,7 @@ static bool proc_create_resource_mem (struct proc_resource_mem* mem,
|
||||
return false;
|
||||
|
||||
mem->paddr = paddr;
|
||||
mem->pages = init->pages;
|
||||
mem->pages = mem->alive_pages = init->pages;
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -101,12 +101,14 @@ struct proc_resource* proc_create_resource (struct proc* proc, int rid, int type
|
||||
struct proc_resource_mem_init* mem_init = data;
|
||||
proc_create_resource_mem (&resource->u.mem, mem_init);
|
||||
resource->ops.cleanup = &proc_cleanup_resource_mem;
|
||||
resource->u.mem.resource = resource;
|
||||
DEBUG ("PR_MEM resource=%p type=%d rid=%d paddr=%p, pages=%zu\n", resource, resource->type,
|
||||
resource->rid, resource->u.mem.paddr, resource->u.mem.pages);
|
||||
} break;
|
||||
case PR_MUTEX: {
|
||||
proc_create_resource_mutex (&resource->u.mutex);
|
||||
resource->ops.cleanup = &proc_cleanup_resource_mutex;
|
||||
resource->u.mutex.resource = resource;
|
||||
DEBUG ("PR_MUTEX resource=%p, type=%d rid=%d\n", resource, resource->type, resource->rid);
|
||||
} break;
|
||||
default: {
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
|
||||
#include <libk/rbtree.h>
|
||||
#include <libk/std.h>
|
||||
#include <proc/mem.h>
|
||||
#include <proc/mutex.h>
|
||||
#include <sync/spin_lock.h>
|
||||
|
||||
@@ -13,15 +14,7 @@
|
||||
#define RV_PUBLIC 1
|
||||
|
||||
struct proc;
|
||||
|
||||
struct proc_resource_mem {
|
||||
uintptr_t paddr;
|
||||
size_t pages;
|
||||
};
|
||||
|
||||
struct proc_resource_mem_init {
|
||||
size_t pages;
|
||||
};
|
||||
struct proc_resource;
|
||||
|
||||
struct proc_resource {
|
||||
int type;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
c += proc/proc.c \
|
||||
proc/resource.c \
|
||||
proc/mutex.c
|
||||
proc/mutex.c \
|
||||
proc/mem.c
|
||||
|
||||
o += proc/proc.o \
|
||||
proc/resource.o \
|
||||
proc/mutex.o
|
||||
proc/mutex.o \
|
||||
proc/mem.o
|
||||
|
||||
Reference in New Issue
Block a user