Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 145580
b: refs/heads/master
c: d047f53
h: refs/heads/master
v: v3
  • Loading branch information
Yinghai Lu authored and Ingo Molnar committed Apr 28, 2009
1 parent 6b73ef8 commit c1e6e2d
Show file tree
Hide file tree
Showing 3 changed files with 15 additions and 6 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 024154cfdd802654cb236a18c78b6e37351e2c49
refs/heads/master: d047f53a2ecce37e3bdf79eac5a326fbaadb3628
17 changes: 13 additions & 4 deletions trunk/arch/x86/kernel/apic/io_apic.c
Original file line number Diff line number Diff line change
Expand Up @@ -3172,14 +3172,13 @@ static int nr_irqs_gsi = NR_IRQS_LEGACY;
/*
* Dynamic irq allocate and deallocation
*/
unsigned int create_irq_nr(unsigned int irq_want)
unsigned int create_irq_nr(unsigned int irq_want, int node)
{
/* Allocate an unused irq */
unsigned int irq;
unsigned int new;
unsigned long flags;
struct irq_cfg *cfg_new = NULL;
int node = cpu_to_node(boot_cpu_id);
struct irq_desc *desc_new = NULL;

irq = 0;
Expand All @@ -3197,6 +3196,13 @@ unsigned int create_irq_nr(unsigned int irq_want)

if (cfg_new->vector != 0)
continue;

#ifdef CONFIG_NUMA_IRQ_DESC
/* different node ?*/
if (desc_new->node != node)
desc = move_irq_desc(desc, node);
#endif

if (__assign_irq_vector(new, cfg_new, apic->target_cpus()) == 0)
irq = new;
break;
Expand All @@ -3214,11 +3220,12 @@ unsigned int create_irq_nr(unsigned int irq_want)

int create_irq(void)
{
int node = cpu_to_node(boot_cpu_id);
unsigned int irq_want;
int irq;

irq_want = nr_irqs_gsi;
irq = create_irq_nr(irq_want);
irq = create_irq_nr(irq_want, node);

if (irq == 0)
irq = -1;
Expand Down Expand Up @@ -3476,15 +3483,17 @@ int arch_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
unsigned int irq_want;
struct intel_iommu *iommu = NULL;
int index = 0;
int node;

/* x86 doesn't support multiple MSI yet */
if (type == PCI_CAP_ID_MSI && nvec > 1)
return 1;

node = dev_to_node(&dev->dev);
irq_want = nr_irqs_gsi;
sub_handle = 0;
list_for_each_entry(msidesc, &dev->msi_list, list) {
irq = create_irq_nr(irq_want);
irq = create_irq_nr(irq_want, node);
if (irq == 0)
return -1;
irq_want = irq + 1;
Expand Down
2 changes: 1 addition & 1 deletion trunk/include/linux/irq.h
Original file line number Diff line number Diff line change
Expand Up @@ -376,7 +376,7 @@ extern void set_irq_noprobe(unsigned int irq);
extern void set_irq_probe(unsigned int irq);

/* Handle dynamic irq creation and destruction */
extern unsigned int create_irq_nr(unsigned int irq_want);
extern unsigned int create_irq_nr(unsigned int irq_want, int node);
extern int create_irq(void);
extern void destroy_irq(unsigned int irq);

Expand Down

0 comments on commit c1e6e2d

Please sign in to comment.