2015-11-27 5 views
5

Nel kernel di Linux, per memorizzare le regioni di memoria di un processo, Linux utilizza sia un elenco collegato che un albero rosso-nero. find_vma è una funzione che individua la prima regione di memoria il cui campo vm_end è maggiore dell'indirizzo passato attraverso l'albero nero rosso. Tuttavia, trovo che non ci sia protezione (come un lucchetto) per l'albero nero rosso dentro find_vma(). Cosa succede se un altro thread chiama la funzione rb_erase per eliminare alcuni elementi sull'albero allo stesso?è un albero nero rosso nel kernel non protetto?

+0

Non è gestito tramite RCU? – Joe

+0

Sembra che 'find_vma' stesso debba essere chiamato con una certa protezione dall'accesso simultaneo (modifica). @Joe: Diversamente dalle liste, l'albero rb non può essere protetto da RCU. – Tsyvarev

+0

@Tsyvarev Grazie per la risposta. Sono d'accordo con te. Ad esempio, in [sys_msync] (http://lxr.free-electrons.com/source/mm/filemap.c?v=2.4.37#L2381) (la chiamata di sistema di 'msync'), chiama' down_read (& current-> mm-> mmap_sem) 'prima e poi' find_vma'. Questo protegge l'albero nero rosso? – HuangJie

risposta

2

Sì, la chiamata della funzione find_vma è protetta dall'accesso simultaneo tramite semaforo. Nello scheduler anche la funzione viene utilizzata con le chiamate al semaforo.

 2209   down_read(&mm->mmap_sem); 
     2210   vma = find_vma(mm, start); 
     .... 
        up_read(&mm->mmap_sem); 



    mmap_sem is used to protect this function call which is a read-write semaphore. 
    struct rw_semaphore mmap_sem; defined inside struct mm_struct. 
Problemi correlati