.. | .. |
---|
688 | 688 | |
---|
689 | 689 | spin_lock(&pgd_lock); |
---|
690 | 690 | /* |
---|
| 691 | + * Keep preemption disabled after __flush_tlb_all() which expects not be |
---|
| 692 | + * preempted during the flush of the local TLB. |
---|
| 693 | + */ |
---|
| 694 | + preempt_disable(); |
---|
| 695 | + /* |
---|
691 | 696 | * Check for races, another CPU might have split this page |
---|
692 | 697 | * up for us already: |
---|
693 | 698 | */ |
---|
694 | 699 | tmp = _lookup_address_cpa(cpa, address, &level); |
---|
695 | 700 | if (tmp != kpte) { |
---|
| 701 | + preempt_enable(); |
---|
696 | 702 | spin_unlock(&pgd_lock); |
---|
697 | 703 | return 1; |
---|
698 | 704 | } |
---|
.. | .. |
---|
726 | 732 | break; |
---|
727 | 733 | |
---|
728 | 734 | default: |
---|
| 735 | + preempt_enable(); |
---|
729 | 736 | spin_unlock(&pgd_lock); |
---|
730 | 737 | return 1; |
---|
731 | 738 | } |
---|
.. | .. |
---|
764 | 771 | * going on. |
---|
765 | 772 | */ |
---|
766 | 773 | __flush_tlb_all(); |
---|
| 774 | + preempt_enable(); |
---|
767 | 775 | spin_unlock(&pgd_lock); |
---|
768 | 776 | |
---|
769 | 777 | return 0; |
---|