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
  11notrace static nokprobe_inline
  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 (cpumask_equal(&current->cpus_allowed, 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
  49out_enable:
  50        preempt_enable_no_resched_notrace();
  51out:
  52        return this_cpu;
  53}
  54
  55notrace unsigned int debug_smp_processor_id(void)
  56{
  57        return check_preemption_disabled("smp_processor_id", "");
  58}
  59EXPORT_SYMBOL(debug_smp_processor_id);
  60NOKPROBE_SYMBOL(debug_smp_processor_id);
  61
  62notrace void __this_cpu_preempt_check(const char *op)
  63{
  64        check_preemption_disabled("__this_cpu_", op);
  65}
  66EXPORT_SYMBOL(__this_cpu_preempt_check);
  67NOKPROBE_SYMBOL(__this_cpu_preempt_check);
  68