On Thu, Aug 04, 2005 at 22:29:45 +0000, Vincenzo Mallozzi wrote:
> [...]
> 1. void mtpmc_set_mm_not_writable(struct mm_struct *mm)
> 2. {
> 3. struct vm_area_struct *vm;
> 4. struct mtpmc_wrprotected_pages *wr_page, *temp_page_wr;
> 5. struct mtpmc_vm_wrprotected *temp_vma_wr;
> 6. struct page *page;
> 7. pte_t *pte;
> 8. unsigned long addr;
> 9.
> 10. down_write(&mm->mmap_sem);
> 11. for (vm = mm->mmap; vm!=NULL; vm=vm->vm_next)
> 12. if(mtpmc_vm_to_save(mm, vm) == 1){
> 13. temp_vma_wr = mtpmc_mk_vm_wrprotected(vm);
> 14. list_add_tail(&temp_vma_wr->list, &vm_write_protected);
> 15. wr_page = temp_vma_wr->pages;
> 16. INIT_LIST_HEAD(&wr_page->list);
> 17. for(addr=vm->vm_start;addr<vm->vm_end;addr+=PAGE_SIZE){
> 18. pte = mtpmc_get_pte_from_address(mm, addr);
> 19. if (pte)
> 20. if (pte_write(*pte)){
> 21. set_pte(pte, pte_wrprotect(*pte));
> 22. list_add_tail(&mtpmc_mk_page_wrprotected(addr)->list,
> &wr_page->list);
> 23. }
> 24. }
>
> 25. up_write(&mm->mmap_sem);
> 26.
> 27. return;
> 28. }
Perhaps your code is safe, but I would think you should have the list
modification itself (list_add_tail) protected by a spin_lock_irqsave.
That's the only way to exclude against interrupts (you can't lock
semaphores in interrupt context).
-------------------------------------------------------------------------------
Jan 'Bulb' Hudec <bulb@xxxxxx>
Attachment:
signature.asc
Description: Digital signature