Просмотр исходного кода

page_alloc: disable preemption while accessing PERCPU_PAGES

greatbridf 9 месяцев назад
Родитель
Сommit
246d1e76d7
1 измененных файлов с 4 добавлено и 0 удалено
  1. 4 0
      src/kernel/mem/page_alloc.rs

+ 4 - 0
src/kernel/mem/page_alloc.rs

@@ -392,7 +392,9 @@ fn __alloc_pages(order: u32) -> PagePtr {
 
 
     if order <= PAGE_ALLOC_COSTLY_ORDER {
     if order <= PAGE_ALLOC_COSTLY_ORDER {
         unsafe {
         unsafe {
+            eonix_preempt::disable();
             pages_ptr = PER_CPU_PAGES.as_mut().get_free_pages(order);
             pages_ptr = PER_CPU_PAGES.as_mut().get_free_pages(order);
+            eonix_preempt::enable();
         }
         }
     } else {
     } else {
         pages_ptr = ZONE.lock().get_free_pages(order);
         pages_ptr = ZONE.lock().get_free_pages(order);
@@ -408,7 +410,9 @@ fn __alloc_pages(order: u32) -> PagePtr {
 fn __free_pages(pages_ptr: PagePtr, order: u32) {
 fn __free_pages(pages_ptr: PagePtr, order: u32) {
     if order <= PAGE_ALLOC_COSTLY_ORDER {
     if order <= PAGE_ALLOC_COSTLY_ORDER {
         unsafe {
         unsafe {
+            eonix_preempt::disable();
             PER_CPU_PAGES.as_mut().free_pages(pages_ptr, order);
             PER_CPU_PAGES.as_mut().free_pages(pages_ptr, order);
+            eonix_preempt::enable();
         }
         }
     } else {
     } else {
         ZONE.lock().free_pages(pages_ptr, order);
         ZONE.lock().free_pages(pages_ptr, order);