Changeset 178 for trunk/kernel/mm/vmm.c


Ignore:
Timestamp:
Jul 11, 2017, 12:57:27 PM (7 years ago)
Author:
max@…
Message:

style

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/mm/vmm.c

    r124 r178  
    181181
    182182    hal_fence();
    183 
    184 }  // end vmm_init()
     183}
    185184
    186185//////////////////////////////////////////
     
    196195    rwlock_wr_lock( &src_vmm->vsegs_lock );
    197196
    198     // initialise dst_vmm vsegs_lock
     197    // initialize dst_vmm vsegs_lock
    199198    rwlock_init( &dst_vmm->vsegs_lock );
    200199
    201     // initialise the dst_vmm vsegs list and the radix tree
     200    // initialize the dst_vmm vsegs list and the radix tree
    202201    dst_vmm->vsegs_nr = 0;
    203202    list_root_init( &dst_vmm->vsegs_root );
     
    208207    if( error )
    209208    {
    210         printk("\n[ERROR] in %s : cannot initialise radix tree for process %x\n",
     209        printk("\n[ERROR] in %s : cannot initialize radix tree for process %x\n",
    211210               __FUNCTION__ , dst_process->pid );
    212211        return ENOMEM;
     
    226225        dst_vseg = vseg_alloc();
    227226
    228         if( dst_vseg == NULL ) 
     227        if( dst_vseg == NULL )
    229228        {
    230229            // release all allocated vsegs
     
    267266    for( i = 0 ; i < 32 ; i++ ) list_root_init( &dst_vmm->mmap_mgr.zombi_list[i] );
    268267
    269     // initialise instrumentation counters
     268    // initialize instrumentation counters
    270269        dst_vmm->pgfault_nr    = 0;
    271270        dst_vmm->u_err_nr      = 0;
     
    273272
    274273    // copy base addresses
    275     dst_vmm->kent_vpn_base = src_vmm->kent_vpn_base; 
    276     dst_vmm->args_vpn_base = src_vmm->args_vpn_base; 
    277     dst_vmm->envs_vpn_base = src_vmm->envs_vpn_base; 
    278     dst_vmm->heap_vpn_base = src_vmm->heap_vpn_base; 
    279     dst_vmm->code_vpn_base = src_vmm->code_vpn_base; 
    280     dst_vmm->data_vpn_base = src_vmm->data_vpn_base; 
     274    dst_vmm->kent_vpn_base = src_vmm->kent_vpn_base;
     275    dst_vmm->args_vpn_base = src_vmm->args_vpn_base;
     276    dst_vmm->envs_vpn_base = src_vmm->envs_vpn_base;
     277    dst_vmm->heap_vpn_base = src_vmm->heap_vpn_base;
     278    dst_vmm->code_vpn_base = src_vmm->code_vpn_base;
     279    dst_vmm->data_vpn_base = src_vmm->data_vpn_base;
    281280
    282281    dst_vmm->entry_point   = src_vmm->entry_point;
     
    302301
    303302    return 0;
    304 
    305 }  // end vmm_copy()
     303}
    306304
    307305///////////////////////////////////////
     
    344342    // release memory allocated to the local page table
    345343    hal_gpt_destroy( &vmm->gpt );
    346 
    347 } // end vmm_destroy()
     344}
    348345
    349346/////////////////////////////////////////////////
     
    364361        }
    365362    return NULL;
    366 }  // vmm_check_conflict()
     363}
    367364
    368365////////////////////////////////////////////////////////////////////////////////////////////
     
    398395    *vpn_size = CONFIG_VMM_STACK_SIZE - 1;
    399396    return 0;
    400 
    401 }  // end vmm_stack_alloc()
     397}
    402398
    403399////////////////////////////////////////////////////////////////////////////////////////////
     
    464460    *vpn_size = size;
    465461    return 0;
    466 
    467 }  // end vmm_mmap_alloc()
     462}
    468463
    469464//////////////////////////////////////////////
     
    560555
    561556        return vseg;
    562 
    563 }  // end vmm_create_vseg()
     557}
    564558
    565559/////////////////////////////////////
     
    612606        vseg_free( vseg );
    613607    }
    614 
    615 }  // end vmm_remove_vseg()
    616 
     608}
    617609
    618610//////////////////////////////////////////////
     
    668660
    669661        return 0;
    670 } // end vmm_map_vseg()
     662}
    671663
    672664/////////////////////////////////////////
     
    688680        hal_gpt_reset_pte( gpt , vpn );
    689681    }
    690 } // end vmm_unmap_vseg()
    691 
     682}
    692683
    693684/////////////////////////////////////////////
     
    745736
    746737        return error;
    747 } // end vmm_resize_vseg()
     738}
    748739
    749740///////////////////////////////////////////
     
    765756
    766757    return vseg;
    767 
    768 } // end vmm_get_vseg()
     758}
    769759
    770760/////////////////////////////////////////
     
    779769    error_t   error;
    780770
    781     // this function must be called by a thread running in the reference cluster 
     771    // this function must be called by a thread running in the reference cluster
    782772    assert( (GET_CXY( process->ref_xp ) == local_cxy ) , __FUNCTION__ ,
    783773             " not called in the reference cluster\n" );
     
    860850    *ret_attr = attr;
    861851    return 0;
    862 }  // end vmm_get_pte()
     852}
    863853
    864854///////////////////////////////////////////////////
     
    906896
    907897    return 0;
    908 }  // end vmm_handle_page_fault()
     898}
    909899
    910900///////////////////////////////////////////
     
    946936
    947937    return error;
    948 
    949 }  // end vmm_v2p_translate()
    950 
    951 
    952 
    953 
     938}
    954939
    955940/*
     
    989974        current.ppn     = ppn;
    990975        current.attr    = vseg->vm_pgprot;
    991         current.cluster = NULL; // this function is called after invalidate one 
     976        current.cluster = NULL; // this function is called after invalidate one
    992977
    993978        error= pmm_set_page(&vseg->vmm->pmm, vaddr , &current);
     
    997982}
    998983
    999 // Hypothesis: the vseg is shared-anon, mapper list is rdlocked, page is locked 
     984// Hypothesis: the vseg is shared-anon, mapper list is rdlocked, page is locked
    1000985error_t vmm_migrate_shared_page_seq( vseg_t *vseg, struct page_s *page, struct page_s **new)
    1001986{
     
    10161001        error      = ECANCELED;
    10171002
    1018         // Invalidate All 
     1003        // Invalidate All
    10191004        do
    10201005        {
     
    10551040        new_pg->index  = page->index;
    10561041
    1057         // TODO: do the complet job regading dirty page 
     1042        // TODO: do the complet job regading dirty page
    10581043        if(PAGE_IS(page, PG_DIRTY))
    10591044                PAGE_SET(new_pg, PG_DIRTY);
     
    10871072//TODO: revisit all manipulation of the page->refcount
    10881073///////////////////////////////////////////////////////////////
    1089 static inline error_t vmm_do_migrate( vseg_t     * vseg, 
     1074static inline error_t vmm_do_migrate( vseg_t     * vseg,
    10901075                                      pmm_page_info_t * pinfo,
    10911076                                      uint32_t          vaddr )
     
    10981083        error_t           err;
    10991084        ppn_t             ppn;
    1100  
     1085
    11011086        assert( pinfo->ppn != 0 );
    11021087
     
    11051090        newpage = NULL;
    11061091        cluster = current_cluster;
    1107  
     1092
    11081093        current.attr = 0;
    11091094        current.ppn  = 0;
     
    11111096        error= pmm_lock_page(&vseg->vmm->pmm, vaddr, &current);
    11121097
    1113         if(error|| (current.isAtomic == false) || 
     1098        if(error|| (current.isAtomic == false) ||
    11141099              (current.ppn != ppn) || !(current.attr & PMM_MIGRATE))
    11151100        {
    11161101#if CONFIG_SHOW_SPURIOUS_PGFAULT
    1117                 printk(INFO, "%s: pid %d, tid %d, cpu %d, nothing to do for vaddr %x\n", 
    1118                        __FUNCTION__, 
    1119                        this->process->pid, 
    1120                        this->info.order, 
     1102                printk(INFO, "%s: pid %d, tid %d, cpu %d, nothing to do for vaddr %x\n",
     1103                       __FUNCTION__,
     1104                       this->process->pid,
     1105                       this->info.order,
    11211106                       cpu_get_id(),
    11221107                       vaddr);
     
    11271112                return 0;
    11281113        }
    1129  
     1114
    11301115        if(!ppn_is_local(ppn))
    11311116        {
     
    11611146        if(err)
    11621147        {
    1163                 // TODO: we should differ the kmem_free call 
     1148                // TODO: we should differ the kmem_free call
    11641149                //page_unlock(page);
    11651150                (void)pmm_unlock_page(&vseg->vmm->pmm, vaddr, &current);
     
    11671152                kmem_free(&req);
    11681153                return err;
    1169         } 
     1154        }
    11701155
    11711156
     
    11741159                ppn_refcount_down(ppn);
    11751160                current_thread->info.remote_pages_cntr ++;
    1176 #if CONFIG_SHOW_REMOTE_PGALLOC 
     1161#if CONFIG_SHOW_REMOTE_PGALLOC
    11771162                printk(INFO, "%s: pid %d, tid %x, cpu %d, cid %d: got new remote page from cluster %d (vaddr %x)\n",
    11781163                       __FUNCTION__,
     
    12251210                 vaddr);
    12261211
    1227  
     1212
    12281213        error= pmm_lock_page(&vseg->vmm->pmm, vaddr, &old);
    12291214
     
    12321217        {
    12331218#if CONFIG_SHOW_SPURIOUS_PGFAULT
    1234                 printk(INFO, "%s: pid %d, tid %d, cpu %d, nothing to do for vaddr %x\n", 
    1235                        __FUNCTION__, 
    1236                        this->process->pid, 
    1237                        this->info.order, 
     1219                printk(INFO, "%s: pid %d, tid %d, cpu %d, nothing to do for vaddr %x\n",
     1220                       __FUNCTION__,
     1221                       this->process->pid,
     1222                       this->info.order,
    12381223                       cpu_get_id(),
    12391224                       vaddr);
     
    12461231        }
    12471232
    1248         //if the ppn is local and the others (processus with wich we share the page) 
     1233        //if the ppn is local and the others (processus with wich we share the page)
    12491234        //has done cow, then use the old.ppn directly
    12501235        if(ppn_is_local(old.ppn))
     
    12591244                                newpage = page;//don't copy the page. use it directly.
    12601245                                isCountDown = false;
    1261                                 vmm_dmsg(2, "%s: pid %d, tid %d, cpu %d, reuse same page for vaddr %x, pg_addr %x\n", 
    1262                                          __FUNCTION__, 
    1263                                          this->process->pid, 
    1264                                          this->info.order, 
    1265                                          cpu_get_id(), 
    1266                                          vaddr, 
     1246                                vmm_dmsg(2, "%s: pid %d, tid %d, cpu %d, reuse same page for vaddr %x, pg_addr %x\n",
     1247                                         __FUNCTION__,
     1248                                         this->process->pid,
     1249                                         this->info.order,
     1250                                         cpu_get_id(),
     1251                                         vaddr,
    12671252                                         ppm_page2addr(page));
    12681253                        }
     
    12751260        //also defcount down the ppn
    12761261        if(newpage == NULL)
    1277         {   
     1262        {
    12781263                req.type  = KMEM_PAGE;
    12791264                req.size  = 0;
     
    12911276                assert(isCountDown);
    12921277               
    1293                 vmm_dmsg(2, 
    1294                          "%s: pid %d, tid %d, cpu %d, newpage for vaddr %x, pg_addr %x\n", 
    1295                          __FUNCTION__, 
    1296                          this->process->pid, 
    1297                          this->info.order, 
    1298                          cpu_get_id(), 
    1299                          vaddr, 
     1278                vmm_dmsg(2,
     1279                         "%s: pid %d, tid %d, cpu %d, newpage for vaddr %x, pg_addr %x\n",
     1280                         __FUNCTION__,
     1281                         this->process->pid,
     1282                         this->info.order,
     1283                         cpu_get_id(),
     1284                         vaddr,
    13001285                         ppm_page2addr(newpage));
    13011286
     
    13231308        if(isCountDown) ppn_refcount_down(old.ppn);
    13241309       
    1325         vmm_dmsg(2, "%s, pid %d, tid %d, cpu %d, COW ended [vaddr %x]\n", 
    1326                  __FUNCTION__, 
     1310        vmm_dmsg(2, "%s, pid %d, tid %d, cpu %d, COW ended [vaddr %x]\n",
     1311                 __FUNCTION__,
    13271312                 this->process->pid,
    13281313                 this->info.order,
    13291314                 cpu_get_id(),
    13301315                 vaddr);
    1331  
     1316
    13321317        return 0;
    13331318}
     
    13581343        {
    13591344#if CONFIG_SHOW_SPURIOUS_PGFAULT
    1360                 printk(INFO, "%s: pid %d, tid %d, cpu %d, nothing to do for vaddr %x\n", 
    1361                        __FUNCTION__, 
    1362                        this->process->pid, 
    1363                        this->info.order, 
     1345                printk(INFO, "%s: pid %d, tid %d, cpu %d, nothing to do for vaddr %x\n",
     1346                       __FUNCTION__,
     1347                       this->process->pid,
     1348                       this->info.order,
    13641349                       cpu_get_id(),
    13651350                       vaddr);
     
    13731358
    13741359        //also hold a refcount!
    1375         ppn = mapper_get_ppn(&vseg->vm_mapper, 
    1376                                index, 
     1360        ppn = mapper_get_ppn(&vseg->vm_mapper,
     1361                               index,
    13771362                               MAPPER_SYNC_OP);
    13781363
     
    14111396        old.attr  = 0;
    14121397        this      = current_thread;
    1413  
     1398
    14141399        error= pmm_lock_page(&vseg->vmm->pmm, vaddr, &old);
    14151400
     
    15051490#if 0
    15061491#if CONFIG_SHOW_VMM_ERROR_MSG
    1507                 printk(ERROR, 
     1492                printk(ERROR,
    15081493                       "ERROR: %s: pid %d, cpu %d, Unexpected page attributes configuration for vaddr %x, found: ppn %x, attr %x\n",
    15091494                       __FUNCTION__,
    15101495                       current_process->pid,
    1511                        cpu_get_id(), 
    1512                        vaddr, 
     1496                       cpu_get_id(),
     1497                       vaddr,
    15131498                       info.ppn,
    15141499                       info.attr);
    15151500#endif
    1516    
     1501
    15171502                return EPERM;
    15181503#endif
     
    15241509        return vmm_do_aod(vseg, vaddr);
    15251510}
    1526 
    15271511*/
    15281512
    1529 
Note: See TracChangeset for help on using the changeset viewer.