diff options
Diffstat (limited to 'kernel/irq/manage.c')
| -rw-r--r-- | kernel/irq/manage.c | 31 | 
1 files changed, 31 insertions, 0 deletions
| diff --git a/kernel/irq/manage.c b/kernel/irq/manage.c index e68932bb308e..b1c7e8f46bfb 100644 --- a/kernel/irq/manage.c +++ b/kernel/irq/manage.c @@ -256,6 +256,37 @@ int irq_set_affinity_hint(unsigned int irq, const struct cpumask *m)  }  EXPORT_SYMBOL_GPL(irq_set_affinity_hint); +/** + *	irq_set_vcpu_affinity - Set vcpu affinity for the interrupt + *	@irq: interrupt number to set affinity + *	@vcpu_info: vCPU specific data + * + *	This function uses the vCPU specific data to set the vCPU + *	affinity for an irq. The vCPU specific data is passed from + *	outside, such as KVM. One example code path is as below: + *	KVM -> IOMMU -> irq_set_vcpu_affinity(). + */ +int irq_set_vcpu_affinity(unsigned int irq, void *vcpu_info) +{ +	unsigned long flags; +	struct irq_desc *desc = irq_get_desc_lock(irq, &flags, 0); +	struct irq_data *data; +	struct irq_chip *chip; +	int ret = -ENOSYS; + +	if (!desc) +		return -EINVAL; + +	data = irq_desc_get_irq_data(desc); +	chip = irq_data_get_irq_chip(data); +	if (chip && chip->irq_set_vcpu_affinity) +		ret = chip->irq_set_vcpu_affinity(data, vcpu_info); +	irq_put_desc_unlock(desc, flags); + +	return ret; +} +EXPORT_SYMBOL_GPL(irq_set_vcpu_affinity); +  static void irq_affinity_notify(struct work_struct *work)  {  	struct irq_affinity_notify *notify = | 
