Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 23 Jun 2005 12:39:40 +0300
From:      Andrey Simonenko <simon@comsys.ntu-kpi.kiev.ua>
To:        freebsd-hackers@freebsd.org
Subject:   Question about synchronization in socow_setup()
Message-ID:  <20050623093940.GA338@pm514-9.comsys.ntu-kpi.kiev.ua>

next in thread | raw e-mail | index | archive | help
Hello,

Can somebody explain how socow_setup() synchronizes access to the page
it wants to COW:

    99		s = splvm();
      	
   100	       /* 
   101		* verify page is mapped & not already wired for i/o
   102		*/
   103		socow_stats.attempted++;
   104		pa=pmap_extract(map->pmap, uva);
   105		if(!pa) {
   106			socow_stats.fail_not_mapped++;
   107			splx(s);
   108			return(0);
   109		}
   110		pp = PHYS_TO_VM_PAGE(pa);
      	
   111		/* 
   112		 * set up COW
   113		 */
   114		vm_page_lock_queues();
   115		vm_page_cowsetup(pp);

How socow_setup() is sure, that pp is valid after pmap_extract()
(line 104) and before vm_page_lock_queues() (line 114) ?

Another question, why socow_setup() uses vm_page_wire() instead
of pmap_extract_and_hold() ?  When a page should be held and when
it should be wired?  According the comment for vm_page_hold(), a
page should be held only for "*very* temporary holding", so when
one decides what to use (vm_page_hold() or vm_page_wire()), he should
decide what will be more effective: simply increment m->hold_count or
increment m->wire_count and remove m from the page queue (so this
page will be invisible for vm_pageout_scan()).  Am I right?



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050623093940.GA338>