ключевой фрагмент функции load_elf_library, содержащей ошибку синхронизации потоков
Как мы видим, семафор mmap_sem освобождается до вызова do_brk() функции, порождая тем самым проблему синхронизации потоков. В тоже время, анализ функции sys_brk(), убеждает нас в том, что функции do_brk() должна вызывается с взведенным семафором. Рассмотрим фрагмент исходного кода, позаимствованный из файла mm/mmap.c:
[1094] vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL);
if (!vma) return -ENOMEM; vma->
vm_mm = mm; vma->
vm_start = addr; vma->
vm_end = addr + len; vma->
vm_flags = flags; vma->
vm_page_prot = protection_map[flags & 0x0f]; vma->
vm_ops = NULL; vma->
vm_pgoff = 0; vma->
vm_file = NULL; vma->
vm_private_data = NULL; vma_link(mm, vma, prev, rb_link, rb_parent);