Skip to content
  1. May 18, 2022
    • Ivan Vecera's avatar
      ice: Fix race during aux device (un)plugging · 4a5c4713
      Ivan Vecera authored
      [ Upstream commit 486b9eee ]
      
      Function ice_plug_aux_dev() assigns pf->adev field too early prior
      aux device initialization and on other side ice_unplug_aux_dev()
      starts aux device deinit and at the end assigns NULL to pf->adev.
      This is wrong because pf->adev should always be non-NULL only when
      aux device is fully initialized and ready. This wrong order causes
      a crash when ice_send_event_to_aux() call occurs because that function
      depends on non-NULL value of pf->adev and does not assume that
      aux device is half-initialized or half-destroyed.
      After order correction the race window is tiny but it is still there,
      as Leon mentioned and manipulation with pf->adev needs to be protected
      by mutex.
      
      Fix (un-)plugging functions so pf->adev field is set after aux device
      init and prior aux device destroy and protect pf->adev assignment by
      new mutex. This mutex is also held during ice_send_event_to_aux()
      call to ensure that aux device is valid during that call.
      Note that device lock used ice_send_event_to_aux() needs to be kept
      to avoid race with aux drv unload.
      
      Reproducer:
      cycle=1
      while :;do
              echo "#### Cycle: $cycle"
      
              ip link set ens7f0 mtu 9000
              ip link add bond0 type bond mode 1 miimon 100
              ip link set bond0 up
              ifenslave bond0 ens7f0
              ip link set bond0 mtu 9000
              ethtool -L ens7f0 combined 1
              ip link del bond0
              ip link set ens7f0 mtu 1500
              sleep 1
      
              let cycle++
      done
      
      In short when the device is added/removed to/from bond the aux device
      is unplugged/plugged. When MTU of the device is changed an event is
      sent to aux device asynchronously. This can race with (un)plugging
      operation and because pf->adev is set too early (plug) or too late
      (unplug) the function ice_send_event_to_aux() can touch uninitialized
      or destroyed fields. In the case of crash below pf->adev->dev.mutex.
      
      Crash:
      [   53.372066] bond0: (slave ens7f0): making interface the new active one
      [   53.378622] bond0: (slave ens7f0): Enslaving as an active interface with an u
      p link
      [   53.386294] IPv6: ADDRCONF(NETDEV_CHANGE): bond0: link becomes ready
      [   53.549104] bond0: (slave ens7f1): Enslaving as a backup interface with an up
       link
      [   54.118906] ice 0000:ca:00.0 ens7f0: Number of in use tx queues changed inval
      idating tc mappings. Priority traffic classification disabled!
      [   54.233374] ice 0000:ca:00.1 ens7f1: Number of in use tx queues changed inval
      idating tc mappings. Priority traffic classification disabled!
      [   54.248204] bond0: (slave ens7f0): Releasing backup interface
      [   54.253955] bond0: (slave ens7f1): making interface the new active one
      [   54.274875] bond0: (slave ens7f1): Releasing backup interface
      [   54.289153] bond0 (unregistering): Released all slaves
      [   55.383179] MII link monitoring set to 100 ms
      [   55.398696] bond0: (slave ens7f0): making interface the new active one
      [   55.405241] BUG: kernel NULL pointer dereference, address: 0000000000000080
      [   55.405289] bond0: (slave ens7f0): Enslaving as an active interface with an u
      p link
      [   55.412198] #PF: supervisor write access in kernel mode
      [   55.412200] #PF: error_code(0x0002) - not-present page
      [   55.412201] PGD 25d2ad067 P4D 0
      [   55.412204] Oops: 0002 [#1] PREEMPT SMP NOPTI
      [   55.412207] CPU: 0 PID: 403 Comm: kworker/0:2 Kdump: loaded Tainted: G S
                 5.17.0-13579-g57f2d6540f03 #1
      [   55.429094] bond0: (slave ens7f1): Enslaving as a backup interface with an up
       link
      [   55.430224] Hardware name: Dell Inc. PowerEdge R750/06V45N, BIOS 1.4.4 10/07/
      2021
      [   55.430226] Workqueue: ice ice_service_task [ice]
      [   55.468169] RIP: 0010:mutex_unlock+0x10/0x20
      [   55.472439] Code: 0f b1 13 74 96 eb e0 4c 89 ee eb d8 e8 79 54 ff ff 66 0f 1f 84 00 00 00 00 00 0f 1f 44 00 00 65 48 8b 04 25 40 ef 01 00 31 d2 <f0> 48 0f b1 17 75 01 c3 e9 e3 fe ff ff 0f 1f 00 0f 1f 44 00 00 48
      [   55.491186] RSP: 0018:ff4454230d7d7e28 EFLAGS: 00010246
      [   55.496413] RAX: ff1a79b208b08000 RBX: ff1a79b2182e8880 RCX: 0000000000000001
      [   55.503545] RDX: 0000000000000000 RSI: ff4454230d7d7db0 RDI: 0000000000000080
      [   55.510678] RBP: ff1a79d1c7e48b68 R08: ff4454230d7d7db0 R09: 0000000000000041
      [   55.517812] R10: 00000000000000a5 R11: 00000000000006e6 R12: ff1a79d1c7e48bc0
      [   55.524945] R13: 0000000000000000 R14: ff1a79d0ffc305c0 R15: 0000000000000000
      [   55.532076] FS:  0000000000000000(0000) GS:ff1a79d0ffc00000(0000) knlGS:0000000000000000
      [   55.540163] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
      [   55.545908] CR2: 0000000000000080 CR3: 00000003487ae003 CR4: 0000000000771ef0
      [   55.553041] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
      [   55.560173] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
      [   55.567305] PKRU: 55555554
      [   55.570018] Call Trace:
      [   55.572474]  <TASK>
      [   55.574579]  ice_service_task+0xaab/0xef0 [ice]
      [   55.579130]  process_one_work+0x1c5/0x390
      [   55.583141]  ? process_one_work+0x390/0x390
      [   55.587326]  worker_thread+0x30/0x360
      [   55.590994]  ? process_one_work+0x390/0x390
      [   55.595180]  kthread+0xe6/0x110
      [   55.598325]  ? kthread_complete_and_exit+0x20/0x20
      [   55.603116]  ret_from_fork+0x1f/0x30
      [   55.606698]  </TASK>
      
      Fixes: f9f5301e
      
       ("ice: Register auxiliary device to provide RDMA")
      Reviewed-by: default avatarLeon Romanovsky <leonro@nvidia.com>
      Signed-off-by: default avatarIvan Vecera <ivecera@redhat.com>
      Reviewed-by: default avatarDave Ertman <david.m.ertman@intel.com>
      Tested-by: Gurucharan <gurucharanx.g@intel.com> (A Contingent worker at Intel)
      Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4a5c4713
    • Maximilian Luz's avatar
      platform/surface: aggregator: Fix initialization order when compiling as builtin module · 50bf9411
      Maximilian Luz authored
      [ Upstream commit 44acfc22 ]
      
      When building the Surface Aggregator Module (SAM) core, registry, and
      other SAM client drivers as builtin modules (=y), proper initialization
      order is not guaranteed. Due to this, client driver registration
      (triggered by device registration in the registry) races against bus
      initialization in the core.
      
      If any attempt is made at registering the device driver before the bus
      has been initialized (i.e. if bus initialization fails this race) driver
      registration will fail with a message similar to:
      
          Driver surface_battery was unable to register with bus_type surface_aggregator because the bus was not initialized
      
      Switch from module_init() to subsys_initcall() to resolve this issue.
      Note that the serdev subsystem uses postcore_initcall() so we are still
      able to safely register the serdev device driver for the core.
      
      Fixes: c167b9c7
      
       ("platform/surface: Add Surface Aggregator subsystem")
      Reported-by: default avatarBlaž Hrastnik <blaz@mxxn.io>
      Signed-off-by: default avatarMaximilian Luz <luzmaximilian@gmail.com>
      Link: https://lore.kernel.org/r/20220429195738.535751-1-luzmaximilian@gmail.com
      
      
      Reviewed-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarHans de Goede <hdegoede@redhat.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      50bf9411
    • Javier Martinez Canillas's avatar
      fbdev: vesafb: Cleanup fb_info in .fb_destroy rather than .remove · f94aa46e
      Javier Martinez Canillas authored
      [ Upstream commit b3c9a924 ]
      
      The driver is calling framebuffer_release() in its .remove callback, but
      this will cause the struct fb_info to be freed too early. Since it could
      be that a reference is still hold to it if user-space opened the fbdev.
      
      This would lead to a use-after-free error if the framebuffer device was
      unregistered but later a user-space process tries to close the fbdev fd.
      
      To prevent this, move the framebuffer_release() call to fb_ops.fb_destroy
      instead of doing it in the driver's .remove callback.
      
      Strictly speaking, the code flow in the driver is still wrong because all
      the hardware cleanupd (i.e: iounmap) should be done in .remove while the
      software cleanup (i.e: releasing the framebuffer) should be done in the
      .fb_destroy handler. But this at least makes to match the behavior before
      commit 27599aac ("fbdev: Hot-unplug firmware fb devices on forced removal").
      
      Fixes: 27599aac
      
       ("fbdev: Hot-unplug firmware fb devices on forced removal")
      Suggested-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
      Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
      Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220505220631.366371-1-javierm@redhat.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      f94aa46e
    • Javier Martinez Canillas's avatar
      fbdev: efifb: Cleanup fb_info in .fb_destroy rather than .remove · cd3c8abb
      Javier Martinez Canillas authored
      [ Upstream commit d258d00f ]
      
      The driver is calling framebuffer_release() in its .remove callback, but
      this will cause the struct fb_info to be freed too early. Since it could
      be that a reference is still hold to it if user-space opened the fbdev.
      
      This would lead to a use-after-free error if the framebuffer device was
      unregistered but later a user-space process tries to close the fbdev fd.
      
      To prevent this, move the framebuffer_release() call to fb_ops.fb_destroy
      instead of doing it in the driver's .remove callback.
      
      Strictly speaking, the code flow in the driver is still wrong because all
      the hardware cleanupd (i.e: iounmap) should be done in .remove while the
      software cleanup (i.e: releasing the framebuffer) should be done in the
      .fb_destroy handler. But this at least makes to match the behavior before
      commit 27599aac ("fbdev: Hot-unplug firmware fb devices on forced removal").
      
      Fixes: 27599aac
      
       ("fbdev: Hot-unplug firmware fb devices on forced removal")
      Suggested-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
      Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
      Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220505220540.366218-1-javierm@redhat.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cd3c8abb
    • Javier Martinez Canillas's avatar
      fbdev: simplefb: Cleanup fb_info in .fb_destroy rather than .remove · 02eef429
      Javier Martinez Canillas authored
      [ Upstream commit 666b90b3 ]
      
      The driver is calling framebuffer_release() in its .remove callback, but
      this will cause the struct fb_info to be freed too early. Since it could
      be that a reference is still hold to it if user-space opened the fbdev.
      
      This would lead to a use-after-free error if the framebuffer device was
      unregistered but later a user-space process tries to close the fbdev fd.
      
      To prevent this, move the framebuffer_release() call to fb_ops.fb_destroy
      instead of doing it in the driver's .remove callback.
      
      Strictly speaking, the code flow in the driver is still wrong because all
      the hardware cleanupd (i.e: iounmap) should be done in .remove while the
      software cleanup (i.e: releasing the framebuffer) should be done in the
      .fb_destroy handler. But this at least makes to match the behavior before
      commit 27599aac ("fbdev: Hot-unplug firmware fb devices on forced removal").
      
      Fixes: 27599aac
      
       ("fbdev: Hot-unplug firmware fb devices on forced removal")
      Suggested-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Signed-off-by: default avatarJavier Martinez Canillas <javierm@redhat.com>
      Reviewed-by: default avatarThomas Zimmermann <tzimmermann@suse.de>
      Reviewed-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
      Link: https://patchwork.freedesktop.org/patch/msgid/20220505220456.366090-1-javierm@redhat.com
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      02eef429
    • Vladimir Oltean's avatar
      net: mscc: ocelot: avoid corrupting hardware counters when moving VCAP filters · 4ebbf76d
      Vladimir Oltean authored
      [ Upstream commit 93a84170 ]
      
      Given the following order of operations:
      
      (1) we add filter A using tc-flower
      (2) we send a packet that matches it
      (3) we read the filter's statistics to find a hit count of 1
      (4) we add a second filter B with a higher preference than A, and A
          moves one position to the right to make room in the TCAM for it
      (5) we send another packet, and this matches the second filter B
      (6) we read the filter statistics again.
      
      When this happens, the hit count of filter A is 2 and of filter B is 1,
      despite a single packet having matched each filter.
      
      Furthermore, in an alternate history, reading the filter stats a second
      time between steps (3) and (4) makes the hit count of filter A remain at
      1 after step (6), as expected.
      
      The reason why this happens has to do with the filter->stats.pkts field,
      which is written to hardware through the call path below:
      
                     vcap_entry_set
                     /      |      \
                    /       |       \
                   /        |        \
                  /         |         \
      es0_entry_set   is1_entry_set   is2_entry_set
                  \         |         /
                   \        |        /
                    \       |       /
              vcap_data_set(data.counter, ...)
      
      The primary role of filter->stats.pkts is to transport the filter hit
      counters from the last readout all the way from vcap_entry_get() ->
      ocelot_vcap_filter_stats_update() -> ocelot_cls_flower_stats().
      The reason why vcap_entry_set() writes it to hardware is so that the
      counters (saturating and having a limited bit width) are cleared
      after each user space readout.
      
      The writing of filter->stats.pkts to hardware during the TCAM entry
      movement procedure is an unintentional consequence of the code design,
      because the hit count isn't up to date at this point.
      
      So at step (4), when filter A is moved by ocelot_vcap_filter_add() to
      make room for filter B, the hardware hit count is 0 (no packet matched
      on it in the meantime), but filter->stats.pkts is 1, because the last
      readout saw the earlier packet. The movement procedure programs the old
      hit count back to hardware, so this creates the impression to user space
      that more packets have been matched than they really were.
      
      The bug can be seen when running the gact_drop_and_ok_test() from the
      tc_actions.sh selftest.
      
      Fix the issue by reading back the hit count to tmp->stats.pkts before
      migrating the VCAP filter. Sure, this is a best-effort technique, since
      the packets that hit the rule between vcap_entry_get() and
      vcap_entry_set() won't be counted, but at least it allows the counters
      to be reliably used for selftests where the traffic is under control.
      
      The vcap_entry_get() name is a bit unintuitive, but it only reads back
      the counter portion of the TCAM entry, not the entire entry.
      
      The index from which we retrieve the counter is also a bit unintuitive
      (i - 1 during add, i + 1 during del), but this is the way in which TCAM
      entry movement works. The "entry index" isn't a stored integer for a
      TCAM filter, instead it is dynamically computed by
      ocelot_vcap_block_get_filter_index() based on the entry's position in
      the &block->rules list. That position (as well as block->count) is
      automatically updated by ocelot_vcap_filter_add_to_block() on add, and
      by ocelot_vcap_block_remove_filter() on del. So "i" is the new filter
      index, and "i - 1" or "i + 1" respectively are the old addresses of that
      TCAM entry (we only support installing/deleting one filter at a time).
      
      Fixes: b5962294
      
       ("net: mscc: ocelot: Add support for tcam")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      4ebbf76d
    • Vladimir Oltean's avatar
      net: mscc: ocelot: restrict tc-trap actions to VCAP IS2 lookup 0 · e4a33862
      Vladimir Oltean authored
      [ Upstream commit 477d2b91 ]
      
      Once the CPU port was added to the destination port mask of a packet, it
      can never be cleared, so even packets marked as dropped by the MASK_MODE
      of a VCAP IS2 filter will still reach it. This is why we need the
      OCELOT_POLICER_DISCARD to "kill dropped packets dead" and make software
      stop seeing them.
      
      We disallow policer rules from being put on any other chain than the one
      for the first lookup, but we don't do this for "drop" rules, although we
      should. This change is merely ascertaining that the rules dont't
      (completely) work and letting the user know.
      
      The blamed commit is the one that introduced the multi-chain architecture
      in ocelot. Prior to that, we should have always offloaded the filters to
      VCAP IS2 lookup 0, where they did work.
      
      Fixes: 1397a2eb
      
       ("net: mscc: ocelot: create TCAM skeleton from tc filter chains")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e4a33862
    • Vladimir Oltean's avatar
      net: mscc: ocelot: fix VCAP IS2 filters matching on both lookups · ceffde8c
      Vladimir Oltean authored
      [ Upstream commit 6741e118 ]
      
      The VCAP IS2 TCAM is looked up twice per packet, and each filter can be
      configured to only match during the first, second lookup, or both, or
      none.
      
      The blamed commit wrote the code for making VCAP IS2 filters match only
      on the given lookup. But right below that code, there was another line
      that explicitly made the lookup a "don't care", and this is overwriting
      the lookup we've selected. So the code had no effect.
      
      Some of the more noticeable effects of having filters match on both
      lookups:
      
      - in "tc -s filter show dev swp0 ingress", we see each packet matching a
        VCAP IS2 filter counted twice. This throws off scripts such as
        tools/testing/selftests/net/forwarding/tc_actions.sh and makes them
        fail.
      
      - a "tc-drop" action offloaded to VCAP IS2 needs a policer as well,
        because once the CPU port becomes a member of the destination port
        mask of a packet, nothing removes it, not even a PERMIT/DENY mask mode
        with a port mask of 0. But VCAP IS2 rules with the POLICE_ENA bit in
        the action vector can only appear in the first lookup. What happens
        when a filter matches both lookups is that the action vector is
        combined, and this makes the POLICE_ENA bit ineffective, since the
        last lookup in which it has appeared is the second one. In other
        words, "tc-drop" actions do not drop packets for the CPU port, dropped
        packets are still seen by software unless there was an FDB entry that
        directed those packets to some other place different from the CPU.
      
      The last bit used to work, because in the initial commit b5962294
      ("net: mscc: ocelot: Add support for tcam"), we were writing the FIRST
      field of the VCAP IS2 half key with a 1, not with a "don't care".
      The change to "don't care" was made inadvertently by me in commit
      c1c3993e ("net: mscc: ocelot: generalize existing code for VCAP"),
      which I just realized, and which needs a separate fix from this one,
      for "stable" kernels that lack the commit blamed below.
      
      Fixes: 226e9cd8
      
       ("net: mscc: ocelot: only install TCAM entries into a specific lookup and PAG")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      ceffde8c
    • Vladimir Oltean's avatar
      net: mscc: ocelot: fix last VCAP IS1/IS2 filter persisting in hardware when deleted · d242b66a
      Vladimir Oltean authored
      [ Upstream commit 16bbebd3 ]
      
      ocelot_vcap_filter_del() works by moving the next filters over the
      current one, and then deleting the last filter by calling vcap_entry_set()
      with a del_filter which was specially created by memsetting its memory
      to zeroes. vcap_entry_set() then programs this to the TCAM and action
      RAM via the cache registers.
      
      The problem is that vcap_entry_set() is a dispatch function which looks
      at del_filter->block_id. But since del_filter is zeroized memory, the
      block_id is 0, or otherwise said, VCAP_ES0. So practically, what we do
      is delete the entry at the same TCAM index from VCAP ES0 instead of IS1
      or IS2.
      
      The code was not always like this. vcap_entry_set() used to simply be
      is2_entry_set(), and then, the logic used to work.
      
      Restore the functionality by populating the block_id of the del_filter
      based on the VCAP block of the filter that we're deleting. This makes
      vcap_entry_set() know what to do.
      
      Fixes: 1397a2eb
      
       ("net: mscc: ocelot: create TCAM skeleton from tc filter chains")
      Signed-off-by: default avatarVladimir Oltean <vladimir.oltean@nxp.com>
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      d242b66a
    • Tariq Toukan's avatar
      net: Fix features skip in for_each_netdev_feature() · cc22bb20
      Tariq Toukan authored
      [ Upstream commit 85db6352 ]
      
      The find_next_netdev_feature() macro gets the "remaining length",
      not bit index.
      Passing "bit - 1" for the following iteration is wrong as it skips
      the adjacent bit. Pass "bit" instead.
      
      Fixes: 3b89ea9c
      
       ("net: Fix for_each_netdev_feature on Big endian")
      Signed-off-by: default avatarTariq Toukan <tariqt@nvidia.com>
      Reviewed-by: default avatarGal Pressman <gal@nvidia.com>
      Link: https://lore.kernel.org/r/20220504080914.1918-1-tariqt@nvidia.com
      
      
      Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      cc22bb20
    • Manikanta Pubbisetty's avatar
      mac80211: Reset MBSSID parameters upon connection · afc080e4
      Manikanta Pubbisetty authored
      [ Upstream commit 86af062f ]
      
      Currently MBSSID parameters in struct ieee80211_bss_conf
      are not reset upon connection. This could be problematic
      with some drivers in a scenario where the device first
      connects to a non-transmit BSS and then connects to a
      transmit BSS of a Multi BSS AP. The MBSSID parameters
      which are set after connecting to a non-transmit BSS will
      not be reset and the same parameters will be passed on to
      the driver during the subsequent connection to a transmit
      BSS of a Multi BSS AP.
      
      For example, firmware running on the ath11k device uses the
      Multi BSS data for tracking the beacon of a non-transmit BSS
      and reports the driver when there is a beacon miss. If we do
      not reset the MBSSID parameters during the subsequent
      connection to a transmit BSS, then the driver would have
      wrong MBSSID data and FW would be looking for an incorrect
      BSSID in the MBSSID beacon of a Multi BSS AP and reports
      beacon loss leading to an unstable connection.
      
      Reset the MBSSID parameters upon every connection to solve this
      problem.
      
      Fixes: 78ac51f8
      
       ("mac80211: support multi-bssid")
      Signed-off-by: default avatarManikanta Pubbisetty <quic_mpubbise@quicinc.com>
      Link: https://lore.kernel.org/r/20220428052744.27040-1-quic_mpubbise@quicinc.com
      
      
      Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      afc080e4
    • Camel Guo's avatar
      hwmon: (tmp401) Add OF device ID table · e346e603
      Camel Guo authored
      [ Upstream commit 3481551f ]
      
      This driver doesn't have of_match_table. This makes the kernel module
      tmp401.ko lack alias patterns (e.g: of:N*T*Cti,tmp411) to match DT node
      of the supported devices hence this kernel module will not be
      automatically loaded.
      
      After adding of_match_table to this driver, the folllowing alias will be
      added into tmp401.ko.
      $ modinfo drivers/hwmon/tmp401.ko
      filename: drivers/hwmon/tmp401.ko
      ......
      author:         Hans de Goede <hdegoede@redhat.com>
      alias:          of:N*T*Cti,tmp435C*
      alias:          of:N*T*Cti,tmp435
      alias:          of:N*T*Cti,tmp432C*
      alias:          of:N*T*Cti,tmp432
      alias:          of:N*T*Cti,tmp431C*
      alias:          of:N*T*Cti,tmp431
      alias:          of:N*T*Cti,tmp411C*
      alias:          of:N*T*Cti,tmp411
      alias:          of:N*T*Cti,tmp401C*
      alias:          of:N*T*Cti,tmp401
      ......
      
      Fixes: af503716
      
       ("i2c: core: report OF style module alias for devices registered via OF")
      Signed-off-by: default avatarCamel Guo <camel.guo@axis.com>
      Link: https://lore.kernel.org/r/20220503114333.456476-1-camel.guo@axis.com
      
      
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e346e603
    • Guenter Roeck's avatar
      iwlwifi: iwl-dbg: Use del_timer_sync() before freeing · e29b71fc
      Guenter Roeck authored
      [ Upstream commit 7635a1ad
      
       ]
      
      In Chrome OS, a large number of crashes is observed due to corrupted timer
      lists. Steven Rostedt pointed out that this usually happens when a timer
      is freed while still active, and that the problem is often triggered
      by code calling del_timer() instead of del_timer_sync() just before
      freeing.
      
      Steven also identified the iwlwifi driver as one of the possible culprits
      since it does exactly that.
      
      Reported-by: default avatarSteven Rostedt <rostedt@goodmis.org>
      Cc: Steven Rostedt <rostedt@goodmis.org>
      Cc: Johannes Berg <johannes.berg@intel.com>
      Cc: Gregory Greenman <gregory.greenman@intel.com>
      Fixes: 60e8abd9
      
       ("iwlwifi: dbg_ini: add periodic trigger new API support")
      Signed-off-by: default avatarGuenter Roeck <linux@roeck-us.net>
      Acked-by: default avatarGregory Greenman <gregory.greenman@intel.com>
      Tested-by: Sedat Dilek <sedat.dilek@gmail.com> # Linux v5.17.3-rc1 and Debian LLVM-14
      Signed-off-by: default avatarKalle Valo <kvalo@kernel.org>
      Link: https://lore.kernel.org/r/20220411154210.1870008-1-linux@roeck-us.net
      
      
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      e29b71fc
    • Sven Eckelmann's avatar
      batman-adv: Don't skb_split skbuffs with frag_list · 8f37aad7
      Sven Eckelmann authored
      [ Upstream commit a063f2fb
      
       ]
      
      The receiving interface might have used GRO to receive more fragments than
      MAX_SKB_FRAGS fragments. In this case, these will not be stored in
      skb_shinfo(skb)->frags but merged into the frag list.
      
      batman-adv relies on the function skb_split to split packets up into
      multiple smaller packets which are not larger than the MTU on the outgoing
      interface. But this function cannot handle frag_list entries and is only
      operating on skb_shinfo(skb)->frags. If it is still trying to split such an
      skb and xmit'ing it on an interface without support for NETIF_F_FRAGLIST,
      then validate_xmit_skb() will try to linearize it. But this fails due to
      inconsistent information. And __pskb_pull_tail will trigger a BUG_ON after
      skb_copy_bits() returns an error.
      
      In case of entries in frag_list, just linearize the skb before operating on
      it with skb_split().
      
      Reported-by: default avatarFelix Kaechele <felix@kaechele.ca>
      Fixes: c6c8fea2
      
       ("net: Add batman-adv meshing protocol")
      Signed-off-by: default avatarSven Eckelmann <sven@narfation.org>
      Tested-by: default avatarFelix Kaechele <felix@kaechele.ca>
      Signed-off-by: default avatarSimon Wunderlich <sw@simonwunderlich.de>
      Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
      8f37aad7
  2. May 16, 2022
  3. May 12, 2022