On 2/8/2019 5:39 AM, Thomas Gleixner wrote:
On Thu, 31 Jan 2019, Liang, Kan wrote:
+u64 perf_get_page_size(u64 virt)
+{
+       unsigned long flags;
+       unsigned int level;
+       pte_t *pte;
+
+       if (!virt)
+               return 0;
+
+       /*
+        * Interrupts are disabled, so it prevents any tear down
+        * of the page tables.
+        * See the comment near struct mmu_table_batch.
+        */
+       local_irq_save(flags);
+       if (virt >= TASK_SIZE)
+               pte = lookup_address(virt, &level);
+       else {
+               if (current->mm)
+                       pte = lookup_address_in_pgd(pgd_offset(current->mm,
virt),
+                                                   virt, &level);

Aside from all the missin {}, I'm fairly sure this is broken since this
happens from NMI context. This can interrupt switch_mm() and things like
use_temporary_mm().

Also; why does this live in the x86 code and not in the generic code?


This is x86 implementation.
In generic code, there is a __weak function. I'll make it clear in the change
log in v4.

No, instead of hiding it in the changelog, split the patch into two:

  #1 Adding the core stuff including the weak function

  #2 Adding the x86 implementation.


Thanks for the comments. I will do it in V5.

Thanks,
Kan

Reply via email to