lkml.org 
[lkml]   [2022]   [Jun]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 102/298] sfc: fix considering that all channels have TX queues
    Date
    From: Martin Habets <habetsm.xilinx@gmail.com>

    [ Upstream commit 2e102b53f8a778f872dc137f4c7ac548705817aa ]

    Normally, all channels have RX and TX queues, but this is not true if
    modparam efx_separate_tx_channels=1 is used. In that cases, some
    channels only have RX queues and others only TX queues (or more
    preciselly, they have them allocated, but not initialized).

    Fix efx_channel_has_tx_queues to return the correct value for this case
    too.

    Messages shown at probe time before the fix:
    sfc 0000:03:00.0 ens6f0np0: MC command 0x82 inlen 544 failed rc=-22 (raw=0) arg=0
    ------------[ cut here ]------------
    netdevice: ens6f0np0: failed to initialise TXQ -1
    WARNING: CPU: 1 PID: 626 at drivers/net/ethernet/sfc/ef10.c:2393 efx_ef10_tx_init+0x201/0x300 [sfc]
    [...] stripped
    RIP: 0010:efx_ef10_tx_init+0x201/0x300 [sfc]
    [...] stripped
    Call Trace:
    efx_init_tx_queue+0xaa/0xf0 [sfc]
    efx_start_channels+0x49/0x120 [sfc]
    efx_start_all+0x1f8/0x430 [sfc]
    efx_net_open+0x5a/0xe0 [sfc]
    __dev_open+0xd0/0x190
    __dev_change_flags+0x1b3/0x220
    dev_change_flags+0x21/0x60
    [...] stripped

    Messages shown at remove time before the fix:
    sfc 0000:03:00.0 ens6f0np0: failed to flush 10 queues
    sfc 0000:03:00.0 ens6f0np0: failed to flush queues

    Fixes: 8700aff08984 ("sfc: fix channel allocation with brute force")
    Reported-by: Tianhao Zhao <tizhao@redhat.com>
    Signed-off-by: Martin Habets <habetsm.xilinx@gmail.com>
    Tested-by: Íñigo Huguet <ihuguet@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/net/ethernet/sfc/net_driver.h | 2 +-
    1 file changed, 1 insertion(+), 1 deletion(-)

    diff --git a/drivers/net/ethernet/sfc/net_driver.h b/drivers/net/ethernet/sfc/net_driver.h
    index cc15ee8812d9..8a9eedec177a 100644
    --- a/drivers/net/ethernet/sfc/net_driver.h
    +++ b/drivers/net/ethernet/sfc/net_driver.h
    @@ -1533,7 +1533,7 @@ static inline bool efx_channel_is_xdp_tx(struct efx_channel *channel)

    static inline bool efx_channel_has_tx_queues(struct efx_channel *channel)
    {
    - return true;
    + return channel && channel->channel >= channel->efx->tx_channel_offset;
    }

    static inline unsigned int efx_channel_num_tx_queues(struct efx_channel *channel)
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-13 16:26    [W:3.031 / U:0.120 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site