Skip to content

Commit

Permalink
LMM updated to support Giant Structures
Browse files Browse the repository at this point in the history
  • Loading branch information
sachinites committed Feb 18, 2022
1 parent 64abd80 commit 0e3d957
Show file tree
Hide file tree
Showing 5 changed files with 47 additions and 52 deletions.
68 changes: 31 additions & 37 deletions LinuxMemoryManager/mm.c
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,7 @@ mm_get_new_vm_page_from_kernel(int units){

#endif
memset(vm_page, 0, units * SYSTEM_PAGE_SIZE);
vm_page->page_size = units * SYSTEM_PAGE_SIZE;
return vm_page;
}

Expand Down Expand Up @@ -178,13 +179,14 @@ mm_sbrk_free_vm_page(vm_page_t *vm_page, int units){
static void
mm_return_vm_page_to_kernel(void *ptr, int units){

MARK_VM_PAGE_EMPTY(((vm_page_t *)ptr));
int rc = 0;
MARK_VM_PAGE_EMPTY(((vm_page_t *)ptr));

#ifdef __USE_GLIBC__
free(ptr);
#elif defined(__USE_MMAP__)
if(munmap(ptr, units * SYSTEM_PAGE_SIZE)){
printf("Error : Could not munmap VM page to kernel");
if(rc = munmap(ptr, units * SYSTEM_PAGE_SIZE)){
printf("Error : Could not munmap VM page (%u) to kernel, errno = %d\n", ((vm_page_t *)ptr)->page_size, errno);
}
#elif defined(__USE_BRK__)
mm_sbrk_free_vm_page((vm_page_t *)ptr, units);
Expand All @@ -193,16 +195,16 @@ mm_return_vm_page_to_kernel(void *ptr, int units){

/*Return a fresh new virtual page*/
vm_page_t *
allocate_vm_page(vm_page_family_t *vm_page_family){
allocate_vm_page(vm_page_family_t *vm_page_family, int units){

vm_page_t *prev_page =
mm_get_available_page_index(vm_page_family);

vm_page_t *vm_page = mm_get_new_vm_page_from_kernel(1);
vm_page_t *vm_page = mm_get_new_vm_page_from_kernel(units);
vm_page->block_meta_data.is_free = MM_TRUE;
vm_page->block_meta_data.block_size =
MAX_PAGE_ALLOCATABLE_MEMORY(1);
vm_page->block_meta_data.offset =
MAX_PAGE_ALLOCATABLE_MEMORY(units);
vm_page->block_meta_data.offset =
offset_of(vm_page_t, block_meta_data);
init_glthread(&vm_page->block_meta_data.priority_thread_glue);
vm_page->block_meta_data.prev_block = NULL;
Expand Down Expand Up @@ -239,12 +241,6 @@ mm_instantiate_new_page_family(
vm_page_family_t *vm_page_family_curr = NULL;
vm_page_for_families_t *new_vm_page_for_families = NULL;

if(struct_size > mm_max_page_allocatable_memory(1)){
printf("Error : %s() Structure %s Size exceeds system page size\n",
__FUNCTION__, struct_name);
return;
}

if(!first_vm_page_for_families){
first_vm_page_for_families = (vm_page_for_families_t *)mm_get_new_vm_page_from_kernel(1);
first_vm_page_for_families->next = NULL;
Expand All @@ -255,18 +251,19 @@ mm_instantiate_new_page_family(
init_glthread(&first_vm_page_for_families->vm_page_family[0].free_block_priority_list_head);
return;
}


vm_page_family_curr = lookup_page_family_by_name(struct_name);

if(vm_page_family_curr) {
assert(0);
}

uint32_t count = 0;

ITERATE_PAGE_FAMILIES_BEGIN(first_vm_page_for_families, vm_page_family_curr){

if(strncmp(vm_page_family_curr->struct_name,
struct_name,MM_MAX_STRUCT_NAME) != 0){
count++;
continue;
}
/*Page family already exists*/
assert(0);
count++;

} ITERATE_PAGE_FAMILIES_END(first_vm_page_for_families, vm_page_family_curr);

if(count == MAX_FAMILIES_PER_VM_PAGE){
Expand Down Expand Up @@ -294,15 +291,15 @@ lookup_page_family_by_name(char *struct_name){
vm_page_for_families_curr;
vm_page_for_families_curr = vm_page_for_families_curr->next){

ITERATE_PAGE_FAMILIES_BEGIN(first_vm_page_for_families, vm_page_family_curr){
ITERATE_PAGE_FAMILIES_BEGIN(vm_page_for_families_curr, vm_page_family_curr){

if(strncmp(vm_page_family_curr->struct_name,
struct_name,
MM_MAX_STRUCT_NAME) == 0){

return vm_page_family_curr;
}
} ITERATE_PAGE_FAMILIES_END(first_vm_page_for_families, vm_page_family_curr);
} ITERATE_PAGE_FAMILIES_END(vm_page_for_families_curr, vm_page_family_curr);
}
return NULL;
}
Expand Down Expand Up @@ -338,9 +335,9 @@ mm_add_free_block_meta_data_to_free_block_list(
}

static vm_page_t *
mm_family_new_page_add(vm_page_family_t *vm_page_family){
mm_family_new_page_add(vm_page_family_t *vm_page_family, int units){

vm_page_t *vm_page = allocate_vm_page(vm_page_family);
vm_page_t *vm_page = allocate_vm_page(vm_page_family, units);

if(!vm_page)
return NULL;
Expand Down Expand Up @@ -444,14 +441,16 @@ mm_allocate_free_data_block(
vm_page_t *vm_page = NULL;
block_meta_data_t *block_meta_data = NULL;

int n_pages_required = ( req_size / MAX_PAGE_ALLOCATABLE_MEMORY(1)) + 1;

block_meta_data_t *biggest_block_meta_data =
mm_get_biggest_free_block_page_family(vm_page_family);

if(!biggest_block_meta_data ||
biggest_block_meta_data->block_size < req_size){

/*Time to add a new page to Page family to satisfy the request*/
vm_page = mm_family_new_page_add(vm_page_family);
vm_page = mm_family_new_page_add(vm_page_family, n_pages_required);

/*Allocate the free block from this page now*/
status = mm_split_free_data_block_for_allocation(vm_page_family,
Expand Down Expand Up @@ -492,13 +491,6 @@ xcalloc(char *struct_name, int units){
return NULL;
}

if(units * pg_family->struct_size > MAX_PAGE_ALLOCATABLE_MEMORY(1)){

printf("Error : Memory Requested Exceeds Page Size\n");
assert(0);
return NULL;
}

/*Find the page which can satisfy the request*/
block_meta_data_t *free_block_meta_data = NULL;

Expand Down Expand Up @@ -549,15 +541,16 @@ mm_vm_page_delete_and_free(
vm_page_family->no_of_system_calls_to_alloc_dealloc_vm_pages++;
vm_page->next = NULL;
vm_page->prev = NULL;
mm_return_vm_page_to_kernel((void *)vm_page, 1);
mm_return_vm_page_to_kernel((void *)vm_page,
vm_page->page_size / SYSTEM_PAGE_SIZE);
return;
}

if(vm_page->next)
vm_page->next->prev = vm_page->prev;
vm_page->prev->next = vm_page->next;
vm_page_family->no_of_system_calls_to_alloc_dealloc_vm_pages++;
mm_return_vm_page_to_kernel((void *)vm_page, 1);
mm_return_vm_page_to_kernel((void *)vm_page, vm_page->page_size / SYSTEM_PAGE_SIZE);
}

static block_meta_data_t *
Expand Down Expand Up @@ -590,7 +583,7 @@ mm_free_blocks(block_meta_data_t *to_be_free_block){
/* Block being freed is the upper most free data block
* in a VM data page, check of hard internal fragmented
* memory and merge*/
char *end_address_of_vm_page = (char *)((char *)hosting_page + SYSTEM_PAGE_SIZE);
char *end_address_of_vm_page = (char *)((char *)hosting_page + hosting_page->page_size);
char *end_address_of_free_data_block =
(char *)(to_be_free_block + 1) + to_be_free_block->block_size;
int internal_mem_fragmentation = (int)((unsigned long)end_address_of_vm_page -
Expand Down Expand Up @@ -649,7 +642,8 @@ mm_print_vm_page_details(vm_page_t *vm_page, uint32_t i){

printf("\tPage Index : %u \n", vm_page->page_index);
printf("\t\t next = %p, prev = %p\n", vm_page->next, vm_page->prev);
printf("\t\t page family = %s\n", vm_page->pg_family->struct_name);
printf("\t\t page family = %s, page_size = %uB\n",
vm_page->pg_family->struct_name, vm_page->page_size);

uint32_t j = 0;
block_meta_data_t *curr;
Expand Down
11 changes: 6 additions & 5 deletions LinuxMemoryManager/mm.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@
#define __MM__

#include <stdint.h>
#include "gluethread/glthread.h"
#include "../gluethread/glthread.h"
#include <stddef.h> /*for size_t*/


Expand All @@ -52,7 +52,7 @@ typedef struct block_meta_data_{
struct block_meta_data_ *next_block;
} block_meta_data_t;
GLTHREAD_TO_STRUCT(glthread_to_block_meta_data,
block_meta_data_t, priority_thread_glue, glthread_ptr);
block_meta_data_t, priority_thread_glue);

#define offset_of(container_structure, field_name) \
((size_t)&(((container_structure *)0)->field_name))
Expand All @@ -65,6 +65,7 @@ typedef struct vm_page_{
struct vm_page_ *prev;
struct vm_page_family_ *pg_family; /*back pointer*/
uint32_t page_index;
uint32_t page_size;
block_meta_data_t block_meta_data;
char page_memory[0];
} vm_page_t;
Expand Down Expand Up @@ -147,10 +148,10 @@ allocate_vm_page();

#define ITERATE_PAGE_FAMILIES_BEGIN(vm_page_for_families_ptr, curr) \
{ \
uint32_t count = 0; \
uint32_t _count = 0; \
for(curr = (vm_page_family_t *)&vm_page_for_families_ptr->vm_page_family[0]; \
curr->struct_size && count < MAX_FAMILIES_PER_VM_PAGE; \
curr++,count++){
curr->struct_size && _count < MAX_FAMILIES_PER_VM_PAGE; \
curr++,_count++){

#define ITERATE_PAGE_FAMILIES_END(vm_page_for_families_ptr, curr) }}

Expand Down
2 changes: 1 addition & 1 deletion instance.c
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ create_new_node(instance_t *instance, char *node_name, AREA area, char *router_i
return NULL;
}

node_t * node = calloc(1, sizeof(node_t));
node_t * node = XCALLOC(1, node_t);
strncpy(node->node_name, node_name, NODE_NAME_SIZE);
node->node_name[NODE_NAME_SIZE - 1] = '\0';
strncpy(node->router_id, router_id, PREFIX_LEN);
Expand Down
6 changes: 3 additions & 3 deletions mem_init.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ init_memory_manager(){
MM_REG_STRUCT(rt_un_entry_t);
MM_REG_STRUCT(rt_un_table_t);
MM_REG_STRUCT(mpls_label_stack_t);
//MM_REG_STRUCT(node_t);
MM_REG_STRUCT(node_t);
MM_REG_STRUCT(edge_t);
MM_REG_STRUCT(instance_t);
MM_REG_STRUCT(traceoptions);
Expand All @@ -92,6 +92,6 @@ init_memory_manager(){
MM_REG_STRUCT(protected_resource_t);
MM_REG_STRUCT(tilfa_cfg_globals_t);
MM_REG_STRUCT(glthread_t);
//MM_REG_STRUCT(gen_segment_list_t);
//MM_REG_STRUCT(tilfa_segment_list_t);
MM_REG_STRUCT(gen_segment_list_t);
MM_REG_STRUCT(tilfa_segment_list_t);
}
12 changes: 6 additions & 6 deletions tilfa.c
Original file line number Diff line number Diff line change
Expand Up @@ -409,15 +409,15 @@ tilfa_clear_segments_list(
if(!pr_res){
remove_glthread(&tilfa_segment_list->gen_segment_list_glue);
tilfa_unlock_protected_resource(tilfa_segment_list->pr_res);
free(tilfa_segment_list);
XFREE(tilfa_segment_list);
tilfa_segment_list = NULL;
continue;
}
else if(tlfa_protected_resource_equal(tilfa_segment_list->pr_res,
pr_res)){
remove_glthread(&tilfa_segment_list->gen_segment_list_glue);
tilfa_unlock_protected_resource(tilfa_segment_list->pr_res);
free(tilfa_segment_list);
XFREE(tilfa_segment_list);
tilfa_segment_list = NULL;
return;
}
Expand Down Expand Up @@ -1821,7 +1821,7 @@ tilfa_record_segment_list(node_t *spf_root,
tilfa_segment_list_ptr,
tilfa_segment_list);
tilfa_unlock_protected_resource(tilfa_segment_list->pr_res);
free(tilfa_segment_list);
XFREE(tilfa_segment_list);
return;
} ITERATE_GLTHREAD_END(&spf_root->tilfa_info->tilfa_segment_list_head[level], curr);

Expand Down Expand Up @@ -2109,7 +2109,7 @@ tilfa_examine_tilfa_path_for_segment_list(
dst_node, q_distance, pq_distance);

tilfa_segment_list_t *tilfa_segment_list =
calloc(1, sizeof(tilfa_segment_list_t));
XCALLOC(1, tilfa_segment_list_t);

if(pq_distance == 0){
tilfa_segment_list->n_segment_list =
Expand All @@ -2133,7 +2133,7 @@ tilfa_examine_tilfa_path_for_segment_list(
pr_res);

if(!segment_list_len_from_p_to_q){
free(tilfa_segment_list);
XFREE(tilfa_segment_list);
return;
}

Expand All @@ -2153,7 +2153,7 @@ tilfa_examine_tilfa_path_for_segment_list(
}

if(tilfa_segment_list->n_segment_list == 0){
free(tilfa_segment_list);
XFREE(tilfa_segment_list);
return;
}

Expand Down

0 comments on commit 0e3d957

Please sign in to comment.