Spinlock save cpu flags

This commit is contained in:
2026-03-12 22:48:34 +01:00
parent 19793e9126
commit 4760818118
50 changed files with 704 additions and 461 deletions

View File

@@ -22,25 +22,29 @@ static struct id_alloc pgid_alloc;
void procgroup_pgid_alloc_init (void) { id_alloc_init (&pgid_alloc, PGIDS_MAX); }
struct procgroup* procgroup_find (int pgid) {
uint64_t fpgt;
struct procgroup* procgroup = NULL;
spin_lock (&procgroup_tree_lock);
spin_lock (&procgroup_tree_lock, &fpgt);
rbtree_find (struct procgroup, &procgroup_tree, pgid, procgroup, procgroup_tree_link, pgid);
spin_unlock (&procgroup_tree_lock);
spin_unlock (&procgroup_tree_lock, fpgt);
return procgroup;
}
uintptr_t procgroup_map (struct procgroup* procgroup, uintptr_t vaddr, size_t pages, uint32_t flags,
uintptr_t* out_paddr) {
spin_lock (&procgroup->lock);
uint64_t fpg;
spin_lock (&procgroup->lock, &fpg);
vaddr = (vaddr == 0) ? procgroup->map_base : vaddr;
struct proc_mapping* mapping = malloc (sizeof (*mapping));
if (mapping == NULL) {
spin_unlock (&procgroup->lock);
spin_unlock (&procgroup->lock, fpg);
return 0;
}
@@ -48,7 +52,7 @@ uintptr_t procgroup_map (struct procgroup* procgroup, uintptr_t vaddr, size_t pa
if (paddr == PMM_ALLOC_ERR) {
free (mapping);
spin_unlock (&procgroup->lock);
spin_unlock (&procgroup->lock, fpg);
return 0;
}
@@ -68,12 +72,13 @@ uintptr_t procgroup_map (struct procgroup* procgroup, uintptr_t vaddr, size_t pa
mm_map_page (&procgroup->pd, ppage, vpage, flags);
}
spin_unlock (&procgroup->lock);
spin_unlock (&procgroup->lock, fpg);
return vaddr;
}
bool procgroup_unmap (struct procgroup* procgroup, uintptr_t start_vaddr, size_t pages) {
uint64_t fpg;
size_t unmap_size = pages * PAGE_SIZE;
uintptr_t end_vaddr = start_vaddr + unmap_size;
@@ -85,7 +90,7 @@ bool procgroup_unmap (struct procgroup* procgroup, uintptr_t start_vaddr, size_t
if (tail_mapping == NULL)
return false;
spin_lock (&procgroup->lock);
spin_lock (&procgroup->lock, &fpg);
list_foreach (procgroup->mappings, mapping_link, mapping_link_tmp) {
struct proc_mapping* mapping =
@@ -138,12 +143,14 @@ bool procgroup_unmap (struct procgroup* procgroup, uintptr_t start_vaddr, size_t
mm_unmap_page (&procgroup->pd, vpage);
}
spin_unlock (&procgroup->lock);
spin_unlock (&procgroup->lock, fpg);
return true;
}
struct procgroup* procgroup_create (void) {
uint64_t fpgt;
struct procgroup* procgroup = malloc (sizeof (*procgroup));
if (procgroup == NULL) {
return NULL;
@@ -175,33 +182,37 @@ struct procgroup* procgroup_create (void) {
return NULL;
}
spin_lock (&procgroup_tree_lock);
spin_lock (&procgroup_tree_lock, &fpgt);
rbtree_insert (struct procgroup, &procgroup_tree, &procgroup->procgroup_tree_link,
procgroup_tree_link, pgid);
spin_unlock (&procgroup_tree_lock);
spin_unlock (&procgroup_tree_lock, fpgt);
return procgroup;
}
void procgroup_attach (struct procgroup* procgroup, struct proc* proc) {
spin_lock (&procgroup->lock);
spin_lock (&proc->lock);
uint64_t fpg, fp;
spin_lock (&procgroup->lock, &fpg);
spin_lock (&proc->lock, &fp);
rbtree_insert (struct proc, &procgroup->memb_proc_tree, &proc->procgroup_memb_tree_link,
procgroup_memb_tree_link, pid);
spin_unlock (&proc->lock);
spin_unlock (&procgroup->lock);
spin_unlock (&proc->lock, fp);
spin_unlock (&procgroup->lock, fpg);
}
static void procgroup_delete (struct procgroup* procgroup, struct reschedule_ctx* rctx) {
spin_lock (&procgroup_tree_lock);
spin_lock (&procgroup->lock);
uint64_t fpg, fpgt;
spin_lock (&procgroup_tree_lock, &fpgt);
spin_lock (&procgroup->lock, &fpg);
rbtree_delete (&procgroup_tree, &procgroup->procgroup_tree_link);
spin_unlock (&procgroup->lock);
spin_unlock (&procgroup_tree_lock);
spin_unlock (&procgroup->lock, fpg);
spin_unlock (&procgroup_tree_lock, fpgt);
/* delete resources */
struct rb_node_link* rnode;
@@ -239,14 +250,16 @@ static void procgroup_delete (struct procgroup* procgroup, struct reschedule_ctx
void procgroup_detach (struct procgroup* procgroup, struct proc* proc,
struct reschedule_ctx* rctx) {
spin_lock (&procgroup->lock);
spin_lock (&proc->lock);
uint64_t fpg, fp;
spin_lock (&procgroup->lock, &fpg);
spin_lock (&proc->lock, &fp);
rbtree_delete (&procgroup->memb_proc_tree, &proc->procgroup_memb_tree_link);
struct rb_node_link* memb_tree = procgroup->memb_proc_tree;
spin_unlock (&proc->lock);
spin_unlock (&procgroup->lock);
spin_unlock (&proc->lock, fp);
spin_unlock (&procgroup->lock, fpg);
if (memb_tree == NULL) {
procgroup_delete (procgroup, rctx);