Commit bd475eea authored by Jakub Kicinski's avatar Jakub Kicinski
Browse files
Tony Nguyen says:

====================
Intel Wired LAN Driver Updates 2025-07-01 (idpf, igc)

For idpf:
Michal returns 0 for key size when RSS is not supported.

Ahmed changes control queue to a spinlock due to sleeping calls.

For igc:
Vitaly disables L1.2 PCI-E link substate on I226 devices to resolve
performance issues.

* '200GbE' of git://git.kernel.org/pub/scm/linux/kernel/git/tnguy/net-queue:
  igc: disable L1.2 PCI-E link substate to avoid performance issue
  idpf: convert control queue mutex to a spinlock
  idpf: return 0 size for RSS key if not supported
====================

Link: https://patch.msgid.link/20250701164317.2983952-1-anthony.l.nguyen@intel.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parents c2a2ff6b 0325143b
Loading
Loading
Loading
Loading
+11 −12
Original line number Diff line number Diff line
@@ -96,7 +96,7 @@ static void idpf_ctlq_init_rxq_bufs(struct idpf_ctlq_info *cq)
 */
static void idpf_ctlq_shutdown(struct idpf_hw *hw, struct idpf_ctlq_info *cq)
{
	mutex_lock(&cq->cq_lock);
	spin_lock(&cq->cq_lock);

	/* free ring buffers and the ring itself */
	idpf_ctlq_dealloc_ring_res(hw, cq);
@@ -104,8 +104,7 @@ static void idpf_ctlq_shutdown(struct idpf_hw *hw, struct idpf_ctlq_info *cq)
	/* Set ring_size to 0 to indicate uninitialized queue */
	cq->ring_size = 0;

	mutex_unlock(&cq->cq_lock);
	mutex_destroy(&cq->cq_lock);
	spin_unlock(&cq->cq_lock);
}

/**
@@ -173,7 +172,7 @@ int idpf_ctlq_add(struct idpf_hw *hw,

	idpf_ctlq_init_regs(hw, cq, is_rxq);

	mutex_init(&cq->cq_lock);
	spin_lock_init(&cq->cq_lock);

	list_add(&cq->cq_list, &hw->cq_list_head);

@@ -272,7 +271,7 @@ int idpf_ctlq_send(struct idpf_hw *hw, struct idpf_ctlq_info *cq,
	int err = 0;
	int i;

	mutex_lock(&cq->cq_lock);
	spin_lock(&cq->cq_lock);

	/* Ensure there are enough descriptors to send all messages */
	num_desc_avail = IDPF_CTLQ_DESC_UNUSED(cq);
@@ -332,7 +331,7 @@ int idpf_ctlq_send(struct idpf_hw *hw, struct idpf_ctlq_info *cq,
	wr32(hw, cq->reg.tail, cq->next_to_use);

err_unlock:
	mutex_unlock(&cq->cq_lock);
	spin_unlock(&cq->cq_lock);

	return err;
}
@@ -364,7 +363,7 @@ int idpf_ctlq_clean_sq(struct idpf_ctlq_info *cq, u16 *clean_count,
	if (*clean_count > cq->ring_size)
		return -EBADR;

	mutex_lock(&cq->cq_lock);
	spin_lock(&cq->cq_lock);

	ntc = cq->next_to_clean;

@@ -397,7 +396,7 @@ int idpf_ctlq_clean_sq(struct idpf_ctlq_info *cq, u16 *clean_count,

	cq->next_to_clean = ntc;

	mutex_unlock(&cq->cq_lock);
	spin_unlock(&cq->cq_lock);

	/* Return number of descriptors actually cleaned */
	*clean_count = i;
@@ -435,7 +434,7 @@ int idpf_ctlq_post_rx_buffs(struct idpf_hw *hw, struct idpf_ctlq_info *cq,
	if (*buff_count > 0)
		buffs_avail = true;

	mutex_lock(&cq->cq_lock);
	spin_lock(&cq->cq_lock);

	if (tbp >= cq->ring_size)
		tbp = 0;
@@ -524,7 +523,7 @@ int idpf_ctlq_post_rx_buffs(struct idpf_hw *hw, struct idpf_ctlq_info *cq,
		wr32(hw, cq->reg.tail, cq->next_to_post);
	}

	mutex_unlock(&cq->cq_lock);
	spin_unlock(&cq->cq_lock);

	/* return the number of buffers that were not posted */
	*buff_count = *buff_count - i;
@@ -552,7 +551,7 @@ int idpf_ctlq_recv(struct idpf_ctlq_info *cq, u16 *num_q_msg,
	u16 i;

	/* take the lock before we start messing with the ring */
	mutex_lock(&cq->cq_lock);
	spin_lock(&cq->cq_lock);

	ntc = cq->next_to_clean;

@@ -614,7 +613,7 @@ int idpf_ctlq_recv(struct idpf_ctlq_info *cq, u16 *num_q_msg,

	cq->next_to_clean = ntc;

	mutex_unlock(&cq->cq_lock);
	spin_unlock(&cq->cq_lock);

	*num_q_msg = i;
	if (*num_q_msg == 0)
+1 −1
Original line number Diff line number Diff line
@@ -99,7 +99,7 @@ struct idpf_ctlq_info {

	enum idpf_ctlq_type cq_type;
	int q_id;
	struct mutex cq_lock;		/* control queue lock */
	spinlock_t cq_lock;		/* control queue lock */
	/* used for interrupt processing */
	u16 next_to_use;
	u16 next_to_clean;
+2 −2
Original line number Diff line number Diff line
@@ -47,7 +47,7 @@ static u32 idpf_get_rxfh_key_size(struct net_device *netdev)
	struct idpf_vport_user_config_data *user_config;

	if (!idpf_is_cap_ena_all(np->adapter, IDPF_RSS_CAPS, IDPF_CAP_RSS))
		return -EOPNOTSUPP;
		return 0;

	user_config = &np->adapter->vport_config[np->vport_idx]->user_config;

@@ -66,7 +66,7 @@ static u32 idpf_get_rxfh_indir_size(struct net_device *netdev)
	struct idpf_vport_user_config_data *user_config;

	if (!idpf_is_cap_ena_all(np->adapter, IDPF_RSS_CAPS, IDPF_CAP_RSS))
		return -EOPNOTSUPP;
		return 0;

	user_config = &np->adapter->vport_config[np->vport_idx]->user_config;

+8 −4
Original line number Diff line number Diff line
@@ -2314,8 +2314,12 @@ void *idpf_alloc_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem, u64 size)
	struct idpf_adapter *adapter = hw->back;
	size_t sz = ALIGN(size, 4096);

	mem->va = dma_alloc_coherent(&adapter->pdev->dev, sz,
				     &mem->pa, GFP_KERNEL);
	/* The control queue resources are freed under a spinlock, contiguous
	 * pages will avoid IOMMU remapping and the use vmap (and vunmap in
	 * dma_free_*() path.
	 */
	mem->va = dma_alloc_attrs(&adapter->pdev->dev, sz, &mem->pa,
				  GFP_KERNEL, DMA_ATTR_FORCE_CONTIGUOUS);
	mem->size = sz;

	return mem->va;
@@ -2330,8 +2334,8 @@ void idpf_free_dma_mem(struct idpf_hw *hw, struct idpf_dma_mem *mem)
{
	struct idpf_adapter *adapter = hw->back;

	dma_free_coherent(&adapter->pdev->dev, mem->size,
			  mem->va, mem->pa);
	dma_free_attrs(&adapter->pdev->dev, mem->size,
		       mem->va, mem->pa, DMA_ATTR_FORCE_CONTIGUOUS);
	mem->size = 0;
	mem->va = NULL;
	mem->pa = 0;
+10 −0
Original line number Diff line number Diff line
@@ -7115,6 +7115,10 @@ static int igc_probe(struct pci_dev *pdev,
	adapter->port_num = hw->bus.func;
	adapter->msg_enable = netif_msg_init(debug, DEFAULT_MSG_ENABLE);

	/* Disable ASPM L1.2 on I226 devices to avoid packet loss */
	if (igc_is_device_id_i226(hw))
		pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2);

	err = pci_save_state(pdev);
	if (err)
		goto err_ioremap;
@@ -7500,6 +7504,9 @@ static int __igc_resume(struct device *dev, bool rpm)
	pci_enable_wake(pdev, PCI_D3hot, 0);
	pci_enable_wake(pdev, PCI_D3cold, 0);

	if (igc_is_device_id_i226(hw))
		pci_disable_link_state(pdev, PCIE_LINK_STATE_L1_2);

	if (igc_init_interrupt_scheme(adapter, true)) {
		netdev_err(netdev, "Unable to allocate memory for queues\n");
		return -ENOMEM;
@@ -7625,6 +7632,9 @@ static pci_ers_result_t igc_io_slot_reset(struct pci_dev *pdev)
		pci_enable_wake(pdev, PCI_D3hot, 0);
		pci_enable_wake(pdev, PCI_D3cold, 0);

		if (igc_is_device_id_i226(hw))
			pci_disable_link_state_locked(pdev, PCIE_LINK_STATE_L1_2);

		/* In case of PCI error, adapter loses its HW address
		 * so we should re-assign it here.
		 */