Skip to content
Permalink
Vladimir-Oltea…
Switch branches/tags

Commits on Aug 10, 2021

  1. net: dsa: tag_8021q: finish conversion to dsa_switch_for_each_port

    The tag_8021q cross-chip notifiers have been converted to iterate using
    dp, but the setup and teardown functions have not yet. This patch makes
    that change.
    
    Note that we jump directly to the "for_each_available_port" variant
    because it didn't make too much sense to set up tag_8021q for unused
    ports even before, but skipping them was too much of a hassle.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  2. net: dsa: convert cross-chip notifiers to iterate using dp

    The majority of cross-chip switch notifiers need to filter in some way
    over the type of ports: some install VLANs etc on all cascade ports.
    
    The difference is that the matching function, which filters by port
    type, is separate from the function where the iteration happens. So this
    patch needs to refactor the matching functions' prototypes as well, to
    take the dp as argument.
    
    In a future patch/series, I might convert dsa_towards_port to return a
    struct dsa_port *dp too, but at the moment it is a bit entangled with
    dsa_routing_port which is also used by mv88e6xxx and they both return an
    int port. So keep dsa_towards_port the way it is and convert it into a
    dp using dsa_to_port.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  3. net: dsa: remove gratuitous use of dsa_is_{user,dsa,cpu}_port

    Find the occurrences of dsa_is_{user,dsa,cpu}_port where a struct
    dsa_port *dp was already available in the function scope, and replace
    them with the dsa_port_is_{user,dsa,cpu} equivalent function which uses
    that dp directly and does not perform another hidden dsa_to_port().
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  4. net: dsa: finish conversion to dsa_switch_for_each_port

    What is left is a 'beauty' conversion, since the performance is in no
    way different than before.
    
    Find the remaining iterators over dst->ports that only filter for the
    ports belonging to a certain switch, and replace those with the
    dsa_switch_for_each_port helper that we have now.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  5. net: dsa: b53: express b53_for_each_port in terms of dsa_switch_for_e…

    …ach_port
    
    Merging the two allows us to remove the open-coded
    "dev->enabled_ports & BIT(i)" check from b53_br_join and b53_br_leave,
    while still avoiding a quadratic iteration through the switch's ports.
    
    Sadly I don't know if it's possible to completely get rid of
    b53_for_each_port and replace it with dsa_switch_for_each_available_port,
    especially for the platforms that use pdata and not OF bindings.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  6. net: dsa: remove the "dsa_to_port in a loop" antipattern from drivers

    Since the DSA conversion from the ds->ports array into the dst->ports
    list, the DSA API has encouraged driver writers to write inefficient
    code.
    
    Currently, switch drivers which want to filter by a specific type of
    port when iterating, like {!unused, user, cpu, dsa}, use the
    dsa_is_*_port helper. Under the hood, this uses dsa_to_port which
    iterates again through dst->ports. But the driver iterates through the
    port list already, so the complexity is quadratic for the typical case
    of a single-switch tree.
    
    Many drivers also call dsa_to_port many times while iterating and do not
    even cache the result, probably unaware of the hidden complexity of this
    function.
    
    When drivers need to iterate between pairs of {to, from} ports, and use
    any of the functions above, the complexity is even higher.
    
    Use the newly introduced DSA port iterators, and also introduce some
    more which are not directly needed by the DSA core.
    
    Note that the b53_br_{join,leave} functions have been converted to use
    the dp-based iterators, but to preserve the original behavior, the
    dev->enabled_ports check from b53_for_each_port has been split out and
    open-coded. This will be addressed in the next patch.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  7. net: dsa: remove the "dsa_to_port in a loop" antipattern from the core

    Ever since Vivien's conversion of the ds->ports array into a dst->ports
    list, and the introduction of dsa_to_port, iterations through the ports
    of a switch became quadratic whenever dsa_to_port was needed.
    
    dsa_to_port can either be called directly, or indirectly through the
    dsa_is_{user,cpu,dsa,unused}_port helpers.
    
    Introduce a basic switch port iterator macro, dsa_switch_for_each_port,
    that works with the iterator variable being a struct dsa_port *dp
    directly, and not an int i. It is an expensive variable to go from i to
    dp, but cheap to go from dp to i.
    
    This macro iterates through the entire ds->dst->ports list and filters
    by the ports belonging just to the switch provided as argument.
    
    While at it, provide some more flavors of that macro which filter for
    specific types of ports: at the moment just user ports and CPU ports.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021
  8. net: dsa: introduce a dsa_port_is_unused helper

    Similar to the existing dsa_port_is_{cpu,user,dsa} helpers which operate
    directly on a struct dsa_port *dp, let's introduce the equivalent of
    dsa_is_unused_port. We will use this to create a more efficient iterator
    over the available ports of a switch.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
    vladimiroltean authored and intel-lab-lkp committed Aug 10, 2021

Commits on Aug 9, 2021

  1. Merge branch 'add-frag-page-support-in-page-pool'

    Yunsheng Lin says:
    
    ====================
    add frag page support in page pool
    
    This patchset adds frag page support in page pool and
    enable skb's page frag recycling based on page pool in
    hns3 drvier.
    ====================
    
    Link: https://lore.kernel.org/r/1628217982-53533-1-git-send-email-linyunsheng@huawei.com
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Jakub Kicinski committed Aug 9, 2021
  2. net: hns3: support skb's frag page recycling based on page pool

    This patch adds skb's frag page recycling support based on
    the frag page support in page pool.
    
    The performance improves above 10~20% for single thread iperf
    TCP flow with IOMMU disabled when iperf server and irq/NAPI
    have a different CPU.
    
    The performance improves about 135%(14Gbit to 33Gbit) for single
    thread iperf TCP flow when IOMMU is in strict mode and iperf
    server shares the same cpu with irq/NAPI.
    
    Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Yunsheng Lin authored and Jakub Kicinski committed Aug 9, 2021
  3. page_pool: add frag page recycling support in page pool

    Currently page pool only support page recycling when there
    is only one user of the page, and the split page reusing
    implemented in the most driver can not use the page pool as
    bing-pong way of reusing requires the multi user support in
    page pool.
    
    Those reusing or recycling has below limitations:
    1. page from page pool can only be used be one user in order
       for the page recycling to happen.
    2. Bing-pong way of reusing in most driver does not support
       multi desc using different part of the same page in order
       to save memory.
    
    So add multi-users support and frag page recycling in page
    pool to overcome the above limitation.
    
    Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Yunsheng Lin authored and Jakub Kicinski committed Aug 9, 2021
  4. page_pool: add interface to manipulate frag count in page pool

    For 32 bit systems with 64 bit dma, dma_addr[1] is used to
    store the upper 32 bit dma addr, those system should be rare
    those days.
    
    For normal system, the dma_addr[1] in 'struct page' is not
    used, so we can reuse dma_addr[1] for storing frag count,
    which means how many frags this page might be splited to.
    
    In order to simplify the page frag support in the page pool,
    the PAGE_POOL_DMA_USE_PP_FRAG_COUNT macro is added to indicate
    the 32 bit systems with 64 bit dma, and the page frag support
    in page pool is disabled for such system.
    
    The newly added page_pool_set_frag_count() is called to reserve
    the maximum frag count before any page frag is passed to the
    user. The page_pool_atomic_sub_frag_count_return() is called
    when user is done with the page frag.
    
    Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Yunsheng Lin authored and Jakub Kicinski committed Aug 9, 2021
  5. page_pool: keep pp info as long as page pool owns the page

    Currently, page->pp is cleared and set everytime the page
    is recycled, which is unnecessary.
    
    So only set the page->pp when the page is added to the page
    pool and only clear it when the page is released from the
    page pool.
    
    This is also a preparation to support allocating frag page
    in page pool.
    
    Reviewed-by: Ilias Apalodimas <ilias.apalodimas@linaro.org>
    Signed-off-by: Yunsheng Lin <linyunsheng@huawei.com>
    Signed-off-by: Jakub Kicinski <kuba@kernel.org>
    Yunsheng Lin authored and Jakub Kicinski committed Aug 9, 2021
  6. devlink: Fix port_type_set function pointer check

    Fix a typo when checking existence of port_type_set function pointer.
    
    Fixes: 82564f6 ("devlink: Simplify devlink port API calls")
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Leon Romanovsky authored and davem330 committed Aug 9, 2021
  7. net: fec: fix build error for ARCH m68k

    reproduce:
    	wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
    	chmod +x ~/bin/make.cross
    	make.cross ARCH=m68k  m5272c3_defconfig
    	make.cross ARCH=m68k
    
       drivers/net/ethernet/freescale/fec_main.c: In function 'fec_enet_eee_mode_set':
    >> drivers/net/ethernet/freescale/fec_main.c:2758:33: error: 'FEC_LPI_SLEEP' undeclared (first use in this function); did you mean 'FEC_ECR_SLEEP'?
        2758 |  writel(sleep_cycle, fep->hwp + FEC_LPI_SLEEP);
             |                                 ^~~~~~~~~~~~~
       arch/m68k/include/asm/io_no.h:25:66: note: in definition of macro '__raw_writel'
          25 | #define __raw_writel(b, addr) (void)((*(__force volatile u32 *) (addr)) = (b))
             |                                                                  ^~~~
       drivers/net/ethernet/freescale/fec_main.c:2758:2: note: in expansion of macro 'writel'
        2758 |  writel(sleep_cycle, fep->hwp + FEC_LPI_SLEEP);
             |  ^~~~~~
       drivers/net/ethernet/freescale/fec_main.c:2758:33: note: each undeclared identifier is reported only once for each function it appears in
        2758 |  writel(sleep_cycle, fep->hwp + FEC_LPI_SLEEP);
             |                                 ^~~~~~~~~~~~~
       arch/m68k/include/asm/io_no.h:25:66: note: in definition of macro '__raw_writel'
          25 | #define __raw_writel(b, addr) (void)((*(__force volatile u32 *) (addr)) = (b))
             |                                                                  ^~~~
       drivers/net/ethernet/freescale/fec_main.c:2758:2: note: in expansion of macro 'writel'
        2758 |  writel(sleep_cycle, fep->hwp + FEC_LPI_SLEEP);
             |  ^~~~~~
    >> drivers/net/ethernet/freescale/fec_main.c:2759:32: error: 'FEC_LPI_WAKE' undeclared (first use in this function)
        2759 |  writel(wake_cycle, fep->hwp + FEC_LPI_WAKE);
             |                                ^~~~~~~~~~~~
       arch/m68k/include/asm/io_no.h:25:66: note: in definition of macro '__raw_writel'
          25 | #define __raw_writel(b, addr) (void)((*(__force volatile u32 *) (addr)) = (b))
             |                                                                  ^~~~
       drivers/net/ethernet/freescale/fec_main.c:2759:2: note: in expansion of macro 'writel'
        2759 |  writel(wake_cycle, fep->hwp + FEC_LPI_WAKE);
             |  ^~~~~~
    
    This patch adds register definition for M5272 platform to pass build.
    
    Fixes: b82f8c3 ("net: fec: add eee mode tx lpi support")
    Reported-by: kernel test robot <lkp@intel.com>
    Signed-off-by: Joakim Zhang <qiangqing.zhang@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Joakim Zhang authored and davem330 committed Aug 9, 2021
  8. net/smc: Allow SMC-D 1MB DMB allocations

    Commit a3fe3d0 ("net/smc: introduce sg-logic for RMBs") introduced
    a restriction for RMB allocations as used by SMC-R. However, SMC-D does
    not use scatter-gather lists to back its DMBs, yet it was limited by
    this restriction, still.
    This patch exempts SMC, but limits allocations to the maximum RMB/DMB
    size respectively.
    
    Signed-off-by: Stefan Raspl <raspl@linux.ibm.com>
    Signed-off-by: Guvenc Gulce <guvenc@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Stefan Raspl authored and davem330 committed Aug 9, 2021
  9. devlink: Set device as early as possible

    All kernel devlink implementations call to devlink_alloc() during
    initialization routine for specific device which is used later as
    a parent device for devlink_register().
    
    Such late device assignment causes to the situation which requires us to
    call to device_register() before setting other parameters, but that call
    opens devlink to the world and makes accessible for the netlink users.
    
    Any attempt to move devlink_register() to be the last call generates the
    following error due to access to the devlink->dev pointer.
    
    [    8.758862]  devlink_nl_param_fill+0x2e8/0xe50
    [    8.760305]  devlink_param_notify+0x6d/0x180
    [    8.760435]  __devlink_params_register+0x2f1/0x670
    [    8.760558]  devlink_params_register+0x1e/0x20
    
    The simple change of API to set devlink device in the devlink_alloc()
    instead of devlink_register() fixes all this above and ensures that
    prior to call to devlink_register() everything already set.
    
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Reviewed-by: Jiri Pirko <jiri@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Leon Romanovsky authored and davem330 committed Aug 9, 2021
  10. wwan: mhi: Fix missing spin_lock_init() in mhi_mbim_probe()

    The driver allocates the spinlock but not initialize it.
    Use spin_lock_init() on it to initialize it correctly.
    
    Fixes: aa730a9 ("net: wwan: Add MHI MBIM network driver")
    Reported-by: Hulk Robot <hulkci@huawei.com>
    Signed-off-by: Wei Yongjun <weiyongjun1@huawei.com>
    Reviewed-by: Sergey Ryazanov <ryazanov.s.a@gmail.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Wei Yongjun authored and davem330 committed Aug 9, 2021
  11. Merge branch 'iucv-next'

    Karsten Graul says:
    
    ====================
    net/iucv: updates 2021-08-09
    
    Please apply the following iucv patches to netdev's net-next tree.
    
    Remove the usage of register asm statements and replace deprecated
    CPU-hotplug functions with the current version.
    Use use consume_skb() instead of kfree_skb() to avoid flooding
    dropwatch with false-positives, and 2 patches with cleanups.
    ====================
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    davem330 committed Aug 9, 2021
  12. net/iucv: Replace deprecated CPU-hotplug functions.

    The functions get_online_cpus() and put_online_cpus() have been
    deprecated during the CPU hotplug rework. They map directly to
    cpus_read_lock() and cpus_read_unlock().
    
    Replace deprecated CPU-hotplug functions with the official version.
    The behavior remains unchanged.
    
    Cc: Julian Wiedmann <jwi@linux.ibm.com>
    Cc: Karsten Graul <kgraul@linux.ibm.com>
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Jakub Kicinski <kuba@kernel.org>
    Cc: linux-s390@vger.kernel.org
    Cc: netdev@vger.kernel.org
    Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
    Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Sebastian Andrzej Siewior authored and davem330 committed Aug 9, 2021
  13. net/iucv: get rid of register asm usage

    Using register asm statements has been proven to be very error prone,
    especially when using code instrumentation where gcc may add function
    calls, which clobbers register contents in an unexpected way.
    
    Therefore get rid of register asm statements in iucv code, even though
    there is currently nothing wrong with it. This way we know for sure
    that the above mentioned bug class won't be introduced here.
    
    Acked-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    hcahca authored and davem330 committed Aug 9, 2021
  14. net/af_iucv: remove wrappers around iucv (de-)registration

    These wrappers are just unnecessary obfuscation.
    
    Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    julianwiedmann authored and davem330 committed Aug 9, 2021
  15. net/af_iucv: clean up a try_then_request_module()

    Use IS_ENABLED(CONFIG_IUCV) to determine whether the iucv_if symbol
    is available, and let depmod deal with the module dependency.
    
    This was introduced back with commit 6fcd61f ("af_iucv: use
    loadable iucv interface"). And to avoid sprinkling IS_ENABLED() over
    all the code, we're keeping the indirection through pr_iucv->...().
    
    Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    julianwiedmann authored and davem330 committed Aug 9, 2021
  16. net/af_iucv: support drop monitoring

    Change the good paths to use consume_skb() instead of kfree_skb(). This
    avoids flooding dropwatch with false-positives.
    
    Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
    Signed-off-by: Karsten Graul <kgraul@linux.ibm.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    julianwiedmann authored and davem330 committed Aug 9, 2021
  17. Merge branch 'dsa-fast-ageing'

    Vladimir Oltean says:
    
    ====================
    DSA fast ageing fixes/improvements
    
    These are 2 small improvements brought to the DSA fast ageing changes
    merged earlier today.
    
    Patch 1 restores the behavior for DSA drivers that don't implement the
    .port_bridge_flags function (I don't think there is any breakage due
    to the new behavior, but just to be sure). This came as a result of
    Andrew's review.
    
    Patch 2 reduces the number of fast ages of a port from 2 to 1 when it
    leaves a bridge.
    ====================
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    davem330 committed Aug 9, 2021
  18. net: dsa: avoid fast ageing twice when port leaves a bridge

    Drivers that support both the toggling of address learning and dynamic
    FDB flushing (mv88e6xxx, b53, sja1105) currently need to fast-age a port
    twice when it leaves a bridge:
    
    - once, when del_nbp() calls br_stp_disable_port() which puts the port
      in the BLOCKING state
    - twice, when dsa_port_switchdev_unsync_attrs() calls
      dsa_port_clear_brport_flags() which disables address learning
    
    The knee-jerk reaction might be to say "dsa_port_clear_brport_flags does
    not need to fast-age the port at all", but the thing is, we still need
    both code paths to flush the dynamic FDB entries in different situations.
    When a DSA switch port leaves a bonding/team interface that is (still) a
    bridge port, no del_nbp() will be called, so we rely on
    dsa_port_clear_brport_flags() function to restore proper standalone port
    functionality with address learning disabled.
    
    So the solution is just to avoid double the work when both code paths
    are called in series. Luckily, DSA already caches the STP port state, so
    we can skip flushing the dynamic FDB when we disable address learning
    and the STP state is one where no address learning takes place at all.
    Under that condition, not flushing the FDB is safe because there is
    supposed to not be any dynamic FDB entry at all (they were flushed
    during the transition towards that state, and none were learned in the
    meanwhile).
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 9, 2021
  19. net: dsa: still fast-age ports joining a bridge if they can't configu…

    …re learning
    
    Commit 39f3210 ("net: dsa: don't fast age standalone ports")
    assumed that all standalone ports disable address learning, but if the
    switch driver implements .port_fast_age but not .port_bridge_flags (like
    ksz9477, ksz8795, lantiq_gswip, lan9303), then that might not actually
    be true.
    
    So whereas before, the bridge temporarily walking us through the
    BLOCKING STP state meant that the standalone ports had a checkpoint to
    flush their baggage and start fresh when they join a bridge, after that
    commit they no longer do.
    
    Restore the old behavior for these drivers by checking if the switch can
    toggle address learning. If it can't, disregard the "do_fast_age"
    argument and unconditionally perform fast ageing on STP state changes.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 9, 2021

Commits on Aug 8, 2021

  1. Merge branch 'sja1105-fast-ageing'

    Vladimir Oltean says:
    
    ====================
    Fast ageing support for SJA1105 DSA driver
    
    While adding support for flushing dynamically learned FDB entries in the
    sja1105 driver, I noticed a few things that could be improved in DSA.
    Most notably, drivers could omit a fast age when address learning is
    turned off, which might mean that ports leaving a bridge and becoming
    standalone could still have FDB entries pointing towards them. Secondly,
    when DSA fast ages a port after the 'learning' flag has been turned off,
    the software bridge still has the dynamically learned 'master' FDB
    entries installed, and those should be deleted too.
    ====================
    
    Signed-off-by: David S. Miller <davem@davemloft.net>
    davem330 committed Aug 8, 2021
  2. net: dsa: sja1105: add FDB fast ageing support

    Delete the dynamically learned FDB entries when the STP state changes
    and when address learning is disabled.
    
    On sja1105 there is no shorthand SPI command for this, so we need to
    walk through the entire FDB to delete.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 8, 2021
  3. net: dsa: sja1105: rely on DSA core tracking of port learning state

    Now that DSA keeps track of the port learning state, it becomes
    superfluous to keep an additional variable with this information in the
    sja1105 driver. Remove it.
    
    The DSA core's learning state is present in struct dsa_port *dp.
    To avoid the antipattern where we iterate through a DSA switch's
    ports and then call dsa_to_port to obtain the "dp" reference (which is
    bad because dsa_to_port iterates through the DSA switch tree once
    again), just iterate through the dst->ports and operate on those
    directly.
    
    The sja1105 had an extra use of priv->learn_ena on non-user ports. DSA
    does not touch the learning state of those ports - drivers are free to
    do what they wish on them. Mark that information with a comment in
    struct dsa_port and let sja1105 set dp->learning for cascade ports.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 8, 2021
  4. net: dsa: flush the dynamic FDB of the software bridge when fast agei…

    …ng a port
    
    Currently, when DSA performs fast ageing on a port, 'bridge fdb' shows
    us that the 'self' entries (corresponding to the hardware bridge, as
    printed by dsa_slave_fdb_dump) are deleted, but the 'master' entries
    (corresponding to the software bridge) aren't.
    
    Indeed, searching through the bridge driver, neither the
    brport_attr_learning handler nor the IFLA_BRPORT_LEARNING handler call
    br_fdb_delete_by_port. However, br_stp_disable_port does, which is one
    of the paths which DSA uses to trigger a fast ageing process anyway.
    
    There is, however, one other very promising caller of
    br_fdb_delete_by_port, and that is the bridge driver's handler of the
    SWITCHDEV_FDB_FLUSH_TO_BRIDGE atomic notifier. Currently the s390/qeth
    HiperSockets card driver is the only user of this.
    
    I can't say I understand that driver's architecture or interaction with
    the bridge, but it appears to not be a switchdev driver in the traditional
    sense of the word. Nonetheless, the mechanism it provides is a useful
    way for DSA to express the fact that it performs fast ageing too, in a
    way that does not change the existing behavior for other drivers.
    
    Cc: Alexandra Winter <wintera@linux.ibm.com>
    Cc: Julian Wiedmann <jwi@linux.ibm.com>
    Cc: Roopa Prabhu <roopa@nvidia.com>
    Cc: Nikolay Aleksandrov <nikolay@nvidia.com>
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 8, 2021
  5. net: dsa: don't fast age bridge ports with learning turned off

    On topology changes, stations that were dynamically learned on ports
    that are no longer part of the active topology must be flushed - this is
    described by clause "17.11 Updating learned station location information"
    of IEEE 802.1D-2004.
    
    However, when address learning on the bridge port is turned off in the
    first place, there is nothing to flush, so skip a potentially expensive
    operation.
    
    We can finally do this now since DSA is aware of the learning state of
    its bridged ports.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 8, 2021
  6. net: dsa: centralize fast ageing when address learning is turned off

    Currently DSA leaves it down to device drivers to fast age the FDB on a
    port when address learning is disabled on it. There are 2 reasons for
    doing that in the first place:
    
    - when address learning is disabled by user space, through
      IFLA_BRPORT_LEARNING or the brport_attr_learning sysfs, what user
      space typically wants to achieve is to operate in a mode with no
      dynamic FDB entry on that port. But if the port is already up, some
      addresses might have been already learned on it, and it seems silly to
      wait for 5 minutes for them to expire until something useful can be
      done.
    
    - when a port leaves a bridge and becomes standalone, DSA turns off
      address learning on it. This also has the nice side effect of flushing
      the dynamically learned bridge FDB entries on it, which is a good idea
      because standalone ports should not have bridge FDB entries on them.
    
    We let drivers manage fast ageing under this condition because if DSA
    were to do it, it would need to track each port's learning state, and
    act upon the transition, which it currently doesn't.
    
    But there are 2 reasons why doing it is better after all:
    
    - drivers might get it wrong and not do it (see b53_port_set_learning)
    
    - we would like to flush the dynamic entries from the software bridge
      too, and letting drivers do that would be another pain point
    
    So track the port learning state and trigger a fast age process
    automatically within DSA.
    
    Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    vladimiroltean authored and davem330 committed Aug 8, 2021
  7. atm: horizon: Fix spelling mistakes in TX comment

    It's "must not", not "musn't", meaning "shall not".
    Let's fix that.
    
    Suggested-by: Joe Perches <joe@perches.com>
    Signed-off-by: Jun Miao <jun.miao@windriver.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Jun Miao authored and davem330 committed Aug 8, 2021
  8. devlink: Simplify devlink port API calls

    Devlink port already has pointer to the devlink instance and all API
    calls that forward these devlink ports to the drivers perform same
    "devlink_port->devlink" assignment before actual call.
    
    This patch removes useless parameter and allows us in the future
    to create specific devlink_port_ops to manage user space access with
    reliable ops assignment.
    
    Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Leon Romanovsky authored and davem330 committed Aug 8, 2021
Older