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 Diff line number Diff line
@@ -309,6 +309,7 @@ struct nicvf {
	struct msix_entry	msix_entries[NIC_VF_MSIX_VECTORS];
	char			irq_name[NIC_VF_MSIX_VECTORS][20];
	bool			irq_allocated[NIC_VF_MSIX_VECTORS];
	cpumask_var_t		affinity_mask[NIC_VF_MSIX_VECTORS];

	/* VF <-> PF mailbox communication */
	bool			pf_acked;
+35 −2
Original line number 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)
{
	int irq, ret = 0;
@@ -944,9 +969,14 @@ static int nicvf_register_interrupts(struct nicvf *nic)
	ret = request_irq(nic->msix_entries[irq].vector,
			  nicvf_qs_err_intr_handler,
			  0, nic->irq_name[irq], nic);
	if (!ret)
	if (ret)
		goto err;

	nic->irq_allocated[irq] = true;

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

err:
	if (ret)
		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])
			continue;

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

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