mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
net/mlx5: Refactor completion irq request/release code
Break the request and release functions into pci and sub-functions devices handling for better readability, eventually making the code symmetric in terms of request/release. Signed-off-by: Eli Cohen <elic@nvidia.com> Reviewed-by: Shay Drory <shayd@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
This commit is contained in:
committed by
Saeed Mahameed
parent
8bebfd7679
commit
b48a0f72bc
@@ -804,44 +804,28 @@ void mlx5_eq_update_ci(struct mlx5_eq *eq, u32 cc, bool arm)
|
|||||||
}
|
}
|
||||||
EXPORT_SYMBOL(mlx5_eq_update_ci);
|
EXPORT_SYMBOL(mlx5_eq_update_ci);
|
||||||
|
|
||||||
static void comp_irqs_release(struct mlx5_core_dev *dev)
|
static void comp_irqs_release_pci(struct mlx5_core_dev *dev)
|
||||||
{
|
{
|
||||||
struct mlx5_eq_table *table = dev->priv.eq_table;
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||||
|
|
||||||
if (mlx5_core_is_sf(dev))
|
mlx5_irqs_release_vectors(table->comp_irqs, table->num_comp_eqs);
|
||||||
mlx5_irq_affinity_irqs_release(dev, table->comp_irqs, table->num_comp_eqs);
|
|
||||||
else
|
|
||||||
mlx5_irqs_release_vectors(table->comp_irqs, table->num_comp_eqs);
|
|
||||||
kfree(table->comp_irqs);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int comp_irqs_request(struct mlx5_core_dev *dev)
|
static int comp_irqs_request_pci(struct mlx5_core_dev *dev)
|
||||||
{
|
{
|
||||||
struct mlx5_eq_table *table = dev->priv.eq_table;
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||||
const struct cpumask *prev = cpu_none_mask;
|
const struct cpumask *prev = cpu_none_mask;
|
||||||
const struct cpumask *mask;
|
const struct cpumask *mask;
|
||||||
int ncomp_eqs = table->num_comp_eqs;
|
int ncomp_eqs;
|
||||||
u16 *cpus;
|
u16 *cpus;
|
||||||
int ret;
|
int ret;
|
||||||
int cpu;
|
int cpu;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
ncomp_eqs = table->num_comp_eqs;
|
ncomp_eqs = table->num_comp_eqs;
|
||||||
table->comp_irqs = kcalloc(ncomp_eqs, sizeof(*table->comp_irqs), GFP_KERNEL);
|
|
||||||
if (!table->comp_irqs)
|
|
||||||
return -ENOMEM;
|
|
||||||
if (mlx5_core_is_sf(dev)) {
|
|
||||||
ret = mlx5_irq_affinity_irqs_request_auto(dev, ncomp_eqs, table->comp_irqs);
|
|
||||||
if (ret < 0)
|
|
||||||
goto free_irqs;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
cpus = kcalloc(ncomp_eqs, sizeof(*cpus), GFP_KERNEL);
|
cpus = kcalloc(ncomp_eqs, sizeof(*cpus), GFP_KERNEL);
|
||||||
if (!cpus) {
|
if (!cpus)
|
||||||
ret = -ENOMEM;
|
ret = -ENOMEM;
|
||||||
goto free_irqs;
|
|
||||||
}
|
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
rcu_read_lock();
|
rcu_read_lock();
|
||||||
@@ -857,12 +841,50 @@ spread_done:
|
|||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
ret = mlx5_irqs_request_vectors(dev, cpus, ncomp_eqs, table->comp_irqs);
|
ret = mlx5_irqs_request_vectors(dev, cpus, ncomp_eqs, table->comp_irqs);
|
||||||
kfree(cpus);
|
kfree(cpus);
|
||||||
if (ret < 0)
|
|
||||||
goto free_irqs;
|
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void comp_irqs_release_sf(struct mlx5_core_dev *dev)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||||
|
|
||||||
|
mlx5_irq_affinity_irqs_release(dev, table->comp_irqs, table->num_comp_eqs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int comp_irqs_request_sf(struct mlx5_core_dev *dev)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||||
|
int ncomp_eqs = table->num_comp_eqs;
|
||||||
|
|
||||||
|
return mlx5_irq_affinity_irqs_request_auto(dev, ncomp_eqs, table->comp_irqs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void comp_irqs_release(struct mlx5_core_dev *dev)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||||
|
|
||||||
|
mlx5_core_is_sf(dev) ? comp_irqs_release_sf(dev) :
|
||||||
|
comp_irqs_release_pci(dev);
|
||||||
|
|
||||||
free_irqs:
|
|
||||||
kfree(table->comp_irqs);
|
kfree(table->comp_irqs);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int comp_irqs_request(struct mlx5_core_dev *dev)
|
||||||
|
{
|
||||||
|
struct mlx5_eq_table *table = dev->priv.eq_table;
|
||||||
|
int ncomp_eqs;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ncomp_eqs = table->num_comp_eqs;
|
||||||
|
table->comp_irqs = kcalloc(ncomp_eqs, sizeof(*table->comp_irqs), GFP_KERNEL);
|
||||||
|
if (!table->comp_irqs)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
ret = mlx5_core_is_sf(dev) ? comp_irqs_request_sf(dev) :
|
||||||
|
comp_irqs_request_pci(dev);
|
||||||
|
if (ret < 0)
|
||||||
|
kfree(table->comp_irqs);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user