LCOV - code coverage report
Current view: top level - kernel/irq - irqdesc.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 59 159 37.1 %
Date: 2023-08-24 13:40:31 Functions: 7 26 26.9 %

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

Generated by: LCOV version 1.14