Changeset 635 for trunk/kernel/mm/ppm.c
- Timestamp:
- Jun 26, 2019, 11:42:37 AM (5 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/mm/ppm.c
r634 r635 212 212 page_t * found_block; 213 213 214 thread_t * this = CURRENT_THREAD; 215 214 216 #if DEBUG_PPM_ALLOC_PAGES 215 thread_t * this = CURRENT_THREAD;216 217 uint32_t cycle = (uint32_t)hal_get_cycles(); 217 218 if( DEBUG_PPM_ALLOC_PAGES < cycle ) … … 237 238 238 239 current_block = NULL; 239 240 // find a free block equal or larger to requested size 241 for( current_order = order ; current_order < CONFIG_PPM_MAX_ORDER ; current_order ++ ) 242 { 243 if( !list_is_empty( &ppm->free_pages_root[current_order] ) ) 240 current_order = order; 241 242 // search a free block equal or larger than requested size 243 while( current_order < CONFIG_PPM_MAX_ORDER ) 244 { 245 // get local pointer on the root of relevant free_list (same in all clusters) 246 list_entry_t * root = &ppm->free_pages_root[current_order]; 247 248 if( !list_is_empty( root ) ) 244 249 { 245 250 // get first free block in this free_list 246 current_block = LIST_FIRST( &ppm->free_pages_root[current_order], page_t , list );251 current_block = LIST_FIRST( root , page_t , list ); 247 252 248 253 // remove this block from this free_list 249 254 list_unlink( ¤t_block->list ); 255 ppm->free_pages_nr[current_order] --; 250 256 251 257 // register pointer on found block 252 258 found_block = current_block; 253 259 254 // update this free-list number of blocks255 ppm->free_pages_nr[current_order] --;256 257 260 // compute found block size 258 261 current_size = (1 << current_order); … … 260 263 break; 261 264 } 265 266 // increment loop index 267 current_order++; 262 268 } 263 269 … … 267 273 remote_busylock_release( lock_xp ); 268 274 269 #if DEBUG_PPM_ALLOC_PAGES 270 cycle = (uint32_t)hal_get_cycles(); 271 if( DEBUG_PPM_ALLOC_PAGES < cycle ) 272 printk("\n[%s] thread[%x,%x] cannot allocate %d page(s) in cluster %x / cycle %d\n", 273 __FUNCTION__, this->process->pid, this->trdid, 1<<order, local_cxy, cycle ); 274 #endif 275 printk("\n[%s] thread[%x,%x] cannot allocate %d page(s) in cluster %x\n", 276 __FUNCTION__, this->process->pid, this->trdid, 1<<order, local_cxy ); 275 277 276 278 return NULL; … … 282 284 while( current_order > order ) 283 285 { 286 // update size and order 284 287 current_order --; 285 286 // update pointer, size, and order fiels for new free block287 288 current_size >>= 1; 289 290 // update order fiels in new free block 288 291 current_block = found_block + current_size; 289 292 current_block->order = current_order; … … 291 294 // insert new free block in relevant free_list 292 295 list_add_first( &ppm->free_pages_root[current_order] , ¤t_block->list ); 293 294 // update number of blocks in free list295 296 ppm->free_pages_nr[current_order] ++; 296 297 } … … 312 313 printk("\n[%s] thread[%x,%x] exit for %d page(s) in cluster %x / ppn = %x / cycle %d\n", 313 314 __FUNCTION__, this->process->pid, this->trdid, 314 1<<order, ppm_page2ppn(XPTR( local_cxy , found_block )), local_cxy, cycle );315 1<<order, local_cxy, ppm_page2ppn(XPTR( local_cxy , found_block )), cycle ); 315 316 #endif 316 317 … … 374 375 375 376 ///////////////////////////////////////////// 376 xptr_tppm_remote_alloc_pages( cxy_t cxy,377 void * ppm_remote_alloc_pages( cxy_t cxy, 377 378 uint32_t order ) 378 379 { … … 382 383 page_t * found_block; 383 384 385 thread_t * this = CURRENT_THREAD; 386 384 387 #if DEBUG_PPM_REMOTE_ALLOC_PAGES 385 thread_t * this = CURRENT_THREAD;386 388 uint32_t cycle = (uint32_t)hal_get_cycles(); 387 389 if( DEBUG_PPM_REMOTE_ALLOC_PAGES < cycle ) … … 408 410 409 411 current_block = NULL; 410 411 // find in remote cluster a free block equal or larger to requested size 412 for( current_order = order ; current_order < CONFIG_PPM_MAX_ORDER ; current_order ++ ) 413 { 414 // get local pointer on the root of relevant free_list in remote cluster 412 current_order = order; 413 414 // search a free block equal or larger than requested size 415 while( current_order < CONFIG_PPM_MAX_ORDER ) 416 { 417 // get local pointer on the root of relevant free_list (same in all clusters) 415 418 list_entry_t * root = &ppm->free_pages_root[current_order]; 416 419 417 if( !list_remote_is_empty( cxy , root ) ) 420 if( !list_remote_is_empty( cxy , root ) ) // list non empty => success 418 421 { 419 422 // get local pointer on first free page descriptor in remote cluster … … 422 425 // remove first free page from the free-list in remote cluster 423 426 list_remote_unlink( cxy , ¤t_block->list ); 427 hal_remote_atomic_add( XPTR( cxy , &ppm->free_pages_nr[current_order] ), -1 ); 424 428 425 429 // register found block 426 430 found_block = current_block; 427 431 428 // decrement relevant free-list number of items in remote cluster429 hal_remote_atomic_add( XPTR( cxy , &ppm->free_pages_nr[current_order] ), -1 );430 431 432 // compute found block size 432 433 current_size = (1 << current_order); … … 434 435 break; 435 436 } 437 438 // increment loop index 439 current_order++; 436 440 } 437 441 … … 441 445 remote_busylock_release( lock_xp ); 442 446 443 #if DEBUG_REMOTE_PPM_ALLOC_PAGES 444 cycle = (uint32_t)hal_get_cycles(); 445 if( DEBUG_PPM_REMOTE_ALLOC_PAGES < cycle ) 446 printk("\n[%s] thread[%x,%x] cannot allocate %d page(s) in cluster %x / cycle %d\n", 447 __FUNCTION__, this->process->pid, this->trdid, 1<<order, cxy, cycle ); 448 #endif 447 printk("\n[ERROR] in %s : thread[%x,%x] cannot allocate %d page(s) in cluster %x\n", 448 __FUNCTION__, this->process->pid, this->trdid, 1<<order, cxy ); 449 449 450 450 return XPTR_NULL; … … 455 455 while( current_order > order ) 456 456 { 457 // update order , size, and local pointer for new free block457 // update order and size 458 458 current_order --; 459 459 current_size >>= 1; 460 461 // update new free block order field in remote cluster 460 462 current_block = found_block + current_size; 461 462 // update new free block order field in remote cluster463 463 hal_remote_s32( XPTR( cxy , ¤t_block->order ) , current_order ); 464 464 … … 497 497 #endif 498 498 499 return XPTR( cxy , found_block );499 return found_block; 500 500 501 501 } // end ppm_remote_alloc_pages()
Note: See TracChangeset
for help on using the changeset viewer.