[dpdk-dev] [PATCH v3] ether: use a default for max Rx frame size in configure()
Thomas Monjalon
thomas at monjalon.net
Tue Aug 1 00:33:05 CEST 2017
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:
> >> 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