linux/lib/smp_processor_id.c
<<
>>
Prefs
   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
  11noinstr static
  12unsigned 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 (current->nr_cpus_allowed == 1)
  27                goto out;
  28
  29#ifdef CONFIG_SMP
  30        if (current->migration_disabled)
  31                goto out;
  32#endif
  33
  34        /*
  35         * It is valid to assume CPU-locality during early bootup:
  36         */
  37        if (system_state < SYSTEM_SCHEDULING)
  38                goto out;
  39
  40        /*
  41         * Avoid recursion:
  42         */
  43        preempt_disable_notrace();
  44
  45        instrumentation_begin();
  46        if (!printk_ratelimit())
  47                goto out_enable;
  48
  49        printk(KERN_ERR "BUG: using %s%s() in preemptible [%08x] code: %s/%d\n",
  50                what1, what2, preempt_count() - 1, current->comm, current->pid);
  51
  52        printk("caller is %pS\n", __builtin_return_address(0));
  53        dump_stack();
  54        instrumentation_end();
  55
  56out_enable:
  57        preempt_enable_no_resched_notrace();
  58out:
  59        return this_cpu;
  60}
  61
  62noinstr unsigned int debug_smp_processor_id(void)
  63{
  64        return check_preemption_disabled("smp_processor_id", "");
  65}
  66EXPORT_SYMBOL(debug_smp_processor_id);
  67
  68noinstr void __this_cpu_preempt_check(const char *op)
  69{
  70        check_preemption_disabled("__this_cpu_", op);
  71}
  72EXPORT_SYMBOL(__this_cpu_preempt_check);
  73