[dpdk-dev] [PATCH v3] ether: use a default for max Rx frame size in configure()

Andriy Berestovskyy Andriy.Berestovskyy at caviumnetworks.com
Mon Apr 24 16:50:37 CEST 2017


Hey Thomas,

On 21.04.2017 00:25, Thomas Monjalon wrote:
>> The hardware is different, there is not much we can do about it.
>
> We can return an error if the max_rx_pkt_len cannot be set in the NIC.

Yes, we pass the value to the PMD, which might check the value and 
return an error.

 >> Nevertheless, we can fix the false comment and have a default for the
 >> jumbos, which is beneficial for the apps/examples.
 >
 > The examples are using a hardcoded value, so they need to be fixed
 > anyway.

We might change the hardcoded values to zeros once the patch is in. This 
will make the examples a bit more clear.


> This ethdev patch is about a behaviour change of the API.

The behaviour was not documented, so IMO it is not an issue.


> It is about considering 0 as a request for default value
> and return an error if a value cannot be set.

Right.


> It will require more agreements and changes in the drivers
> for returning an error where appropriate.

IMO the changes are transparent for the PMDs (please see below), but it 
might affect some applications. Here is the change in API behaviour:

Before the patch:
jumbo == 0, max_rx_pkt_len == 0, RESULT: max_rx_pkt_len = ETHER_MAX_LEN
jumbo == 0, max_rx_pkt_len == 10, RESULT: max_rx_pkt_len = ETHER_MAX_LEN
jumbo == 0, max_rx_pkt_len == 1200, RESULT: max_rx_pkt_len = 1200
jumbo == 0, max_rx_pkt_len == 9K, RESULT: max_rx_pkt_len = ETHER_MAX_LEN

jumbo == 1, max_rx_pkt_len == 0, RESULT: ERROR
jumbo == 1, max_rx_pkt_len == 10, RESULT: ERROR
jumbo == 1, max_rx_pkt_len == 1200, RESULT: max_rx_pkt_len = 1200
jumbo == 1, max_rx_pkt_len == 9K, RESULT: ERROR or max_rx_pkt_len = 9K
jumbo == 1, max_rx_pkt_len == 90K, RESULT: ERROR


After the patch:
jumbo == 0, max_rx_pkt_len == 0, RESULT: max_rx_pkt_len = ETHER_MAX_LEN
jumbo == 0, max_rx_pkt_len == 10, RESULT: ERROR (changed)
jumbo == 0, max_rx_pkt_len == 1200, RESULT: max_rx_pkt_len = 1200
jumbo == 0, max_rx_pkt_len == 9K, RESULT: ERROR (changed)

jumbo == 1, max_rx_pkt_len == 0, RESULT: max_rx_pkt_len = dev_info()
jumbo == 1, max_rx_pkt_len == 10, RESULT: ERROR
jumbo == 1, max_rx_pkt_len == 1200, RESULT: max_rx_pkt_len = 1200
jumbo == 1, max_rx_pkt_len == 9K, RESULT: ERROR or max_rx_pkt_len = 9K
jumbo == 1, max_rx_pkt_len == 90K, RESULT: ERROR

Only the apps which requested too small or too big normal frames will be 
affected. In most cases it will be rather an error in the app...


Also I have looked through all the PMDs to confirm they are not 
affected. Here is the summary:

af_packet
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = ETH_FRAME_LEN (1514)

ark
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = ETH_FRAME_LEN (16K - 128)

avp
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = avp->max_rx_pkt_len
rx_queue_setup() uses max_rx_pkt_len for scattering

bnx2x
configure() uses max_rx_pkt_len to set internal mtu
info() returns max_rx_pktlen = BNX2X_MAX_RX_PKT_LEN (15872)

bnxt
configure() uses max_rx_pkt_len to set internal mtu
info() returns max_rx_pktlen = BNXT_MAX_MTU + ETHER_HDR_LEN + 
ETHER_CRC_LEN + VLAN_TAG_SIZE (9000 + 14 + 4 + 4)

bonding
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = internals->candidate_max_rx_pktlen or 
ETHER_MAX_JUMBO_FRAME_LEN (0x3F00)

cxgbe
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = CXGBE_MAX_RX_PKTLEN (9000 + 14 + 4)
rx_queue_setup() checks max_rx_pkt_len boundaries

dpaa2
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = DPAA2_MAX_RX_PKT_LEN (10240)

e1000 (em)
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = em_get_max_pktlen() (0x2412, 0x1000, 
1518, 0x3f00, depends on model)

e1000 (igb)
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = 0x3fff
start() writes max_rx_pkt_len to HW for jumbo frames only
start() uses max_rx_pkt_len for scattering

ena
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = adapter->max_mtu
start() checks max_rx_pkt_len boundaries

enic
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = enic->max_mtu + 14 + 4

fm10k
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = FM10K_MAX_PKT_SIZE (15 * 1024)
start() uses max_rx_pkt_len for scattering

i40e
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = I40E_FRAME_SIZE_MAX (9728)
rx_queue_config() checks max_rx_pkt_len boundaries

ixgbe
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = 15872 (9728 for vf)
start() writes max_rx_pkt_len to HW for jumbo frames only
start() uses max_rx_pkt_len for scattering

kni
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = UINT32_MAX

liquidio
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = LIO_MAX_RX_PKTLEN (64K)
start() checks max_rx_pkt_len boundaries

mlx4
configure() uses max_rx_pkt_len for scattering
info() returns max_rx_pktlen = 65536

mlx5
configure() uses max_rx_pkt_len for scattering
info() returns max_rx_pktlen = 65536

nfp
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = hw->mtu

null
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = (uint32_t)-1

pcap
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = (uint32_t)-1

qede
configure() uses max_rx_pkt_len for scattering + internal data
info() returns max_rx_pktlen = ETH_TX_MAX_NON_LSO_PKT_LEN (9700 - 4 - 4 
- 12 - 8)

ring
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = (uint32_t)-1

sfc
configure() uses max_rx_pkt_len to set internal data
info() returns max_rx_pktlen = EFX_MAC_PDU_MAX (9202 + 14 + 4 + 4 + 16)

szedata2
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = (uint32_t)-1

tap
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = ETHER_MAX_VLAN_FRAME_LEN (1518 + 4)

thunderx
configure() uses max_rx_pkt_len for scattering + sets internal mtu
info() returns max_rx_pktlen = NIC_HW_MAX_FRS (9200)

vhost
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = (uint32_t)-1

virtio
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = VIRTIO_MAX_RX_PKTLEN (9728U)

vmxnet3
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = 16384;

xenvirt
configure() does not use max_rx_pkt_len
info() returns max_rx_pktlen = 2048


Regards,
Andriy


More information about the dev mailing list