net/mlx5: Fix get vector affinity helper function

mlx5_get_vector_affinity used to call pci_irq_get_affinity and after
reverting the patch that sets the device affinity via PCI_IRQ_AFFINITY
API, calling pci_irq_get_affinity becomes useless and it breaks RDMA
mlx5 users.  To fix this, this patch provides an alternative way to
retrieve IRQ vector affinity using legacy IRQ API, following
smp_affinity read procfs implementation.

Fixes: 231243c827 ("Revert mlx5: move affinity hints assignments to generic code")
Fixes: a435393aca ("mlx5: move affinity hints assignments to generic code")
Cc: Sagi Grimberg <sagi@grimberg.me>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
This commit is contained in:
Saeed Mahameed 2018-01-04 04:35:51 +02:00
parent 8978cc921f
commit 05e0cc84e0
1 changed files with 18 additions and 1 deletions

View File

@ -36,6 +36,7 @@
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/completion.h> #include <linux/completion.h>
#include <linux/pci.h> #include <linux/pci.h>
#include <linux/irq.h>
#include <linux/spinlock_types.h> #include <linux/spinlock_types.h>
#include <linux/semaphore.h> #include <linux/semaphore.h>
#include <linux/slab.h> #include <linux/slab.h>
@ -1231,7 +1232,23 @@ enum {
static inline const struct cpumask * static inline const struct cpumask *
mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector) mlx5_get_vector_affinity(struct mlx5_core_dev *dev, int vector)
{ {
return pci_irq_get_affinity(dev->pdev, MLX5_EQ_VEC_COMP_BASE + vector); const struct cpumask *mask;
struct irq_desc *desc;
unsigned int irq;
int eqn;
int err;
err = mlx5_vector2eqn(dev, vector, &eqn, &irq);
if (err)
return NULL;
desc = irq_to_desc(irq);
#ifdef CONFIG_GENERIC_IRQ_EFFECTIVE_AFF_MASK
mask = irq_data_get_effective_affinity_mask(&desc->irq_data);
#else
mask = desc->irq_common_data.affinity;
#endif
return mask;
} }
#endif /* MLX5_DRIVER_H */ #endif /* MLX5_DRIVER_H */