[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 2/4] pass struct irq_desc * to set_affinity() IRQ accessors



On 20/09/11 16:43, Jan Beulich wrote:
> This is because the descriptor is generally more useful (with the IRQ
> number being accessible in it if necessary) and going forward will
> hopefully allow to remove all direct accesses to the IRQ descriptor
> array, in turn making it possible to make this some other, more
> efficient data structure.

Do be aware that certain bits of the code use pointer arithmetic between
an irq_{cfg,desc} * and the base of the array to work out the irq
value.  Changing the data structure will likely invalidate that logic in
subtle ways.

~Andrew

> Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
>
> --- a/xen/arch/ia64/linux-xen/iosapic.c
> +++ b/xen/arch/ia64/linux-xen/iosapic.c
> @@ -352,18 +352,18 @@ unmask_irq (unsigned int irq)
>
>
>  static void
> -iosapic_set_affinity (unsigned int irq, const cpumask_t *mask)
> +iosapic_set_affinity (struct irq_desc *desc, const cpumask_t *mask)
>  {
>  #ifdef CONFIG_SMP
>         unsigned long flags;
>         u32 high32, low32;
>         int dest, rte_index;
>         char __iomem *addr;
> -       int redir = (irq & IA64_IRQ_REDIRECTED) ? 1 : 0;
> +       int redir = (desc->irq & IA64_IRQ_REDIRECTED) ? 1 : 0;
> +       unsigned int irq = desc->irq & ~IA64_IRQ_REDIRECTED;
>         ia64_vector vec;
>         struct iosapic_rte_info *rte;
>
> -       irq &= (~IA64_IRQ_REDIRECTED);
>         vec = irq_to_vector(irq);
>
>         if (cpumask_empty(mask))
> --- a/xen/arch/x86/hpet.c
> +++ b/xen/arch/x86/hpet.c
> @@ -258,24 +258,14 @@ static void hpet_msi_mask(unsigned int i
>      hpet_write32(cfg, HPET_Tn_CFG(ch->idx));
>  }
>
> -static void hpet_msi_write(unsigned int irq, struct msi_msg *msg)
> +static void hpet_msi_write(struct hpet_event_channel *ch, struct msi_msg 
> *msg)
>  {
> -    unsigned int ch_idx = irq_to_channel(irq);
> -    struct hpet_event_channel *ch = hpet_events + ch_idx;
> -
> -    BUG_ON(ch_idx >= num_hpets_used);
> -
>      hpet_write32(msg->data, HPET_Tn_ROUTE(ch->idx));
>      hpet_write32(msg->address_lo, HPET_Tn_ROUTE(ch->idx) + 4);
>  }
>
> -static void hpet_msi_read(unsigned int irq, struct msi_msg *msg)
> +static void hpet_msi_read(struct hpet_event_channel *ch, struct msi_msg *msg)
>  {
> -    unsigned int ch_idx = irq_to_channel(irq);
> -    struct hpet_event_channel *ch = hpet_events + ch_idx;
> -
> -    BUG_ON(ch_idx >= num_hpets_used);
> -
>      msg->data = hpet_read32(HPET_Tn_ROUTE(ch->idx));
>      msg->address_lo = hpet_read32(HPET_Tn_ROUTE(ch->idx) + 4);
>      msg->address_hi = 0;
> @@ -305,23 +295,22 @@ static void hpet_msi_end(unsigned int ir
>  {
>  }
>
> -static void hpet_msi_set_affinity(unsigned int irq, const cpumask_t *mask)
> +static void hpet_msi_set_affinity(struct irq_desc *desc, const cpumask_t 
> *mask)
>  {
>      struct msi_msg msg;
>      unsigned int dest;
> -    struct irq_desc * desc = irq_to_desc(irq);
>      struct irq_cfg *cfg= desc->chip_data;
>
>      dest = set_desc_affinity(desc, mask);
>      if (dest == BAD_APICID)
>          return;
>
> -    hpet_msi_read(irq, &msg);
> +    hpet_msi_read(desc->action->dev_id, &msg);
>      msg.data &= ~MSI_DATA_VECTOR_MASK;
>      msg.data |= MSI_DATA_VECTOR(cfg->vector);
>      msg.address_lo &= ~MSI_ADDR_DEST_ID_MASK;
>      msg.address_lo |= MSI_ADDR_DEST_ID(dest);
> -    hpet_msi_write(irq, &msg);
> +    hpet_msi_write(desc->action->dev_id, &msg);
>  }
>
>  /*
> @@ -338,12 +327,12 @@ static hw_irq_controller hpet_msi_type =
>      .set_affinity   = hpet_msi_set_affinity,
>  };
>
> -static void __hpet_setup_msi_irq(unsigned int irq)
> +static void __hpet_setup_msi_irq(struct irq_desc *desc)
>  {
>      struct msi_msg msg;
>
> -    msi_compose_msg(irq, &msg);
> -    hpet_msi_write(irq, &msg);
> +    msi_compose_msg(desc->irq, &msg);
> +    hpet_msi_write(desc->action->dev_id, &msg);
>  }
>
>  static int __init hpet_setup_msi_irq(unsigned int irq)
> @@ -357,7 +346,7 @@ static int __init hpet_setup_msi_irq(uns
>      if ( ret < 0 )
>          return ret;
>
> -    __hpet_setup_msi_irq(irq);
> +    __hpet_setup_msi_irq(desc);
>
>      return 0;
>  }
> @@ -471,7 +460,7 @@ static void hpet_attach_channel(unsigned
>      if ( ch->cpu != cpu )
>          return;
>
> -    hpet_msi_set_affinity(ch->irq, cpumask_of(ch->cpu));
> +    hpet_msi_set_affinity(irq_to_desc(ch->irq), cpumask_of(ch->cpu));
>  }
>
>  static void hpet_detach_channel(unsigned int cpu,
> @@ -493,7 +482,7 @@ static void hpet_detach_channel(unsigned
>      }
>
>      ch->cpu = first_cpu(ch->cpumask);
> -    hpet_msi_set_affinity(ch->irq, cpumask_of(ch->cpu));
> +    hpet_msi_set_affinity(irq_to_desc(ch->irq), cpumask_of(ch->cpu));
>  }
>
>  #include <asm/mc146818rtc.h>
> @@ -619,7 +608,7 @@ void hpet_broadcast_resume(void)
>      for ( i = 0; i < n; i++ )
>      {
>          if ( hpet_events[i].irq >= 0 )
> -            __hpet_setup_msi_irq(hpet_events[i].irq);
> +            __hpet_setup_msi_irq(irq_to_desc(hpet_events[i].irq));
>
>          /* set HPET Tn as oneshot */
>          cfg = hpet_read32(HPET_Tn_CFG(hpet_events[i].idx));
> --- a/xen/arch/x86/io_apic.c
> +++ b/xen/arch/x86/io_apic.c
> @@ -658,7 +658,7 @@ unsigned int set_desc_affinity(struct ir
>  }
>
>  static void
> -set_ioapic_affinity_irq_desc(struct irq_desc *desc, const cpumask_t *mask)
> +set_ioapic_affinity_irq(struct irq_desc *desc, const cpumask_t *mask)
>  {
>      unsigned long flags;
>      unsigned int dest;
> @@ -695,16 +695,6 @@ set_ioapic_affinity_irq_desc(struct irq_
>      spin_unlock_irqrestore(&ioapic_lock, flags);
>
>  }
> -
> -static void
> -set_ioapic_affinity_irq(unsigned int irq, const struct cpumask *mask)
> -{
> -    struct irq_desc *desc;
> -
> -    desc = irq_to_desc(irq);
> -
> -    set_ioapic_affinity_irq_desc(desc, mask);
> -}
>  #endif /* CONFIG_SMP */
>
>  /*
> @@ -802,7 +792,7 @@ void /*__init*/ setup_ioapic_dest(void)
>              irq = pin_2_irq(irq_entry, ioapic, pin);
>              cfg = irq_cfg(irq);
>              BUG_ON(cpus_empty(cfg->cpu_mask));
> -            set_ioapic_affinity_irq(irq, &cfg->cpu_mask);
> +            set_ioapic_affinity_irq(irq_to_desc(irq), &cfg->cpu_mask);
>          }
>
>      }
> @@ -1780,7 +1770,7 @@ static void mask_and_ack_level_ioapic_ir
>
>      if ((irq_desc[irq].status & IRQ_MOVE_PENDING) &&
>         !io_apic_level_ack_pending(irq))
> -        move_masked_irq(irq);
> +        move_masked_irq(desc);
>
>      if ( !(v & (1 << (i & 0x1f))) ) {
>          spin_lock(&ioapic_lock);
> @@ -1799,7 +1789,9 @@ static void end_level_ioapic_irq (unsign
>      {
>          if ( directed_eoi_enabled )
>          {
> -            if ( !(irq_desc[irq].status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
> +            struct irq_desc *desc = irq_to_desc(irq);
> +
> +            if ( !(desc->status & (IRQ_DISABLED|IRQ_MOVE_PENDING)) )
>              {
>                  eoi_IO_APIC_irq(irq);
>                  return;
> @@ -1807,9 +1799,9 @@ static void end_level_ioapic_irq (unsign
>
>              mask_IO_APIC_irq(irq);
>              eoi_IO_APIC_irq(irq);
> -            if ( (irq_desc[irq].status & IRQ_MOVE_PENDING) &&
> +            if ( (desc->status & IRQ_MOVE_PENDING) &&
>                   !io_apic_level_ack_pending(irq) )
> -                move_masked_irq(irq);
> +                move_masked_irq(desc);
>          }
>
>          if ( !(irq_desc[irq].status & IRQ_DISABLED) )
> --- a/xen/arch/x86/irq.c
> +++ b/xen/arch/x86/irq.c
> @@ -557,10 +557,8 @@ void __setup_vector_irq(int cpu)
>      }
>  }
>
> -void move_masked_irq(int irq)
> +void move_masked_irq(struct irq_desc *desc)
>  {
> -    struct irq_desc *desc = irq_to_desc(irq);
> -
>      if (likely(!(desc->status & IRQ_MOVE_PENDING)))
>          return;
>
> @@ -582,7 +580,7 @@ void move_masked_irq(int irq)
>       * For correct operation this depends on the caller masking the irqs.
>       */
>      if (likely(cpus_intersects(desc->pending_mask, cpu_online_map)))
> -        desc->handler->set_affinity(irq, &desc->pending_mask);
> +        desc->handler->set_affinity(desc, &desc->pending_mask);
>
>      cpus_clear(desc->pending_mask);
>  }
> @@ -598,7 +596,7 @@ void move_native_irq(int irq)
>          return;
>
>      desc->handler->disable(irq);
> -    move_masked_irq(irq);
> +    move_masked_irq(desc);
>      desc->handler->enable(irq);
>  }
>
> @@ -1409,7 +1407,7 @@ int pirq_guest_bind(struct vcpu *v, stru
>          /* Attempt to bind the interrupt target to the correct CPU. */
>          cpu_set(v->processor, cpumask);
>          if ( !opt_noirqbalance && (desc->handler->set_affinity != NULL) )
> -            desc->handler->set_affinity(irq, &cpumask);
> +            desc->handler->set_affinity(desc, &cpumask);
>      }
>      else if ( !will_share || !action->shareable )
>      {
> @@ -1963,7 +1961,7 @@ void fixup_irqs(void)
>              desc->handler->disable(irq);
>
>          if ( desc->handler->set_affinity )
> -            desc->handler->set_affinity(irq, &affinity);
> +            desc->handler->set_affinity(desc, &affinity);
>          else if ( !(warned++) )
>              set_affinity = 0;
>
> --- a/xen/arch/x86/msi.c
> +++ b/xen/arch/x86/msi.c
> @@ -266,11 +266,10 @@ static void write_msi_msg(struct msi_des
>      }
>  }
>
> -void set_msi_affinity(unsigned int irq, const cpumask_t *mask)
> +void set_msi_affinity(struct irq_desc *desc, const cpumask_t *mask)
>  {
>      struct msi_msg msg;
>      unsigned int dest;
> -    struct irq_desc *desc = irq_to_desc(irq);
>      struct msi_desc *msi_desc = desc->msi_desc;
>      struct irq_cfg *cfg = desc->chip_data;
>
> --- a/xen/drivers/passthrough/amd/iommu_init.c
> +++ b/xen/drivers/passthrough/amd/iommu_init.c
> @@ -344,12 +344,11 @@ static void amd_iommu_reset_event_log(st
>      set_iommu_event_log_control(iommu, IOMMU_CONTROL_ENABLED);
>  }
>
> -static void iommu_msi_set_affinity(unsigned int irq, const cpumask_t *mask)
> +static void iommu_msi_set_affinity(struct irq_desc *desc, const cpumask_t 
> *mask)
>  {
>      struct msi_msg msg;
>      unsigned int dest;
> -    struct amd_iommu *iommu = irq_to_iommu[irq];
> -    struct irq_desc *desc = irq_to_desc(irq);
> +    struct amd_iommu *iommu = desc->action->dev_id;
>      struct irq_cfg *cfg = desc->chip_data;
>      u8 bus = (iommu->bdf >> 8) & 0xff;
>      u8 dev = PCI_SLOT(iommu->bdf & 0xff);
> @@ -591,7 +590,7 @@ static void enable_iommu(struct amd_iomm
>      register_iommu_event_log_in_mmio_space(iommu);
>      register_iommu_exclusion_range(iommu);
>
> -    iommu_msi_set_affinity(iommu->irq, &cpu_online_map);
> +    iommu_msi_set_affinity(irq_to_desc(iommu->irq), &cpu_online_map);
>      amd_iommu_msi_enable(iommu, IOMMU_CONTROL_ENABLED);
>
>      set_iommu_command_buffer_control(iommu, IOMMU_CONTROL_ENABLED);
> --- a/xen/drivers/passthrough/vtd/iommu.c
> +++ b/xen/drivers/passthrough/vtd/iommu.c
> @@ -998,14 +998,12 @@ static void dma_msi_end(unsigned int irq
>      ack_APIC_irq();
>  }
>
> -static void dma_msi_set_affinity(unsigned int irq, const cpumask_t *mask)
> +static void dma_msi_set_affinity(struct irq_desc *desc, const cpumask_t 
> *mask)
>  {
>      struct msi_msg msg;
>      unsigned int dest;
>      unsigned long flags;
> -
> -    struct iommu *iommu = irq_to_iommu[irq];
> -    struct irq_desc *desc = irq_to_desc(irq);
> +    struct iommu *iommu = desc->action->dev_id;
>      struct irq_cfg *cfg = desc->chip_data;
>
>  #ifdef CONFIG_X86
> @@ -1984,7 +1982,7 @@ static int init_vtd_hw(void)
>          iommu = drhd->iommu;
>
>          cfg = irq_cfg(iommu->irq);
> -        dma_msi_set_affinity(iommu->irq, &cfg->cpu_mask);
> +        dma_msi_set_affinity(irq_to_desc(iommu->irq), &cfg->cpu_mask);
>
>          clear_fault_bits(iommu);
>
> --- a/xen/include/asm-x86/irq.h
> +++ b/xen/include/asm-x86/irq.h
> @@ -172,7 +172,7 @@ void unlock_vector_lock(void);
>  void __setup_vector_irq(int cpu);
>
>  void move_native_irq(int irq);
> -void move_masked_irq(int irq);
> +void move_masked_irq(struct irq_desc *);
>
>  int __assign_irq_vector(int irq, struct irq_cfg *, const cpumask_t *);
>
> --- a/xen/include/asm-x86/msi.h
> +++ b/xen/include/asm-x86/msi.h
> @@ -77,7 +77,7 @@ struct msi_desc;
>  /* Helper functions */
>  extern void mask_msi_irq(unsigned int irq);
>  extern void unmask_msi_irq(unsigned int irq);
> -extern void set_msi_affinity(unsigned int vector, const cpumask_t *);
> +extern void set_msi_affinity(struct irq_desc *, const cpumask_t *);
>  extern int pci_enable_msi(struct msi_info *msi, struct msi_desc **desc);
>  extern void pci_disable_msi(struct msi_desc *desc);
>  extern void pci_cleanup_msi(struct pci_dev *pdev);
> --- a/xen/include/xen/irq.h
> +++ b/xen/include/xen/irq.h
> @@ -33,6 +33,8 @@ struct irqaction {
>  #define NEVER_ASSIGN_IRQ        (-2)
>  #define FREE_TO_ASSIGN_IRQ      (-3)
>
> +struct irq_desc;
> +
>  /*
>   * Interrupt controller descriptor. This is all we need
>   * to describe about the low-level hardware.
> @@ -45,7 +47,7 @@ struct hw_interrupt_type {
>      void (*disable)(unsigned int irq);
>      void (*ack)(unsigned int irq);
>      void (*end)(unsigned int irq, u8 vector);
> -    void (*set_affinity)(unsigned int irq, const cpumask_t *);
> +    void (*set_affinity)(struct irq_desc *, const cpumask_t *);
>  };
>
>  typedef const struct hw_interrupt_type hw_irq_controller;
>
>

-- 
Andrew Cooper - Dom0 Kernel Engineer, Citrix XenServer
T: +44 (0)1223 225 900, http://www.citrix.com


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.