// this has its parallell in exe$alonpagvar int exe$allocate_pool(int requestsize, int pooltype, int alignment, unsigned int * allocatedsize, void ** returnblock) { int reqsize=requestsize; unsigned int * alosize_p=allocatedsize; void ** pool_p=returnblock; int sts=SS$_NORMAL; // extra from alononpaged if (reqsize&63) reqsize=((reqsize>>6)+1)<<6; // mm book said something about align 64 *alosize_p=reqsize; struct _npool_data * pooldata = exe$gs_bap_npool; struct _lsthds * lsthd = pooldata->npool$ar_lsthds; struct _myhead * array = &lsthd->lsthds$q_listheads; if (reqsize<=8192) { *pool_p = exe$lal_remove_first(&array[reqsize>>6]); if (*pool_p) { check_packet(*pool_p,reqsize,0); #if 0 poison_packet(*pool_p,reqsize,0); #endif } }
int exe_std$alononpaged (int reqsize, int *alosize_p, void **pool_p) { int sts=SS$_NORMAL; #if 0 if (reqsize<=srpsize) { if (rqempty(&ioc$gq_srpiq)) goto var; int addr=remqti(&ioc$gq_srpiq,addr); *alosize_p=reqsize; *pool_p=addr; return sts; } if (reqsize<=irpsize) { if (rqempty(&ioc$gq_irpiq)) goto var; int addr=remqti(&ioc$gq_irpiq,addr); *alosize_p=reqsize; *pool_p=addr; return sts; } if (reqsize >= lrpmin && reqsize<=srpsize) { if (rqempty(&ioc$gq_lrpiq)) goto var; int addr=remqti(&ioc$gq_srpiq,addr); *alosize_p=reqsize; *pool_p=addr; return sts; } #endif if (reqsize&63) reqsize=((reqsize>>6)+1)<<6; // mm book said something about align 64 *alosize_p=reqsize; struct _npool_data * pooldata = exe$gs_npp_npool; struct _lsthds * lsthd = pooldata->npool$ar_lsthds; struct _myhead * array = &lsthd->lsthds$q_listheads; if (reqsize<=8192) { *pool_p = exe$lal_remove_first(&array[reqsize>>6]); if (*pool_p) { check_packet(*pool_p,reqsize,0); #if 0 poison_packet(*pool_p,reqsize,0); #endif } }
void __init init_nonpaged_pool(void * pgdat, int size, struct _npool_data * pool, void ** start , void ** free) { struct mymap * mytmp; *start=alloc_bootmem_node(pgdat,size); *start= (struct page *)(PAGE_OFFSET + MAP_ALIGN((unsigned long)(*start) - PAGE_OFFSET)); *free= *start; struct _lsthds * l = pool->npool$ar_lsthds; l->lsthds$l_variablelist_unused=*free; mytmp=*start; mytmp->flink=0; /* ? */ mytmp->size=size; poison_packet(mytmp,size,1); }