Changeset 623 for trunk/kernel/mm/mapper.c
- Timestamp:
- Mar 6, 2019, 4:37:15 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/mm/mapper.c
r614 r623 3 3 * 4 4 * Authors Mohamed Lamine Karaoui (2015) 5 * Alain Greiner (2016,2017,2018 )5 * Alain Greiner (2016,2017,2018,2019) 6 6 * 7 7 * Copyright (c) UPMC Sorbonne Universites … … 261 261 vfs_inode_t * inode = mapper->inode; 262 262 vfs_inode_get_name( XPTR( local_cxy , inode ) , name ); 263 // if( DEBUG_MAPPER_HANDLE_MISS < cycle ) 264 // if( (page_id == 1) && (cycle > 10000000) ) 263 if( DEBUG_MAPPER_HANDLE_MISS < cycle ) 265 264 printk("\n[%s] enter for page %d in <%s> / cycle %d", 266 265 __FUNCTION__, page_id, name, cycle ); … … 322 321 #if DEBUG_MAPPER_HANDLE_MISS 323 322 cycle = (uint32_t)hal_get_cycles(); 324 // if( DEBUG_MAPPER_HANDLE_MISS < cycle ) 325 // if( (page_id == 1) && (cycle > 10000000) ) 323 if( DEBUG_MAPPER_HANDLE_MISS < cycle ) 326 324 printk("\n[%s] exit for page %d in <%s> / ppn %x / cycle %d", 327 325 __FUNCTION__, page_id, name, ppm_page2ppn( *page_xp ), cycle ); … … 442 440 ppm_page_do_dirty( page_xp ); 443 441 hal_copy_from_uspace( map_ptr , buf_ptr , page_count ); 442 443 putb(" in mapper_move_user()" , map_ptr , page_count ); 444 444 445 } 445 446 … … 645 646 646 647 } // end mapper_remote_set_32() 648 649 ///////////////////////////////////////// 650 error_t mapper_sync( mapper_t * mapper ) 651 { 652 page_t * page; // local pointer on current page descriptor 653 xptr_t page_xp; // extended pointer on current page descriptor 654 grdxt_t * rt; // pointer on radix_tree descriptor 655 uint32_t start_key; // start page index in mapper 656 uint32_t found_key; // current page index in mapper 657 error_t error; 658 659 #if DEBUG_MAPPER_SYNC 660 thread_t * this = CURRENT_THREAD; 661 uint32_t cycle = (uint32_t)hal_get_cycles(); 662 char name[CONFIG_VFS_MAX_NAME_LENGTH]; 663 vfs_inode_get_name( XPTR( local_cxy , mapper->inode ) , name ); 664 #endif 665 666 // get pointer on radix tree 667 rt = &mapper->rt; 668 669 // initialise loop variable 670 start_key = 0; 671 672 // scan radix-tree until last page found 673 while( 1 ) 674 { 675 // get page descriptor from radix tree 676 page = (page_t *)grdxt_get_first( rt , start_key , &found_key ); 677 678 if( page == NULL ) break; 679 680 assert( (page->index == found_key ), __FUNCTION__, "wrong page descriptor index" ); 681 assert( (page->order == 0), __FUNCTION__, "mapper page order must be 0" ); 682 683 // build extended pointer on page descriptor 684 page_xp = XPTR( local_cxy , page ); 685 686 // synchronize page if dirty 687 if( (page->flags & PG_DIRTY) != 0 ) 688 { 689 690 #if DEBUG_MAPPER_SYNC 691 if( cycle > DEBUG_MAPPER_SYNC ) 692 printk("\n[%s] thread[%x,%x] synchonise page %d of <%s> to device\n", 693 __FUNCTION__, this->process->pid, this->trdid, page->index, name ); 694 #endif 695 // copy page to file system 696 error = vfs_fs_move_page( page_xp , IOC_WRITE ); 697 698 if( error ) 699 { 700 printk("\n[ERROR] in %s : cannot synchonize dirty page %d\n", 701 __FUNCTION__, page->index ); 702 return -1; 703 } 704 705 // remove page from PPM dirty list 706 ppm_page_undo_dirty( page_xp ); 707 } 708 else 709 { 710 711 #if DEBUG_MAPPER_SYNC 712 if( cycle > DEBUG_MAPPER_SYNC ) 713 printk("\n[%s] thread[%x,%x] skip page %d for <%s>\n", 714 __FUNCTION__, this->process->pid, this->trdid, page->index, name ); 715 #endif 716 } 717 718 // update loop variable 719 start_key = page->index + 1; 720 } // end while 721 722 return 0; 723 724 } // end mapper_sync() 647 725 648 726 //////////////////////////////////////////////////
Note: See TracChangeset
for help on using the changeset viewer.