The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/lib/smp_processor_id.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

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

Cache object: f1b903dd3f1714d035a50e2486825860


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.