commit:     c2410f2b4bc3761fc1f1d7fe46cfc4748df8cd83
Author:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
AuthorDate: Sat Sep 12 18:08:09 2020 +0000
Commit:     Mike Pagano <mpagano <AT> gentoo <DOT> org>
CommitDate: Sat Sep 12 18:08:09 2020 +0000
URL:        https://gitweb.gentoo.org/proj/linux-patches.git/commit/?id=c2410f2b

Linux patch 5.4.65

Signed-off-by: Mike Pagano <mpagano <AT> gentoo.org>

 0000_README             |   4 +
 1064_linux-5.4.65.patch | 356 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 360 insertions(+)

diff --git a/0000_README b/0000_README
index 282897d..c73366d 100644
--- a/0000_README
+++ b/0000_README
@@ -299,6 +299,10 @@ Patch:  1063_linux-5.4.64.patch
 From:   http://www.kernel.org
 Desc:   Linux 5.4.64
 
+Patch:  1064_linux-5.4.65.patch
+From:   http://www.kernel.org
+Desc:   Linux 5.4.65
+
 Patch:  1500_XATTR_USER_PREFIX.patch
 From:   https://bugs.gentoo.org/show_bug.cgi?id=470644
 Desc:   Support for namespace user.pax.* on tmpfs.

diff --git a/1064_linux-5.4.65.patch b/1064_linux-5.4.65.patch
new file mode 100644
index 0000000..720873a
--- /dev/null
+++ b/1064_linux-5.4.65.patch
@@ -0,0 +1,356 @@
+diff --git a/Makefile b/Makefile
+index 7bdfb21bb9269..4cb68164b79ee 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,7 +1,7 @@
+ # SPDX-License-Identifier: GPL-2.0
+ VERSION = 5
+ PATCHLEVEL = 4
+-SUBLEVEL = 64
++SUBLEVEL = 65
+ EXTRAVERSION =
+ NAME = Kleptomaniac Octopus
+ 
+diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c
+index b91f92e4e5f22..915ac75b55fc7 100644
+--- a/drivers/net/usb/dm9601.c
++++ b/drivers/net/usb/dm9601.c
+@@ -625,6 +625,10 @@ static const struct usb_device_id products[] = {
+        USB_DEVICE(0x0a46, 0x1269),    /* DM9621A USB to Fast Ethernet Adapter 
*/
+        .driver_info = (unsigned long)&dm9601_info,
+       },
++      {
++       USB_DEVICE(0x0586, 0x3427),    /* ZyXEL Keenetic Plus DSL xDSL modem */
++       .driver_info = (unsigned long)&dm9601_info,
++      },
+       {},                     // END
+ };
+ 
+diff --git a/net/core/dev.c b/net/core/dev.c
+index 56cd7b83a3829..cdc1c3a144e1f 100644
+--- a/net/core/dev.c
++++ b/net/core/dev.c
+@@ -6231,12 +6231,13 @@ void netif_napi_add(struct net_device *dev, struct 
napi_struct *napi,
+               netdev_err_once(dev, "%s() called with weight %d\n", __func__,
+                               weight);
+       napi->weight = weight;
+-      list_add(&napi->dev_list, &dev->napi_list);
+       napi->dev = dev;
+ #ifdef CONFIG_NETPOLL
+       napi->poll_owner = -1;
+ #endif
+       set_bit(NAPI_STATE_SCHED, &napi->state);
++      set_bit(NAPI_STATE_NPSVC, &napi->state);
++      list_add_rcu(&napi->dev_list, &dev->napi_list);
+       napi_hash_add(napi);
+ }
+ EXPORT_SYMBOL(netif_napi_add);
+diff --git a/net/core/netpoll.c b/net/core/netpoll.c
+index 849380a622ef9..cb67d36f3adb0 100644
+--- a/net/core/netpoll.c
++++ b/net/core/netpoll.c
+@@ -161,7 +161,7 @@ static void poll_napi(struct net_device *dev)
+       struct napi_struct *napi;
+       int cpu = smp_processor_id();
+ 
+-      list_for_each_entry(napi, &dev->napi_list, dev_list) {
++      list_for_each_entry_rcu(napi, &dev->napi_list, dev_list) {
+               if (cmpxchg(&napi->poll_owner, -1, cpu) == -1) {
+                       poll_one_napi(napi);
+                       smp_store_release(&napi->poll_owner, -1);
+diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
+index 47b6d73d30e55..51673d00bbeac 100644
+--- a/net/ipv4/fib_trie.c
++++ b/net/ipv4/fib_trie.c
+@@ -2010,7 +2010,8 @@ void fib_info_notify_update(struct net *net, struct 
nl_info *info)
+               struct hlist_head *head = &net->ipv4.fib_table_hash[h];
+               struct fib_table *tb;
+ 
+-              hlist_for_each_entry_rcu(tb, head, tb_hlist)
++              hlist_for_each_entry_rcu(tb, head, tb_hlist,
++                                       lockdep_rtnl_is_held())
+                       __fib_info_notify_update(net, tb, info);
+       }
+ }
+diff --git a/net/ipv6/sysctl_net_ipv6.c b/net/ipv6/sysctl_net_ipv6.c
+index ec8fcfc60a27b..73842054bfe68 100644
+--- a/net/ipv6/sysctl_net_ipv6.c
++++ b/net/ipv6/sysctl_net_ipv6.c
+@@ -21,6 +21,7 @@
+ #include <net/calipso.h>
+ #endif
+ 
++static int two = 2;
+ static int flowlabel_reflect_max = 0x7;
+ static int auto_flowlabels_min;
+ static int auto_flowlabels_max = IP6_AUTO_FLOW_LABEL_MAX;
+@@ -151,7 +152,7 @@ static struct ctl_table ipv6_table_template[] = {
+               .mode           = 0644,
+               .proc_handler   = proc_rt6_multipath_hash_policy,
+               .extra1         = SYSCTL_ZERO,
+-              .extra2         = SYSCTL_ONE,
++              .extra2         = &two,
+       },
+       {
+               .procname       = "seg6_flowlabel",
+diff --git a/net/netlabel/netlabel_domainhash.c 
b/net/netlabel/netlabel_domainhash.c
+index f5d34da0646ed..12aa803b2f689 100644
+--- a/net/netlabel/netlabel_domainhash.c
++++ b/net/netlabel/netlabel_domainhash.c
+@@ -85,6 +85,7 @@ static void netlbl_domhsh_free_entry(struct rcu_head *entry)
+                       kfree(netlbl_domhsh_addr6_entry(iter6));
+               }
+ #endif /* IPv6 */
++              kfree(ptr->def.addrsel);
+       }
+       kfree(ptr->domain);
+       kfree(ptr);
+@@ -536,6 +537,8 @@ int netlbl_domhsh_add(struct netlbl_dom_map *entry,
+                               goto add_return;
+               }
+ #endif /* IPv6 */
++              /* cleanup the new entry since we've moved everything over */
++              netlbl_domhsh_free_entry(&entry->rcu);
+       } else
+               ret_val = -EINVAL;
+ 
+@@ -579,6 +582,12 @@ int netlbl_domhsh_remove_entry(struct netlbl_dom_map 
*entry,
+ {
+       int ret_val = 0;
+       struct audit_buffer *audit_buf;
++      struct netlbl_af4list *iter4;
++      struct netlbl_domaddr4_map *map4;
++#if IS_ENABLED(CONFIG_IPV6)
++      struct netlbl_af6list *iter6;
++      struct netlbl_domaddr6_map *map6;
++#endif /* IPv6 */
+ 
+       if (entry == NULL)
+               return -ENOENT;
+@@ -596,6 +605,9 @@ int netlbl_domhsh_remove_entry(struct netlbl_dom_map 
*entry,
+               ret_val = -ENOENT;
+       spin_unlock(&netlbl_domhsh_lock);
+ 
++      if (ret_val)
++              return ret_val;
++
+       audit_buf = netlbl_audit_start_common(AUDIT_MAC_MAP_DEL, audit_info);
+       if (audit_buf != NULL) {
+               audit_log_format(audit_buf,
+@@ -605,40 +617,29 @@ int netlbl_domhsh_remove_entry(struct netlbl_dom_map 
*entry,
+               audit_log_end(audit_buf);
+       }
+ 
+-      if (ret_val == 0) {
+-              struct netlbl_af4list *iter4;
+-              struct netlbl_domaddr4_map *map4;
+-#if IS_ENABLED(CONFIG_IPV6)
+-              struct netlbl_af6list *iter6;
+-              struct netlbl_domaddr6_map *map6;
+-#endif /* IPv6 */
+-
+-              switch (entry->def.type) {
+-              case NETLBL_NLTYPE_ADDRSELECT:
+-                      netlbl_af4list_foreach_rcu(iter4,
+-                                           &entry->def.addrsel->list4) {
+-                              map4 = netlbl_domhsh_addr4_entry(iter4);
+-                              cipso_v4_doi_putdef(map4->def.cipso);
+-                      }
++      switch (entry->def.type) {
++      case NETLBL_NLTYPE_ADDRSELECT:
++              netlbl_af4list_foreach_rcu(iter4, &entry->def.addrsel->list4) {
++                      map4 = netlbl_domhsh_addr4_entry(iter4);
++                      cipso_v4_doi_putdef(map4->def.cipso);
++              }
+ #if IS_ENABLED(CONFIG_IPV6)
+-                      netlbl_af6list_foreach_rcu(iter6,
+-                                           &entry->def.addrsel->list6) {
+-                              map6 = netlbl_domhsh_addr6_entry(iter6);
+-                              calipso_doi_putdef(map6->def.calipso);
+-                      }
++              netlbl_af6list_foreach_rcu(iter6, &entry->def.addrsel->list6) {
++                      map6 = netlbl_domhsh_addr6_entry(iter6);
++                      calipso_doi_putdef(map6->def.calipso);
++              }
+ #endif /* IPv6 */
+-                      break;
+-              case NETLBL_NLTYPE_CIPSOV4:
+-                      cipso_v4_doi_putdef(entry->def.cipso);
+-                      break;
++              break;
++      case NETLBL_NLTYPE_CIPSOV4:
++              cipso_v4_doi_putdef(entry->def.cipso);
++              break;
+ #if IS_ENABLED(CONFIG_IPV6)
+-              case NETLBL_NLTYPE_CALIPSO:
+-                      calipso_doi_putdef(entry->def.calipso);
+-                      break;
++      case NETLBL_NLTYPE_CALIPSO:
++              calipso_doi_putdef(entry->def.calipso);
++              break;
+ #endif /* IPv6 */
+-              }
+-              call_rcu(&entry->rcu, netlbl_domhsh_free_entry);
+       }
++      call_rcu(&entry->rcu, netlbl_domhsh_free_entry);
+ 
+       return ret_val;
+ }
+diff --git a/net/sched/sch_taprio.c b/net/sched/sch_taprio.c
+index b1eb12d33b9a6..6a5086e586efb 100644
+--- a/net/sched/sch_taprio.c
++++ b/net/sched/sch_taprio.c
+@@ -1177,9 +1177,27 @@ static void taprio_offload_config_changed(struct 
taprio_sched *q)
+       spin_unlock(&q->current_entry_lock);
+ }
+ 
+-static void taprio_sched_to_offload(struct taprio_sched *q,
++static u32 tc_map_to_queue_mask(struct net_device *dev, u32 tc_mask)
++{
++      u32 i, queue_mask = 0;
++
++      for (i = 0; i < dev->num_tc; i++) {
++              u32 offset, count;
++
++              if (!(tc_mask & BIT(i)))
++                      continue;
++
++              offset = dev->tc_to_txq[i].offset;
++              count = dev->tc_to_txq[i].count;
++
++              queue_mask |= GENMASK(offset + count - 1, offset);
++      }
++
++      return queue_mask;
++}
++
++static void taprio_sched_to_offload(struct net_device *dev,
+                                   struct sched_gate_list *sched,
+-                                  const struct tc_mqprio_qopt *mqprio,
+                                   struct tc_taprio_qopt_offload *offload)
+ {
+       struct sched_entry *entry;
+@@ -1194,7 +1212,8 @@ static void taprio_sched_to_offload(struct taprio_sched 
*q,
+ 
+               e->command = entry->command;
+               e->interval = entry->interval;
+-              e->gate_mask = entry->gate_mask;
++              e->gate_mask = tc_map_to_queue_mask(dev, entry->gate_mask);
++
+               i++;
+       }
+ 
+@@ -1202,7 +1221,6 @@ static void taprio_sched_to_offload(struct taprio_sched 
*q,
+ }
+ 
+ static int taprio_enable_offload(struct net_device *dev,
+-                               struct tc_mqprio_qopt *mqprio,
+                                struct taprio_sched *q,
+                                struct sched_gate_list *sched,
+                                struct netlink_ext_ack *extack)
+@@ -1224,7 +1242,7 @@ static int taprio_enable_offload(struct net_device *dev,
+               return -ENOMEM;
+       }
+       offload->enable = 1;
+-      taprio_sched_to_offload(q, sched, mqprio, offload);
++      taprio_sched_to_offload(dev, sched, offload);
+ 
+       err = ops->ndo_setup_tc(dev, TC_SETUP_QDISC_TAPRIO, offload);
+       if (err < 0) {
+@@ -1486,7 +1504,7 @@ static int taprio_change(struct Qdisc *sch, struct 
nlattr *opt,
+       }
+ 
+       if (FULL_OFFLOAD_IS_ENABLED(q->flags))
+-              err = taprio_enable_offload(dev, mqprio, q, new_admin, extack);
++              err = taprio_enable_offload(dev, q, new_admin, extack);
+       else
+               err = taprio_disable_offload(dev, q, extack);
+       if (err)
+diff --git a/net/sctp/socket.c b/net/sctp/socket.c
+index 58fe6556cdf5b..3a11212bb4c0e 100644
+--- a/net/sctp/socket.c
++++ b/net/sctp/socket.c
+@@ -8176,8 +8176,6 @@ static int sctp_get_port_local(struct sock *sk, union 
sctp_addr *addr)
+ 
+       pr_debug("%s: begins, snum:%d\n", __func__, snum);
+ 
+-      local_bh_disable();
+-
+       if (snum == 0) {
+               /* Search for an available port. */
+               int low, high, remaining, index;
+@@ -8196,20 +8194,21 @@ static int sctp_get_port_local(struct sock *sk, union 
sctp_addr *addr)
+                               continue;
+                       index = sctp_phashfn(sock_net(sk), rover);
+                       head = &sctp_port_hashtable[index];
+-                      spin_lock(&head->lock);
++                      spin_lock_bh(&head->lock);
+                       sctp_for_each_hentry(pp, &head->chain)
+                               if ((pp->port == rover) &&
+                                   net_eq(sock_net(sk), pp->net))
+                                       goto next;
+                       break;
+               next:
+-                      spin_unlock(&head->lock);
++                      spin_unlock_bh(&head->lock);
++                      cond_resched();
+               } while (--remaining > 0);
+ 
+               /* Exhausted local port range during search? */
+               ret = 1;
+               if (remaining <= 0)
+-                      goto fail;
++                      return ret;
+ 
+               /* OK, here is the one we will use.  HEAD (the port
+                * hash table list entry) is non-NULL and we hold it's
+@@ -8224,7 +8223,7 @@ static int sctp_get_port_local(struct sock *sk, union 
sctp_addr *addr)
+                * port iterator, pp being NULL.
+                */
+               head = &sctp_port_hashtable[sctp_phashfn(sock_net(sk), snum)];
+-              spin_lock(&head->lock);
++              spin_lock_bh(&head->lock);
+               sctp_for_each_hentry(pp, &head->chain) {
+                       if ((pp->port == snum) && net_eq(pp->net, sock_net(sk)))
+                               goto pp_found;
+@@ -8324,10 +8323,7 @@ success:
+       ret = 0;
+ 
+ fail_unlock:
+-      spin_unlock(&head->lock);
+-
+-fail:
+-      local_bh_enable();
++      spin_unlock_bh(&head->lock);
+       return ret;
+ }
+ 
+diff --git a/net/tipc/socket.c b/net/tipc/socket.c
+index aea951a1f805b..5318bb6611abc 100644
+--- a/net/tipc/socket.c
++++ b/net/tipc/socket.c
+@@ -2616,18 +2616,21 @@ static int tipc_shutdown(struct socket *sock, int how)
+ 
+       trace_tipc_sk_shutdown(sk, NULL, TIPC_DUMP_ALL, " ");
+       __tipc_shutdown(sock, TIPC_CONN_SHUTDOWN);
+-      sk->sk_shutdown = SEND_SHUTDOWN;
++      if (tipc_sk_type_connectionless(sk))
++              sk->sk_shutdown = SHUTDOWN_MASK;
++      else
++              sk->sk_shutdown = SEND_SHUTDOWN;
+ 
+       if (sk->sk_state == TIPC_DISCONNECTING) {
+               /* Discard any unreceived messages */
+               __skb_queue_purge(&sk->sk_receive_queue);
+ 
+-              /* Wake up anyone sleeping in poll */
+-              sk->sk_state_change(sk);
+               res = 0;
+       } else {
+               res = -ENOTCONN;
+       }
++      /* Wake up anyone sleeping in poll. */
++      sk->sk_state_change(sk);
+ 
+       release_sock(sk);
+       return res;

Reply via email to