unsigned int alloc_buddy(int size, buddy_t* tmp_buddy) { buddy_t* cur_buddy; int new_size; cur_buddy = tmp_buddy; if(size>1){ new_size = cur_buddy->size/2; if(tmp_buddy->left==NULL && tmp_buddy->right==NULL){ new_size = tmp_buddy->size/2; printf("Ok\n"); tmp_buddy->left = create_buddy(new_size); if(new_size/2>=size) alloc_buddy(size,cur_buddy->left); else tmp_buddy->status == BUDDY_BUSY; } else if(tmp_buddy->left!=NULL && tmp_buddy->status==BUDDY_FREE){ alloc_buddy(size, tmp_buddy->left); } else if(tmp_buddy->right!=NULL && tmp_buddy->status==BUDDY_FREE){ alloc_buddy(size, tmp_buddy->right); } else{ printf("Se sono nell'else allora devo proseguire nella navigazione\n"); alloc_buddy(size/2,tmp_buddy); } } // else printf("Otherwise ok\n"); }
struct page* __pages_alloc (zone_t *zone ,gfp_t flage,uint32_t order) { page_t * pf = NULL; if ((flage & _GFP_ZERO) && (flage & _GFP_HIGH)) panic("(flage & _GFP_ZERO) && (flage & _GFP_HIGH)\n"); pf = alloc_buddy (zone,order); if(pf == NULL) goto out; if (flage & _GFP_ZERO) { int i = PAGE_SIZE << order; memset((void*)page2virt(pf),0,i); } out: return pf; }