Linux 5.15.115
Greg Kroah-Hartman
maintainerI'm announcing the release of the 5.15.115 kernel.
All users of the 5.15 kernel series must upgrade.
The updated 5.15.y git tree can be found at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git linux-5.15.y
and can be browsed at the normal kernel.org git web browser:
https://git.kernel.org/?p=linux/kernel/git/stable/linux-stable.git;a=summary
thanks,
greg k-h
------------
Documentation/networking/bonding.rst | 11 Makefile | 2 drivers/android/binder.c | 26 + drivers/android/binder_alloc.c | 64 +--- drivers/android/binder_alloc.h | 2 drivers/android/binder_alloc_selftest.c | 2 drivers/irqchip/irq-mips-gic.c | 65 ++-- drivers/net/bonding/bond_main.c | 17 - drivers/net/bonding/bond_netlink.c | 22 + drivers/net/bonding/bond_options.c | 36 ++ drivers/net/bonding/bond_procfs.c | 2 drivers/net/bonding/bond_sysfs.c | 13 drivers/net/dsa/mt7530.c | 124 +++++--- drivers/net/ethernet/mellanox/mlx5/core/en/ptp.c | 2 drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h | 2 drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 19 - drivers/net/ethernet/mellanox/mlx5/core/en_tx.c | 19 - drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c | 81 ++++- drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h | 3 drivers/net/phy/mscc/mscc.h | 1 drivers/net/phy/mscc/mscc_main.c | 54 +-- drivers/platform/x86/intel/speed_select_if/isst_if_common.c | 49 ++- drivers/power/supply/bq24190_charger.c | 13 drivers/power/supply/bq27xxx_battery.c | 171 ++++++------ drivers/power/supply/power_supply_core.c | 57 ++-- include/linux/power/bq27xxx_battery.h | 3 include/linux/power_supply.h | 5 include/net/bond_options.h | 1 include/net/bonding.h | 3 include/net/dsa.h | 28 + include/net/ip.h | 2 include/net/page_pool.h | 18 - include/net/xdp.h | 3 include/uapi/linux/if_link.h | 1 include/uapi/linux/in.h | 2 kernel/bpf/hashtab.c | 6 net/bluetooth/hci_sock.c | 28 + net/core/page_pool.c | 34 ++ net/core/xdp.c | 93 ++++-- net/ipv4/ip_sockglue.c | 12 net/ipv4/raw.c | 5 net/ipv6/raw.c | 3 net/netfilter/nf_conntrack_netlink.c | 8 tools/include/uapi/linux/if_link.h | 1 44 files changed, 725 insertions(+), 388 deletions(-)
Anton Protopopov (1):
bpf: fix a memory leak in the LRU and LRU_PERCPU hash maps
Arınç ÜNAL (1):
net: dsa: mt7530: fix network connectivity with multiple CPU ports
Carlos Llamas (5):
binder: fix UAF caused by faulty buffer cleanup
Revert "binder_alloc: add missing mmap_lock calls when using the VMA" Revert "android: binder: stop saving a pointer to the VMA"
binder: add lockless binder_alloc_(set|get)_vma()
binder: fix UAF of alloc->vma in race with munmap()
Daniel Golle (1):
net: dsa: mt7530: split-off common parts from mt7531_setup
David Epping (1):
net: phy: mscc: enable VSC8501/2 RGMII RX clock
Frank Wunderlich (1):
net: dsa: mt7530: rework mt753[01]_setup
Greg Kroah-Hartman (1):
Linux 5.15.115
Hangbin Liu (2):
Bonding: add arp_missed_max option
bonding: fix send_peer_notif overflow
Hans de Goede (5):
power: supply: bq27xxx: Move bq27xxx_battery_update() down
power: supply: bq27xxx: Ensure power_supply_changed() is called on current sign changes
power: supply: bq27xxx: After charger plug in/out wait 0.5s for things to stabilize
power: supply: core: Refactor power_supply_set_input_current_limit_from_supplier()
power: supply: bq24190: Call power_supply_changed() after updating input current
Jiaxun Yang (2):
irqchip/mips-gic: Use raw spinlock for gic_lock irqchip/mips-gic: Don't touch vl_map if a local interrupt is not routable
Marc Zyngier (1):
irqchip/mips-gic: Get rid of the reliance on irq_cpu_online()
Mark Bloch (1):
net/mlx5: devcom only supports 2 ports
Nicolas Dichtel (1):
ipv{4,6}/raw: fix output xfrm lookup wrt protocol
Paul Blakey (1):
netfilter: ctnetlink: Support offloaded conntrack entry deletion
Qingfang DENG (1):
net: page_pool: use in_softirq() instead
Rahul Rameshbabu (1):
net/mlx5e: Fix SQ wake logic in ptp napi_poll context
Ruihan Li (1):
bluetooth: Add cmd validity checks at the start of hci_sock_ioctl()
Sebastian Andrzej Siewior (1):
xdp: xdp_mem_allocator can be NULL in trace_mem_connect().
Shay Drory (1):
net/mlx5: Devcom, serialize devcom registration
Sicelo A. Mhlongo (1):
power: supply: bq27xxx: expose battery data when CI=1
Srinivas Pandruvada (1):
platform/x86: ISST: PUNIT device mapping with Sub-NUMA clustering
Steve Wahl (1):
platform/x86: ISST: Remove 8 socket limit
Toke Høiland-Jørgensen (1):
xdp: Allow registering memory model without rxq reference
Vlad Buslov (1):
net/mlx5e: Fix deadlock in tc route query code
Vladimir Oltean (1):
net: dsa: introduce helpers for iterating through ports using dp
Yunsheng Lin (1):
page_pool: fix inconsistency for page_pool_ring_[un]lock()
Greg Kroah-Hartman
maintainerDocumentation/networking/bonding.rst +11 -0
@@ -422,6 +422,17 @@ arp_all_targets consider the slave up only when all of the arp_ip_targets are reachable +arp_missed_max + + Specifies the number of arp_interval monitor checks that must + fail in order for an interface to be marked down by the ARP monitor. + + In order to provide orderly failover semantics, backup interfaces + are permitted an extra monitor check (i.e., they must fail + arp_missed_max + 1 times before being marked down). + + The default value is 2, and the allowable range is 1 - 255. + downdelay Specifies the time, in milliseconds, to wait before disabling
Makefile +1 -1
@@ -1,7 +1,7 @@ # SPDX-License-Identifier: GPL-2.0 VERSION = 5 PATCHLEVEL = 15 -SUBLEVEL = 114 +SUBLEVEL = 115 EXTRAVERSION = NAME = Trick or Treat
drivers/android/binder.c +20 -6
@@ -1903,24 +1903,23 @@ static void binder_deferred_fd_close(int fd)static void binder_transaction_buffer_release (struct binder_proc *proc,struct binder_thread *thread,struct binder_buffer *buffer, -binder_size_t failed_at, +binder_size_t off_end_offset,bool is_failure) {int debug_id = buffer->debug_id; -binder_size_t off_start_offset, buffer_offset, off_end_offset; +binder_size_t off_start_offset, buffer_offset;binder_debug (BINDER_DEBUG_TRANSACTION ,"%d buffer release %d, size %zd-%zd, failed at %llx\n" , proc->pid, buffer->debug_id, buffer->data_size, buffer->offsets_size, - (unsigned long long )failed_at); + (unsigned long long )off_end_offset);if (buffer->target_node)binder_dec_node (buffer->target_node,1 ,0 ); off_start_offset =ALIGN (buffer->data_size,sizeof (void *)); - off_end_offset = is_failure && failed_at ? failed_at : - off_start_offset + buffer->offsets_size; +for (buffer_offset = off_start_offset; buffer_offset < off_end_offset; buffer_offset +=sizeof (binder_size_t)) {struct binder_object_header *hdr;
@@ -2080,6 +2079,21 @@ static void binder_transaction_buffer_release(struct binder_proc *proc, } } +/* Clean up all the objects in the buffer */ +static inline void binder_release_entire_buffer (struct binder_proc *proc, +struct binder_thread *thread, +struct binder_buffer *buffer, +bool is_failure) +{ +binder_size_t off_end_offset; + + off_end_offset =ALIGN (buffer->data_size,sizeof (void *)); + off_end_offset += buffer->offsets_size; + +binder_transaction_buffer_release (proc, thread, buffer, + off_end_offset, is_failure); +} +static int binder_translate_binder (struct flat_binder_object *fp,struct binder_transaction *t,struct binder_thread *thread)
@@ -3578,7 +3592,7 @@ binder_free_buf(struct binder_proc *proc,binder_node_inner_unlock (buf_node); }trace_binder_transaction_buffer_release (buffer); -binder_transaction_buffer_release (proc, thread, buffer,0 , is_failure); +binder_release_entire_buffer (proc, thread, buffer, is_failure);binder_alloc_free_buf (&proc->alloc, buffer); }
drivers/android/binder_alloc.c +22 -42
126 lines not on this page · raw message
drivers/android/binder_alloc.h +1 -1
@@ -100,7 +100,7 @@ struct binder_lru_page {*/ struct binder_alloc {struct mutex mutex; -unsigned long vma_addr; +struct vm_area_struct *vma;struct mm_struct *vma_vm_mm;void __user *buffer;struct list_head buffers;
drivers/android/binder_alloc_selftest.c +1 -1
@@ -287,7 +287,7 @@ void binder_selftest_alloc(struct binder_alloc *alloc)if (!binder_selftest_run)return ;mutex_lock (&binder_selftest_lock); -if (!binder_selftest_run || !alloc->vma_addr) +if (!binder_selftest_run || !alloc->vma) goto done;pr_info ("STARTED\n" );binder_selftest_alloc_offset (alloc, end_offset,0 );
drivers/irqchip/irq-mips-gic.c +41 -24
157 lines not on this page · raw message
drivers/net/bonding/bond_main.c +9 -8
@@ -3145,8 +3145,8 @@ static void bond_loadbalance_arp_mon(struct bonding *bond)* when the source ip is 0, so don't take the link down * if we don't know our ip yet */ -if (!bond_time_in_interval (bond, trans_start,2 ) || - !bond_time_in_interval (bond, slave->last_rx,2 )) { +if (!bond_time_in_interval (bond, trans_start, bond->params.missed_max) || + !bond_time_in_interval (bond, slave->last_rx, bond->params.missed_max)) {bond_propose_link_state (slave,BOND_LINK_DOWN ); slave_state_changed =1 ;
@@ -3240,7 +3240,7 @@ static int bond_ab_arp_inspect(struct bonding *bond)/* Backup slave is down if: * - No current_arp_slave AND -* - more than 3*delta since last receive AND +* - more than (missed_max+1)*delta since last receive AND * - the bond has an IP address * * Note: a non-null current_arp_slave indicates
@@ -3252,20 +3252,20 @@ static int bond_ab_arp_inspect(struct bonding *bond)*/ if (!bond_is_active_slave (slave) && !rcu_access_pointer (bond->current_arp_slave) && - !bond_time_in_interval (bond, last_rx,3 )) { + !bond_time_in_interval (bond, last_rx, bond->params.missed_max +1 )) {bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++; }/* Active slave is down if: -* - more than 2*delta since transmitting OR -* - (more than 2*delta since receive AND +* - more than missed_max*delta since transmitting OR +* - (more than missed_max*delta since receive AND * the bond has an IP address) */ trans_start =dev_trans_start (slave->dev);if (bond_is_active_slave (slave) && - (!bond_time_in_interval (bond, trans_start,2 ) || - !bond_time_in_interval (bond, last_rx,2 ))) { + (!bond_time_in_interval (bond, trans_start, bond->params.missed_max) || + !bond_time_in_interval (bond, last_rx, bond->params.missed_max))) {bond_propose_link_state (slave,BOND_LINK_DOWN ); commit++; }
@@ -5886,6 +5886,7 @@ static int bond_check_params(struct bond_params *params) params->arp_interval = arp_interval; params->arp_validate = arp_validate_value; params->arp_all_targets = arp_all_targets_value; + params->missed_max =2 ; params->updelay = updelay; params->downdelay = downdelay; params->peer_notif_delay =0 ;
drivers/net/bonding/bond_netlink.c +21 -1
@@ -79,6 +79,11 @@ static int bond_fill_slave_info(struct sk_buff *skb,return -EMSGSIZE ; } +/* Limit the max delay range to 300s */ +static struct netlink_range_validation delay_range = { + .max =300000 , +}; +static const struct nla_policy bond_policy[IFLA_BOND_MAX +1 ] = { [IFLA_BOND_MODE ] = { .type =NLA_U8 }, [IFLA_BOND_ACTIVE_SLAVE ] = { .type =NLA_U32 },
@@ -109,7 +114,8 @@ static const struct nla_policy bond_policy[IFLA_BOND_MAX + 1] = { [IFLA_BOND_AD_ACTOR_SYSTEM ] = { .type =NLA_BINARY , .len = ETH_ALEN }, [IFLA_BOND_TLB_DYNAMIC_LB] = { .type = NLA_U8 }, - [IFLA_BOND_PEER_NOTIF_DELAY] = { .type = NLA_U32 }, + [IFLA_BOND_PEER_NOTIF_DELAY] = NLA_POLICY_FULL_RANGE(NLA_U32, &delay_range), + [IFLA_BOND_MISSED_MAX] = { .type = NLA_U8 }, };static const struct nla_policy bond_slave_policy[IFLA_BOND_SLAVE_MAX +1 ] = {
@@ -453,6 +459,15 @@ static int bond_changelink(struct net_device *bond_dev, struct nlattr *tb[],return err; } +if (data[IFLA_BOND_MISSED_MAX ]) { +int missed_max =nla_get_u8 (data[IFLA_BOND_MISSED_MAX ]); + +bond_opt_initval (&newval, missed_max); + err =__bond_opt_set (bond,BOND_OPT_MISSED_MAX , &newval); +if (err) +return err; + } +return 0 ; }
@@ -515,6 +530,7 @@ static size_t bond_get_size(const struct net_device *bond_dev)nla_total_size (ETH_ALEN ) +/* IFLA_BOND_AD_ACTOR_SYSTEM */ nla_total_size (sizeof (u8)) +/* IFLA_BOND_TLB_DYNAMIC_LB */ nla_total_size (sizeof (u32)) +/* IFLA_BOND_PEER_NOTIF_DELAY */ +nla_total_size (sizeof (u8)) +/* IFLA_BOND_MISSED_MAX */ 0 ; }
@@ -650,6 +666,10 @@ static int bond_fill_info(struct sk_buff *skb, bond->params.tlb_dynamic_lb)) goto nla_put_failure; +if (nla_put_u8 (skb,IFLA_BOND_MISSED_MAX , + bond->params.missed_max)) + goto nla_put_failure; +if (BOND_MODE (bond) ==BOND_MODE_8023AD ) {struct ad_info info;
drivers/net/bonding/bond_options.c +35 -1
@@ -78,6 +78,8 @@ static int bond_option_ad_actor_system_set(struct bonding *bond, const struct bond_opt_value *newval);static int bond_option_ad_user_port_key_set (struct bonding *bond,const struct bond_opt_value *newval); +static int bond_option_missed_max_set (struct bonding *bond, +const struct bond_opt_value *newval);static const struct bond_opt_value bond_mode_tbl[] = {
@@ -163,6 +165,12 @@ static const struct bond_opt_value bond_num_peer_notif_tbl[] = { { NULL, -1, 0} }; +static const struct bond_opt_value bond_peer_notif_delay_tbl[] = { + {"off" ,0 ,0 }, + {"maxval" ,300000 ,BOND_VALFLAG_MAX }, + {NULL ,-1 ,0 } +}; +static const struct bond_opt_value bond_primary_reselect_tbl[] = { {"always" ,BOND_PRI_RESELECT_ALWAYS ,BOND_VALFLAG_DEFAULT }, {"better" ,BOND_PRI_RESELECT_BETTER ,0 },
@@ -213,6 +221,13 @@ static const struct bond_opt_value bond_ad_user_port_key_tbl[] = { { NULL, -1, 0}, }; +static const struct bond_opt_value bond_missed_max_tbl[] = { + { "minval", 1, BOND_VALFLAG_MIN}, + { "maxval", 255, BOND_VALFLAG_MAX}, + { "default", 2, BOND_VALFLAG_DEFAULT}, + { NULL, -1, 0}, +}; + static const struct bond_option bond_opts[BOND_OPT_LAST] = { [BOND_OPT_MODE] = { .id = BOND_OPT_MODE,
@@ -270,6 +285,15 @@ static const struct bond_option bond_opts[BOND_OPT_LAST] = { .values = bond_intmax_tbl, .set = bond_option_arp_interval_set }, + [BOND_OPT_MISSED_MAX] = { + .id = BOND_OPT_MISSED_MAX, + .name = "arp_missed_max", + .desc = "Maximum number of missed ARP interval", + .unsuppmodes =BIT (BOND_MODE_8023AD ) |BIT (BOND_MODE_TLB ) | + BIT(BOND_MODE_ALB), + .values = bond_missed_max_tbl, + .set = bond_option_missed_max_set + }, [BOND_OPT_ARP_TARGETS] = { .id = BOND_OPT_ARP_TARGETS, .name = "arp_ip_target",
@@ -449,7 +473,7 @@ static const struct bond_option bond_opts[BOND_OPT_LAST] = { .id = BOND_OPT_PEER_NOTIF_DELAY, .name = "peer_notif_delay", .desc = "Delay between each peer notification on failover event, in milliseconds", - .values = bond_intmax_tbl, + .values = bond_peer_notif_delay_tbl, .set = bond_option_peer_notif_delay_set } };
@@ -1186,6 +1210,16 @@ static int bond_option_arp_all_targets_set(struct bonding *bond,return 0 ; } +static int bond_option_missed_max_set (struct bonding *bond, +const struct bond_opt_value *newval) +{ +netdev_dbg (bond->dev,"Setting missed max to %s (%llu)\n" , + newval->string, newval->value); + bond->params.missed_max = newval->value; + +return 0 ; +} +static int bond_option_primary_set (struct bonding *bond,const struct bond_opt_value *newval) {
drivers/net/bonding/bond_procfs.c +2 -0
@@ -115,6 +115,8 @@ static void bond_info_show_master(struct seq_file *seq)seq_printf (seq,"ARP Polling Interval (ms): %d\n" , bond->params.arp_interval); +seq_printf (seq,"ARP Missed Max: %u\n" , + bond->params.missed_max);seq_printf (seq,"ARP IP target/s (n.n.n.n form):" );
drivers/net/bonding/bond_sysfs.c +13 -0
@@ -303,6 +303,18 @@ static ssize_t bonding_show_arp_targets(struct device *d, static DEVICE_ATTR(arp_ip_target, 0644, bonding_show_arp_targets, bonding_sysfs_store_option); +/* Show the arp missed max. */ +static ssize_t bonding_show_missed_max (struct device *d, +struct device_attribute *attr, +char *buf) +{ +struct bonding *bond =to_bond (d); + +return sprintf (buf,"%u\n" , bond->params.missed_max); +} +static DEVICE_ATTR(arp_missed_max, 0644, + bonding_show_missed_max, bonding_sysfs_store_option); +/* Show the up and down delays. */ static ssize_t bonding_show_downdelay(struct device *d, struct device_attribute *attr,
@@ -779,6 +791,7 @@ static struct attribute *per_bond_attrs[] = { &dev_attr_ad_actor_sys_prio.attr, &dev_attr_ad_actor_system.attr, &dev_attr_ad_user_port_key.attr, + &dev_attr_arp_missed_max.attr, NULL, };
drivers/net/dsa/mt7530.c +78 -46
170 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/en/ptp.c +2 -0
@@ -126,6 +126,8 @@ static bool mlx5e_ptp_poll_ts_cq(struct mlx5e_cq *cq, int budget)/* ensure cq space is freed before enabling more cqes */ wmb (); +mlx5e_txqsq_wake (&ptpsq->txqsq); +return work_done == budget; }
drivers/net/ethernet/mellanox/mlx5/core/en/txrx.h +2 -0
@@ -172,6 +172,8 @@ static inline u16 mlx5e_txqsq_get_next_pi(struct mlx5e_txqsq *sq, u16 size)return pi; } +void mlx5e_txqsq_wake (struct mlx5e_txqsq *sq); +struct mlx5e_icosq_wqe_info {u8 wqe_type;u8 num_wqebbs;
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +10 -9
@@ -1308,11 +1308,9 @@ bool mlx5e_tc_is_vf_tunnel(struct net_device *out_dev, struct net_device *route_int mlx5e_tc_query_route_vport (struct net_device *out_dev,struct net_device *route_dev,u16 *vport) {struct mlx5e_priv *out_priv, *route_priv; -struct mlx5_devcom *devcom =NULL ;struct mlx5_core_dev *route_mdev;struct mlx5_eswitch *esw;u16 vhca_id; -int err; out_priv =netdev_priv (out_dev); esw = out_priv->mdev->priv.eswitch;
@@ -1321,6 +1319,9 @@ int mlx5e_tc_query_route_vport(struct net_device *out_dev, struct net_device *ro vhca_id =MLX5_CAP_GEN (route_mdev, vhca_id);if (mlx5_lag_is_active (out_priv->mdev)) { +struct mlx5_devcom *devcom; +int err; +/* In lag case we may get devices from different eswitch instances. * If we failed to get vport num, it means, mostly, that we on the wrong * eswitch.
@@ -1329,16 +1330,16 @@ int mlx5e_tc_query_route_vport(struct net_device *out_dev, struct net_device *roif (err != -ENOENT )return err; +rcu_read_lock (); devcom = out_priv->mdev->priv.devcom; - esw =mlx5_devcom_get_peer_data (devcom,MLX5_DEVCOM_ESW_OFFLOADS ); -if (!esw) -return -ENODEV ; + esw =mlx5_devcom_get_peer_data_rcu (devcom,MLX5_DEVCOM_ESW_OFFLOADS ); + err = esw ?mlx5_eswitch_vhca_id_to_vport (esw, vhca_id, vport) : -ENODEV ; +rcu_read_unlock (); + +return err; } - err =mlx5_eswitch_vhca_id_to_vport (esw, vhca_id, vport); -if (devcom) -mlx5_devcom_release_peer_data (devcom,MLX5_DEVCOM_ESW_OFFLOADS ); -return err; +return mlx5_eswitch_vhca_id_to_vport (esw, vhca_id, vport); } int mlx5e_tc_add_flow_mod_hdr(struct mlx5e_priv *priv,
drivers/net/ethernet/mellanox/mlx5/core/en_tx.c +12 -7
@@ -810,6 +810,17 @@ static void mlx5e_tx_wi_consume_fifo_skbs(struct mlx5e_txqsq *sq, struct mlx5e_t } } +void mlx5e_txqsq_wake (struct mlx5e_txqsq *sq) +{ +if (netif_tx_queue_stopped (sq->txq) && +mlx5e_wqc_has_room_for (&sq->wq, sq->cc, sq->pc, sq->stop_room) && +mlx5e_ptpsq_fifo_has_room (sq) && + !test_bit (MLX5E_SQ_STATE_RECOVERING , &sq->state)) { +netif_tx_wake_queue (sq->txq); + sq->stats->wake++; + } +} +bool mlx5e_poll_tx_cq (struct mlx5e_cq *cq,int napi_budget) {struct mlx5e_sq_stats *stats;
@@ -909,13 +920,7 @@ bool mlx5e_poll_tx_cq(struct mlx5e_cq *cq, int napi_budget)netdev_tx_completed_queue (sq->txq, npkts, nbytes); -if (netif_tx_queue_stopped (sq->txq) && -mlx5e_wqc_has_room_for (&sq->wq, sq->cc, sq->pc, sq->stop_room) && -mlx5e_ptpsq_fifo_has_room (sq) && - !test_bit (MLX5E_SQ_STATE_RECOVERING , &sq->state)) { -netif_tx_wake_queue (sq->txq); - stats->wake++; - } +mlx5e_txqsq_wake (sq);return (i ==MLX5E_TX_CQ_POLL_BUDGET ); }
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.c +59 -22
190 lines not on this page · raw message
drivers/net/ethernet/mellanox/mlx5/core/lib/devcom.h +3 -0
@@ -6,6 +6,8 @@#include <linux/mlx5/driver.h> +#define MLX5_DEVCOM_PORTS_SUPPORTED 2 +enum mlx5_devcom_components {MLX5_DEVCOM_ESW_OFFLOADS ,
@@ -39,6 +41,7 @@ bool mlx5_devcom_is_paired(struct mlx5_devcom *devcom,void *mlx5_devcom_get_peer_data (struct mlx5_devcom *devcom,enum mlx5_devcom_components id); +void *mlx5_devcom_get_peer_data_rcu (struct mlx5_devcom *devcom,enum mlx5_devcom_components id);void mlx5_devcom_release_peer_data (struct mlx5_devcom *devcom,enum mlx5_devcom_components id);
drivers/net/phy/mscc/mscc.h +1 -0
@@ -179,6 +179,7 @@ enum rgmii_clock_delay {#define VSC8502_RGMII_CNTL 20#define VSC8502_RGMII_RX_DELAY_MASK 0x0070#define VSC8502_RGMII_TX_DELAY_MASK 0x0007 +#define VSC8502_RGMII_RX_CLK_DISABLE 0x0800#define MSCC_PHY_WOL_LOWER_MAC_ADDR 21#define MSCC_PHY_WOL_MID_MAC_ADDR 22
drivers/net/phy/mscc/mscc_main.c +28 -26
84 lines not on this page · raw message
drivers/platform/x86/intel/speed_select_if/isst_if_common.c +36 -13
111 lines not on this page · raw message
drivers/power/supply/bq24190_charger.c +12 -1
@@ -1201,8 +1201,19 @@ static void bq24190_input_current_limit_work(struct work_struct *work)struct bq24190_dev_info *bdi = container_of(work, struct bq24190_dev_info, input_current_limit_work.work); +union power_supply_propval val; +int ret; -power_supply_set_input_current_limit_from_supplier (bdi->charger); + ret =power_supply_get_property_from_supplier (bdi->charger, +POWER_SUPPLY_PROP_CURRENT_MAX , + &val); +if (ret) +return ; + +bq24190_charger_set_property (bdi->charger, +POWER_SUPPLY_PROP_INPUT_CURRENT_LIMIT , + &val); +power_supply_changed (bdi->charger); }/* Sync the input-current-limit with our parent supply (if we have one) */
drivers/power/supply/bq27xxx_battery.c +88 -83
205 lines not on this page · raw message
drivers/power/supply/power_supply_core.c +30 -27
76 lines not on this page · raw message
include/linux/power/bq27xxx_battery.h +3 -0
@@ -2,6 +2,8 @@#ifndef __LINUX_BQ27X00_BATTERY_H__#define __LINUX_BQ27X00_BATTERY_H__ +#include <linux/power_supply.h> +enum bq27xxx_chip {BQ27000 =1 ,/* bq27000, bq27200 */ BQ27010, /* bq27010, bq27210 */
@@ -70,6 +72,7 @@ struct bq27xxx_device_info {int charge_design_full;bool removed;unsigned long last_update; +union power_supply_propval last_status;struct delayed_work work;struct power_supply *bat;struct list_head list;
include/linux/power_supply.h +3 -2
@@ -420,8 +420,9 @@ power_supply_temp2resist_simple(struct power_supply_resistance_temp_table *table int table_len, int temp);extern void power_supply_changed (struct power_supply *psy);extern int power_supply_am_i_supplied (struct power_supply *psy); -extern int power_supply_set_input_current_limit_from_supplier ( -struct power_supply *psy); +int power_supply_get_property_from_supplier (struct power_supply *psy, +enum power_supply_property psp, +union power_supply_propval *val);extern int power_supply_set_battery_charged (struct power_supply *psy);#ifdef CONFIG_POWER_SUPPLY
include/net/bond_options.h +1 -0
@@ -65,6 +65,7 @@ enum {BOND_OPT_NUM_PEER_NOTIF_ALIAS ,BOND_OPT_PEER_NOTIF_DELAY ,BOND_OPT_LACP_ACTIVE , +BOND_OPT_MISSED_MAX , BOND_OPT_LAST };
include/net/bonding.h +2 -1
@@ -121,6 +121,7 @@ struct bond_params {int xmit_policy;int miimon;u8 num_peer_notif; +u8 missed_max;int arp_interval;int arp_validate;int arp_all_targets;
@@ -227,7 +228,7 @@ struct bonding {*/ spinlock_t mode_lock;spinlock_t stats_lock; -u8 send_peer_notif; +u32 send_peer_notif;u8 igmp_retrans;#ifdef CONFIG_PROC_FS struct proc_dir_entry *proc_entry;
include/net/dsa.h +28 -0
@@ -472,6 +472,34 @@ static inline bool dsa_is_user_port(struct dsa_switch *ds, int p)return dsa_to_port (ds, p)->type ==DSA_PORT_TYPE_USER ; } +#define dsa_tree_for_each_user_port (_dp, _dst) \ + list_for_each_entry((_dp), &(_dst)->ports, list) \ + if (dsa_port_is_user((_dp))) + +#define dsa_switch_for_each_port (_dp, _ds) \ + list_for_each_entry((_dp), &(_ds)->dst->ports, list) \ + if ((_dp)->ds == (_ds)) + +#define dsa_switch_for_each_port_safe (_dp, _next, _ds) \ + list_for_each_entry_safe((_dp), (_next), &(_ds)->dst->ports, list) \ + if ((_dp)->ds == (_ds)) + +#define dsa_switch_for_each_port_continue_reverse (_dp, _ds) \ + list_for_each_entry_continue_reverse((_dp), &(_ds)->dst->ports, list) \ + if ((_dp)->ds == (_ds)) + +#define dsa_switch_for_each_available_port (_dp, _ds) \ + dsa_switch_for_each_port((_dp), (_ds)) \ + if (!dsa_port_is_unused((_dp))) + +#define dsa_switch_for_each_user_port (_dp, _ds) \ + dsa_switch_for_each_port((_dp), (_ds)) \ + if (dsa_port_is_user((_dp))) + +#define dsa_switch_for_each_cpu_port (_dp, _ds) \ + dsa_switch_for_each_port((_dp), (_ds)) \ + if (dsa_port_is_cpu((_dp))) +static inline u32 dsa_user_ports (struct dsa_switch *ds) {u32 mask =0 ;
include/net/ip.h +2 -0
@@ -75,6 +75,7 @@ struct ipcm_cookie {__be32 addr;int oif;struct ip_options_rcu *opt; +__u8 protocol;__u8 ttl;__s16 tos;char priority;
@@ -95,6 +96,7 @@ static inline void ipcm_init_sk(struct ipcm_cookie *ipcm, ipcm->sockc.tsflags = inet->sk.sk_tsflags; ipcm->oif = inet->sk.sk_bound_dev_if; ipcm->addr = inet->inet_saddr; + ipcm->protocol = inet->inet_num; }#define IPCB (skb) ((struct inet_skb_parm*)((skb)->cb))
include/net/page_pool.h +0 -18
@@ -282,22 +282,4 @@ static inline void page_pool_nid_changed(struct page_pool *pool, int new_nid) page_pool_update_nid(pool, new_nid); } -static inline void page_pool_ring_lock(struct page_pool *pool) - __acquires(&pool->ring.producer_lock) -{ -if (in_serving_softirq ()) -spin_lock (&pool->ring.producer_lock); -else -spin_lock_bh (&pool->ring.producer_lock); -} - -static inline void page_pool_ring_unlock (struct page_pool *pool) - __releases(&pool->ring.producer_lock) -{ -if (in_serving_softirq ()) -spin_unlock (&pool->ring.producer_lock); -else -spin_unlock_bh (&pool->ring.producer_lock); -} -#endif /* _NET_PAGE_POOL_H */
include/net/xdp.h +3 -0
@@ -260,6 +260,9 @@ bool xdp_rxq_info_is_reg(struct xdp_rxq_info *xdp_rxq);int xdp_rxq_info_reg_mem_model (struct xdp_rxq_info *xdp_rxq,enum xdp_mem_type type,void *allocator);void xdp_rxq_info_unreg_mem_model (struct xdp_rxq_info *xdp_rxq); +int xdp_reg_mem_model (struct xdp_mem_info *mem, +enum xdp_mem_type type,void *allocator); +void xdp_unreg_mem_model (struct xdp_mem_info *mem);/* Drivers not supporting XDP metadata can use this helper, which * rejects any room expansion for metadata as a result.
include/uapi/linux/if_link.h +1 -0
@@ -858,6 +858,7 @@ enum {IFLA_BOND_TLB_DYNAMIC_LB ,IFLA_BOND_PEER_NOTIF_DELAY ,IFLA_BOND_AD_LACP_ACTIVE , +IFLA_BOND_MISSED_MAX , __IFLA_BOND_MAX, };
include/uapi/linux/in.h +2 -0
@@ -159,6 +159,8 @@ struct in_addr {#define MCAST_MSFILTER 48#define IP_MULTICAST_ALL 49#define IP_UNICAST_IF 50 +#define IP_LOCAL_PORT_RANGE 51 +#define IP_PROTOCOL 52#define MCAST_EXCLUDE 0#define MCAST_INCLUDE 1
kernel/bpf/hashtab.c +4 -2
@@ -1165,7 +1165,7 @@ static int htab_lru_map_update_elem(struct bpf_map *map, void *key, void *value, ret =htab_lock_bucket (htab, b, hash, &flags);if (ret) -return ret; + goto err_lock_bucket; l_old =lookup_elem_raw (head, hash, key, key_size);
@@ -1186,6 +1186,7 @@ static int htab_lru_map_update_elem(struct bpf_map *map, void *key, void *value, err:htab_unlock_bucket (htab, b, hash, flags); +err_lock_bucket:if (ret)htab_lru_push_free (htab, l_new);else if (l_old)
@@ -1288,7 +1289,7 @@ static int __htab_lru_percpu_map_update_elem(struct bpf_map *map, void *key, ret =htab_lock_bucket (htab, b, hash, &flags);if (ret) -return ret; + goto err_lock_bucket; l_old =lookup_elem_raw (head, hash, key, key_size);
@@ -1311,6 +1312,7 @@ static int __htab_lru_percpu_map_update_elem(struct bpf_map *map, void *key, ret =0 ; err:htab_unlock_bucket (htab, b, hash, flags); +err_lock_bucket:if (l_new)bpf_lru_push_free (&htab->lru, &l_new->lru_node);return ret;
net/bluetooth/hci_sock.c +28 -0
@@ -980,6 +980,34 @@ static int hci_sock_ioctl(struct socket *sock, unsigned int cmd,BT_DBG ("cmd %x arg %lx" , cmd, arg); +/* Make sure the cmd is valid before doing anything */ +switch (cmd) { +case HCIGETDEVLIST : +case HCIGETDEVINFO : +case HCIGETCONNLIST : +case HCIDEVUP : +case HCIDEVDOWN : +case HCIDEVRESET : +case HCIDEVRESTAT : +case HCISETSCAN : +case HCISETAUTH : +case HCISETENCRYPT : +case HCISETPTYPE : +case HCISETLINKPOL : +case HCISETLINKMODE : +case HCISETACLMTU : +case HCISETSCOMTU : +case HCIINQUIRY : +case HCISETRAW : +case HCIGETCONNINFO : +case HCIGETAUTHINFO : +case HCIBLOCKADDR : +case HCIUNBLOCKADDR : +break ; +default : +return -ENOIOCTLCMD ; + } +lock_sock (sk);if (hci_pi (sk)->channel !=HCI_CHANNEL_RAW ) {
net/core/page_pool.c +29 -5
@@ -26,6 +26,29 @@#define BIAS_MAX LONG_MAX +static bool page_pool_producer_lock (struct page_pool *pool) + __acquires(&pool->ring.producer_lock) +{ +bool in_softirq =in_softirq (); + +if (in_softirq) +spin_lock (&pool->ring.producer_lock); +else +spin_lock_bh (&pool->ring.producer_lock); + +return in_softirq; +} + +static void page_pool_producer_unlock (struct page_pool *pool, +bool in_softirq) + __releases(&pool->ring.producer_lock) +{ +if (in_softirq) +spin_unlock (&pool->ring.producer_lock); +else +spin_unlock_bh (&pool->ring.producer_lock); +} +static int page_pool_init (struct page_pool *pool,const struct page_pool_params *params) {
@@ -390,8 +413,8 @@ static void page_pool_return_page(struct page_pool *pool, struct page *page)static bool page_pool_recycle_in_ring (struct page_pool *pool,struct page *page) {int ret; -/* BH protection not needed if current is serving softirq */ -if (in_serving_softirq ()) +/* BH protection not needed if current is softirq */ +if (in_softirq ()) ret =ptr_ring_produce (&pool->ring, page);else ret =ptr_ring_produce_bh (&pool->ring, page);
@@ -446,7 +469,7 @@ __page_pool_put_page(struct page_pool *pool, struct page *page,page_pool_dma_sync_for_device (pool, page, dma_sync_size); -if (allow_direct &&in_serving_softirq () && +if (allow_direct &&in_softirq () &&page_pool_recycle_in_cache (page, pool))return NULL ;
@@ -489,6 +512,7 @@ void page_pool_put_page_bulk(struct page_pool *pool, void **data, int count) {int i, bulk_len =0 ; +bool in_softirq;for (i =0 ; i < count; i++) {struct page *page =virt_to_head_page (data[i]);
@@ -503,12 +527,12 @@ void page_pool_put_page_bulk(struct page_pool *pool, void **data,return ;/* Bulk producer into ptr_ring page_pool cache */ -page_pool_ring_lock (pool); + in_softirq =page_pool_producer_lock (pool);for (i =0 ; i < bulk_len; i++) {if (__ptr_ring_produce (&pool->ring, data[i]))break ;/* ring full */ } -page_pool_ring_unlock (pool); +page_pool_producer_unlock (pool, in_softirq);/* Hopefully all pages was return into ptr_ring */ if (likely (i == bulk_len))
net/core/xdp.c +63 -30
158 lines not on this page · raw message
net/ipv4/ip_sockglue.c +11 -1
@@ -317,7 +317,14 @@ int ip_cmsg_send(struct sock *sk, struct msghdr *msg, struct ipcm_cookie *ipc, ipc->tos = val; ipc->priority =rt_tos2priority (ipc->tos);break ; - +case IP_PROTOCOL : +if (cmsg->cmsg_len !=CMSG_LEN (sizeof (int ))) +return -EINVAL ; + val = *(int *)CMSG_DATA (cmsg); +if (val <1 || val >255 ) +return -EINVAL ; + ipc->protocol = val; +break ;default :return -EINVAL ; }
@@ -1724,6 +1731,9 @@ static int do_ip_getsockopt(struct sock *sk, int level, int optname,case IP_MINTTL : val = inet->min_ttl;break ; +case IP_PROTOCOL : + val =inet_sk (sk)->inet_num; +break ;default :release_sock (sk);return -ENOPROTOOPT ;
net/ipv4/raw.c +4 -1
@@ -559,6 +559,9 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len) }ipcm_init_sk (&ipc, inet); +/* Keep backward compat */ +if (hdrincl) + ipc.protocol =IPPROTO_RAW ;if (msg->msg_controllen) { err =ip_cmsg_send (sk, msg, &ipc, false);
@@ -626,7 +629,7 @@ static int raw_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)flowi4_init_output (&fl4, ipc.oif, ipc.sockc.mark, tos,RT_SCOPE_UNIVERSE , - hdrincl ?IPPROTO_RAW : sk->sk_protocol, + hdrincl ? ipc.protocol : sk->sk_protocol,inet_sk_flowi_flags (sk) | (hdrincl ?FLOWI_FLAG_KNOWN_NH :0 ), daddr, saddr,0 ,0 , sk->sk_uid);
net/ipv6/raw.c +2 -1
@@ -828,7 +828,8 @@ static int rawv6_sendmsg(struct sock *sk, struct msghdr *msg, size_t len)if (!proto) proto = inet->inet_num; -else if (proto != inet->inet_num) +else if (proto != inet->inet_num && + inet->inet_num !=IPPROTO_RAW )return -EINVAL ;if (proto >255 )
net/netfilter/nf_conntrack_netlink.c +0 -8
@@ -1546,9 +1546,6 @@ static const struct nla_policy ct_nla_policy[CTA_MAX+1] = {static int ctnetlink_flush_iterate (struct nf_conn *ct,void *data) { -if (test_bit (IPS_OFFLOAD_BIT , &ct->status)) -return 0 ; -return ctnetlink_filter_match (ct, data); }
@@ -1612,11 +1609,6 @@ static int ctnetlink_del_conntrack(struct sk_buff *skb, ct =nf_ct_tuplehash_to_ctrack (h); -if (test_bit (IPS_OFFLOAD_BIT , &ct->status)) { -nf_ct_put (ct); -return -EBUSY ; - } -if (cda[CTA_ID ]) {__be32 id =nla_get_be32 (cda[CTA_ID ]);
tools/include/uapi/linux/if_link.h +1 -0
@@ -655,6 +655,7 @@ enum {IFLA_BOND_TLB_DYNAMIC_LB ,IFLA_BOND_PEER_NOTIF_DELAY ,IFLA_BOND_AD_LACP_ACTIVE , +IFLA_BOND_MISSED_MAX , __IFLA_BOND_MAX, };