| .. | .. |
|---|
| 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; |
|---|