Re: [PATCH v3] ether: use a default for max Rx frame size in configure()
flat view
From: Thomas Monjalon <hidden>
Date: 2017-07-31 22:33:07
We are missing some comments about this proposal. 24/04/2017 16:50, Andriy Berestovskyy:
Hey Thomas, On 21.04.2017 00:25, Thomas Monjalon wrote:quoted
quoted
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.quoted
This ethdev patch is about a behaviour change of the API.The behaviour was not documented, so IMO it is not an issue.quoted
It is about considering 0 as a request for default value and return an error if a value cannot be set.Right.quoted
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