|
@@ -481,7 +481,7 @@ unsigned int irq_create_mapping(struct irq_domain *domain,
|
|
|
}
|
|
|
|
|
|
/* Allocate a virtual interrupt number */
|
|
|
- virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node));
|
|
|
+ virq = irq_domain_alloc_descs(-1, 1, hwirq, of_node_to_nid(of_node), NULL);
|
|
|
if (virq <= 0) {
|
|
|
pr_debug("-> virq allocation failed\n");
|
|
|
return 0;
|
|
@@ -835,19 +835,23 @@ const struct irq_domain_ops irq_domain_simple_ops = {
|
|
|
EXPORT_SYMBOL_GPL(irq_domain_simple_ops);
|
|
|
|
|
|
int irq_domain_alloc_descs(int virq, unsigned int cnt, irq_hw_number_t hwirq,
|
|
|
- int node)
|
|
|
+ int node, const struct cpumask *affinity)
|
|
|
{
|
|
|
unsigned int hint;
|
|
|
|
|
|
if (virq >= 0) {
|
|
|
- virq = irq_alloc_descs(virq, virq, cnt, node);
|
|
|
+ virq = __irq_alloc_descs(virq, virq, cnt, node, THIS_MODULE,
|
|
|
+ affinity);
|
|
|
} else {
|
|
|
hint = hwirq % nr_irqs;
|
|
|
if (hint == 0)
|
|
|
hint++;
|
|
|
- virq = irq_alloc_descs_from(hint, cnt, node);
|
|
|
- if (virq <= 0 && hint > 1)
|
|
|
- virq = irq_alloc_descs_from(1, cnt, node);
|
|
|
+ virq = __irq_alloc_descs(-1, hint, cnt, node, THIS_MODULE,
|
|
|
+ affinity);
|
|
|
+ if (virq <= 0 && hint > 1) {
|
|
|
+ virq = __irq_alloc_descs(-1, 1, cnt, node, THIS_MODULE,
|
|
|
+ affinity);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return virq;
|
|
@@ -1160,6 +1164,7 @@ int irq_domain_alloc_irqs_recursive(struct irq_domain *domain,
|
|
|
* @node: NUMA node id for memory allocation
|
|
|
* @arg: domain specific argument
|
|
|
* @realloc: IRQ descriptors have already been allocated if true
|
|
|
+ * @affinity: Optional irq affinity mask for multiqueue devices
|
|
|
*
|
|
|
* Allocate IRQ numbers and initialized all data structures to support
|
|
|
* hierarchy IRQ domains.
|
|
@@ -1175,7 +1180,7 @@ int irq_domain_alloc_irqs_recursive(struct irq_domain *domain,
|
|
|
*/
|
|
|
int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
|
|
|
unsigned int nr_irqs, int node, void *arg,
|
|
|
- bool realloc)
|
|
|
+ bool realloc, const struct cpumask *affinity)
|
|
|
{
|
|
|
int i, ret, virq;
|
|
|
|
|
@@ -1193,7 +1198,8 @@ int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
|
|
|
if (realloc && irq_base >= 0) {
|
|
|
virq = irq_base;
|
|
|
} else {
|
|
|
- virq = irq_domain_alloc_descs(irq_base, nr_irqs, 0, node);
|
|
|
+ virq = irq_domain_alloc_descs(irq_base, nr_irqs, 0, node,
|
|
|
+ affinity);
|
|
|
if (virq < 0) {
|
|
|
pr_debug("cannot allocate IRQ(base %d, count %d)\n",
|
|
|
irq_base, nr_irqs);
|