[dpdk-dev] [PATCH] ixgbevf jumbo frame issue with DPDK VF

Ivan Boule ivan.boule at 6wind.com
Mon May 5 09:29:42 CEST 2014


On 05/01/2014 07:24 PM, Ananyev, Konstantin wrote:
> Hi Ivan,
> So do I need to split that patch into 2 and resubmit, or can it be applied like that?
Yes, split the patch into 2 independent patches and resubmit them, please.
Thanks.

Regards,
Ivan

> Thanks
> Konstantin
>
> -----Original Message-----
> From: Ivan Boule [mailto:ivan.boule at 6wind.com]
> Sent: Wednesday, April 30, 2014 10:49 AM
> To: Ananyev, Konstantin; dev at dpdk.org
> Subject: Re: [dpdk-dev] [PATCH] ixgbevf jumbo frame issue with DPDK VF
>
> Hi Konstantin,
>
> The content's of your patch is OK.
> However, the following fix in the function `eth_igbvf_rx_init`:
>
> -		if (hw->mac.type == e1000_82576) {
> +		if (hw->mac.type ==  e1000_vfadapt) {
>
> should be sent in a different patch (without the spurious blank
> character ) ,
> as this fix is not related to the jumbo frame issue that is addressed here.
>
> Regards,
> Ivan
>
>    On 04/24/2014 06:45 PM, Ananyev, Konstantin wrote:
>> When latest Linux ixgbe PF is used, and DPDK VF is used in DPDK application,
>> jumbo frames are not received.
>> Also - if Linux ixgbe PF has MTU set to 1500 (default),
>> then normal sized packets can be received by DPDK VF.
>> However, if Linux PF has MTU > 1500, then DPDK VF receives no packets
>> (normal or jumbo).
>> With ixgbe_mbox_api_10 ixgbe simply didn't allow set VF MTU > 1514 for 82599.
>> With ixgbe_mbox_ajpi_11 it does, though now, if PF uses jumbo frames,
>> it simply disables RX for all VFs.
>> So to work with PF ithat using jumbo frames, at startup each VF has to:
>> 1. negotiate with PF mbox_api_11.
>> 2. Send to PF SET_LPE message with desired MTU.
>> Note, that if PF already uses MTU bigger then asked by the VF,
>> then PF wouldn't take any action.
>>
>> Signed-off-by: Konstantin Ananyev <konstantin.ananyev at intel.com>
>> ---
>>    lib/librte_pmd_e1000/igb_rxtx.c     |    7 ++++-
>>    lib/librte_pmd_ixgbe/ixgbe_ethdev.c |   47 ++++++++++++++++++++++++----------
>>    lib/librte_pmd_ixgbe/ixgbe_rxtx.c   |    4 +++
>>    3 files changed, 43 insertions(+), 15 deletions(-)
>>
>> diff --git a/lib/librte_pmd_e1000/igb_rxtx.c b/lib/librte_pmd_e1000/igb_rxtx.c
>> index 4608595..1ebe2f5 100644
>> --- a/lib/librte_pmd_e1000/igb_rxtx.c
>> +++ b/lib/librte_pmd_e1000/igb_rxtx.c
>> @@ -2077,6 +2077,11 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev)
>>    
>>    	hw = E1000_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>    
>> +	/* setup MTU */
>> +	e1000_rlpml_set_vf(hw,
>> +		(uint16_t)(dev->data->dev_conf.rxmode.max_rx_pkt_len +
>> +		VLAN_TAG_SIZE));
>> +
>>    	/* Configure and enable each RX queue. */
>>    	rctl_bsize = 0;
>>    	dev->rx_pkt_burst = eth_igb_recv_pkts;
>> @@ -2149,7 +2154,7 @@ eth_igbvf_rx_init(struct rte_eth_dev *dev)
>>    		rxdctl &= 0xFFF00000;
>>    		rxdctl |= (rxq->pthresh & 0x1F);
>>    		rxdctl |= ((rxq->hthresh & 0x1F) << 8);
>> -		if (hw->mac.type == e1000_82576) {
>> +		if (hw->mac.type ==  e1000_vfadapt) {
>>    			/*
>>    			 * Workaround of 82576 VF Erratum
>>    			 * force set WTHRESH to 1
>> diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
>> index a5a7f9a..6dd52d7 100644
>> --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
>> +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c
>> @@ -808,19 +808,30 @@ eth_ixgbe_dev_init(__attribute__((unused)) struct eth_driver *eth_drv,
>>    	return 0;
>>    }
>>    
>> -static void ixgbevf_get_queue_num(struct ixgbe_hw *hw)
>> +
>> +/*
>> + * Negotiate mailbox API version with the PF.
>> + * After reset API version is always set to the basic one (ixgbe_mbox_api_10).
>> + * Then we try to negotiate starting with the most recent one.
>> + * If all negotiation attempts fail, then we will proceed with
>> + * the default one (ixgbe_mbox_api_10).
>> + */
>> +static void
>> +ixgbevf_negotiate_api(struct ixgbe_hw *hw)
>>    {
>> -	/* Traffic classes are not supported by now */
>> -	unsigned int tcs, tc;
>> +	int32_t i;
>>    
>> -	/*
>> -	 * Must let PF know we are at mailbox API version 1.1.
>> -	 * Otherwise PF won't answer properly.
>> -	 * In case that PF fails to provide Rx/Tx queue number,
>> -	 * max_tx_queues and max_rx_queues remain to be 1.
>> -	 */
>> -	if (!ixgbevf_negotiate_api_version(hw, ixgbe_mbox_api_11))
>> -		ixgbevf_get_queues(hw, &tcs, &tc);
>> +	/* start with highest supported, proceed down */
>> +	static const enum ixgbe_pfvf_api_rev sup_ver[] = {
>> +		ixgbe_mbox_api_11,
>> +		ixgbe_mbox_api_10,
>> +	};
>> +
>> +	for (i = 0;
>> +			i != RTE_DIM(sup_ver) &&
>> +			ixgbevf_negotiate_api_version(hw, sup_ver[i]) != 0;
>> +			i++)
>> +		;
>>    }
>>    
>>    /*
>> @@ -830,9 +841,11 @@ static int
>>    eth_ixgbevf_dev_init(__attribute__((unused)) struct eth_driver *eth_drv,
>>    		     struct rte_eth_dev *eth_dev)
>>    {
>> -	struct rte_pci_device *pci_dev;
>> -	struct ixgbe_hw *hw = IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
>>    	int diag;
>> +	uint32_t tc, tcs;
>> +	struct rte_pci_device *pci_dev;
>> +	struct ixgbe_hw *hw =
>> +		IXGBE_DEV_PRIVATE_TO_HW(eth_dev->data->dev_private);
>>    	struct ixgbe_vfta * shadow_vfta =
>>    		IXGBE_DEV_PRIVATE_TO_VFTA(eth_dev->data->dev_private);
>>    	struct ixgbe_hwstrip *hwstrip =
>> @@ -891,8 +904,11 @@ eth_ixgbevf_dev_init(__attribute__((unused)) struct eth_driver *eth_drv,
>>    		return (diag);
>>    	}
>>    
>> +	/* negotiate mailbox API version to use with the PF. */
>> +	ixgbevf_negotiate_api(hw);
>> +
>>    	/* Get Rx/Tx queue count via mailbox, which is ready after reset_hw */
>> -	ixgbevf_get_queue_num(hw);
>> +	ixgbevf_get_queues(hw, &tcs, &tc);
>>    
>>    	/* Allocate memory for storing MAC addresses */
>>    	eth_dev->data->mac_addrs = rte_zmalloc("ixgbevf", ETHER_ADDR_LEN *
>> @@ -2518,6 +2534,9 @@ ixgbevf_dev_start(struct rte_eth_dev *dev)
>>    
>>    	hw->mac.ops.reset_hw(hw);
>>    
>> +	/* negotiate mailbox API version to use with the PF. */
>> +	ixgbevf_negotiate_api(hw);
>> +
>>    	ixgbevf_dev_tx_init(dev);
>>    
>>    	/* This can fail when allocating mbufs for descriptor rings */
>> diff --git a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
>> index 55414b9..7930dbd 100644
>> --- a/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
>> +++ b/lib/librte_pmd_ixgbe/ixgbe_rxtx.c
>> @@ -3594,6 +3594,10 @@ ixgbevf_dev_rx_init(struct rte_eth_dev *dev)
>>    	PMD_INIT_FUNC_TRACE();
>>    	hw = IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private);
>>    
>> +	/* setup MTU */
>> +	ixgbevf_rlpml_set_vf(hw,
>> +		(uint16_t)dev->data->dev_conf.rxmode.max_rx_pkt_len);
>> +
>>    	/* Setup RX queues */
>>    	dev->rx_pkt_burst = ixgbe_recv_pkts;
>>    	for (i = 0; i < dev->data->nb_rx_queues; i++) {
>


-- 
Ivan Boule
6WIND Development Engineer



More information about the dev mailing list