2015-11-27 14 views
5

Im Linux-Kernel verwendet Linux zum Speichern der Speicherbereiche eines Prozesses sowohl eine verknüpfte Liste als auch einen rot-schwarzen Baum. find_vma ist eine Funktion, die den ersten Speicherbereich findet, dessen vm_end-Feld größer als die übergebene Adresse durch Rot-Schwarz-Struktur ist. Allerdings finde ich es dort keinen Schutz (wie eine Sperre) für den rotschwarzen Baum innerhalb von find_vma(). Was passiert, wenn ein anderer Thread die Funktion rb_erase aufruft, um ein Element im Baum gleichzeitig zu löschen?ist rot schwarz Baum im Kernel nicht geschützt?

+0

Wird es nicht über RCU verwaltet? – Joe

+0

Es scheint, dass 'find_vma' selbst mit etwas Schutz vor gleichzeitigem Zugriff (Modifikation) aufgerufen werden sollte. @Joe: Im Gegensatz zu Listen kann rb-tree nicht von RCU geschützt werden. – Tsyvarev

+0

@Tsyvarev Danke für Ihre Antwort. Ich stimme dir zu. Zum Beispiel wird in [sys_msync] (http://lxr.free-electron.com/source/mm/filemap.c?v=2.4.37#L2381) (der Systemaufruf von msync) "down_read" aufgerufen (& current-> mm-> mmap_sem) 'zuerst und dann' find_vma'. Schützt das den rot-schwarzen Baum? – HuangJie

Antwort

2

Ja, find_vma Funktionsaufruf ist vor gleichzeitigem Zugriff über Semaphor geschützt. Im Scheduler wird auch die Funktion mit Semaphoraufrufen verwendet.

 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. 
Verwandte Themen