Changeset 18 for trunk/kernel/mm/mapper.c
- Timestamp:
- Jun 3, 2017, 4:42:49 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/mm/mapper.c
r14 r18 105 105 page = (page_t *)grdxt_get_first( &mapper->radix , start_index , &found_index ); 106 106 107 if( page != NULL ) 107 if( page != NULL ) 108 108 { 109 109 // remove page from mapper and release to PPM … … 127 127 128 128 return 0; 129 129 130 130 } // end mapper_destroy() 131 131 … … 147 147 page = (page_t *)grdxt_lookup( &mapper->radix , index ); 148 148 149 // test if page available in mapper 149 // test if page available in mapper 150 150 if( ( page == NULL) || page_is_flag( page , PG_INLOAD ) ) // page not available / 151 151 { … … 167 167 req.flags = AF_NONE; 168 168 page = kmem_alloc( &req ); 169 169 170 170 if( page == NULL ) 171 171 { … … 190 190 rwlock_wr_unlock( &mapper->lock ); 191 191 192 if( error ) 192 if( error ) 193 193 { 194 194 printk("\n[ERROR] in %s : thread %x cannot insert page in mapper\n", … … 201 201 return NULL; 202 202 } 203 203 204 204 // launch I/O operation to load page from file system 205 205 error = mapper_updt_page( mapper , index , page ); … … 236 236 if( page_is_flag( page , PG_INLOAD ) ) break; 237 237 238 // deschedule 238 // deschedule 239 239 sched_yield(); 240 240 } 241 241 242 242 } 243 243 244 244 return page; 245 245 } 246 else 246 else 247 247 { 248 248 // release lock from READ_MODE … … 268 268 return EIO; 269 269 } 270 270 271 271 // take mapper lock in WRITE_MODE 272 272 rwlock_wr_lock( &mapper->lock ); … … 331 331 rwlock_wr_unlock( &mapper->lock ); 332 332 333 // release page lock 333 // release page lock 334 334 page_unlock( page ); 335 335 … … 339 339 return EIO; 340 340 } 341 341 342 342 return 0; 343 343 } // end mapper_updt_page … … 364 364 } 365 365 366 if( page_is_flag( page , PG_DIRTY ) ) 366 if( page_is_flag( page , PG_DIRTY ) ) 367 367 { 368 368 // get file system type and inode pointer … … 388 388 rwlock_rd_unlock( &mapper->lock ); 389 389 390 // release page lock 390 // release page lock 391 391 page_unlock( page ); 392 392 … … 396 396 return EIO; 397 397 } 398 398 399 399 // clear dirty bit 400 400 page_undo_dirty( page ); 401 401 } 402 402 403 403 return 0; 404 404 … … 408 408 // This static function is called by the mapper_move fragments() function. 409 409 // It moves one fragment between an user buffer and the kernel mapper. 410 // Implementation Note: It can require access to one or two pages in mapper: 410 // Implementation Note: It can require access to one or two pages in mapper: 411 411 // [max_page_index == min_page_index] <=> fragment fit in one mapper page 412 412 // [max_page index == min_page_index + 1] <=> fragment spread on two mapper pages … … 416 416 fragment_t * fragment ) 417 417 { 418 uint32_t size; // number of bytes in fragment 418 uint32_t size; // number of bytes in fragment 419 419 cxy_t buf_cxy; // cluster identifier for user buffer 420 420 uint8_t * buf_ptr; // local pointer on first byte in user buffer 421 421 422 422 xptr_t xp_buf; // extended pointer on byte in user buffer 423 423 xptr_t xp_map; // extended pointer on byte in kernel mapper 424 424 425 uint32_t min_file_offset; // offset of first byte in file 426 uint32_t max_file_offset; // offset of last byte in file 425 uint32_t min_file_offset; // offset of first byte in file 426 uint32_t max_file_offset; // offset of last byte in file 427 427 428 428 uint32_t first_page_index; // index of first page in mapper 429 uint32_t first_page_offset; // offset of first byte in first page in mapper 430 uint32_t first_page_size; // offset of first byte in first page in mapper 431 432 uint32_t second_page_index; // index of last page in mapper 433 uint32_t second_page_offset; // offset of last byte in last page in mapper 434 uint32_t second_page_size; // offset of last byte in last page in mapper 435 429 uint32_t first_page_offset; // offset of first byte in first page in mapper 430 uint32_t first_page_size; // offset of first byte in first page in mapper 431 432 uint32_t second_page_index; // index of last page in mapper 433 uint32_t second_page_offset; // offset of last byte in last page in mapper 434 uint32_t second_page_size; // offset of last byte in last page in mapper 435 436 436 page_t * page; // pointer on one page descriptor in mapper 437 437 uint8_t * map_ptr; // local pointer on first byte in mapper … … 448 448 return EINVAL; 449 449 } 450 450 451 451 // compute offsets of first and last bytes in file 452 452 min_file_offset = fragment->file_offset; … … 459 459 if ( first_page_index == second_page_index ) // only one page in mapper 460 460 { 461 // compute offset and size for page in mapper 461 // compute offset and size for page in mapper 462 462 first_page_offset = min_file_offset & (1<<CONFIG_PPM_PAGE_SHIFT); 463 463 first_page_size = size; … … 499 499 // compute local pointer on first byte in first page in mapper 500 500 map_ptr = (uint8_t *)ppm_page2base(page) + first_page_offset; 501 501 502 502 // compute extended pointers 503 503 xp_map = XPTR( local_cxy , map_ptr ); … … 517 517 // compute offset and size for second page in mapper 518 518 second_page_offset = 0; 519 second_page_size = size - first_page_size; 519 second_page_size = size - first_page_size; 520 520 521 521 // get pointer on second page in mapper … … 526 526 // compute local pointer on first byte in second page in mapper 527 527 map_ptr = (uint8_t *)ppm_page2base( page ) + second_page_offset; 528 528 529 529 // compute extended pointers 530 530 xp_map = XPTR( local_cxy , map_ptr ); … … 573 573 frags_array = client_frags; 574 574 } 575 else // make a local copy of fragments array 575 else // make a local copy of fragments array 576 576 { 577 577 hal_remote_memcpy( XPTR( local_cxy , local_frags ) , xp_frags ,
Note: See TracChangeset
for help on using the changeset viewer.