LCOV - code coverage report
Current view: top level - kernel/irq - irqdesc.c (source / functions) Hit Total Coverage
Test: landlock.info Lines: 107 335 31.9 %
Date: 2021-04-22 12:43:58 Functions: 14 37 37.8 %

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0
       2             : /*
       3             :  * Copyright (C) 1992, 1998-2006 Linus Torvalds, Ingo Molnar
       4             :  * Copyright (C) 2005-2006, Thomas Gleixner, Russell King
       5             :  *
       6             :  * This file contains the interrupt descriptor management code. Detailed
       7             :  * information is available in Documentation/core-api/genericirq.rst
       8             :  *
       9             :  */
      10             : #include <linux/irq.h>
      11             : #include <linux/slab.h>
      12             : #include <linux/export.h>
      13             : #include <linux/interrupt.h>
      14             : #include <linux/kernel_stat.h>
      15             : #include <linux/radix-tree.h>
      16             : #include <linux/bitmap.h>
      17             : #include <linux/irqdomain.h>
      18             : #include <linux/sysfs.h>
      19             : 
      20             : #include "internals.h"
      21             : 
      22             : /*
      23             :  * lockdep: we want to handle all irq_desc locks as a single lock-class:
      24             :  */
      25             : static struct lock_class_key irq_desc_lock_class;
      26             : 
      27             : #if defined(CONFIG_SMP)
      28           0 : static int __init irq_affinity_setup(char *str)
      29             : {
      30           0 :         alloc_bootmem_cpumask_var(&irq_default_affinity);
      31           0 :         cpulist_parse(str, irq_default_affinity);
      32             :         /*
      33             :          * Set at least the boot cpu. We don't want to end up with
      34             :          * bugreports caused by random comandline masks
      35             :          */
      36           0 :         cpumask_set_cpu(smp_processor_id(), irq_default_affinity);
      37           0 :         return 1;
      38             : }
      39             : __setup("irqaffinity=", irq_affinity_setup);
      40             : 
      41           1 : static void __init init_irq_default_affinity(void)
      42             : {
      43           1 :         if (!cpumask_available(irq_default_affinity))
      44           1 :                 zalloc_cpumask_var(&irq_default_affinity, GFP_NOWAIT);
      45           1 :         if (cpumask_empty(irq_default_affinity))
      46           1 :                 cpumask_setall(irq_default_affinity);
      47           1 : }
      48             : #else
      49             : static void __init init_irq_default_affinity(void)
      50             : {
      51             : }
      52             : #endif
      53             : 
      54             : #ifdef CONFIG_SMP
      55          16 : static int alloc_masks(struct irq_desc *desc, int node)
      56             : {
      57          16 :         if (!zalloc_cpumask_var_node(&desc->irq_common_data.affinity,
      58             :                                      GFP_KERNEL, node))
      59             :                 return -ENOMEM;
      60             : 
      61             : #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
      62          16 :         if (!zalloc_cpumask_var_node(&desc->irq_common_data.effective_affinity,
      63             :                                      GFP_KERNEL, node)) {
      64             :                 free_cpumask_var(desc->irq_common_data.affinity);
      65             :                 return -ENOMEM;
      66             :         }
      67             : #endif
      68             : 
      69             : #ifdef CONFIG_GENERIC_PENDING_IRQ
      70          16 :         if (!zalloc_cpumask_var_node(&desc->pending_mask, GFP_KERNEL, node)) {
      71             : #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
      72             :                 free_cpumask_var(desc->irq_common_data.effective_affinity);
      73             : #endif
      74             :                 free_cpumask_var(desc->irq_common_data.affinity);
      75             :                 return -ENOMEM;
      76             :         }
      77             : #endif
      78          16 :         return 0;
      79             : }
      80             : 
      81          16 : static void desc_smp_init(struct irq_desc *desc, int node,
      82             :                           const struct cpumask *affinity)
      83             : {
      84          16 :         if (!affinity)
      85          16 :                 affinity = irq_default_affinity;
      86          16 :         cpumask_copy(desc->irq_common_data.affinity, affinity);
      87             : 
      88             : #ifdef CONFIG_GENERIC_PENDING_IRQ
      89          16 :         cpumask_clear(desc->pending_mask);
      90             : #endif
      91             : #ifdef CONFIG_NUMA
      92          16 :         desc->irq_common_data.node = node;
      93             : #endif
      94          16 : }
      95             : 
      96             : #else
      97             : static inline int
      98             : alloc_masks(struct irq_desc *desc, int node) { return 0; }
      99             : static inline void
     100             : desc_smp_init(struct irq_desc *desc, int node, const struct cpumask *affinity) { }
     101             : #endif
     102             : 
     103          16 : static void desc_set_defaults(unsigned int irq, struct irq_desc *desc, int node,
     104             :                               const struct cpumask *affinity, struct module *owner)
     105             : {
     106          16 :         int cpu;
     107             : 
     108          16 :         desc->irq_common_data.handler_data = NULL;
     109          16 :         desc->irq_common_data.msi_desc = NULL;
     110             : 
     111          16 :         desc->irq_data.common = &desc->irq_common_data;
     112          16 :         desc->irq_data.irq = irq;
     113          16 :         desc->irq_data.chip = &no_irq_chip;
     114          16 :         desc->irq_data.chip_data = NULL;
     115          16 :         irq_settings_clr_and_set(desc, ~0, _IRQ_DEFAULT_INIT_FLAGS);
     116          16 :         irqd_set(&desc->irq_data, IRQD_IRQ_DISABLED);
     117          16 :         irqd_set(&desc->irq_data, IRQD_IRQ_MASKED);
     118          16 :         desc->handle_irq = handle_bad_irq;
     119          16 :         desc->depth = 1;
     120          16 :         desc->irq_count = 0;
     121          16 :         desc->irqs_unhandled = 0;
     122          16 :         desc->tot_count = 0;
     123          16 :         desc->name = NULL;
     124          16 :         desc->owner = owner;
     125          80 :         for_each_possible_cpu(cpu)
     126          64 :                 *per_cpu_ptr(desc->kstat_irqs, cpu) = 0;
     127          16 :         desc_smp_init(desc, node, affinity);
     128          16 : }
     129             : 
     130             : int nr_irqs = NR_IRQS;
     131             : EXPORT_SYMBOL_GPL(nr_irqs);
     132             : 
     133             : static DEFINE_MUTEX(sparse_irq_lock);
     134             : static DECLARE_BITMAP(allocated_irqs, IRQ_BITMAP_BITS);
     135             : 
     136             : #ifdef CONFIG_SPARSE_IRQ
     137             : 
     138             : static void irq_kobj_release(struct kobject *kobj);
     139             : 
     140             : #ifdef CONFIG_SYSFS
     141             : static struct kobject *irq_kobj_base;
     142             : 
     143             : #define IRQ_ATTR_RO(_name) \
     144             : static struct kobj_attribute _name##_attr = __ATTR_RO(_name)
     145             : 
     146           0 : static ssize_t per_cpu_count_show(struct kobject *kobj,
     147             :                                   struct kobj_attribute *attr, char *buf)
     148             : {
     149           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     150           0 :         ssize_t ret = 0;
     151           0 :         char *p = "";
     152           0 :         int cpu;
     153             : 
     154           0 :         for_each_possible_cpu(cpu) {
     155           0 :                 unsigned int c = irq_desc_kstat_cpu(desc, cpu);
     156             : 
     157           0 :                 ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%u", p, c);
     158           0 :                 p = ",";
     159             :         }
     160             : 
     161           0 :         ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
     162           0 :         return ret;
     163             : }
     164             : IRQ_ATTR_RO(per_cpu_count);
     165             : 
     166           0 : static ssize_t chip_name_show(struct kobject *kobj,
     167             :                               struct kobj_attribute *attr, char *buf)
     168             : {
     169           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     170           0 :         ssize_t ret = 0;
     171             : 
     172           0 :         raw_spin_lock_irq(&desc->lock);
     173           0 :         if (desc->irq_data.chip && desc->irq_data.chip->name) {
     174           0 :                 ret = scnprintf(buf, PAGE_SIZE, "%s\n",
     175             :                                 desc->irq_data.chip->name);
     176             :         }
     177           0 :         raw_spin_unlock_irq(&desc->lock);
     178             : 
     179           0 :         return ret;
     180             : }
     181             : IRQ_ATTR_RO(chip_name);
     182             : 
     183           0 : static ssize_t hwirq_show(struct kobject *kobj,
     184             :                           struct kobj_attribute *attr, char *buf)
     185             : {
     186           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     187           0 :         ssize_t ret = 0;
     188             : 
     189           0 :         raw_spin_lock_irq(&desc->lock);
     190           0 :         if (desc->irq_data.domain)
     191           0 :                 ret = sprintf(buf, "%d\n", (int)desc->irq_data.hwirq);
     192           0 :         raw_spin_unlock_irq(&desc->lock);
     193             : 
     194           0 :         return ret;
     195             : }
     196             : IRQ_ATTR_RO(hwirq);
     197             : 
     198           0 : static ssize_t type_show(struct kobject *kobj,
     199             :                          struct kobj_attribute *attr, char *buf)
     200             : {
     201           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     202           0 :         ssize_t ret = 0;
     203             : 
     204           0 :         raw_spin_lock_irq(&desc->lock);
     205           0 :         ret = sprintf(buf, "%s\n",
     206           0 :                       irqd_is_level_type(&desc->irq_data) ? "level" : "edge");
     207           0 :         raw_spin_unlock_irq(&desc->lock);
     208             : 
     209           0 :         return ret;
     210             : 
     211             : }
     212             : IRQ_ATTR_RO(type);
     213             : 
     214           0 : static ssize_t wakeup_show(struct kobject *kobj,
     215             :                            struct kobj_attribute *attr, char *buf)
     216             : {
     217           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     218           0 :         ssize_t ret = 0;
     219             : 
     220           0 :         raw_spin_lock_irq(&desc->lock);
     221           0 :         ret = sprintf(buf, "%s\n",
     222           0 :                       irqd_is_wakeup_set(&desc->irq_data) ? "enabled" : "disabled");
     223           0 :         raw_spin_unlock_irq(&desc->lock);
     224             : 
     225           0 :         return ret;
     226             : 
     227             : }
     228             : IRQ_ATTR_RO(wakeup);
     229             : 
     230           0 : static ssize_t name_show(struct kobject *kobj,
     231             :                          struct kobj_attribute *attr, char *buf)
     232             : {
     233           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     234           0 :         ssize_t ret = 0;
     235             : 
     236           0 :         raw_spin_lock_irq(&desc->lock);
     237           0 :         if (desc->name)
     238           0 :                 ret = scnprintf(buf, PAGE_SIZE, "%s\n", desc->name);
     239           0 :         raw_spin_unlock_irq(&desc->lock);
     240             : 
     241           0 :         return ret;
     242             : }
     243             : IRQ_ATTR_RO(name);
     244             : 
     245           0 : static ssize_t actions_show(struct kobject *kobj,
     246             :                             struct kobj_attribute *attr, char *buf)
     247             : {
     248           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     249           0 :         struct irqaction *action;
     250           0 :         ssize_t ret = 0;
     251           0 :         char *p = "";
     252             : 
     253           0 :         raw_spin_lock_irq(&desc->lock);
     254           0 :         for (action = desc->action; action != NULL; action = action->next) {
     255           0 :                 ret += scnprintf(buf + ret, PAGE_SIZE - ret, "%s%s",
     256             :                                  p, action->name);
     257           0 :                 p = ",";
     258             :         }
     259           0 :         raw_spin_unlock_irq(&desc->lock);
     260             : 
     261           0 :         if (ret)
     262           0 :                 ret += scnprintf(buf + ret, PAGE_SIZE - ret, "\n");
     263             : 
     264           0 :         return ret;
     265             : }
     266             : IRQ_ATTR_RO(actions);
     267             : 
     268             : static struct attribute *irq_attrs[] = {
     269             :         &per_cpu_count_attr.attr,
     270             :         &chip_name_attr.attr,
     271             :         &hwirq_attr.attr,
     272             :         &type_attr.attr,
     273             :         &wakeup_attr.attr,
     274             :         &name_attr.attr,
     275             :         &actions_attr.attr,
     276             :         NULL
     277             : };
     278             : ATTRIBUTE_GROUPS(irq);
     279             : 
     280             : static struct kobj_type irq_kobj_type = {
     281             :         .release        = irq_kobj_release,
     282             :         .sysfs_ops      = &kobj_sysfs_ops,
     283             :         .default_groups = irq_groups,
     284             : };
     285             : 
     286          16 : static void irq_sysfs_add(int irq, struct irq_desc *desc)
     287             : {
     288          16 :         if (irq_kobj_base) {
     289             :                 /*
     290             :                  * Continue even in case of failure as this is nothing
     291             :                  * crucial.
     292             :                  */
     293          16 :                 if (kobject_add(&desc->kobj, irq_kobj_base, "%d", irq))
     294           0 :                         pr_warn("Failed to add kobject for irq %d\n", irq);
     295             :         }
     296          16 : }
     297             : 
     298           0 : static void irq_sysfs_del(struct irq_desc *desc)
     299             : {
     300             :         /*
     301             :          * If irq_sysfs_init() has not yet been invoked (early boot), then
     302             :          * irq_kobj_base is NULL and the descriptor was never added.
     303             :          * kobject_del() complains about a object with no parent, so make
     304             :          * it conditional.
     305             :          */
     306           0 :         if (irq_kobj_base)
     307           0 :                 kobject_del(&desc->kobj);
     308             : }
     309             : 
     310           1 : static int __init irq_sysfs_init(void)
     311             : {
     312           1 :         struct irq_desc *desc;
     313           1 :         int irq;
     314             : 
     315             :         /* Prevent concurrent irq alloc/free */
     316           1 :         irq_lock_sparse();
     317             : 
     318           1 :         irq_kobj_base = kobject_create_and_add("irq", kernel_kobj);
     319           1 :         if (!irq_kobj_base) {
     320           0 :                 irq_unlock_sparse();
     321           0 :                 return -ENOMEM;
     322             :         }
     323             : 
     324             :         /* Add the already allocated interrupts */
     325          73 :         for_each_irq_desc(irq, desc)
     326          16 :                 irq_sysfs_add(irq, desc);
     327           1 :         irq_unlock_sparse();
     328             : 
     329           1 :         return 0;
     330             : }
     331             : postcore_initcall(irq_sysfs_init);
     332             : 
     333             : #else /* !CONFIG_SYSFS */
     334             : 
     335             : static struct kobj_type irq_kobj_type = {
     336             :         .release        = irq_kobj_release,
     337             : };
     338             : 
     339             : static void irq_sysfs_add(int irq, struct irq_desc *desc) {}
     340             : static void irq_sysfs_del(struct irq_desc *desc) {}
     341             : 
     342             : #endif /* CONFIG_SYSFS */
     343             : 
     344             : static RADIX_TREE(irq_desc_tree, GFP_KERNEL);
     345             : 
     346          16 : static void irq_insert_desc(unsigned int irq, struct irq_desc *desc)
     347             : {
     348          16 :         radix_tree_insert(&irq_desc_tree, irq, desc);
     349             : }
     350             : 
     351         438 : struct irq_desc *irq_to_desc(unsigned int irq)
     352             : {
     353         361 :         return radix_tree_lookup(&irq_desc_tree, irq);
     354             : }
     355             : #ifdef CONFIG_KVM_BOOK3S_64_HV_MODULE
     356             : EXPORT_SYMBOL_GPL(irq_to_desc);
     357             : #endif
     358             : 
     359           0 : static void delete_irq_desc(unsigned int irq)
     360             : {
     361           0 :         radix_tree_delete(&irq_desc_tree, irq);
     362             : }
     363             : 
     364             : #ifdef CONFIG_SMP
     365           0 : static void free_masks(struct irq_desc *desc)
     366             : {
     367             : #ifdef CONFIG_GENERIC_PENDING_IRQ
     368           0 :         free_cpumask_var(desc->pending_mask);
     369             : #endif
     370           0 :         free_cpumask_var(desc->irq_common_data.affinity);
     371             : #ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
     372           0 :         free_cpumask_var(desc->irq_common_data.effective_affinity);
     373             : #endif
     374             : }
     375             : #else
     376             : static inline void free_masks(struct irq_desc *desc) { }
     377             : #endif
     378             : 
     379           7 : void irq_lock_sparse(void)
     380             : {
     381           7 :         mutex_lock(&sparse_irq_lock);
     382           6 : }
     383             : 
     384           7 : void irq_unlock_sparse(void)
     385             : {
     386           7 :         mutex_unlock(&sparse_irq_lock);
     387           6 : }
     388             : 
     389          16 : static struct irq_desc *alloc_desc(int irq, int node, unsigned int flags,
     390             :                                    const struct cpumask *affinity,
     391             :                                    struct module *owner)
     392             : {
     393          16 :         struct irq_desc *desc;
     394             : 
     395          16 :         desc = kzalloc_node(sizeof(*desc), GFP_KERNEL, node);
     396          16 :         if (!desc)
     397             :                 return NULL;
     398             :         /* allocate based on nr_cpu_ids */
     399          16 :         desc->kstat_irqs = alloc_percpu(unsigned int);
     400          16 :         if (!desc->kstat_irqs)
     401           0 :                 goto err_desc;
     402             : 
     403          16 :         if (alloc_masks(desc, node))
     404           0 :                 goto err_kstat;
     405             : 
     406          16 :         raw_spin_lock_init(&desc->lock);
     407          16 :         lockdep_set_class(&desc->lock, &irq_desc_lock_class);
     408          16 :         mutex_init(&desc->request_mutex);
     409          16 :         init_rcu_head(&desc->rcu);
     410             : 
     411          16 :         desc_set_defaults(irq, desc, node, affinity, owner);
     412          16 :         irqd_set(&desc->irq_data, flags);
     413          16 :         kobject_init(&desc->kobj, &irq_kobj_type);
     414             : 
     415          16 :         return desc;
     416             : 
     417           0 : err_kstat:
     418           0 :         free_percpu(desc->kstat_irqs);
     419           0 : err_desc:
     420           0 :         kfree(desc);
     421           0 :         return NULL;
     422             : }
     423             : 
     424           0 : static void irq_kobj_release(struct kobject *kobj)
     425             : {
     426           0 :         struct irq_desc *desc = container_of(kobj, struct irq_desc, kobj);
     427             : 
     428           0 :         free_masks(desc);
     429           0 :         free_percpu(desc->kstat_irqs);
     430           0 :         kfree(desc);
     431           0 : }
     432             : 
     433           0 : static void delayed_free_desc(struct rcu_head *rhp)
     434             : {
     435           0 :         struct irq_desc *desc = container_of(rhp, struct irq_desc, rcu);
     436             : 
     437           0 :         kobject_put(&desc->kobj);
     438           0 : }
     439             : 
     440           0 : static void free_desc(unsigned int irq)
     441             : {
     442           0 :         struct irq_desc *desc = irq_to_desc(irq);
     443             : 
     444           0 :         irq_remove_debugfs_entry(desc);
     445           0 :         unregister_irq_proc(irq, desc);
     446             : 
     447             :         /*
     448             :          * sparse_irq_lock protects also show_interrupts() and
     449             :          * kstat_irq_usr(). Once we deleted the descriptor from the
     450             :          * sparse tree we can free it. Access in proc will fail to
     451             :          * lookup the descriptor.
     452             :          *
     453             :          * The sysfs entry must be serialized against a concurrent
     454             :          * irq_sysfs_init() as well.
     455             :          */
     456           0 :         irq_sysfs_del(desc);
     457           0 :         delete_irq_desc(irq);
     458             : 
     459             :         /*
     460             :          * We free the descriptor, masks and stat fields via RCU. That
     461             :          * allows demultiplex interrupts to do rcu based management of
     462             :          * the child interrupts.
     463             :          * This also allows us to use rcu in kstat_irqs_usr().
     464             :          */
     465           0 :         call_rcu(&desc->rcu, delayed_free_desc);
     466           0 : }
     467             : 
     468           0 : static int alloc_descs(unsigned int start, unsigned int cnt, int node,
     469             :                        const struct irq_affinity_desc *affinity,
     470             :                        struct module *owner)
     471             : {
     472           0 :         struct irq_desc *desc;
     473           0 :         int i;
     474             : 
     475             :         /* Validate affinity mask(s) */
     476           0 :         if (affinity) {
     477           0 :                 for (i = 0; i < cnt; i++) {
     478           0 :                         if (cpumask_empty(&affinity[i].mask))
     479             :                                 return -EINVAL;
     480             :                 }
     481             :         }
     482             : 
     483           0 :         for (i = 0; i < cnt; i++) {
     484           0 :                 const struct cpumask *mask = NULL;
     485           0 :                 unsigned int flags = 0;
     486             : 
     487           0 :                 if (affinity) {
     488           0 :                         if (affinity->is_managed) {
     489           0 :                                 flags = IRQD_AFFINITY_MANAGED |
     490             :                                         IRQD_MANAGED_SHUTDOWN;
     491             :                         }
     492           0 :                         mask = &affinity->mask;
     493           0 :                         node = cpu_to_node(cpumask_first(mask));
     494           0 :                         affinity++;
     495             :                 }
     496             : 
     497           0 :                 desc = alloc_desc(start + i, node, flags, mask, owner);
     498           0 :                 if (!desc)
     499           0 :                         goto err;
     500           0 :                 irq_insert_desc(start + i, desc);
     501           0 :                 irq_sysfs_add(start + i, desc);
     502           0 :                 irq_add_debugfs_entry(start + i, desc);
     503             :         }
     504           0 :         bitmap_set(allocated_irqs, start, cnt);
     505           0 :         return start;
     506             : 
     507           0 : err:
     508           0 :         for (i--; i >= 0; i--)
     509           0 :                 free_desc(start + i);
     510             :         return -ENOMEM;
     511             : }
     512             : 
     513           0 : static int irq_expand_nr_irqs(unsigned int nr)
     514             : {
     515           0 :         if (nr > IRQ_BITMAP_BITS)
     516             :                 return -ENOMEM;
     517           0 :         nr_irqs = nr;
     518           0 :         return 0;
     519             : }
     520             : 
     521           1 : int __init early_irq_init(void)
     522             : {
     523           1 :         int i, initcnt, node = first_online_node;
     524           1 :         struct irq_desc *desc;
     525             : 
     526           1 :         init_irq_default_affinity();
     527             : 
     528             :         /* Let arch update nr_irqs and return the nr of preallocated irqs */
     529           1 :         initcnt = arch_probe_nr_irqs();
     530           1 :         printk(KERN_INFO "NR_IRQS: %d, nr_irqs: %d, preallocated irqs: %d\n",
     531             :                NR_IRQS, nr_irqs, initcnt);
     532             : 
     533           1 :         if (WARN_ON(nr_irqs > IRQ_BITMAP_BITS))
     534           0 :                 nr_irqs = IRQ_BITMAP_BITS;
     535             : 
     536           1 :         if (WARN_ON(initcnt > IRQ_BITMAP_BITS))
     537           0 :                 initcnt = IRQ_BITMAP_BITS;
     538             : 
     539           1 :         if (initcnt > nr_irqs)
     540           0 :                 nr_irqs = initcnt;
     541             : 
     542          17 :         for (i = 0; i < initcnt; i++) {
     543          16 :                 desc = alloc_desc(i, node, 0, NULL, NULL);
     544          16 :                 set_bit(i, allocated_irqs);
     545          16 :                 irq_insert_desc(i, desc);
     546             :         }
     547           1 :         return arch_early_irq_init();
     548             : }
     549             : 
     550             : #else /* !CONFIG_SPARSE_IRQ */
     551             : 
     552             : struct irq_desc irq_desc[NR_IRQS] __cacheline_aligned_in_smp = {
     553             :         [0 ... NR_IRQS-1] = {
     554             :                 .handle_irq     = handle_bad_irq,
     555             :                 .depth          = 1,
     556             :                 .lock           = __RAW_SPIN_LOCK_UNLOCKED(irq_desc->lock),
     557             :         }
     558             : };
     559             : 
     560             : int __init early_irq_init(void)
     561             : {
     562             :         int count, i, node = first_online_node;
     563             :         struct irq_desc *desc;
     564             : 
     565             :         init_irq_default_affinity();
     566             : 
     567             :         printk(KERN_INFO "NR_IRQS: %d\n", NR_IRQS);
     568             : 
     569             :         desc = irq_desc;
     570             :         count = ARRAY_SIZE(irq_desc);
     571             : 
     572             :         for (i = 0; i < count; i++) {
     573             :                 desc[i].kstat_irqs = alloc_percpu(unsigned int);
     574             :                 alloc_masks(&desc[i], node);
     575             :                 raw_spin_lock_init(&desc[i].lock);
     576             :                 lockdep_set_class(&desc[i].lock, &irq_desc_lock_class);
     577             :                 mutex_init(&desc[i].request_mutex);
     578             :                 desc_set_defaults(i, &desc[i], node, NULL, NULL);
     579             :         }
     580             :         return arch_early_irq_init();
     581             : }
     582             : 
     583             : struct irq_desc *irq_to_desc(unsigned int irq)
     584             : {
     585             :         return (irq < NR_IRQS) ? irq_desc + irq : NULL;
     586             : }
     587             : EXPORT_SYMBOL(irq_to_desc);
     588             : 
     589             : static void free_desc(unsigned int irq)
     590             : {
     591             :         struct irq_desc *desc = irq_to_desc(irq);
     592             :         unsigned long flags;
     593             : 
     594             :         raw_spin_lock_irqsave(&desc->lock, flags);
     595             :         desc_set_defaults(irq, desc, irq_desc_get_node(desc), NULL, NULL);
     596             :         raw_spin_unlock_irqrestore(&desc->lock, flags);
     597             : }
     598             : 
     599             : static inline int alloc_descs(unsigned int start, unsigned int cnt, int node,
     600             :                               const struct irq_affinity_desc *affinity,
     601             :                               struct module *owner)
     602             : {
     603             :         u32 i;
     604             : 
     605             :         for (i = 0; i < cnt; i++) {
     606             :                 struct irq_desc *desc = irq_to_desc(start + i);
     607             : 
     608             :                 desc->owner = owner;
     609             :         }
     610             :         bitmap_set(allocated_irqs, start, cnt);
     611             :         return start;
     612             : }
     613             : 
     614             : static int irq_expand_nr_irqs(unsigned int nr)
     615             : {
     616             :         return -ENOMEM;
     617             : }
     618             : 
     619             : void irq_mark_irq(unsigned int irq)
     620             : {
     621             :         mutex_lock(&sparse_irq_lock);
     622             :         bitmap_set(allocated_irqs, irq, 1);
     623             :         mutex_unlock(&sparse_irq_lock);
     624             : }
     625             : 
     626             : #ifdef CONFIG_GENERIC_IRQ_LEGACY
     627             : void irq_init_desc(unsigned int irq)
     628             : {
     629             :         free_desc(irq);
     630             : }
     631             : #endif
     632             : 
     633             : #endif /* !CONFIG_SPARSE_IRQ */
     634             : 
     635             : /**
     636             :  * generic_handle_irq - Invoke the handler for a particular irq
     637             :  * @irq:        The irq number to handle
     638             :  *
     639             :  */
     640           0 : int generic_handle_irq(unsigned int irq)
     641             : {
     642           0 :         struct irq_desc *desc = irq_to_desc(irq);
     643           0 :         struct irq_data *data;
     644             : 
     645           0 :         if (!desc)
     646             :                 return -EINVAL;
     647             : 
     648           0 :         data = irq_desc_get_irq_data(desc);
     649           0 :         if (WARN_ON_ONCE(!in_irq() && handle_enforce_irqctx(data)))
     650             :                 return -EPERM;
     651             : 
     652           0 :         generic_handle_irq_desc(desc);
     653           0 :         return 0;
     654             : }
     655             : EXPORT_SYMBOL_GPL(generic_handle_irq);
     656             : 
     657             : #ifdef CONFIG_HANDLE_DOMAIN_IRQ
     658             : /**
     659             :  * __handle_domain_irq - Invoke the handler for a HW irq belonging to a domain
     660             :  * @domain:     The domain where to perform the lookup
     661             :  * @hwirq:      The HW irq number to convert to a logical one
     662             :  * @lookup:     Whether to perform the domain lookup or not
     663             :  * @regs:       Register file coming from the low-level handling code
     664             :  *
     665             :  * Returns:     0 on success, or -EINVAL if conversion has failed
     666             :  */
     667             : int __handle_domain_irq(struct irq_domain *domain, unsigned int hwirq,
     668             :                         bool lookup, struct pt_regs *regs)
     669             : {
     670             :         struct pt_regs *old_regs = set_irq_regs(regs);
     671             :         unsigned int irq = hwirq;
     672             :         int ret = 0;
     673             : 
     674             :         irq_enter();
     675             : 
     676             : #ifdef CONFIG_IRQ_DOMAIN
     677             :         if (lookup)
     678             :                 irq = irq_find_mapping(domain, hwirq);
     679             : #endif
     680             : 
     681             :         /*
     682             :          * Some hardware gives randomly wrong interrupts.  Rather
     683             :          * than crashing, do something sensible.
     684             :          */
     685             :         if (unlikely(!irq || irq >= nr_irqs)) {
     686             :                 ack_bad_irq(irq);
     687             :                 ret = -EINVAL;
     688             :         } else {
     689             :                 generic_handle_irq(irq);
     690             :         }
     691             : 
     692             :         irq_exit();
     693             :         set_irq_regs(old_regs);
     694             :         return ret;
     695             : }
     696             : 
     697             : #ifdef CONFIG_IRQ_DOMAIN
     698             : /**
     699             :  * handle_domain_nmi - Invoke the handler for a HW irq belonging to a domain
     700             :  * @domain:     The domain where to perform the lookup
     701             :  * @hwirq:      The HW irq number to convert to a logical one
     702             :  * @regs:       Register file coming from the low-level handling code
     703             :  *
     704             :  *              This function must be called from an NMI context.
     705             :  *
     706             :  * Returns:     0 on success, or -EINVAL if conversion has failed
     707             :  */
     708             : int handle_domain_nmi(struct irq_domain *domain, unsigned int hwirq,
     709             :                       struct pt_regs *regs)
     710             : {
     711             :         struct pt_regs *old_regs = set_irq_regs(regs);
     712             :         unsigned int irq;
     713             :         int ret = 0;
     714             : 
     715             :         /*
     716             :          * NMI context needs to be setup earlier in order to deal with tracing.
     717             :          */
     718             :         WARN_ON(!in_nmi());
     719             : 
     720             :         irq = irq_find_mapping(domain, hwirq);
     721             : 
     722             :         /*
     723             :          * ack_bad_irq is not NMI-safe, just report
     724             :          * an invalid interrupt.
     725             :          */
     726             :         if (likely(irq))
     727             :                 generic_handle_irq(irq);
     728             :         else
     729             :                 ret = -EINVAL;
     730             : 
     731             :         set_irq_regs(old_regs);
     732             :         return ret;
     733             : }
     734             : #endif
     735             : #endif
     736             : 
     737             : /* Dynamic interrupt handling */
     738             : 
     739             : /**
     740             :  * irq_free_descs - free irq descriptors
     741             :  * @from:       Start of descriptor range
     742             :  * @cnt:        Number of consecutive irqs to free
     743             :  */
     744           0 : void irq_free_descs(unsigned int from, unsigned int cnt)
     745             : {
     746           0 :         int i;
     747             : 
     748           0 :         if (from >= nr_irqs || (from + cnt) > nr_irqs)
     749             :                 return;
     750             : 
     751           0 :         mutex_lock(&sparse_irq_lock);
     752           0 :         for (i = 0; i < cnt; i++)
     753           0 :                 free_desc(from + i);
     754             : 
     755           0 :         bitmap_clear(allocated_irqs, from, cnt);
     756           0 :         mutex_unlock(&sparse_irq_lock);
     757             : }
     758             : EXPORT_SYMBOL_GPL(irq_free_descs);
     759             : 
     760             : /**
     761             :  * __irq_alloc_descs - allocate and initialize a range of irq descriptors
     762             :  * @irq:        Allocate for specific irq number if irq >= 0
     763             :  * @from:       Start the search from this irq number
     764             :  * @cnt:        Number of consecutive irqs to allocate.
     765             :  * @node:       Preferred node on which the irq descriptor should be allocated
     766             :  * @owner:      Owning module (can be NULL)
     767             :  * @affinity:   Optional pointer to an affinity mask array of size @cnt which
     768             :  *              hints where the irq descriptors should be allocated and which
     769             :  *              default affinities to use
     770             :  *
     771             :  * Returns the first irq number or error code
     772             :  */
     773             : int __ref
     774           0 : __irq_alloc_descs(int irq, unsigned int from, unsigned int cnt, int node,
     775             :                   struct module *owner, const struct irq_affinity_desc *affinity)
     776             : {
     777           0 :         int start, ret;
     778             : 
     779           0 :         if (!cnt)
     780             :                 return -EINVAL;
     781             : 
     782           0 :         if (irq >= 0) {
     783           0 :                 if (from > irq)
     784             :                         return -EINVAL;
     785             :                 from = irq;
     786             :         } else {
     787             :                 /*
     788             :                  * For interrupts which are freely allocated the
     789             :                  * architecture can force a lower bound to the @from
     790             :                  * argument. x86 uses this to exclude the GSI space.
     791             :                  */
     792           0 :                 from = arch_dynirq_lower_bound(from);
     793             :         }
     794             : 
     795           0 :         mutex_lock(&sparse_irq_lock);
     796             : 
     797           0 :         start = bitmap_find_next_zero_area(allocated_irqs, IRQ_BITMAP_BITS,
     798             :                                            from, cnt, 0);
     799           0 :         ret = -EEXIST;
     800           0 :         if (irq >=0 && start != irq)
     801           0 :                 goto unlock;
     802             : 
     803           0 :         if (start + cnt > nr_irqs) {
     804           0 :                 ret = irq_expand_nr_irqs(start + cnt);
     805           0 :                 if (ret)
     806           0 :                         goto unlock;
     807             :         }
     808           0 :         ret = alloc_descs(start, cnt, node, affinity, owner);
     809           0 : unlock:
     810           0 :         mutex_unlock(&sparse_irq_lock);
     811           0 :         return ret;
     812             : }
     813             : EXPORT_SYMBOL_GPL(__irq_alloc_descs);
     814             : 
     815             : /**
     816             :  * irq_get_next_irq - get next allocated irq number
     817             :  * @offset:     where to start the search
     818             :  *
     819             :  * Returns next irq number after offset or nr_irqs if none is found.
     820             :  */
     821          68 : unsigned int irq_get_next_irq(unsigned int offset)
     822             : {
     823          68 :         return find_next_bit(allocated_irqs, nr_irqs, offset);
     824             : }
     825             : 
     826             : struct irq_desc *
     827          77 : __irq_get_desc_lock(unsigned int irq, unsigned long *flags, bool bus,
     828             :                     unsigned int check)
     829             : {
     830          77 :         struct irq_desc *desc = irq_to_desc(irq);
     831             : 
     832          77 :         if (desc) {
     833          77 :                 if (check & _IRQ_DESC_CHECK) {
     834           0 :                         if ((check & _IRQ_DESC_PERCPU) &&
     835           0 :                             !irq_settings_is_per_cpu_devid(desc))
     836             :                                 return NULL;
     837             : 
     838           0 :                         if (!(check & _IRQ_DESC_PERCPU) &&
     839           0 :                             irq_settings_is_per_cpu_devid(desc))
     840             :                                 return NULL;
     841             :                 }
     842             : 
     843          77 :                 if (bus)
     844          31 :                         chip_bus_lock(desc);
     845          77 :                 raw_spin_lock_irqsave(&desc->lock, *flags);
     846             :         }
     847             :         return desc;
     848             : }
     849             : 
     850          77 : void __irq_put_desc_unlock(struct irq_desc *desc, unsigned long flags, bool bus)
     851             :         __releases(&desc->lock)
     852             : {
     853          77 :         raw_spin_unlock_irqrestore(&desc->lock, flags);
     854          77 :         if (bus)
     855          31 :                 chip_bus_sync_unlock(desc);
     856          77 : }
     857             : 
     858           0 : int irq_set_percpu_devid_partition(unsigned int irq,
     859             :                                    const struct cpumask *affinity)
     860             : {
     861           0 :         struct irq_desc *desc = irq_to_desc(irq);
     862             : 
     863           0 :         if (!desc)
     864             :                 return -EINVAL;
     865             : 
     866           0 :         if (desc->percpu_enabled)
     867             :                 return -EINVAL;
     868             : 
     869           0 :         desc->percpu_enabled = kzalloc(sizeof(*desc->percpu_enabled), GFP_KERNEL);
     870             : 
     871           0 :         if (!desc->percpu_enabled)
     872             :                 return -ENOMEM;
     873             : 
     874           0 :         if (affinity)
     875           0 :                 desc->percpu_affinity = affinity;
     876             :         else
     877           0 :                 desc->percpu_affinity = cpu_possible_mask;
     878             : 
     879           0 :         irq_set_percpu_devid_flags(irq);
     880           0 :         return 0;
     881             : }
     882             : 
     883           0 : int irq_set_percpu_devid(unsigned int irq)
     884             : {
     885           0 :         return irq_set_percpu_devid_partition(irq, NULL);
     886             : }
     887             : 
     888           0 : int irq_get_percpu_devid_partition(unsigned int irq, struct cpumask *affinity)
     889             : {
     890           0 :         struct irq_desc *desc = irq_to_desc(irq);
     891             : 
     892           0 :         if (!desc || !desc->percpu_enabled)
     893             :                 return -EINVAL;
     894             : 
     895           0 :         if (affinity)
     896           0 :                 cpumask_copy(affinity, desc->percpu_affinity);
     897             : 
     898             :         return 0;
     899             : }
     900             : EXPORT_SYMBOL_GPL(irq_get_percpu_devid_partition);
     901             : 
     902           0 : void kstat_incr_irq_this_cpu(unsigned int irq)
     903             : {
     904           0 :         kstat_incr_irqs_this_cpu(irq_to_desc(irq));
     905           0 : }
     906             : 
     907             : /**
     908             :  * kstat_irqs_cpu - Get the statistics for an interrupt on a cpu
     909             :  * @irq:        The interrupt number
     910             :  * @cpu:        The cpu number
     911             :  *
     912             :  * Returns the sum of interrupt counts on @cpu since boot for
     913             :  * @irq. The caller must ensure that the interrupt is not removed
     914             :  * concurrently.
     915             :  */
     916           0 : unsigned int kstat_irqs_cpu(unsigned int irq, int cpu)
     917             : {
     918           0 :         struct irq_desc *desc = irq_to_desc(irq);
     919             : 
     920           0 :         return desc && desc->kstat_irqs ?
     921           0 :                         *per_cpu_ptr(desc->kstat_irqs, cpu) : 0;
     922             : }
     923             : 
     924           0 : static bool irq_is_nmi(struct irq_desc *desc)
     925             : {
     926           0 :         return desc->istate & IRQS_NMI;
     927             : }
     928             : 
     929           0 : static unsigned int kstat_irqs(unsigned int irq)
     930             : {
     931           0 :         struct irq_desc *desc = irq_to_desc(irq);
     932           0 :         unsigned int sum = 0;
     933           0 :         int cpu;
     934             : 
     935           0 :         if (!desc || !desc->kstat_irqs)
     936             :                 return 0;
     937           0 :         if (!irq_settings_is_per_cpu_devid(desc) &&
     938           0 :             !irq_settings_is_per_cpu(desc) &&
     939           0 :             !irq_is_nmi(desc))
     940           0 :                 return data_race(desc->tot_count);
     941             : 
     942           0 :         for_each_possible_cpu(cpu)
     943           0 :                 sum += data_race(*per_cpu_ptr(desc->kstat_irqs, cpu));
     944             :         return sum;
     945             : }
     946             : 
     947             : /**
     948             :  * kstat_irqs_usr - Get the statistics for an interrupt from thread context
     949             :  * @irq:        The interrupt number
     950             :  *
     951             :  * Returns the sum of interrupt counts on all cpus since boot for @irq.
     952             :  *
     953             :  * It uses rcu to protect the access since a concurrent removal of an
     954             :  * interrupt descriptor is observing an rcu grace period before
     955             :  * delayed_free_desc()/irq_kobj_release().
     956             :  */
     957           0 : unsigned int kstat_irqs_usr(unsigned int irq)
     958             : {
     959           0 :         unsigned int sum;
     960             : 
     961           0 :         rcu_read_lock();
     962           0 :         sum = kstat_irqs(irq);
     963           0 :         rcu_read_unlock();
     964           0 :         return sum;
     965             : }
     966             : 
     967             : #ifdef CONFIG_LOCKDEP
     968           0 : void __irq_set_lockdep_class(unsigned int irq, struct lock_class_key *lock_class,
     969             :                              struct lock_class_key *request_class)
     970             : {
     971           0 :         struct irq_desc *desc = irq_to_desc(irq);
     972             : 
     973           0 :         if (desc) {
     974           0 :                 lockdep_set_class(&desc->lock, lock_class);
     975           0 :                 lockdep_set_class(&desc->request_mutex, request_class);
     976             :         }
     977           0 : }
     978             : EXPORT_SYMBOL_GPL(__irq_set_lockdep_class);
     979             : #endif

Generated by: LCOV version 1.14