root/lib/smp_processor_id.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. check_preemption_disabled
  2. debug_smp_processor_id
  3. __this_cpu_preempt_check

   1 // SPDX-License-Identifier: GPL-2.0
   2 /*
   3  * lib/smp_processor_id.c
   4  *
   5  * DEBUG_PREEMPT variant of smp_processor_id().
   6  */
   7 #include <linux/export.h>
   8 #include <linux/kprobes.h>
   9 #include <linux/sched.h>
  10 
  11 notrace static nokprobe_inline
  12 unsigned int check_preemption_disabled(const char *what1, const char *what2)
  13 {
  14         int this_cpu = raw_smp_processor_id();
  15 
  16         if (likely(preempt_count()))
  17                 goto out;
  18 
  19         if (irqs_disabled())
  20                 goto out;
  21 
  22         /*
  23          * Kernel threads bound to a single CPU can safely use
  24          * smp_processor_id():
  25          */
  26         if (cpumask_equal(current->cpus_ptr, cpumask_of(this_cpu)))
  27                 goto out;
  28 
  29         /*
  30          * It is valid to assume CPU-locality during early bootup:
  31          */
  32         if (system_state < SYSTEM_SCHEDULING)
  33                 goto out;
  34 
  35         /*
  36          * Avoid recursion:
  37          */
  38         preempt_disable_notrace();
  39 
  40         if (!printk_ratelimit())
  41                 goto out_enable;
  42 
  43         printk(KERN_ERR "BUG: using %s%s() in preemptible [%08x] code: %s/%d\n",
  44                 what1, what2, preempt_count() - 1, current->comm, current->pid);
  45 
  46         printk("caller is %pS\n", __builtin_return_address(0));
  47         dump_stack();
  48 
  49 out_enable:
  50         preempt_enable_no_resched_notrace();
  51 out:
  52         return this_cpu;
  53 }
  54 
  55 notrace unsigned int debug_smp_processor_id(void)
  56 {
  57         return check_preemption_disabled("smp_processor_id", "");
  58 }
  59 EXPORT_SYMBOL(debug_smp_processor_id);
  60 NOKPROBE_SYMBOL(debug_smp_processor_id);
  61 
  62 notrace void __this_cpu_preempt_check(const char *op)
  63 {
  64         check_preemption_disabled("__this_cpu_", op);
  65 }
  66 EXPORT_SYMBOL(__this_cpu_preempt_check);
  67 NOKPROBE_SYMBOL(__this_cpu_preempt_check);

/* [<][>][^][v][top][bottom][index][help] */