Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fb4b7d98 authored by Sunil Goutham's avatar Sunil Goutham Committed by David S. Miller
Browse files

net: thunderx: Assign affinity hints to vf's interrupts



This affinity hint can be used by user space irqbalance tool to set
preferred CPU mask for irqs registered by this VF. Irqbalance needs
to be in 'exact' mode to set irq affinity same as indicated by
affinity hint.

Signed-off-by: default avatarSunil Goutham <sgoutham@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent ef0a4d86
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -309,6 +309,7 @@ struct nicvf {
	struct msix_entry	msix_entries[NIC_VF_MSIX_VECTORS];
	struct msix_entry	msix_entries[NIC_VF_MSIX_VECTORS];
	char			irq_name[NIC_VF_MSIX_VECTORS][20];
	char			irq_name[NIC_VF_MSIX_VECTORS][20];
	bool			irq_allocated[NIC_VF_MSIX_VECTORS];
	bool			irq_allocated[NIC_VF_MSIX_VECTORS];
	cpumask_var_t		affinity_mask[NIC_VF_MSIX_VECTORS];


	/* VF <-> PF mailbox communication */
	/* VF <-> PF mailbox communication */
	bool			pf_acked;
	bool			pf_acked;
+35 −2
Original line number Original line Diff line number Diff line
@@ -899,6 +899,31 @@ static void nicvf_disable_msix(struct nicvf *nic)
	}
	}
}
}


static void nicvf_set_irq_affinity(struct nicvf *nic)
{
	int vec, cpu;
	int irqnum;

	for (vec = 0; vec < nic->num_vec; vec++) {
		if (!nic->irq_allocated[vec])
			continue;

		if (!zalloc_cpumask_var(&nic->affinity_mask[vec], GFP_KERNEL))
			return;
		 /* CQ interrupts */
		if (vec < NICVF_INTR_ID_SQ)
			/* Leave CPU0 for RBDR and other interrupts */
			cpu = nicvf_netdev_qidx(nic, vec) + 1;
		else
			cpu = 0;

		cpumask_set_cpu(cpumask_local_spread(cpu, nic->node),
				nic->affinity_mask[vec]);
		irqnum = nic->msix_entries[vec].vector;
		irq_set_affinity_hint(irqnum, nic->affinity_mask[vec]);
	}
}

static int nicvf_register_interrupts(struct nicvf *nic)
static int nicvf_register_interrupts(struct nicvf *nic)
{
{
	int irq, ret = 0;
	int irq, ret = 0;
@@ -944,9 +969,14 @@ static int nicvf_register_interrupts(struct nicvf *nic)
	ret = request_irq(nic->msix_entries[irq].vector,
	ret = request_irq(nic->msix_entries[irq].vector,
			  nicvf_qs_err_intr_handler,
			  nicvf_qs_err_intr_handler,
			  0, nic->irq_name[irq], nic);
			  0, nic->irq_name[irq], nic);
	if (!ret)
	if (ret)
		goto err;

	nic->irq_allocated[irq] = true;
	nic->irq_allocated[irq] = true;


	/* Set IRQ affinities */
	nicvf_set_irq_affinity(nic);

err:
err:
	if (ret)
	if (ret)
		netdev_err(nic->netdev, "request_irq failed, vector %d\n", irq);
		netdev_err(nic->netdev, "request_irq failed, vector %d\n", irq);
@@ -963,6 +993,9 @@ static void nicvf_unregister_interrupts(struct nicvf *nic)
		if (!nic->irq_allocated[irq])
		if (!nic->irq_allocated[irq])
			continue;
			continue;


		irq_set_affinity_hint(nic->msix_entries[irq].vector, NULL);
		free_cpumask_var(nic->affinity_mask[irq]);

		if (irq < NICVF_INTR_ID_SQ)
		if (irq < NICVF_INTR_ID_SQ)
			free_irq(nic->msix_entries[irq].vector, nic->napi[irq]);
			free_irq(nic->msix_entries[irq].vector, nic->napi[irq]);
		else
		else