6.17.13-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 413/507 net: dsa: b53: move writing ARL entries into their own functions
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit bf6e9d2ae1dbafee53ec4ccd126595172e1e5278 ]
Move writing ARL entries into individual functions for each format.
Stable-dep-of: 8e46aacea426 ("net: dsa: b53: use same ARL search result offset for BCM5325/65")
--- drivers/net/dsa/b53/b53_common.c | 38 ++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 12 deletions(-)
drivers/net/dsa/b53/b53_common.c +26 -12
@@ -1840,6 +1840,16 @@ static void b53_arl_read_entry_25(struct b53_device *dev,b53_arl_to_entry_25 (ent, mac_vid); } +static void b53_arl_write_entry_25 (struct b53_device *dev, +const struct b53_arl_entry *ent,u8 idx) +{ +u64 mac_vid; + +b53_arl_from_entry_25 (&mac_vid, ent); +b53_write64 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_MAC_VID_ENTRY (idx), + mac_vid); +} +static void b53_arl_read_entry_95 (struct b53_device *dev,struct b53_arl_entry *ent,u8 idx) {
@@ -1852,6 +1862,19 @@ static void b53_arl_read_entry_95(struct b53_device *dev,b53_arl_to_entry (ent, mac_vid, fwd_entry); } +static void b53_arl_write_entry_95 (struct b53_device *dev, +const struct b53_arl_entry *ent,u8 idx) +{ +u32 fwd_entry; +u64 mac_vid; + +b53_arl_from_entry (&mac_vid, &fwd_entry, ent); +b53_write64 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_MAC_VID_ENTRY (idx), + mac_vid); +b53_write32 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_DATA_ENTRY (idx), + fwd_entry); +} +static int b53_arl_read (struct b53_device *dev,const u8 *mac,u16 vid,struct b53_arl_entry *ent,u8 *idx) {
@@ -1892,9 +1915,8 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, const unsigned char *addr, u16 vid, bool is_valid) { struct b53_arl_entry ent; -u32 fwd_entry; -u64 mac, mac_vid =0 ;u8 idx =0 ; +u64 mac;int ret;/* Convert the array into a 64-bit MAC */
@@ -1931,7 +1953,6 @@ static int b53_arl_op(struct b53_device *dev, int op, int port,/* We could not find a matching MAC, so reset to a new entry */ dev_dbg (dev->dev,"{%pM,%.4d} not found, using idx: %d\n" , addr, vid, idx); - fwd_entry =0 ;break ;default : dev_dbg(dev->dev, "{%pM,%.4d} found, using idx: %d\n",
@@ -1959,16 +1980,9 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, ent.is_age = false;memcpy (ent.mac, addr,ETH_ALEN );if (is5325 (dev) ||is5365 (dev)) -b53_arl_from_entry_25 (&mac_vid, &ent); +b53_arl_write_entry_25 (dev, &ent, idx);else -b53_arl_from_entry (&mac_vid, &fwd_entry, &ent); - -b53_write64 (dev,B53_ARLIO_PAGE , -B53_ARLTBL_MAC_VID_ENTRY (idx), mac_vid); - -if (!is5325 (dev) && !is5365 (dev)) -b53_write32 (dev,B53_ARLIO_PAGE , -B53_ARLTBL_DATA_ENTRY (idx), fwd_entry); +b53_arl_write_entry_95 (dev, &ent, idx);return b53_arl_rw_op (dev,0 ); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 414/507 net: dsa: b53: provide accessors for accessing ARL_SRCH_CTL
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 1716be6db04af53bac9b869f01156a460595cf41 ]
In order to more easily support more formats, move accessing ARL_SRCH_CTL into helper functions to contain the differences.
Stable-dep-of: 8e46aacea426 ("net: dsa: b53: use same ARL search result offset for BCM5325/65")
--- drivers/net/dsa/b53/b53_common.c | 37 +++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 13 deletions(-)
drivers/net/dsa/b53/b53_common.c +24 -13
@@ -2017,18 +2017,37 @@ int b53_fdb_del(struct dsa_switch *ds, int port, }EXPORT_SYMBOL (b53_fdb_del); -static int b53_arl_search_wait (struct b53_device *dev) +static void b53_read_arl_srch_ctl (struct b53_device *dev,u8 *val) { -unsigned int timeout =1000 ; -u8 reg, offset; +u8 offset; + +if (is5325 (dev) ||is5365 (dev)) + offset =B53_ARL_SRCH_CTL_25 ; +else + offset =B53_ARL_SRCH_CTL ; + +b53_read8 (dev,B53_ARLIO_PAGE , offset, val); +} + +static void b53_write_arl_srch_ctl (struct b53_device *dev,u8 val) +{ +u8 offset;if (is5325 (dev) ||is5365 (dev)) offset =B53_ARL_SRCH_CTL_25 ;else offset =B53_ARL_SRCH_CTL ; +b53_write8 (dev,B53_ARLIO_PAGE , offset, val); +} + +static int b53_arl_search_wait (struct b53_device *dev) +{ +unsigned int timeout =1000 ; +u8 reg; + do { - b53_read8(dev, B53_ARLIO_PAGE, offset, ®); + b53_read_arl_srch_ctl(dev, ®); if (!(reg & ARL_SRCH_STDN)) return -ENOENT;
@@ -2083,23 +2102,15 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,unsigned int count =0 , results_per_hit =1 ;struct b53_device *priv = ds->priv;struct b53_arl_entry results[2 ]; -u8 offset;int ret; -u8 reg;if (priv->num_arl_bins >2 ) results_per_hit =2 ;mutex_lock (&priv->arl_mutex); -if (is5325 (priv) ||is5365 (priv)) - offset =B53_ARL_SRCH_CTL_25 ; -else - offset =B53_ARL_SRCH_CTL ; -/* Start search operation */ - reg =ARL_SRCH_STDN ; -b53_write8 (priv,B53_ARLIO_PAGE , offset, reg); +b53_write_arl_srch_ctl (priv,ARL_SRCH_STDN ); do { ret = b53_arl_search_wait(priv);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 415/507 net: dsa: b53: split reading search entry into their own functions
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit e0c476f325a8c9b961a3d446c24d3c8ecae7d186 ]
Split reading search entries into a function for each format.
Stable-dep-of: 8e46aacea426 ("net: dsa: b53: use same ARL search result offset for BCM5325/65")
--- drivers/net/dsa/b53/b53_common.c | 56 ++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 18 deletions(-)
drivers/net/dsa/b53/b53_common.c +38 -18
@@ -2060,28 +2060,48 @@ static int b53_arl_search_wait(struct b53_device *dev)return -ETIMEDOUT ; } -static void b53_arl_search_rd (struct b53_device *dev,u8 idx, -struct b53_arl_entry *ent) +static void b53_arl_search_read_25 (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) {u64 mac_vid; -if (is5325 (dev)) { -b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_0_MACVID_25 , - &mac_vid); -b53_arl_to_entry_25 (ent, mac_vid); - }else if (is5365 (dev)) { -b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_0_MACVID_65 , - &mac_vid); -b53_arl_to_entry_25 (ent, mac_vid); - }else { -u32 fwd_entry; +b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_0_MACVID_25 , + &mac_vid); +b53_arl_to_entry_25 (ent, mac_vid); +} -b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_MACVID (idx), - &mac_vid); -b53_read32 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL (idx), - &fwd_entry); -b53_arl_to_entry (ent, mac_vid, fwd_entry); - } +static void b53_arl_search_read_65 (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) +{ +u64 mac_vid; + +b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_0_MACVID_65 , + &mac_vid); +b53_arl_to_entry_25 (ent, mac_vid); +} + +static void b53_arl_search_read_95 (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) +{ +u32 fwd_entry; +u64 mac_vid; + +b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_MACVID (idx), + &mac_vid); +b53_read32 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL (idx), + &fwd_entry); +b53_arl_to_entry (ent, mac_vid, fwd_entry); +} + +static void b53_arl_search_rd (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) +{ +if (is5325 (dev)) +b53_arl_search_read_25 (dev, idx, ent); +else if (is5365 (dev)) +b53_arl_search_read_65 (dev, idx, ent); +else +b53_arl_search_read_95 (dev, idx, ent); } static int b53_fdb_copy(int port, const struct b53_arl_entry *ent,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 416/507 net: dsa: b53: move ARL entry functions into ops struct
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit a7e73339ad46ade76d29fb6cc7d7854222608c26 ]
Now that the differences in ARL entry formats are neatly contained into functions per chip family, wrap them into an ops struct and add wrapper functions to access them.
Stable-dep-of: 8e46aacea426 ("net: dsa: b53: use same ARL search result offset for BCM5325/65")
--- drivers/net/dsa/b53/b53_common.c | 67 ++++++++++++++++++++++---------- drivers/net/dsa/b53/b53_priv.h | 30 ++++++++++++++ 2 files changed, 76 insertions(+), 21 deletions(-)
drivers/net/dsa/b53/b53_common.c +46 -21
@@ -1890,10 +1890,7 @@ static int b53_arl_read(struct b53_device *dev, const u8 *mac,/* Read the bins */ for (i =0 ; i < dev->num_arl_bins; i++) { -if (is5325 (dev) ||is5365 (dev)) -b53_arl_read_entry_25 (dev, ent, i); -else -b53_arl_read_entry_95 (dev, ent, i); +b53_arl_read_entry (dev, ent, i);if (!ent->is_valid) {set_bit (i, free_bins);
@@ -1979,10 +1976,7 @@ static int b53_arl_op(struct b53_device *dev, int op, int port, ent.is_static = true; ent.is_age = false;memcpy (ent.mac, addr,ETH_ALEN ); -if (is5325 (dev) ||is5365 (dev)) -b53_arl_write_entry_25 (dev, &ent, idx); -else -b53_arl_write_entry_95 (dev, &ent, idx); +b53_arl_write_entry (dev, &ent, idx);return b53_arl_rw_op (dev,0 ); }
@@ -2093,17 +2087,6 @@ static void b53_arl_search_read_95(struct b53_device *dev, u8 idx,b53_arl_to_entry (ent, mac_vid, fwd_entry); } -static void b53_arl_search_rd (struct b53_device *dev,u8 idx, -struct b53_arl_entry *ent) -{ -if (is5325 (dev)) -b53_arl_search_read_25 (dev, idx, ent); -else if (is5365 (dev)) -b53_arl_search_read_65 (dev, idx, ent); -else -b53_arl_search_read_95 (dev, idx, ent); -} -static int b53_fdb_copy (int port,const struct b53_arl_entry *ent,dsa_fdb_dump_cb_t *cb,void *data) {
@@ -2137,13 +2120,13 @@ int b53_fdb_dump(struct dsa_switch *ds, int port,if (ret)break ; -b53_arl_search_rd (priv,0 , &results[0 ]); +b53_arl_search_read (priv,0 , &results[0 ]); ret =b53_fdb_copy (port, &results[0 ], cb, data);if (ret)break ;if (results_per_hit ==2 ) { -b53_arl_search_rd (priv,1 , &results[1 ]); +b53_arl_search_read (priv,1 , &results[1 ]); ret =b53_fdb_copy (port, &results[1 ], cb, data);if (ret)break ;
@@ -2669,6 +2652,24 @@ static const struct dsa_switch_ops b53_switch_ops = { .port_change_mtu = b53_change_mtu, }; +static const struct b53_arl_ops b53_arl_ops_25 = { + .arl_read_entry = b53_arl_read_entry_25, + .arl_write_entry = b53_arl_write_entry_25, + .arl_search_read = b53_arl_search_read_25, +}; + +static const struct b53_arl_ops b53_arl_ops_65 = { + .arl_read_entry = b53_arl_read_entry_25, + .arl_write_entry = b53_arl_write_entry_25, + .arl_search_read = b53_arl_search_read_65, +}; + +static const struct b53_arl_ops b53_arl_ops_95 = { + .arl_read_entry = b53_arl_read_entry_95, + .arl_write_entry = b53_arl_write_entry_95, + .arl_search_read = b53_arl_search_read_95, +}; +struct b53_chip_data {u32 chip_id;const char *dev_name;
@@ -2682,6 +2683,7 @@ struct b53_chip_data {u8 duplex_reg;u8 jumbo_pm_reg;u8 jumbo_size_reg; +const struct b53_arl_ops *arl_ops; };#define B53_VTA_REGS \
@@ -2701,6 +2703,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .arl_buckets = 1024, .imp_port = 5, .duplex_reg = B53_DUPLEX_STAT_FE, + .arl_ops = &b53_arl_ops_25, }, { .chip_id = BCM5365_DEVICE_ID,
@@ -2711,6 +2714,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .arl_buckets = 1024, .imp_port = 5, .duplex_reg = B53_DUPLEX_STAT_FE, + .arl_ops = &b53_arl_ops_65, }, { .chip_id = BCM5389_DEVICE_ID,
@@ -2724,6 +2728,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM5395_DEVICE_ID,
@@ -2737,6 +2742,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM5397_DEVICE_ID,
@@ -2750,6 +2756,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM5398_DEVICE_ID,
@@ -2763,6 +2770,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53101_DEVICE_ID,
@@ -2776,6 +2784,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53115_DEVICE_ID,
@@ -2789,6 +2798,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53125_DEVICE_ID,
@@ -2802,6 +2812,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53128_DEVICE_ID,
@@ -2815,6 +2826,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM63XX_DEVICE_ID,
@@ -2828,6 +2840,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_63XX, .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX, .jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53010_DEVICE_ID,
@@ -2841,6 +2854,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53011_DEVICE_ID,
@@ -2854,6 +2868,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53012_DEVICE_ID,
@@ -2867,6 +2882,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53018_DEVICE_ID,
@@ -2880,6 +2896,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53019_DEVICE_ID,
@@ -2893,6 +2910,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM58XX_DEVICE_ID,
@@ -2906,6 +2924,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM583XX_DEVICE_ID,
@@ -2919,6 +2938,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, },/* Starfighter 2 */ {
@@ -2933,6 +2953,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM7445_DEVICE_ID,
@@ -2946,6 +2967,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM7278_DEVICE_ID,
@@ -2959,6 +2981,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, { .chip_id = BCM53134_DEVICE_ID,
@@ -2973,6 +2996,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, + .arl_ops = &b53_arl_ops_95, }, };
@@ -3001,6 +3025,7 @@ static int b53_switch_init(struct b53_device *dev) dev->num_vlans = chip->vlans; dev->num_arl_bins = chip->arl_bins; dev->num_arl_buckets = chip->arl_buckets; + dev->arl_ops = chip->arl_ops;break ; } }
drivers/net/dsa/b53/b53_priv.h +30 -0
@@ -58,6 +58,17 @@ struct b53_io_ops { bool link_up); }; +struct b53_arl_entry ; + +struct b53_arl_ops { +void (*arl_read_entry)(struct b53_device *dev, +struct b53_arl_entry *ent,u8 idx); +void (*arl_write_entry)(struct b53_device *dev, +const struct b53_arl_entry *ent,u8 idx); +void (*arl_search_read)(struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent); +}; +#define B53_INVALID_LANE 0xffenum {
@@ -127,6 +138,7 @@ struct b53_device {struct mutex stats_mutex;struct mutex arl_mutex;const struct b53_io_ops *ops; +const struct b53_arl_ops *arl_ops;/* chip specific data */ u32 chip_id;
@@ -371,6 +383,24 @@ static inline void b53_arl_from_entry_25(u64 *mac_vid, *mac_vid |=ARLTBL_AGE_25 ; } +static inline void b53_arl_read_entry (struct b53_device *dev, +struct b53_arl_entry *ent,u8 idx) +{ + dev->arl_ops->arl_read_entry (dev, ent, idx); +} + +static inline void b53_arl_write_entry (struct b53_device *dev, +const struct b53_arl_entry *ent,u8 idx) +{ + dev->arl_ops->arl_write_entry (dev, ent, idx); +} + +static inline void b53_arl_search_read (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) +{ + dev->arl_ops->arl_search_read (dev, idx, ent); +} +#ifdef CONFIG_BCM47XX #include <linux/bcm47xx_nvram.h>
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 417/507 net: dsa: b53: add support for 5389/5397/5398 ARL entry format
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 300f78e8b6b7be17c2c78afeded75be68acb1aa7 ]
BCM5389, BCM5397 and BCM5398 use a different ARL entry format with just a 16 bit fwdentry register, as well as different search control and data offsets.
So add appropriate ops for them and switch those chips to use them.
Stable-dep-of: 8e46aacea426 ("net: dsa: b53: use same ARL search result offset for BCM5325/65")
--- drivers/net/dsa/b53/b53_common.c | 53 ++++++++++++++++++++++++++++++-- drivers/net/dsa/b53/b53_priv.h | 26 ++++++++++++++++ drivers/net/dsa/b53/b53_regs.h | 13 ++++++++ 3 files changed, 89 insertions(+), 3 deletions(-)
drivers/net/dsa/b53/b53_common.c +50 -3
@@ -1850,6 +1850,31 @@ static void b53_arl_write_entry_25(struct b53_device *dev, mac_vid); } +static void b53_arl_read_entry_89 (struct b53_device *dev, +struct b53_arl_entry *ent,u8 idx) +{ +u64 mac_vid; +u16 fwd_entry; + +b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_MAC_VID_ENTRY (idx), + &mac_vid); +b53_read16 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_DATA_ENTRY (idx), &fwd_entry); +b53_arl_to_entry_89 (ent, mac_vid, fwd_entry); +} + +static void b53_arl_write_entry_89 (struct b53_device *dev, +const struct b53_arl_entry *ent,u8 idx) +{ +u32 fwd_entry; +u64 mac_vid; + +b53_arl_from_entry_89 (&mac_vid, &fwd_entry, ent); +b53_write64 (dev,B53_ARLIO_PAGE , +B53_ARLTBL_MAC_VID_ENTRY (idx), mac_vid); +b53_write16 (dev,B53_ARLIO_PAGE , +B53_ARLTBL_DATA_ENTRY (idx), fwd_entry); +} +static void b53_arl_read_entry_95 (struct b53_device *dev,struct b53_arl_entry *ent,u8 idx) {
@@ -2017,6 +2042,8 @@ static void b53_read_arl_srch_ctl(struct b53_device *dev, u8 *val)if (is5325 (dev) ||is5365 (dev)) offset =B53_ARL_SRCH_CTL_25 ; +else if (dev->chip_id ==BCM5389_DEVICE_ID ||is5397_98 (dev)) + offset =B53_ARL_SRCH_CTL_89 ;else offset =B53_ARL_SRCH_CTL ;
@@ -2029,6 +2056,8 @@ static void b53_write_arl_srch_ctl(struct b53_device *dev, u8 val)if (is5325 (dev) ||is5365 (dev)) offset =B53_ARL_SRCH_CTL_25 ; +else if (dev->chip_id ==BCM5389_DEVICE_ID ||is5397_98 (dev)) + offset =B53_ARL_SRCH_CTL_89 ;else offset =B53_ARL_SRCH_CTL ;
@@ -2074,6 +2103,18 @@ static void b53_arl_search_read_65(struct b53_device *dev, u8 idx,b53_arl_to_entry_25 (ent, mac_vid); } +static void b53_arl_search_read_89 (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) +{ +u16 fwd_entry; +u64 mac_vid; + +b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSLT_MACVID_89 , + &mac_vid); +b53_read16 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSLT_89 , &fwd_entry); +b53_arl_to_entry_89 (ent, mac_vid, fwd_entry); +} +static void b53_arl_search_read_95 (struct b53_device *dev,u8 idx,struct b53_arl_entry *ent) {
@@ -2664,6 +2705,12 @@ static const struct b53_arl_ops b53_arl_ops_65 = { .arl_search_read = b53_arl_search_read_65, }; +static const struct b53_arl_ops b53_arl_ops_89 = { + .arl_read_entry = b53_arl_read_entry_89, + .arl_write_entry = b53_arl_write_entry_89, + .arl_search_read = b53_arl_search_read_89, +}; +static const struct b53_arl_ops b53_arl_ops_95 = { .arl_read_entry = b53_arl_read_entry_95, .arl_write_entry = b53_arl_write_entry_95,
@@ -2728,7 +2775,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, - .arl_ops = &b53_arl_ops_95, + .arl_ops = &b53_arl_ops_89, }, { .chip_id = BCM5395_DEVICE_ID,
@@ -2756,7 +2803,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, - .arl_ops = &b53_arl_ops_95, + .arl_ops = &b53_arl_ops_89, }, { .chip_id = BCM5398_DEVICE_ID,
@@ -2770,7 +2817,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .duplex_reg = B53_DUPLEX_STAT_GE, .jumbo_pm_reg = B53_JUMBO_PORT_MASK, .jumbo_size_reg = B53_JUMBO_MAX_SIZE, - .arl_ops = &b53_arl_ops_95, + .arl_ops = &b53_arl_ops_89, }, { .chip_id = BCM53101_DEVICE_ID,
drivers/net/dsa/b53/b53_priv.h +26 -0
@@ -353,6 +353,18 @@ static inline void b53_arl_to_entry_25(struct b53_arl_entry *ent, ent->vid = (mac_vid >>ARLTBL_VID_S_65 ) &ARLTBL_VID_MASK_25 ; } +static inline void b53_arl_to_entry_89 (struct b53_arl_entry *ent, +u64 mac_vid,u16 fwd_entry) +{ +memset (ent,0 ,sizeof (*ent)); + ent->port = fwd_entry &ARLTBL_DATA_PORT_ID_MASK_89 ; + ent->is_valid = !!(fwd_entry &ARLTBL_VALID_89 ); + ent->is_age = !!(fwd_entry &ARLTBL_AGE_89 ); + ent->is_static = !!(fwd_entry &ARLTBL_STATIC_89 ); +u64_to_ether_addr (mac_vid, ent->mac); + ent->vid = mac_vid >>ARLTBL_VID_S ; +} +static inline void b53_arl_from_entry (u64 *mac_vid,u32 *fwd_entry,const struct b53_arl_entry *ent) {
@@ -383,6 +395,20 @@ static inline void b53_arl_from_entry_25(u64 *mac_vid, *mac_vid |=ARLTBL_AGE_25 ; } +static inline void b53_arl_from_entry_89 (u64 *mac_vid,u32 *fwd_entry, +const struct b53_arl_entry *ent) +{ + *mac_vid =ether_addr_to_u64 (ent->mac); + *mac_vid |= (u64)(ent->vid &ARLTBL_VID_MASK ) <<ARLTBL_VID_S ; + *fwd_entry = ent->port &ARLTBL_DATA_PORT_ID_MASK_89 ; +if (ent->is_valid) + *fwd_entry |=ARLTBL_VALID_89 ; +if (ent->is_static) + *fwd_entry |=ARLTBL_STATIC_89 ; +if (ent->is_age) + *fwd_entry |=ARLTBL_AGE_89 ; +} +static inline void b53_arl_read_entry (struct b53_device *dev,struct b53_arl_entry *ent,u8 idx) {
drivers/net/dsa/b53/b53_regs.h +13 -0
@@ -342,12 +342,20 @@#define ARLTBL_STATIC BIT(15)#define ARLTBL_VALID BIT(16) +/* BCM5389 ARL Table Data Entry N Register format (16 bit) */ +#define ARLTBL_DATA_PORT_ID_MASK_89 GENMASK(8, 0) +#define ARLTBL_TC_MASK_89 GENMASK(12, 10) +#define ARLTBL_AGE_89 BIT(13) +#define ARLTBL_STATIC_89 BIT(14) +#define ARLTBL_VALID_89 BIT(15) +/* Maximum number of bin entries in the ARL for all switches */ #define B53_ARLTBL_MAX_BIN_ENTRIES 4/* ARL Search Control Register (8 bit) */ #define B53_ARL_SRCH_CTL 0x50#define B53_ARL_SRCH_CTL_25 0x20 +#define B53_ARL_SRCH_CTL_89 0x30#define ARL_SRCH_VLID BIT(0)#define ARL_SRCH_STDN BIT(7)
@@ -355,10 +363,12 @@#define B53_ARL_SRCH_ADDR 0x51#define B53_ARL_SRCH_ADDR_25 0x22#define B53_ARL_SRCH_ADDR_65 0x24 +#define B53_ARL_SRCH_ADDR_89 0x31#define ARL_ADDR_MASK GENMASK(14, 0)/* ARL Search MAC/VID Result (64 bit) */ #define B53_ARL_SRCH_RSTL_0_MACVID 0x60 +#define B53_ARL_SRCH_RSLT_MACVID_89 0x33/* Single register search result on 5325 */ #define B53_ARL_SRCH_RSTL_0_MACVID_25 0x24
@@ -368,6 +378,9 @@/* ARL Search Data Result (32 bit) */ #define B53_ARL_SRCH_RSTL_0 0x68 +/* BCM5389 ARL Search Data Result (16 bit) */ +#define B53_ARL_SRCH_RSLT_89 0x3b +#define B53_ARL_SRCH_RSTL_MACVID (x) (B53_ARL_SRCH_RSTL_0_MACVID + ((x) * 0x10))#define B53_ARL_SRCH_RSTL (x) (B53_ARL_SRCH_RSTL_0 + ((x) * 0x10))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 418/507 net: dsa: b53: use same ARL search result offset for BCM5325/65
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 8e46aacea4264bcb8d4265fb07577afff58ae78d ]
BCM5365's search result is at the same offset as BCM5325's search result, and they (mostly) share the same format, so switch BCM5365 to BCM5325's arl ops.
--- drivers/net/dsa/b53/b53_common.c | 18 +----------------- drivers/net/dsa/b53/b53_regs.h | 4 +--- 2 files changed, 2 insertions(+), 20 deletions(-)
drivers/net/dsa/b53/b53_common.c +1 -17
@@ -2093,16 +2093,6 @@ static void b53_arl_search_read_25(struct b53_device *dev, u8 idx,b53_arl_to_entry_25 (ent, mac_vid); } -static void b53_arl_search_read_65 (struct b53_device *dev,u8 idx, -struct b53_arl_entry *ent) -{ -u64 mac_vid; - -b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_0_MACVID_65 , - &mac_vid); -b53_arl_to_entry_25 (ent, mac_vid); -} -static void b53_arl_search_read_89 (struct b53_device *dev,u8 idx,struct b53_arl_entry *ent) {
@@ -2699,12 +2689,6 @@ static const struct b53_arl_ops b53_arl_ops_25 = { .arl_search_read = b53_arl_search_read_25, }; -static const struct b53_arl_ops b53_arl_ops_65 = { - .arl_read_entry = b53_arl_read_entry_25, - .arl_write_entry = b53_arl_write_entry_25, - .arl_search_read = b53_arl_search_read_65, -}; -static const struct b53_arl_ops b53_arl_ops_89 = { .arl_read_entry = b53_arl_read_entry_89, .arl_write_entry = b53_arl_write_entry_89,
@@ -2761,7 +2745,7 @@ static const struct b53_chip_data b53_switch_chips[] = { .arl_buckets = 1024, .imp_port = 5, .duplex_reg = B53_DUPLEX_STAT_FE, - .arl_ops = &b53_arl_ops_65, + .arl_ops = &b53_arl_ops_25, }, { .chip_id = BCM5389_DEVICE_ID,
drivers/net/dsa/b53/b53_regs.h +1 -3
@@ -370,10 +370,8 @@#define B53_ARL_SRCH_RSTL_0_MACVID 0x60#define B53_ARL_SRCH_RSLT_MACVID_89 0x33 -/* Single register search result on 5325 */ +/* Single register search result on 5325/5365 */ #define B53_ARL_SRCH_RSTL_0_MACVID_25 0x24 -/* Single register search result on 5365 */ -#define B53_ARL_SRCH_RSTL_0_MACVID_65 0x30/* ARL Search Data Result (32 bit) */ #define B53_ARL_SRCH_RSTL_0 0x68
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 419/507 net: dsa: b53: fix CPU port unicast ARL entries for BCM5325/65
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 85132103f700b1340fc17df8a981509d17bf4872 ]
On BCM5325 and BCM5365, unicast ARL entries use 8 as the value for the CPU port, so we need to translate it to/from 5 as used for the CPU port at most other places.
--- drivers/net/dsa/b53/b53_priv.h | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/net/dsa/b53/b53_priv.h +9 -4
@@ -344,12 +344,14 @@ static inline void b53_arl_to_entry_25(struct b53_arl_entry *ent, u64 mac_vid) {memset (ent,0 ,sizeof (*ent)); - ent->port = (mac_vid >>ARLTBL_DATA_PORT_ID_S_25 ) & -ARLTBL_DATA_PORT_ID_MASK_25 ; ent->is_valid = !!(mac_vid &ARLTBL_VALID_25 ); ent->is_age = !!(mac_vid &ARLTBL_AGE_25 ); ent->is_static = !!(mac_vid &ARLTBL_STATIC_25 );u64_to_ether_addr (mac_vid, ent->mac); + ent->port = (mac_vid >>ARLTBL_DATA_PORT_ID_S_25 ) & +ARLTBL_DATA_PORT_ID_MASK_25 ; +if (is_unicast_ether_addr (ent->mac) && ent->port ==B53_CPU_PORT ) + ent->port =B53_CPU_PORT_25 ; ent->vid = (mac_vid >>ARLTBL_VID_S_65 ) &ARLTBL_VID_MASK_25 ; }
@@ -383,8 +385,11 @@ static inline void b53_arl_from_entry_25(u64 *mac_vid, const struct b53_arl_entry *ent) { *mac_vid =ether_addr_to_u64 (ent->mac); - *mac_vid |= (u64)(ent->port &ARLTBL_DATA_PORT_ID_MASK_25 ) << -ARLTBL_DATA_PORT_ID_S_25 ; +if (is_unicast_ether_addr (ent->mac) && ent->port ==B53_CPU_PORT_25 ) + *mac_vid |= (u64 )B53_CPU_PORT <<ARLTBL_DATA_PORT_ID_S_25 ; +else + *mac_vid |= (u64)(ent->port &ARLTBL_DATA_PORT_ID_MASK_25 ) << +ARLTBL_DATA_PORT_ID_S_25 ; *mac_vid |= (u64)(ent->vid &ARLTBL_VID_MASK_25 ) <<ARLTBL_VID_S_65 ;if (ent->is_valid)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 420/507 net: dsa: b53: add support for bcm63xx ARL entry format
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 2b3013ac03028a2364d8779719bb6bfbc0212435 ]
The ARL registers of BCM63XX embedded switches are somewhat unique. The normal ARL table access registers have the same format as BCM5389, but the ARL search registers differ:
* SRCH_CTL is at the same offset of BCM5389, but 16 bits wide. It does not have more fields, just needs to be accessed by a 16 bit read.
* SRCH_RSLT_MACVID and SRCH_RSLT are aligned to 32 bit, and have shifted offsets.
* SRCH_RSLT has a different format than the normal ARL data entry register.
* There is only one set of ENTRY_N registers, implying a 1 bin layout.
So add appropriate ops for bcm63xx and let it use it.
Stable-dep-of: 3b08863469aa ("net: dsa: b53: fix BCM5325/65 ARL entry multicast port masks")
--- drivers/net/dsa/b53/b53_common.c | 44 +++++++++++++++++++++++++++----- drivers/net/dsa/b53/b53_priv.h | 15 +++++++++++ drivers/net/dsa/b53/b53_regs.h | 9 +++++++ 3 files changed, 61 insertions(+), 7 deletions(-)
drivers/net/dsa/b53/b53_common.c +37 -7
@@ -2042,12 +2042,20 @@ static void b53_read_arl_srch_ctl(struct b53_device *dev, u8 *val)if (is5325 (dev) ||is5365 (dev)) offset =B53_ARL_SRCH_CTL_25 ; -else if (dev->chip_id ==BCM5389_DEVICE_ID ||is5397_98 (dev)) +else if (dev->chip_id ==BCM5389_DEVICE_ID ||is5397_98 (dev) || +is63xx (dev)) offset =B53_ARL_SRCH_CTL_89 ;else offset =B53_ARL_SRCH_CTL ; -b53_read8 (dev,B53_ARLIO_PAGE , offset, val); +if (is63xx (dev)) { +u16 val16; + +b53_read16 (dev,B53_ARLIO_PAGE , offset, &val16); + *val = val16 &0xff ; + }else { +b53_read8 (dev,B53_ARLIO_PAGE , offset, val); + } }static void b53_write_arl_srch_ctl (struct b53_device *dev,u8 val)
@@ -2056,12 +2064,16 @@ static void b53_write_arl_srch_ctl(struct b53_device *dev, u8 val)if (is5325 (dev) ||is5365 (dev)) offset =B53_ARL_SRCH_CTL_25 ; -else if (dev->chip_id ==BCM5389_DEVICE_ID ||is5397_98 (dev)) +else if (dev->chip_id ==BCM5389_DEVICE_ID ||is5397_98 (dev) || +is63xx (dev)) offset =B53_ARL_SRCH_CTL_89 ;else offset =B53_ARL_SRCH_CTL ; -b53_write8 (dev,B53_ARLIO_PAGE , offset, val); +if (is63xx (dev)) +b53_write16 (dev,B53_ARLIO_PAGE , offset, val); +else +b53_write8 (dev,B53_ARLIO_PAGE , offset, val); }static int b53_arl_search_wait (struct b53_device *dev)
@@ -2105,6 +2117,18 @@ static void b53_arl_search_read_89(struct b53_device *dev, u8 idx,b53_arl_to_entry_89 (ent, mac_vid, fwd_entry); } +static void b53_arl_search_read_63xx (struct b53_device *dev,u8 idx, +struct b53_arl_entry *ent) +{ +u16 fwd_entry; +u64 mac_vid; + +b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSLT_MACVID_63XX , + &mac_vid); +b53_read16 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSLT_63XX , &fwd_entry); +b53_arl_search_to_entry_63xx (ent, mac_vid, fwd_entry); +} +static void b53_arl_search_read_95 (struct b53_device *dev,u8 idx,struct b53_arl_entry *ent) {
@@ -2695,6 +2719,12 @@ static const struct b53_arl_ops b53_arl_ops_89 = { .arl_search_read = b53_arl_search_read_89, }; +static const struct b53_arl_ops b53_arl_ops_63xx = { + .arl_read_entry = b53_arl_read_entry_89, + .arl_write_entry = b53_arl_write_entry_89, + .arl_search_read = b53_arl_search_read_63xx, +}; +static const struct b53_arl_ops b53_arl_ops_95 = { .arl_read_entry = b53_arl_read_entry_95, .arl_write_entry = b53_arl_write_entry_95,
@@ -2864,14 +2894,14 @@ static const struct b53_chip_data b53_switch_chips[] = { .dev_name = "BCM63xx", .vlans = 4096, .enabled_ports = 0, /* pdata must provide them */ - .arl_bins = 4, - .arl_buckets = 1024, + .arl_bins = 1, + .arl_buckets = 4096, .imp_port = 8, .vta_regs = B53_VTA_REGS_63XX, .duplex_reg = B53_DUPLEX_STAT_63XX, .jumbo_pm_reg = B53_JUMBO_PORT_MASK_63XX, .jumbo_size_reg = B53_JUMBO_MAX_SIZE_63XX, - .arl_ops = &b53_arl_ops_95, + .arl_ops = &b53_arl_ops_63xx, }, { .chip_id = BCM53010_DEVICE_ID,
drivers/net/dsa/b53/b53_priv.h +15 -0
@@ -414,6 +414,21 @@ static inline void b53_arl_from_entry_89(u64 *mac_vid, u32 *fwd_entry, *fwd_entry |=ARLTBL_AGE_89 ; } +static inline void b53_arl_search_to_entry_63xx (struct b53_arl_entry *ent, +u64 mac_vid,u16 fwd_entry) +{ +memset (ent,0 ,sizeof (*ent)); +u64_to_ether_addr (mac_vid, ent->mac); + ent->vid = mac_vid >>ARLTBL_VID_S ; + + ent->port = fwd_entry &ARL_SRST_PORT_ID_MASK_63XX ; + ent->port >>=1 ; + + ent->is_age = !!(fwd_entry &ARL_SRST_AGE_63XX ); + ent->is_static = !!(fwd_entry &ARL_SRST_STATIC_63XX ); + ent->is_valid =1 ; +} +static inline void b53_arl_read_entry (struct b53_device *dev,struct b53_arl_entry *ent,u8 idx) {
drivers/net/dsa/b53/b53_regs.h +9 -0
@@ -364,11 +364,13 @@#define B53_ARL_SRCH_ADDR_25 0x22#define B53_ARL_SRCH_ADDR_65 0x24#define B53_ARL_SRCH_ADDR_89 0x31 +#define B53_ARL_SRCH_ADDR_63XX 0x32#define ARL_ADDR_MASK GENMASK(14, 0)/* ARL Search MAC/VID Result (64 bit) */ #define B53_ARL_SRCH_RSTL_0_MACVID 0x60#define B53_ARL_SRCH_RSLT_MACVID_89 0x33 +#define B53_ARL_SRCH_RSLT_MACVID_63XX 0x34/* Single register search result on 5325/5365 */ #define B53_ARL_SRCH_RSTL_0_MACVID_25 0x24
@@ -382,6 +384,13 @@#define B53_ARL_SRCH_RSTL_MACVID (x) (B53_ARL_SRCH_RSTL_0_MACVID + ((x) * 0x10))#define B53_ARL_SRCH_RSTL (x) (B53_ARL_SRCH_RSTL_0 + ((x) * 0x10)) +/* 63XX ARL Search Data Result (16 bit) */ +#define B53_ARL_SRCH_RSLT_63XX 0x3c +#define ARL_SRST_PORT_ID_MASK_63XX GENMASK(9, 1) +#define ARL_SRST_TC_MASK_63XX GENMASK(13, 11) +#define ARL_SRST_AGE_63XX BIT(14) +#define ARL_SRST_STATIC_63XX BIT(15) +/************************************************************************* * IEEE 802.1X Registers *************************************************************************/
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 421/507 net: dsa: b53: fix BCM5325/65 ARL entry multicast port masks
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit 3b08863469aa6028ac7c3120966f4e2f6051cf6b ]
We currently use the mask 0xf for writing and reading b53_entry::port, but this is only correct for unicast ARL entries. Multicast ARL entries use a bitmask, and 0xf is not enough space for ports > 3, which includes the CPU port.
So extend the mask accordingly to also fit port 4 (bit 4) and MII (bit 5). According to the datasheet the multicast port mask is [60:48], making it 12 bit wide, but bits 60-55 are reserved anyway, and collide with the priority field at [60:59], so I am not sure if this is valid. Therefore leave it at the actual used range, [53:48].
The ARL search result register differs a bit, and there the mask is only [52:48], so only spanning the user ports. The MII port bit is contained in the Search Result Extension register. So create a separate search result parse function that properly handles this.
--- drivers/net/dsa/b53/b53_common.c | 4 +++- drivers/net/dsa/b53/b53_priv.h | 25 +++++++++++++++++++++---- drivers/net/dsa/b53/b53_regs.h | 8 +++++++- 3 files changed, 31 insertions(+), 6 deletions(-)
drivers/net/dsa/b53/b53_common.c +3 -1
@@ -2099,10 +2099,12 @@ static void b53_arl_search_read_25(struct b53_device *dev, u8 idx, struct b53_arl_entry *ent) {u64 mac_vid; +u8 ext; +b53_read8 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSLT_EXT_25 , &ext);b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARL_SRCH_RSTL_0_MACVID_25 , &mac_vid); -b53_arl_to_entry_25 (ent, mac_vid); +b53_arl_search_to_entry_25 (ent, mac_vid, ext); } static void b53_arl_search_read_89(struct b53_device *dev, u8 idx,
drivers/net/dsa/b53/b53_priv.h +21 -4
@@ -348,8 +348,8 @@ static inline void b53_arl_to_entry_25(struct b53_arl_entry *ent, ent->is_age = !!(mac_vid &ARLTBL_AGE_25 ); ent->is_static = !!(mac_vid &ARLTBL_STATIC_25 );u64_to_ether_addr (mac_vid, ent->mac); - ent->port = (mac_vid >>ARLTBL_DATA_PORT_ID_S_25 ) & -ARLTBL_DATA_PORT_ID_MASK_25 ; + ent->port = (mac_vid &ARLTBL_DATA_PORT_ID_MASK_25 ) >> +ARLTBL_DATA_PORT_ID_S_25 ;if (is_unicast_ether_addr (ent->mac) && ent->port ==B53_CPU_PORT ) ent->port =B53_CPU_PORT_25 ; ent->vid = (mac_vid >>ARLTBL_VID_S_65 ) &ARLTBL_VID_MASK_25 ;
@@ -388,8 +388,8 @@ static inline void b53_arl_from_entry_25(u64 *mac_vid,if (is_unicast_ether_addr (ent->mac) && ent->port ==B53_CPU_PORT_25 ) *mac_vid |= (u64 )B53_CPU_PORT <<ARLTBL_DATA_PORT_ID_S_25 ;else - *mac_vid |= (u64)(ent->port &ARLTBL_DATA_PORT_ID_MASK_25 ) << -ARLTBL_DATA_PORT_ID_S_25 ; + *mac_vid |= ((u64 )ent->port <<ARLTBL_DATA_PORT_ID_S_25 ) & +ARLTBL_DATA_PORT_ID_MASK_25 ; *mac_vid |= (u64)(ent->vid &ARLTBL_VID_MASK_25 ) <<ARLTBL_VID_S_65 ;if (ent->is_valid)
@@ -414,6 +414,23 @@ static inline void b53_arl_from_entry_89(u64 *mac_vid, u32 *fwd_entry, *fwd_entry |=ARLTBL_AGE_89 ; } +static inline void b53_arl_search_to_entry_25 (struct b53_arl_entry *ent, +u64 mac_vid,u8 ext) +{ +memset (ent,0 ,sizeof (*ent)); + ent->is_valid = !!(mac_vid &ARLTBL_VALID_25 ); + ent->is_age = !!(mac_vid &ARLTBL_AGE_25 ); + ent->is_static = !!(mac_vid &ARLTBL_STATIC_25 ); +u64_to_ether_addr (mac_vid, ent->mac); + ent->vid = (mac_vid >>ARLTBL_VID_S_65 ) &ARLTBL_VID_MASK_25 ; + ent->port = (mac_vid &ARL_SRCH_RSLT_PORT_ID_MASK_25 ) >> +ARL_SRCH_RSLT_PORT_ID_S_25 ; +if (is_multicast_ether_addr (ent->mac) && (ext &ARL_SRCH_RSLT_EXT_MC_MII )) + ent->port |=BIT (B53_CPU_PORT_25 ); +else if (!is_multicast_ether_addr (ent->mac) && ent->port ==B53_CPU_PORT ) + ent->port =B53_CPU_PORT_25 ; +} +static inline void b53_arl_search_to_entry_63xx (struct b53_arl_entry *ent,u64 mac_vid,u16 fwd_entry) {
drivers/net/dsa/b53/b53_regs.h +7 -1
@@ -328,7 +328,7 @@#define ARLTBL_VID_MASK_25 0xff#define ARLTBL_VID_MASK 0xfff#define ARLTBL_DATA_PORT_ID_S_25 48 -#define ARLTBL_DATA_PORT_ID_MASK_25 0xf +#define ARLTBL_DATA_PORT_ID_MASK_25 GENMASK_ULL(53, 48)#define ARLTBL_VID_S_65 53#define ARLTBL_AGE_25 BIT_ULL(61)#define ARLTBL_STATIC_25 BIT_ULL(62)
@@ -374,6 +374,12 @@/* Single register search result on 5325/5365 */ #define B53_ARL_SRCH_RSTL_0_MACVID_25 0x24 +#define ARL_SRCH_RSLT_PORT_ID_S_25 48 +#define ARL_SRCH_RSLT_PORT_ID_MASK_25 GENMASK_ULL(52, 48) + +/* BCM5325/5365 Search result extend register (8 bit) */ +#define B53_ARL_SRCH_RSLT_EXT_25 0x2c +#define ARL_SRCH_RSLT_EXT_MC_MII BIT(2)/* ARL Search Data Result (32 bit) */ #define B53_ARL_SRCH_RSTL_0 0x68
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 422/507 net: dsa: b53: fix BCM5325/65 ARL entry VIDs
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Gorski <[email protected]>
[ Upstream commit d39514e6a2d14f57830d649e2bf03b49612c2f73 ]
BCM5325/65's ARL entry registers do not contain the VID, only the search result register does. ARL entries have a separate VID entry register for the index into the VLAN table.
So make ARL entry accessors use the VID entry registers instead, and move the VLAN ID field definition to the search register definition.
--- drivers/net/dsa/b53/b53_common.c | 9 +++++++-- drivers/net/dsa/b53/b53_priv.h | 12 ++++++------ drivers/net/dsa/b53/b53_regs.h | 7 +++++-- 3 files changed, 18 insertions(+), 10 deletions(-)
drivers/net/dsa/b53/b53_common.c +7 -2
@@ -1833,19 +1833,24 @@ static int b53_arl_rw_op(struct b53_device *dev, unsigned int op)static void b53_arl_read_entry_25 (struct b53_device *dev,struct b53_arl_entry *ent,u8 idx) { +u8 vid_entry;u64 mac_vid; +b53_read8 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_VID_ENTRY_25 (idx), + &vid_entry);b53_read64 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_MAC_VID_ENTRY (idx), &mac_vid); -b53_arl_to_entry_25 (ent, mac_vid); +b53_arl_to_entry_25 (ent, mac_vid, vid_entry); }static void b53_arl_write_entry_25 (struct b53_device *dev,const struct b53_arl_entry *ent,u8 idx) { +u8 vid_entry;u64 mac_vid; -b53_arl_from_entry_25 (&mac_vid, ent); +b53_arl_from_entry_25 (&mac_vid, &vid_entry, ent); +b53_write8 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_VID_ENTRY_25 (idx), vid_entry);b53_write64 (dev,B53_ARLIO_PAGE ,B53_ARLTBL_MAC_VID_ENTRY (idx), mac_vid); }
drivers/net/dsa/b53/b53_priv.h +6 -6
@@ -341,7 +341,7 @@ static inline void b53_arl_to_entry(struct b53_arl_entry *ent, }static inline void b53_arl_to_entry_25 (struct b53_arl_entry *ent, -u64 mac_vid) +u64 mac_vid,u8 vid_entry) {memset (ent,0 ,sizeof (*ent)); ent->is_valid = !!(mac_vid &ARLTBL_VALID_25 );
@@ -352,7 +352,7 @@ static inline void b53_arl_to_entry_25(struct b53_arl_entry *ent,ARLTBL_DATA_PORT_ID_S_25 ;if (is_unicast_ether_addr (ent->mac) && ent->port ==B53_CPU_PORT ) ent->port =B53_CPU_PORT_25 ; - ent->vid = (mac_vid >>ARLTBL_VID_S_65 ) &ARLTBL_VID_MASK_25 ; + ent->vid = vid_entry; } static inline void b53_arl_to_entry_89(struct b53_arl_entry *ent,
@@ -381,7 +381,7 @@ static inline void b53_arl_from_entry(u64 *mac_vid, u32 *fwd_entry, *fwd_entry |=ARLTBL_AGE ; } -static inline void b53_arl_from_entry_25 (u64 *mac_vid, +static inline void b53_arl_from_entry_25 (u64 *mac_vid,u8 *vid_entry,const struct b53_arl_entry *ent) { *mac_vid =ether_addr_to_u64 (ent->mac);
@@ -390,14 +390,13 @@ static inline void b53_arl_from_entry_25(u64 *mac_vid,else *mac_vid |= ((u64 )ent->port <<ARLTBL_DATA_PORT_ID_S_25 ) &ARLTBL_DATA_PORT_ID_MASK_25 ; - *mac_vid |= (u64)(ent->vid &ARLTBL_VID_MASK_25 ) << -ARLTBL_VID_S_65 ;if (ent->is_valid) *mac_vid |=ARLTBL_VALID_25 ;if (ent->is_static) *mac_vid |=ARLTBL_STATIC_25 ;if (ent->is_age) *mac_vid |=ARLTBL_AGE_25 ; + *vid_entry = ent->vid; } static inline void b53_arl_from_entry_89(u64 *mac_vid, u32 *fwd_entry,
@@ -422,7 +421,8 @@ static inline void b53_arl_search_to_entry_25(struct b53_arl_entry *ent, ent->is_age = !!(mac_vid &ARLTBL_AGE_25 ); ent->is_static = !!(mac_vid &ARLTBL_STATIC_25 );u64_to_ether_addr (mac_vid, ent->mac); - ent->vid = (mac_vid >>ARLTBL_VID_S_65 ) &ARLTBL_VID_MASK_25 ; + ent->vid = (mac_vid &ARL_SRCH_RSLT_VID_MASK_25 ) >> +ARL_SRCH_RSLT_VID_S_25 ; ent->port = (mac_vid &ARL_SRCH_RSLT_PORT_ID_MASK_25 ) >>ARL_SRCH_RSLT_PORT_ID_S_25 ;if (is_multicast_ether_addr (ent->mac) && (ext &ARL_SRCH_RSLT_EXT_MC_MII ))
drivers/net/dsa/b53/b53_regs.h +5 -2
@@ -325,11 +325,9 @@#define B53_ARLTBL_MAC_VID_ENTRY (n) ((0x10 * (n)) + 0x10)#define ARLTBL_MAC_MASK 0xffffffffffffULL#define ARLTBL_VID_S 48 -#define ARLTBL_VID_MASK_25 0xff#define ARLTBL_VID_MASK 0xfff#define ARLTBL_DATA_PORT_ID_S_25 48#define ARLTBL_DATA_PORT_ID_MASK_25 GENMASK_ULL(53, 48) -#define ARLTBL_VID_S_65 53#define ARLTBL_AGE_25 BIT_ULL(61)#define ARLTBL_STATIC_25 BIT_ULL(62)#define ARLTBL_VALID_25 BIT_ULL(63)
@@ -349,6 +347,9 @@#define ARLTBL_STATIC_89 BIT(14)#define ARLTBL_VALID_89 BIT(15) +/* BCM5325/BCM565 ARL Table VID Entry N Registers (8 bit) */ +#define B53_ARLTBL_VID_ENTRY_25 (n) ((0x2 * (n)) + 0x30) +/* Maximum number of bin entries in the ARL for all switches */ #define B53_ARLTBL_MAX_BIN_ENTRIES 4
@@ -376,6 +377,8 @@#define B53_ARL_SRCH_RSTL_0_MACVID_25 0x24#define ARL_SRCH_RSLT_PORT_ID_S_25 48#define ARL_SRCH_RSLT_PORT_ID_MASK_25 GENMASK_ULL(52, 48) +#define ARL_SRCH_RSLT_VID_S_25 53 +#define ARL_SRCH_RSLT_VID_MASK_25 GENMASK_ULL(60, 53)/* BCM5325/5365 Search result extend register (8 bit) */ #define B53_ARL_SRCH_RSLT_EXT_25 0x2c
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 423/507 net: hsr: create an API to get hsr port type
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaoliang Yang <[email protected]>
[ Upstream commit a0244e76213980f3b9bb5d40b0b6705fcf24230d ]
Since the introduction of HSR_PT_INTERLINK in commit 5055cccfc2d1 ("net:
hsr: Provide RedBox support (HSR-SAN)"), we see that different port types require different settings for hardware offload, which was not the case before when we only had HSR_PT_SLAVE_A and HSR_PT_SLAVE_B. But there is currently no way to know which port is which type, so create the hsr_get_port_type() API function and export it.
When hsr_get_port_type() is called from the device driver, the port can must be found in the HSR port list. An important use case is for this function to work from offloading drivers' NETDEV_CHANGEUPPER handler, which is triggered by hsr_portdev_setup() -> netdev_master_upper_dev_link(). Therefore, we need to move the addition of the hsr_port to the HSR port list prior to calling hsr_portdev_setup(). This makes the error restoration path also more similar to hsr_del_port(), where kfree_rcu(port) is already used.
Stable-dep-of: 30296ac76426 ("net: dsa: xrs700x: reject unsupported HSR configurations")
--- include/linux/if_hsr.h | 9 +++++++++ net/hsr/hsr_device.c | 20 ++++++++++++++++++++ net/hsr/hsr_slave.c | 7 ++++--- 3 files changed, 33 insertions(+), 3 deletions(-)
include/linux/if_hsr.h +9 -0
@@ -43,6 +43,8 @@ extern bool is_hsr_master(struct net_device *dev);extern int hsr_get_version (struct net_device *dev,enum hsr_version *ver);struct net_device *hsr_get_port_ndev (struct net_device *ndev,enum hsr_port_type pt); +int hsr_get_port_type (struct net_device *hsr_dev,struct net_device *dev, +enum hsr_port_type *type);#else static inline bool is_hsr_master (struct net_device *dev) {
@@ -59,6 +61,13 @@ static inline struct net_device *hsr_get_port_ndev(struct net_device *ndev, {return ERR_PTR (-EINVAL ); } + +static inline int hsr_get_port_type (struct net_device *hsr_dev, +struct net_device *dev, +enum hsr_port_type *type) +{ +return -EINVAL ; +}#endif /* CONFIG_HSR */ #endif /*_LINUX_IF_HSR_H_*/
net/hsr/hsr_device.c +20 -0
@@ -690,6 +690,26 @@ struct net_device *hsr_get_port_ndev(struct net_device *ndev, }EXPORT_SYMBOL (hsr_get_port_ndev); +int hsr_get_port_type (struct net_device *hsr_dev,struct net_device *dev, +enum hsr_port_type *type) +{ +struct hsr_priv *hsr =netdev_priv (hsr_dev); +struct hsr_port *port; + +rcu_read_lock (); +hsr_for_each_port (hsr, port) { +if (port->dev == dev) { + *type = port->type; +rcu_read_unlock (); +return 0 ; + } + } +rcu_read_unlock (); + +return -EINVAL ; +} +EXPORT_SYMBOL (hsr_get_port_type); +/* Default multicast address for HSR Supervision frames */ static const unsigned char def_multicast_addr[ETH_ALEN ]__aligned(2) = {0x01 ,0x15 ,0x4e ,0x00 ,0x01 ,0x00
net/hsr/hsr_slave.c +4 -3
@@ -204,14 +204,14 @@ int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev, port->type = type;ether_addr_copy (port->original_macaddress, dev->dev_addr); +list_add_tail_rcu (&port->port_list, &hsr->ports); +if (type !=HSR_PT_MASTER ) { res =hsr_portdev_setup (hsr, dev, port, extack);if (res) goto fail_dev_setup; } -list_add_tail_rcu (&port->port_list, &hsr->ports); - master =hsr_port_get_hsr (hsr,HSR_PT_MASTER );netdev_update_features (master->dev);dev_set_mtu (master->dev,hsr_get_max_mtu (hsr));
@@ -219,7 +219,8 @@ int hsr_add_port(struct hsr_priv *hsr, struct net_device *dev,return 0 ; fail_dev_setup: -kfree (port); +list_del_rcu (&port->port_list); +kfree_rcu (port, rcu);return res; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 424/507 net: dsa: xrs700x: reject unsupported HSR configurations
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Oltean <[email protected]>
[ Upstream commit 30296ac7642652428396222e720718f2661e9425 ]
As discussed here:
https://lore.kernel.org/netdev/20240620090210.drop6jwh7e5qw556@skbuf/
the fact is that the xrs700x.c driver only supports offloading HSR_PT_SLAVE_A and HSR_PT_SLAVE_B (which were the only port types at the time the offload was written, _for this driver_).
Up until now, the API did not explicitly tell offloading drivers what port has what role. So xrs700x can get confused and think that it can support a configuration which it actually can't. There was a table in the attached link which gave an example:
$ ip link add name hsr0 type hsr slave1 swp0 slave2 swp1 \ interlink swp2 supervision 45 version 1
HSR_PT_SLAVE_A HSR_PT_SLAVE_B HSR_PT_INTERLINK
----------------------------------------------------------------
user
space 0 1 2
requests
----------------------------------------------------------------
XRS700X
driver 1 2 -
understands
The switch would act as if the ring ports were swp1 and swp2.
Now that we have explicit hsr_get_port_type() API, let's use that to work around the unintended semantical changes of the offloading API brought by the introduction of interlink ports in HSR.
--- drivers/net/dsa/xrs700x/xrs700x.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/net/dsa/xrs700x/xrs700x.c +11 -0
@@ -566,6 +566,7 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,struct xrs700x *priv = ds->priv;struct net_device *user;int ret, i, hsr_pair[2 ]; +enum hsr_port_type type;enum hsr_version ver;bool fwd = false;
@@ -589,6 +590,16 @@ static int xrs700x_hsr_join(struct dsa_switch *ds, int port,return -EOPNOTSUPP ; } + ret =hsr_get_port_type (hsr,dsa_to_port (ds, port)->user, &type); +if (ret) +return ret; + +if (type !=HSR_PT_SLAVE_A && type !=HSR_PT_SLAVE_B ) { +NL_SET_ERR_MSG_MOD (extack, +"Only HSR slave ports can be offloaded" ); +return -EOPNOTSUPP ; + } + dsa_hsr_foreach_port(dp, ds, hsr) {if (dp->index != port) { partner = dp;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 425/507 net/sched: sch_cake: Fix incorrect qlen reduction in cake_drop
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiang Mei <[email protected]>
[ Upstream commit 9fefc78f7f02d71810776fdeb119a05a946a27cc ]
In cake_drop(), qdisc_tree_reduce_backlog() is used to update the qlen and backlog of the qdisc hierarchy. Its caller, cake_enqueue(), assumes that the parent qdisc will enqueue the current packet. However, this assumption breaks when cake_enqueue() returns NET_XMIT_CN: the parent qdisc stops enqueuing current packet, leaving the tree qlen/backlog accounting inconsistent. This mismatch can lead to a NULL dereference (e.g., when the parent Qdisc is qfq_qdisc).
This patch computes the qlen/backlog delta in a more robust way by observing the difference before and after the series of cake_drop() calls, and then compensates the qdisc tree accounting if cake_enqueue() returns NET_XMIT_CN.
To ensure correct compensation when ACK thinning is enabled, a new variable is introduced to keep qlen unchanged.
--- net/sched/sch_cake.c | 58 ++++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 26 deletions(-)
net/sched/sch_cake.c +32 -26
@@ -1597,7 +1597,6 @@ static unsigned int cake_drop(struct Qdisc *sch, struct sk_buff **to_free)qdisc_drop_reason (skb, sch, to_free,SKB_DROP_REASON_QDISC_OVERLIMIT ); sch->q.qlen--; -qdisc_tree_reduce_backlog (sch,1 , len);cake_heapify (q,0 );
@@ -1743,14 +1742,14 @@ static void cake_reconfigure(struct Qdisc *sch);static s32 cake_enqueue (struct sk_buff *skb,struct Qdisc *sch,struct sk_buff **to_free) { +u32 idx, tin, prev_qlen, prev_backlog, drop_id;struct cake_sched_data *q =qdisc_priv (sch); -int len =qdisc_pkt_len (skb); -int ret; +int len =qdisc_pkt_len (skb), ret;struct sk_buff *ack =NULL ;ktime_t now =ktime_get ();struct cake_tin_data *b;struct cake_flow *flow; -u32 idx, tin; +bool same_flow = false;/* choose flow to insert into */ idx =cake_classify (sch, &b, skb, q->flow_mode, &ret);
@@ -1823,6 +1822,8 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,consume_skb (skb); }else {/* not splitting */ +int ack_pkt_len =0 ; +cobalt_set_enqueue_time (skb, now);get_cobalt_cb (skb)->adjusted_len =cake_overhead (q, skb);flow_queue_add (flow, skb);
@@ -1833,13 +1834,13 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,if (ack) { b->ack_drops++; sch->qstats.drops++; - b->bytes +=qdisc_pkt_len (ack); - len -=qdisc_pkt_len (ack); + ack_pkt_len =qdisc_pkt_len (ack); + b->bytes += ack_pkt_len; q->buffer_used += skb->truesize - ack->truesize;if (q->rate_flags &CAKE_FLAG_INGRESS )cake_advance_shaper (q, b, ack, now, true); -qdisc_tree_reduce_backlog (sch,1 ,qdisc_pkt_len (ack)); +qdisc_tree_reduce_backlog (sch,1 , ack_pkt_len);consume_skb (ack); }else { sch->q.qlen++;
@@ -1848,11 +1849,11 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,/* stats */ b->packets++; - b->bytes += len; - b->backlogs[idx] += len; - b->tin_backlog += len; - sch->qstats.backlog += len; - q->avg_window_bytes += len; + b->bytes += len - ack_pkt_len; + b->backlogs[idx] += len - ack_pkt_len; + b->tin_backlog += len - ack_pkt_len; + sch->qstats.backlog += len - ack_pkt_len; + q->avg_window_bytes += len - ack_pkt_len; }if (q->overflow_timeout)
@@ -1927,24 +1928,29 @@ static s32 cake_enqueue(struct sk_buff *skb, struct Qdisc *sch,if (q->buffer_used > q->buffer_max_used) q->buffer_max_used = q->buffer_used; -if (q->buffer_used > q->buffer_limit) { -bool same_flow = false; -u32 dropped =0 ; -u32 drop_id; +if (q->buffer_used <= q->buffer_limit) +return NET_XMIT_SUCCESS ; -while (q->buffer_used > q->buffer_limit) { - dropped++; - drop_id =cake_drop (sch, to_free); + prev_qlen = sch->q.qlen; + prev_backlog = sch->qstats.backlog; -if ((drop_id >>16 ) == tin && - (drop_id &0xFFFF ) == idx) - same_flow = true; - } - b->drop_overlimit += dropped; +while (q->buffer_used > q->buffer_limit) { + drop_id =cake_drop (sch, to_free); +if ((drop_id >>16 ) == tin && + (drop_id &0xFFFF ) == idx) + same_flow = true; + } + + prev_qlen -= sch->q.qlen; + prev_backlog -= sch->qstats.backlog; + b->drop_overlimit += prev_qlen; -if (same_flow) -return NET_XMIT_CN ; +if (same_flow) { +qdisc_tree_reduce_backlog (sch, prev_qlen -1 , + prev_backlog - len); +return NET_XMIT_CN ; } +qdisc_tree_reduce_backlog (sch, prev_qlen, prev_backlog);return NET_XMIT_SUCCESS ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 426/507 perf jitdump: Add sym/str-tables to build-ID generation
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 25d498e636d1f8d138d65246cfb5b1fc3069ca56 ]
It was reported that python backtrace with JIT dump was broken after the change to built-in SHA-1 implementation. It seems python generates the same JIT code for each function. They will become separate DSOs but the contents are the same. Only difference is in the symbol name.
But this caused a problem that every JIT'ed DSOs will have the same build-ID which makes perf confused. And it resulted in no python symbols (from JIT) in the output.
Looking back at the original code before the conversion, it used the load_addr as well as the code section to distinguish each DSO. But it'd be better to use contents of symtab and strtab instead as it aligns with some linker behaviors.
This patch adds a buffer to save all the contents in a single place for SHA-1 calculation. Probably we need to add sha1_update() or similar to update the existing hash value with different contents and use it here. But it's out of scope for this change and I'd like something that can be backported to the stable trees easily.
--- tools/perf/util/genelf.c | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-)
tools/perf/util/genelf.c +30 -2
@@ -173,6 +173,8 @@ jit_write_elf(int fd, uint64_t load_addr __maybe_unused, const char *sym,Elf_Shdr *shdr;uint64_t eh_frame_base_offset;char *strsym =NULL ; +void *build_id_data =NULL , *tmp; +int build_id_data_len;int symlen;int retval =-1 ;
@@ -251,6 +253,14 @@ jit_write_elf(int fd, uint64_t load_addr __maybe_unused, const char *sym, shdr->sh_flags =SHF_EXECINSTR |SHF_ALLOC ; shdr->sh_entsize =0 ; + build_id_data =malloc (csize); +if (build_id_data ==NULL ) { +warnx ("cannot allocate build-id data" ); + goto error; + } +memcpy (build_id_data, code, csize); + build_id_data_len = csize; +/* * Setup .eh_frame_hdr and .eh_frame */
@@ -334,6 +344,15 @@ jit_write_elf(int fd, uint64_t load_addr __maybe_unused, const char *sym, shdr->sh_entsize =sizeof (Elf_Sym); shdr->sh_link = unwinding ?6 :4 ;/* index of .strtab section */ + tmp =realloc (build_id_data, build_id_data_len +sizeof (symtab)); +if (tmp ==NULL ) { +warnx ("cannot allocate build-id data" ); + goto error; + } +memcpy (tmp + build_id_data_len, symtab,sizeof (symtab)); + build_id_data = tmp; + build_id_data_len +=sizeof (symtab); +/* * setup symbols string table * 2 = 1 for 0 in 1st entry, 1 for the 0 at end of symbol for 2nd entry
@@ -376,6 +395,15 @@ jit_write_elf(int fd, uint64_t load_addr __maybe_unused, const char *sym, shdr->sh_flags =0 ; shdr->sh_entsize =0 ; + tmp =realloc (build_id_data, build_id_data_len + symlen); +if (tmp ==NULL ) { +warnx ("cannot allocate build-id data" ); + goto error; + } +memcpy (tmp + build_id_data_len, strsym, symlen); + build_id_data = tmp; + build_id_data_len += symlen; +/* * setup build-id section */
@@ -394,7 +422,7 @@ jit_write_elf(int fd, uint64_t load_addr __maybe_unused, const char *sym,/* * build-id generation */ -sha1 (code, csize, bnote.build_id); +sha1 (build_id_data, build_id_data_len, bnote.build_id); bnote.desc.namesz =sizeof (bnote.name);/* must include 0 termination */ bnote.desc.descsz =sizeof (bnote.build_id); bnote.desc.type =NT_GNU_BUILD_ID ;
@@ -439,7 +467,7 @@ jit_write_elf(int fd, uint64_t load_addr __maybe_unused, const char *sym, (void )elf_end (e);free (strsym); - +free (build_id_data);return retval; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 427/507 perf tools: Mark split kallsyms DSOs as loaded
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit 7da4d60db33cccd8f4c445ab20bba71531435ee5 ]
The maps__split_kallsyms() will split symbols to module DSOs if it comes from a module. It also handled some unusual kernel symbols after modules by creating new kernel maps like "[kernel].0".
But they are pseudo DSOs to have those unexpected symbols. They should not be considered as unloaded kernel DSOs. Otherwise the dso__load() for them will end up calling dso__load_kallsyms() and then maps__split_kallsyms() again and again.
--- tools/perf/util/symbol.c | 1 + 1 file changed, 1 insertion(+)
tools/perf/util/symbol.c +1 -0
@@ -967,6 +967,7 @@ static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,return -1 ;dso__set_kernel (ndso,dso__kernel (dso)); +dso__set_loaded (ndso); curr_map =map__new2 (pos->start, ndso);if (curr_map ==NULL ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 428/507 perf tools: Fix split kallsyms DSO counting
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Namhyung Kim <[email protected]>
[ Upstream commit ad0b9c4865b98dc37f4d606d26b1c19808796805 ]
It's counted twice as it's increased after calling maps__insert(). I guess we want to increase it only after it's added properly.
--- tools/perf/util/symbol.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/perf/util/symbol.c +2 -2
@@ -955,11 +955,11 @@ static int maps__split_kallsyms(struct maps *kmaps, struct dso *dso, u64 delta,if (dso__kernel (dso) ==DSO_SPACE__KERNEL_GUEST )snprintf (dso_name,sizeof (dso_name),"[guest.kernel].%d" , - kernel_range++); + kernel_range);else snprintf (dso_name,sizeof (dso_name),"[kernel].%d" , - kernel_range++); + kernel_range); ndso =dso__new (dso_name);map__zput (curr_map);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 429/507 perf hist: In init, ensure mem_info is put on error paths
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ian Rogers <[email protected]>
[ Upstream commit f60efb4454b24cc944ff3eac164bb9dce9169f71 ]
Rather than exit the internal map_symbols directly, put the mem-info that does this and also lowers the reference count on the mem-info itself otherwise the mem-info is being leaked.
--- tools/perf/util/hist.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
tools/perf/util/hist.c +2 -4
@@ -608,10 +608,8 @@ static int hist_entry__init(struct hist_entry *he,map_symbol__exit (&he->branch_info->to.ms);zfree (&he->branch_info); } -if (he->mem_info) { -map_symbol__exit (&mem_info__iaddr (he->mem_info)->ms); -map_symbol__exit (&mem_info__daddr (he->mem_info)->ms); - } +if (he->mem_info) +mem_info__zput (he->mem_info); err:map_symbol__exit (&he->ms);zfree (&he->stat_acc);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 430/507 pinctrl: single: Fix incorrect type for error return variable
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit 61d1bb53547d42c6bdaec9da4496beb3a1a05264 ]
pcs_pinconf_get() and pcs_pinconf_set() declare ret as unsigned int, but assign it the return values of pcs_get_function() that may return negative error codes. This causes negative error codes to be converted to large positive values.
Change ret from unsigned int to int in both functions.
--- drivers/pinctrl/pinctrl-single.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
drivers/pinctrl/pinctrl-single.c +4 -3
@@ -485,7 +485,8 @@ static int pcs_pinconf_get(struct pinctrl_dev *pctldev,struct pcs_device *pcs =pinctrl_dev_get_drvdata (pctldev);struct pcs_function *func;enum pin_config_param param; -unsigned offset =0 , data =0 , i, j, ret; +unsigned offset =0 , data =0 , i, j; +int ret; ret =pcs_get_function (pctldev, pin, &func);if (ret)
@@ -549,9 +550,9 @@ static int pcs_pinconf_set(struct pinctrl_dev *pctldev, {struct pcs_device *pcs =pinctrl_dev_get_drvdata (pctldev);struct pcs_function *func; -unsigned offset =0 , shift =0 , i, data, ret; +unsigned offset =0 , shift =0 , i, data;u32 arg; -int j; +int j, ret;enum pin_config_param param; ret =pcs_get_function (pctldev, pin, &func);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 431/507 fbdev: ssd1307fb: fix potential page leak in ssd1307fb_probe()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abdun Nihaal <[email protected]>
[ Upstream commit 164312662ae9764b83b84d97afb25c42eb2be473 ]
The page allocated for vmem using __get_free_pages() is not freed on the error paths after it. Fix that by adding a corresponding __free_pages() call to the error path.
--- drivers/video/fbdev/ssd1307fb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/video/fbdev/ssd1307fb.c +3 -1
@@ -680,7 +680,7 @@ static int ssd1307fb_probe(struct i2c_client *client)if (!ssd1307fb_defio) {dev_err (dev,"Couldn't allocate deferred io.\n" ); ret = -ENOMEM ; - goto fb_alloc_error; + goto fb_defio_error; } ssd1307fb_defio->delay =HZ / refreshrate;
@@ -757,6 +757,8 @@ static int ssd1307fb_probe(struct i2c_client *client)regulator_disable (par->vbat_reg); reset_oled_error:fb_deferred_io_cleanup (info); +fb_defio_error: +__free_pages (vmem,get_order (vmem_size)); fb_alloc_error:framebuffer_release (info);return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 432/507 9p: fix cache/debug options printing in v9fs_show_options
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Sandeen <[email protected]>
[ Upstream commit f0445613314f474c1a0ec6fa8a5cd153a618f1b6 ]
commit 4eb3117888a92 changed the cache= option to accept either string shortcuts or bitfield values. It also changed /proc/mounts to emit the option as the hexadecimal numeric value rather than the shortcut string.
However, by printing "cache=%x" without the leading 0x, shortcuts such as "cache=loose" will emit "cache=f" and 'f' is not a string that is parseable by kstrtoint(), so remounting may fail if a remount with "cache=f" is attempted.
debug=%x has had the same problem since options have been displayed in c4fac9100456 ("9p: Implement show_options")
Fix these by adding the 0x prefix to the hexadecimal value shown in /proc/mounts.
Message-ID: <[email protected]>
--- fs/9p/v9fs.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/9p/v9fs.c +2 -2
@@ -101,7 +101,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry *root)struct v9fs_session_info *v9ses = root->d_sb->s_fs_info;if (v9ses->debug) -seq_printf (m,",debug=%x" , v9ses->debug); +seq_printf (m,",debug=%#x" , v9ses->debug);if (!uid_eq (v9ses->dfltuid,V9FS_DEFUID ))seq_printf (m,",dfltuid=%u" ,from_kuid_munged (&init_user_ns, v9ses->dfltuid));
@@ -117,7 +117,7 @@ int v9fs_show_options(struct seq_file *m, struct dentry *root)if (v9ses->nodev)seq_puts (m,",nodevmap" );if (v9ses->cache) -seq_printf (m,",cache=%x" , v9ses->cache); +seq_printf (m,",cache=%#x" , v9ses->cache);#ifdef CONFIG_9P_FSCACHE if (v9ses->cachetag && (v9ses->cache &CACHE_FSCACHE ))seq_printf (m,",cachetag=%s" , v9ses->cachetag);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 433/507 sched/fair: Fix unfairness caused by stalled tg_load_avg_contrib when the last task migrates out
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: xupengbo <[email protected]>
[ Upstream commit ca125231dd29fc0678dd3622e9cdea80a51dffe4 ]
When a task is migrated out, there is a probability that the tg->load_avg value will become abnormal. The reason is as follows:
1. Due to the 1ms update period limitation in update_tg_load_avg(), there is a possibility that the reduced load_avg is not updated to tg->load_avg when a task migrates out.
2. Even though __update_blocked_fair() traverses the leaf_cfs_rq_list and calls update_tg_load_avg() for cfs_rqs that are not fully decayed, the key function cfs_rq_is_decayed() does not check whether cfs->tg_load_avg_contrib is null. Consequently, in some cases, __update_blocked_fair() removes cfs_rqs whose avg.load_avg has not been updated to tg->load_avg.
Add a check of cfs_rq->tg_load_avg_contrib in cfs_rq_is_decayed(), which fixes the case (2.) mentioned above.
--- kernel/sched/fair.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/sched/fair.c +3 -0
@@ -4062,6 +4062,9 @@ static inline bool cfs_rq_is_decayed(struct cfs_rq *cfs_rq)if (child_cfs_rq_on_list (cfs_rq))return false; +if (cfs_rq->tg_load_avg_contrib) +return false; +return true; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 434/507 sched/core: Fix psi_dequeue() for Proxy Execution
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Stultz <[email protected]>
[ Upstream commit c2ae8b0df2d1bb7a063f9e356e4e9a06cd4afe11 ]
Currently, if the sleep flag is set, psi_dequeue() doesn't change any of the psi_flags.
This is because psi_task_switch() will clear TSK_ONCPU as well as other potential flags (TSK_RUNNING), and the assumption is that a voluntary sleep always consists of a task being dequeued followed shortly there after with a psi_sched_switch() call.
Proxy Execution changes this expectation, as mutex-blocked tasks that would normally sleep stay on the runqueue. But in the case where the mutex-owning task goes to sleep, or the owner is on a remote cpu, we will then deactivate the blocked task shortly after.
In that situation, the mutex-blocked task will have had its TSK_ONCPU cleared when it was switched off the cpu, but it will stay TSK_RUNNING. Then if we later dequeue it (as currently done if we hit a case find_proxy_task() can't yet handle, such as the case of the owner being on another rq or a sleeping owner) psi_dequeue() won't change any state (leaving it TSK_RUNNING), as it incorrectly expects a psi_task_switch() call to immediately follow.
Later on when the task get woken/re-enqueued, and psi_flags are set for TSK_RUNNING, we hit an error as the task is already TSK_RUNNING:
psi: inconsistent task state! task=188:kworker/28:0 cpu=28 psi_flags=4 clear=0 set=4
To resolve this, extend the logic in psi_dequeue() so that if the sleep flag is set, we also check if psi_flags have TSK_ONCPU set (meaning the psi_task_switch is imminent) before we do the shortcut return.
If TSK_ONCPU is not set, that means we've already switched away, and this psi_dequeue call needs to clear the flags.
--- kernel/sched/stats.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/sched/stats.h +6 -1
@@ -180,8 +180,13 @@ static inline void psi_dequeue(struct task_struct *p, int flags)* avoid walking all ancestors twice, psi_task_switch() handles * TSK_RUNNING and TSK_IOWAIT for us when it moves TSK_ONCPU. * Do nothing here. +* +* In the SCHED_PROXY_EXECUTION case we may do sleeping +* dequeues that are not followed by a task switch, so check +* TSK_ONCPU is set to ensure the task switch is imminent. +* Otherwise clear the flags as usual. */ -if (flags &DEQUEUE_SLEEP ) +if ((flags &DEQUEUE_SLEEP ) && (p->psi_flags &TSK_ONCPU ))return ;/*
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 435/507 platform/x86:intel/pmc: Update Arrow Lake telemetry GUID
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xi Pardee <[email protected]>
[ Upstream commit 644ab3bc98ee386f178d5209ae8170b3fac591aa ]
Update ARL_PMT_DMU_GUID value. Arrow Lake PMT DMU GUID has been updated after it was add to the driver. This updates ensures that the die C6 value is available in the debug filesystem.
Bugzilla Link: https://bugzilla.kernel.org/show_bug.cgi?id=220421
--- drivers/platform/x86/intel/pmc/core.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/platform/x86/intel/pmc/core.h +1 -1
@@ -282,7 +282,7 @@ enum ppfear_regs {/* Die C6 from PUNIT telemetry */ #define MTL_PMT_DMU_DIE_C6_OFFSET 15#define MTL_PMT_DMU_GUID 0x1A067102 -#define ARL_PMT_DMU_GUID 0x1A06A000 +#define ARL_PMT_DMU_GUID 0x1A06A102#define LNL_PMC_MMIO_REG_LEN 0x2708#define LNL_PMC_LTR_OSSE 0x1B88
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 436/507 f2fs: maintain one time GC mode is enabled during whole zoned GC cycle
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit e462fc48ceb8224811c3224650afed05cb7f0872 ]
The current version missed setting one time GC for normal zoned GC cycle. So, valid threshold control is not working. Need to fix it to prevent excessive GC for zoned devices.
--- fs/f2fs/gc.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-)
fs/f2fs/gc.c +10 -7
@@ -38,13 +38,14 @@ static int gc_thread_func(void *data)struct f2fs_gc_control gc_control = { .victim_segno =NULL_SEGNO , .should_migrate_blocks = false, - .err_gc_skipped = false }; + .err_gc_skipped = false, + .one_time = false }; wait_ms = gc_th->min_sleep_time;set_freezable (); do { - bool sync_mode, foreground = false; + bool sync_mode, foreground = false, gc_boost = false; wait_event_freezable_timeout(*wq, kthread_should_stop() ||
@@ -52,8 +53,12 @@ static int gc_thread_func(void *data) gc_th->gc_wake, msecs_to_jiffies(wait_ms)); -if (test_opt (sbi,GC_MERGE ) &&waitqueue_active (fggc_wq)) +if (test_opt (sbi,GC_MERGE ) &&waitqueue_active (fggc_wq)) { foreground = true; + gc_control.one_time = false; + }else if (f2fs_sb_has_blkzoned (sbi)) { + gc_control.one_time = true; + }/* give it a try one time */ if (gc_th->gc_wake)
@@ -81,8 +86,6 @@ static int gc_thread_func(void *data)continue ; } - gc_control.one_time = false; -/* * [GC triggering condition] * 0. GC is not conducted currently.
@@ -132,7 +135,7 @@ static int gc_thread_func(void *data)if (need_to_boost_gc (sbi)) {decrease_sleep_time (gc_th, &wait_ms);if (f2fs_sb_has_blkzoned (sbi)) - gc_control.one_time = true; + gc_boost = true; }else {increase_sleep_time (gc_th, &wait_ms); }
@@ -141,7 +144,7 @@ static int gc_thread_func(void *data) FOREGROUND : BACKGROUND); sync_mode = (F2FS_OPTION (sbi).bggc_mode ==BGGC_MODE_SYNC ) || - (gc_control.one_time && gc_th->boost_gc_greedy); + (gc_boost && gc_th->boost_gc_greedy);/* foreground GC was been triggered via f2fs_balance_fs() */ if (foreground && !f2fs_sb_has_blkzoned (sbi))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 437/507 rtc: amlogic-a4: fix double free caused by devm
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit 384150d7a5b60c1086790a8ee07b0629f906cca2 ]
The clock obtained via devm_clk_get_enabled() is automatically managed by devres and will be disabled and freed on driver detach. Manually calling clk_disable_unprepare() in error path and remove function causes double free.
Remove the redundant clk_disable_unprepare() calls from the probe error path and aml_rtc_remove(), allowing the devm framework to automatically manage the clock lifecycle.
--- drivers/rtc/rtc-amlogic-a4.c | 4 ---- 1 file changed, 4 deletions(-)
drivers/rtc/rtc-amlogic-a4.c +0 -4
@@ -390,7 +390,6 @@ static int aml_rtc_probe(struct platform_device *pdev)return 0 ; err_clk: -clk_disable_unprepare (rtc->sys_clk);device_init_wakeup (dev, false);return ret;
@@ -423,9 +422,6 @@ static SIMPLE_DEV_PM_OPS(aml_rtc_pm_ops,static void aml_rtc_remove (struct platform_device *pdev) { -struct aml_rtc_data *rtc =dev_get_drvdata (&pdev->dev); - -clk_disable_unprepare (rtc->sys_clk);device_init_wakeup (&pdev->dev, false); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 438/507 kbuild: install-extmod-build: Fix when given dir outside the build dir
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Le Cuirot <[email protected]>
[ Upstream commit 5ff90d427ef841fa48608d0c19a81c48d6126d46 ]
Commit b5e395653546 ("kbuild: install-extmod-build: Fix build when specifying KBUILD_OUTPUT") tried to address the "build" variable expecting a relative path by using realpath --relative-base=., but this only works when the given directory is below the current directory. realpath --relative-to=. will return a relative path in all cases.
Stable-dep-of: 4ab2ee307983 ("kbuild: install-extmod-build: Properly fix CC expansion when ccache is used")
--- scripts/package/install-extmod-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/package/install-extmod-build +1 -1
@@ -63,7 +63,7 @@ if [ "${CC}" != "${HOSTCC}" ]; then # Clear VPATH and srcroot because the source files reside in the output # directory. # shellcheck disable=SC2016 # $(MAKE) and $(build) will be expanded by Make - "${MAKE}" run-command KBUILD_RUN_COMMAND='+$(MAKE) HOSTCC='"${CC}"' VPATH= srcroot=. $(build)='"$(realpath --relative-base=. "${destdir}")"/scripts + "${MAKE}" run-command KBUILD_RUN_COMMAND='+$(MAKE) HOSTCC='"${CC}"' VPATH= srcroot=. $(build)='"$(realpath --relative-to=. "${destdir}")"/scripts rm -f "${destdir}/scripts/Kbuild" fi
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 439/507 kbuild: install-extmod-build: Properly fix CC expansion when ccache is used
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit 4ab2ee307983548b29ddaab0ecaef82d526cf4c9 ]
Currently, when cross-compiling and ccache is used, the expanding of CC turns out to be without any quotes, leading to the following error:
make[4]: *** No rule to make target 'aarch64-linux-gnu-gcc'. Stop. make[3]: *** [Makefile:2164: run-command] Error 2
And it makes sense, because after expansion it ends up like this:
make run-command KBUILD_RUN_COMMAND=+$(MAKE) \
HOSTCC=ccache aarch64-linux-gnu-gcc VPATH= srcroot=. $(build)= ...
So add another set of double quotes to surround whatever CC expands to to make sure the aarch64-linux-gnu-gcc isn't expanded to something that looks like an entirely separate target.
--- scripts/package/install-extmod-build | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/package/install-extmod-build +1 -1
@@ -63,7 +63,7 @@ if [ "${CC}" != "${HOSTCC}" ]; then # Clear VPATH and srcroot because the source files reside in the output # directory. # shellcheck disable=SC2016 # $(MAKE) and $(build) will be expanded by Make - "${MAKE}" run-command KBUILD_RUN_COMMAND='+$(MAKE) HOSTCC='"${CC}"' VPATH= srcroot=. $(build)='"$(realpath --relative-to=. "${destdir}")"/scripts + "${MAKE}" run-command KBUILD_RUN_COMMAND='+$(MAKE) HOSTCC="'"${CC}"'" VPATH= srcroot=. $(build)='"$(realpath --relative-to=. "${destdir}")"/scripts rm -f "${destdir}/scripts/Kbuild" fi
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 440/507 NFS: Avoid changing nlink when file removes and attribute updates race
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit bd4928ec799b31c492eb63f9f4a0c1e0bb4bb3f7 ]
If a file removal races with another operation that updates its attributes, then skip the change to nlink, and just mark the attributes as being stale.
--- fs/nfs/dir.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
fs/nfs/dir.c +13 -6
@@ -1894,13 +1894,15 @@ static int nfs_dentry_delete(const struct dentry *dentry) }/* Ensure that we revalidate inode->i_nlink */ -static void nfs_drop_nlink (struct inode *inode) +static void nfs_drop_nlink (struct inode *inode,unsigned long gencount) { +struct nfs_inode *nfsi =NFS_I (inode); +spin_lock (&inode->i_lock);/* drop the inode if we're reasonably sure this is the last link */ -if (inode->i_nlink >0 ) +if (inode->i_nlink >0 && gencount == nfsi->attr_gencount)drop_nlink (inode); -NFS_I (inode)->attr_gencount =nfs_inc_attr_generation_counter (); + nfsi->attr_gencount =nfs_inc_attr_generation_counter ();nfs_set_cache_invalid ( inode,NFS_INO_INVALID_CHANGE |NFS_INO_INVALID_CTIME |NFS_INO_INVALID_NLINK );
@@ -1914,8 +1916,9 @@ static void nfs_drop_nlink(struct inode *inode)static void nfs_dentry_iput (struct dentry *dentry,struct inode *inode) {if (dentry->d_flags &DCACHE_NFSFS_RENAMED ) { +unsigned long gencount =READ_ONCE (NFS_I (inode)->attr_gencount);nfs_complete_unlink (dentry, inode); -nfs_drop_nlink (inode); +nfs_drop_nlink (inode, gencount); }iput (inode); }
@@ -2509,9 +2512,11 @@ static int nfs_safe_remove(struct dentry *dentry)trace_nfs_remove_enter (dir, dentry);if (inode !=NULL ) { +unsigned long gencount =READ_ONCE (NFS_I (inode)->attr_gencount); + error =NFS_PROTO (dir)->remove (dir, dentry);if (error ==0 ) -nfs_drop_nlink (inode); +nfs_drop_nlink (inode, gencount); }else error =NFS_PROTO (dir)->remove (dir, dentry);if (error == -ENOENT )
@@ -2711,6 +2716,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, {struct inode *old_inode =d_inode (old_dentry);struct inode *new_inode =d_inode (new_dentry); +unsigned long new_gencount =0 ;struct dentry *dentry =NULL ;struct rpc_task *task;bool must_unblock = false;
@@ -2763,6 +2769,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, }else {block_revalidate (new_dentry); must_unblock = true; + new_gencount =NFS_I (new_inode)->attr_gencount;spin_unlock (&new_dentry->d_lock); }
@@ -2802,7 +2809,7 @@ int nfs_rename(struct mnt_idmap *idmap, struct inode *old_dir, new_dir, new_dentry, error);if (!error) {if (new_inode !=NULL ) -nfs_drop_nlink (new_inode); +nfs_drop_nlink (new_inode, new_gencount);/* * The d_move() should be here instead of in an async RPC completion * handler because we need the proper locks to move the dentry. If
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 441/507 fs/nls: Fix utf16 to utf8 conversion
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit 25524b6190295577e4918c689644451365e6466d ]
Currently the function responsible for converting between utf16 and utf8 strings will ignore any characters that cannot be converted. This however also includes multi-byte characters that do not fit into the provided string buffer.
This can cause problems if such a multi-byte character is followed by a single-byte character. In such a case the multi-byte character might be ignored when the provided string buffer is too small, but the single-byte character might fit and is thus still copied into the resulting string.
Fix this by stop filling the provided string buffer once a character does not fit. In order to be able to do this extend utf32_to_utf8() to return useful errno codes instead of -1.
--- fs/nls/nls_base.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
fs/nls/nls_base.c +12 -4
@@ -94,7 +94,7 @@ int utf32_to_utf8(unicode_t u, u8 *s, int maxout) l = u;if (l >UNICODE_MAX || (l &SURROGATE_MASK ) ==SURROGATE_PAIR ) -return -1 ; +return -EILSEQ ; nc =0 ;for (t = utf8_table; t->cmask && maxout; t++, maxout--) {
@@ -110,7 +110,7 @@ int utf32_to_utf8(unicode_t u, u8 *s, int maxout)return nc; } } -return -1 ; +return -EOVERFLOW ; }EXPORT_SYMBOL (utf32_to_utf8);
@@ -217,8 +217,16 @@ int utf16s_to_utf8s(const wchar_t *pwcs, int inlen, enum utf16_endian endian, inlen--; } size =utf32_to_utf8 (u, op, maxout); -if (size ==-1 ) { -/* Ignore character and move on */ +if (size <0 ) { +if (size == -EILSEQ ) { +/* Ignore character and move on */ +continue ; + } +/* +* Stop filling the buffer with data once a character +* does not fit anymore. +*/ +break ; }else { op += size; maxout -= size;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 442/507 NFS: Initialise verifiers for visible dentries in readdir and lookup
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 9bd545539b233725a3416801f7c374bff0327d6e ]
Ensure that the verifiers are initialised before calling d_splice_alias() in both nfs_prime_dcache() and nfs_lookup().
--- fs/nfs/dir.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
fs/nfs/dir.c +4 -2
@@ -789,16 +789,17 @@ void nfs_prime_dcache(struct dentry *parent, struct nfs_entry *entry, goto out; } +nfs_set_verifier (dentry, dir_verifier); inode =nfs_fhget (dentry->d_sb, entry->fh, entry->fattr); alias =d_splice_alias (inode, dentry);d_lookup_done (dentry);if (alias) {if (IS_ERR (alias)) goto out; +nfs_set_verifier (alias, dir_verifier);dput (dentry); dentry = alias; } -nfs_set_verifier (dentry, dir_verifier);trace_nfs_readdir_lookup (d_inode (parent), dentry,0 ); out:dput (dentry);
@@ -1994,13 +1995,14 @@ struct dentry *nfs_lookup(struct inode *dir, struct dentry * dentry, unsigned innfs_lookup_advise_force_readdirplus (dir, flags); no_entry: +nfs_set_verifier (dentry, dir_verifier); res =d_splice_alias (inode, dentry);if (res !=NULL ) {if (IS_ERR (res)) goto out; +nfs_set_verifier (res, dir_verifier); dentry = res; } -nfs_set_verifier (dentry, dir_verifier); out:trace_nfs_lookup_exit (dir, dentry, flags,PTR_ERR_OR_ZERO (res));nfs_free_fattr (fattr);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 443/507 NFS: Initialise verifiers for visible dentries in nfs_atomic_open()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 518c32a1bc4f8df1a8442ee8cdfea3e2fcff20a0 ]
Ensure that the verifiers are initialised before calling d_splice_alias() in nfs_atomic_open().
--- fs/nfs/dir.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/dir.c +1 -1
@@ -2144,12 +2144,12 @@ int nfs_atomic_open(struct inode *dir, struct dentry *dentry,d_drop (dentry);switch (err) {case -ENOENT : -d_splice_alias (NULL , dentry);if (nfs_server_capable (dir,NFS_CAP_CASE_INSENSITIVE )) dir_verifier =inode_peek_iversion_raw (dir);else dir_verifier =nfs_save_change_attribute (dir);nfs_set_verifier (dentry, dir_verifier); +d_splice_alias (NULL , dentry);break ;case -EISDIR :case -ENOTDIR :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 444/507 NFS: Initialise verifiers for visible dentries in _nfs4_open_and_get_state
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 0f900f11002ff52391fc2aa4a75e59f26ed1c242 ]
Ensure that the verifiers are initialised before calling d_splice_alias() in _nfs4_open_and_get_state().
--- fs/nfs/nfs4proc.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-)
fs/nfs/nfs4proc.c +14 -13
@@ -3174,18 +3174,6 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,if (opendata->o_res.rflags &NFS4_OPEN_RESULT_PRESERVE_UNLINKED )set_bit (NFS_INO_PRESERVE_UNLINKED , &NFS_I (state->inode)->flags); - dentry = opendata->dentry; -if (d_really_is_negative (dentry)) { -struct dentry *alias; -d_drop (dentry); - alias =d_splice_alias (igrab (state->inode), dentry); -/* d_splice_alias() can't fail here - it's a non-directory */ -if (alias) { -dput (ctx->dentry); - ctx->dentry = dentry = alias; - } - } -switch (opendata->o_arg.claim) {default :break ;
@@ -3196,7 +3184,20 @@ static int _nfs4_open_and_get_state(struct nfs4_opendata *opendata,break ;if (opendata->o_res.delegation.type !=0 ) dir_verifier =nfs_save_change_attribute (dir); -nfs_set_verifier (dentry, dir_verifier); + } + + dentry = opendata->dentry; +nfs_set_verifier (dentry, dir_verifier); +if (d_really_is_negative (dentry)) { +struct dentry *alias; +d_drop (dentry); + alias =d_splice_alias (igrab (state->inode), dentry); +/* d_splice_alias() can't fail here - it's a non-directory */ +if (alias) { +dput (ctx->dentry); +nfs_set_verifier (alias, dir_verifier); + ctx->dentry = dentry = alias; + } }/* Parse layoutget results before we check for access */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 445/507 NFSv4/pNFS: Clear NFS_INO_LAYOUTCOMMIT in pnfs_mark_layout_stateid_invalid
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Curley <[email protected]>
[ Upstream commit e0f8058f2cb56de0b7572f51cd563ca5debce746 ]
Fixes a crash when layout is null during this call stack:
write_inode
-> nfs4_write_inode
-> pnfs_layoutcommit_inodepnfs_set_layoutcommit relies on the lseg refcount to keep the layout around. Need to clear NFS_INO_LAYOUTCOMMIT otherwise we might attempt to reference a null layout.
--- fs/nfs/pnfs.c | 1 + 1 file changed, 1 insertion(+)
fs/nfs/pnfs.c +1 -0
@@ -464,6 +464,7 @@ pnfs_mark_layout_stateid_invalid(struct pnfs_layout_hdr *lo,struct pnfs_layout_segment *lseg, *next;set_bit (NFS_LAYOUT_INVALID_STID , &lo->plh_flags); +clear_bit (NFS_INO_LAYOUTCOMMIT , &NFS_I (lo->plh_inode)->flags);list_for_each_entry_safe (lseg, next, &lo->plh_segs, pls_list)pnfs_clear_lseg_state (lseg, lseg_list);pnfs_clear_layoutreturn_info (lo);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 446/507 panthor: save task pid and comm in panthor_group
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chia-I Wu <[email protected]>
[ Upstream commit 33b9cb6dcda2520600ac4fec725946af32c2e586 ]
We would like to report them on gpu errors.
We choose to save the info on panthor_group_create rather than on panthor_open because, when the two differ, we are more interested in the task that created the group.
Stable-dep-of: eec7e23d848d ("drm/panthor: Prevent potential UAF in group creation")
--- drivers/gpu/drm/panthor/panthor_sched.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/gpu/drm/panthor/panthor_sched.c +19 -0
@@ -641,6 +641,15 @@ struct panthor_group {size_t kbo_sizes; } fdinfo; +/** @task_info: Info of current->group_leader that created the group. */ +struct { +/** @task_info.pid: pid of current->group_leader */ +pid_t pid; + +/** @task_info.comm: comm of current->group_leader */ +char comm[TASK_COMM_LEN ]; + } task_info; +/** @state: Group state. */ enum panthor_group_state state;
@@ -3391,6 +3400,14 @@ group_create_queue(struct panthor_group *group,return ERR_PTR (ret); } +static void group_init_task_info (struct panthor_group *group) +{ +struct task_struct *task = current->group_leader; + + group->task_info.pid = task->pid; +get_task_comm (group->task_info.comm, task); +} +static void add_group_kbo_sizes (struct panthor_device *ptdev,struct panthor_group *group) {
@@ -3542,6 +3559,8 @@ int panthor_group_create(struct panthor_file *pfile,add_group_kbo_sizes (group->ptdev, group);spin_lock_init (&group->fdinfo.lock); +group_init_task_info (group); +return gid; err_put_group:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 447/507 drm/panthor: Prevent potential UAF in group creation
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Akash Goel <[email protected]>
[ Upstream commit eec7e23d848d2194dd8791fcd0f4a54d4378eecd ]
This commit prevents the possibility of a use after free issue in the GROUP_CREATE ioctl function, which arose as pointer to the group is accessed in that ioctl function after storing it in the Xarray. A malicious userspace can second guess the handle of a group and try to call GROUP_DESTROY ioctl from another thread around the same time as GROUP_CREATE ioctl.
To prevent the use after free exploit, this commit uses a mark on an entry of group pool Xarray which is added just before returning from the GROUP_CREATE ioctl function. The mark is checked for all ioctls that specify the group handle and so userspace won't be abe to delete a group that isn't marked yet.
v2: Add R-bs and fixes tags
--- drivers/gpu/drm/panthor/panthor_sched.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
drivers/gpu/drm/panthor/panthor_sched.c +15 -4
@@ -772,6 +772,12 @@ struct panthor_job_profiling_data {*/ #define MAX_GROUPS_PER_POOL 128 +/* +* Mark added on an entry of group pool Xarray to identify if the group has +* been fully initialized and can be accessed elsewhere in the driver code. +*/ +#define GROUP_REGISTERED XA_MARK_1 +/** * struct panthor_group_pool - Group pool *
@@ -2887,7 +2893,7 @@ void panthor_fdinfo_gather_group_samples(struct panthor_file *pfile)return ;xa_lock (&gpool->xa); -xa_for_each (&gpool->xa, i, group) { +xa_for_each_marked (&gpool->xa, i, group,GROUP_REGISTERED ) {guard (spinlock)(&group->fdinfo.lock); pfile->stats.cycles += group->fdinfo.data.cycles; pfile->stats.time += group->fdinfo.data.time;
@@ -3561,6 +3567,8 @@ int panthor_group_create(struct panthor_file *pfile,group_init_task_info (group); +xa_set_mark (&gpool->xa, gid,GROUP_REGISTERED ); +return gid; err_put_group:
@@ -3575,6 +3583,9 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle)struct panthor_scheduler *sched = ptdev->scheduler;struct panthor_group *group; +if (!xa_get_mark (&gpool->xa, group_handle,GROUP_REGISTERED )) +return -EINVAL ; + group =xa_erase (&gpool->xa, group_handle);if (!group)return -EINVAL ;
@@ -3600,12 +3611,12 @@ int panthor_group_destroy(struct panthor_file *pfile, u32 group_handle) }static struct panthor_group *group_from_handle (struct panthor_group_pool *pool, -u32 group_handle) +unsigned long group_handle) {struct panthor_group *group;xa_lock (&pool->xa); - group =group_get (xa_load (&pool->xa, group_handle)); + group =group_get (xa_find (&pool->xa, &group_handle, group_handle,GROUP_REGISTERED ));xa_unlock (&pool->xa);return group;
@@ -3692,7 +3703,7 @@ panthor_fdinfo_gather_group_mem_info(struct panthor_file *pfile,return ;xa_lock (&gpool->xa); -xa_for_each (&gpool->xa, i, group) { +xa_for_each_marked (&gpool->xa, i, group,GROUP_REGISTERED ) { stats->resident += group->fdinfo.kbo_sizes;if (group->csg_id >=0 ) stats->active += group->fdinfo.kbo_sizes;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 448/507 Revert "nfs: ignore SB_RDONLY when remounting nfs"
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 400fa37afbb11a601c204b72af0f0e5bc2db695c ]
This reverts commit 80c4de6ab44c14e910117a02f2f8241ffc6ec54a.
Silently ignoring the "ro" and "rw" mount options causes user confusion, and regressions.
--- fs/nfs/super.c | 10 ---------- 1 file changed, 10 deletions(-)
fs/nfs/super.c +0 -10
@@ -1051,16 +1051,6 @@ int nfs_reconfigure(struct fs_context *fc)sync_filesystem (sb); -/* -* The SB_RDONLY flag has been removed from the superblock during -* mounts to prevent interference between different filesystems. -* Similarly, it is also necessary to ignore the SB_RDONLY flag -* during reconfiguration; otherwise, it may also result in the -* creation of redundant superblocks when mounting a directory with -* different rw and ro flags multiple times. -*/ - fc->sb_flags_mask &= ~SB_RDONLY ; -/* * Userspace mount programs that send binary options generally send * them populated with default values. We have no way to know which
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 449/507 Revert "nfs: clear SB_RDONLY before getting superblock"
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit d216b698d44e33417ad4cc796cb04ccddbb8c0ee ]
This reverts commit 8cd9b785943c57a136536250da80ba1eb6f8eb18.
Silently ignoring the "ro" and "rw" mount options causes user confusion, and regressions.
--- fs/nfs/super.c | 9 --------- 1 file changed, 9 deletions(-)
fs/nfs/super.c +0 -9
@@ -1308,17 +1308,8 @@ int nfs_get_tree_common(struct fs_context *fc)if (IS_ERR (server))return PTR_ERR (server); -/* -* When NFS_MOUNT_UNSHARED is not set, NFS forces the sharing of a -* superblock among each filesystem that mounts sub-directories -* belonging to a single exported root path. -* To prevent interference between different filesystems, the -* SB_RDONLY flag should be removed from the superblock. -*/ if (server->flags &NFS_MOUNT_UNSHARED ) compare_super =NULL ; -else - fc->sb_flags &= ~SB_RDONLY ;/* -o noac implies -o sync */ if (server->flags &NFS_MOUNT_NOAC )
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 450/507 Revert "nfs: ignore SB_RDONLY when mounting nfs"
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit d4a26d34f1946142f9d32e540490e4926ae9a46b ]
This reverts commit 52cb7f8f177878b4f22397b9c4d2c8f743766be3.
Silently ignoring the "ro" and "rw" mount options causes user confusion, and regressions.
--- fs/nfs/internal.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/nfs/internal.h +1 -1
@@ -13,7 +13,7 @@#include <linux/nfslocalio.h> #include <linux/wait_bit.h> -#define NFS_SB_MASK (SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS) +#define NFS_SB_MASK (SB_RDONLY|SB_NOSUID|SB_NODEV|SB_NOEXEC|SB_SYNCHRONOUS)extern const struct export_operations nfs_export_ops;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 451/507 NFS: Automounted filesystems should inherit ro,noexec,nodev,sync flags
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 8675c69816e4276b979ff475ee5fac4688f80125 ]
When a filesystem is being automounted, it needs to preserve the user-set superblock mount options, such as the "ro" flag.
--- fs/nfs/namespace.c | 6 ++++++ fs/nfs/super.c | 4 ---- 2 files changed, 6 insertions(+), 4 deletions(-)
fs/nfs/namespace.c +6 -0
@@ -149,6 +149,7 @@ struct vfsmount *nfs_d_automount(struct path *path)struct vfsmount *mnt =ERR_PTR (-ENOMEM );struct nfs_server *server =NFS_SB (path->dentry->d_sb);struct nfs_client *client = server->nfs_client; +unsigned long s_flags = path->dentry->d_sb->s_flags;int timeout =READ_ONCE (nfs_mountpoint_expiry_timeout);int ret;
@@ -174,6 +175,11 @@ struct vfsmount *nfs_d_automount(struct path *path) fc->net_ns =get_net (client->cl_net); } +/* Inherit the flags covered by NFS_SB_MASK */ + fc->sb_flags_mask |=NFS_SB_MASK ; + fc->sb_flags &= ~NFS_SB_MASK ; + fc->sb_flags |= s_flags &NFS_SB_MASK ; +/* for submounts we want the same server; referrals will reassign */ memcpy (&ctx->nfs_server._address, &client->cl_addr, client->cl_addrlen); ctx->nfs_server.addrlen = client->cl_addrlen;
fs/nfs/super.c +0 -4
@@ -1315,10 +1315,6 @@ int nfs_get_tree_common(struct fs_context *fc)if (server->flags &NFS_MOUNT_NOAC ) fc->sb_flags |=SB_SYNCHRONOUS ; -if (ctx->clone_data.sb) -if (ctx->clone_data.sb->s_flags &SB_SYNCHRONOUS ) - fc->sb_flags |=SB_SYNCHRONOUS ; -/* Get a superblock - note that we may end up sharing one that already exists */ fc->s_fs_info = server; s =sget_fc (fc, compare_super, nfs_set_super);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 452/507 NFS: Fix inheritance of the block sizes when automounting
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
[ Upstream commit 2b092175f5e301cdaa935093edfef2be9defb6df ]
Only inherit the block sizes that were actually specified as mount parameters for the parent mount.
--- fs/nfs/client.c | 21 +++++++++++++++++---- fs/nfs/internal.h | 1 - fs/nfs/namespace.c | 5 ++++- fs/nfs/nfs4client.c | 18 ++++++++++++++---- fs/nfs/super.c | 10 +++------- include/linux/nfs_fs_sb.h | 5 +++++ 6 files changed, 43 insertions(+), 17 deletions(-)
fs/nfs/client.c +17 -4
@@ -784,10 +784,18 @@ static int nfs_init_server(struct nfs_server *server, server->fattr_valid =NFS_ATTR_FATTR_V4 ; } -if (ctx->rsize) +if (ctx->bsize) { + server->bsize = ctx->bsize; + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_BSIZE ; + } +if (ctx->rsize) { server->rsize =nfs_io_size (ctx->rsize, clp->cl_proto); -if (ctx->wsize) + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_RSIZE ; + } +if (ctx->wsize) { server->wsize =nfs_io_size (ctx->wsize, clp->cl_proto); + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_WSIZE ; + } server->acregmin = ctx->acregmin *HZ ; server->acregmax = ctx->acregmax *HZ ;
@@ -977,8 +985,13 @@ EXPORT_SYMBOL_GPL(nfs_probe_server);void nfs_server_copy_userdata (struct nfs_server *target,struct nfs_server *source) { target->flags = source->flags; - target->rsize = source->rsize; - target->wsize = source->wsize; + target->automount_inherit = source->automount_inherit; +if (source->automount_inherit &NFS_AUTOMOUNT_INHERIT_BSIZE ) + target->bsize = source->bsize; +if (source->automount_inherit &NFS_AUTOMOUNT_INHERIT_RSIZE ) + target->rsize = source->rsize; +if (source->automount_inherit &NFS_AUTOMOUNT_INHERIT_WSIZE ) + target->wsize = source->wsize; target->acregmin = source->acregmin; target->acregmax = source->acregmax; target->acdirmin = source->acdirmin;
fs/nfs/internal.h +0 -1
@@ -152,7 +152,6 @@ struct nfs_fs_context {struct super_block *sb;struct dentry *dentry;struct nfs_fattr *fattr; -unsigned int inherited_bsize; } clone_data; };
fs/nfs/namespace.c +4 -1
@@ -190,6 +190,10 @@ struct vfsmount *nfs_d_automount(struct path *path) ctx->nfs_mod = client->cl_nfs_mod;get_nfs_version (ctx->nfs_mod); +/* Inherit block sizes if they were specified as mount parameters */ +if (server->automount_inherit &NFS_AUTOMOUNT_INHERIT_BSIZE ) + ctx->bsize = server->bsize; + ret = client->rpc_ops->submount (fc, server);if (ret <0 ) { mnt =ERR_PTR (ret);
@@ -289,7 +293,6 @@ int nfs_do_submount(struct fs_context *fc)return -ENOMEM ; ctx->internal = true; - ctx->clone_data.inherited_bsize = ctx->clone_data.sb->s_blocksize_bits; p =nfs_devname (dentry, buffer,4096 );if (IS_ERR (p)) {
fs/nfs/nfs4client.c +14 -4
@@ -1174,10 +1174,20 @@ static int nfs4_init_server(struct nfs_server *server, struct fs_context *fc)if (error <0 )return error; -if (ctx->rsize) - server->rsize =nfs_io_size (ctx->rsize, server->nfs_client->cl_proto); -if (ctx->wsize) - server->wsize =nfs_io_size (ctx->wsize, server->nfs_client->cl_proto); +if (ctx->bsize) { + server->bsize = ctx->bsize; + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_BSIZE ; + } +if (ctx->rsize) { + server->rsize = +nfs_io_size (ctx->rsize, server->nfs_client->cl_proto); + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_RSIZE ; + } +if (ctx->wsize) { + server->wsize = +nfs_io_size (ctx->wsize, server->nfs_client->cl_proto); + server->automount_inherit |=NFS_AUTOMOUNT_INHERIT_WSIZE ; + } server->acregmin = ctx->acregmin *HZ ; server->acregmax = ctx->acregmax *HZ ;
fs/nfs/super.c +3 -7
@@ -1091,8 +1091,9 @@ static void nfs_fill_super(struct super_block *sb, struct nfs_fs_context *ctx) sb->s_blocksize =0 ; sb->s_xattr = server->nfs_client->cl_nfs_mod->xattr; sb->s_op = server->nfs_client->cl_nfs_mod->sops; -if (ctx->bsize) - sb->s_blocksize =nfs_block_size (ctx->bsize, &sb->s_blocksize_bits); +if (server->bsize) + sb->s_blocksize = +nfs_block_size (server->bsize, &sb->s_blocksize_bits);switch (server->nfs_client->rpc_ops->version) {case 2 :
@@ -1338,13 +1339,8 @@ int nfs_get_tree_common(struct fs_context *fc) }if (!s->s_root) { -unsigned bsize = ctx->clone_data.inherited_bsize;/* initial superblock/root creation */ nfs_fill_super (s, ctx); -if (bsize) { - s->s_blocksize_bits = bsize; - s->s_blocksize =1U << bsize; - } error =nfs_get_cache_cookie (s, ctx);if (error <0 ) goto error_splat_super;
include/linux/nfs_fs_sb.h +5 -0
@@ -172,6 +172,11 @@ struct nfs_server {#define NFS_MOUNT_FORCE_RDIRPLUS 0x20000000#define NFS_MOUNT_NETUNREACH_FATAL 0x40000000 +unsigned int automount_inherit;/* Properties inherited by automount */ +#define NFS_AUTOMOUNT_INHERIT_BSIZE 0x0001 +#define NFS_AUTOMOUNT_INHERIT_RSIZE 0x0002 +#define NFS_AUTOMOUNT_INHERIT_WSIZE 0x0004 +unsigned int caps;/* server capabilities */ __u64 fattr_valid;/* Valid attributes */ unsigned int rsize;/* read size */
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 453/507 fs/nls: Fix inconsistency between utf8_to_utf32() and utf32_to_utf8()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Armin Wolf <[email protected]>
[ Upstream commit c36f9d7b2869a003a2f7d6ff2c6bac9e62fd7d68 ]
After commit 25524b619029 ("fs/nls: Fix utf16 to utf8 conversion"), the return values of utf8_to_utf32() and utf32_to_utf8() are inconsistent when encountering an error: utf8_to_utf32() returns -1, while utf32_to_utf8() returns errno codes. Fix this inconsistency by modifying utf8_to_utf32() to return errno codes as well.
--- fs/nls/nls_base.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
fs/nls/nls_base.c +7 -4
@@ -67,19 +67,22 @@ int utf8_to_utf32(const u8 *s, int inlen, unicode_t *pu) l &= t->lmask;if (l < t->lval || l >UNICODE_MAX || (l &SURROGATE_MASK ) ==SURROGATE_PAIR ) -return -1 ; +return -EILSEQ ; + *pu = (unicode_t ) l;return nc; }if (inlen <= nc) -return -1 ; +return -EOVERFLOW ; + s++; c = (*s ^0x80 ) &0xFF ;if (c &0xC0 ) -return -1 ; +return -EILSEQ ; + l = (l <<6 ) | c; } -return -1 ; +return -EILSEQ ; }EXPORT_SYMBOL (utf8_to_utf32);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 454/507 platform/x86: asus-wmi: use brightness_set_blocking() for kbd led
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anton Khirnov <[email protected]>
[ Upstream commit ccb61a328321ba3f8567e350664c9ca7a42b6c70 ]
kbd_led_set() can sleep, and so may not be used as the brightness_set() callback.
Otherwise using this led with a trigger leads to system hangs accompanied by:
BUG: scheduling while atomic: acpi_fakekeyd/2588/0x00000003 CPU: 4 UID: 0 PID: 2588 Comm: acpi_fakekeyd Not tainted 6.17.9+deb14-amd64 #1 PREEMPT(lazy) Debian 6.17.9-1 Hardware name: ASUSTeK COMPUTER INC. ASUS EXPERTBOOK B9403CVAR/B9403CVAR, BIOS B9403CVAR.311 12/24/2024 Call Trace: <TASK> [...] schedule_timeout+0xbd/0x100 __down_common+0x175/0x290 down_timeout+0x67/0x70 acpi_os_wait_semaphore+0x57/0x90 [...] asus_wmi_evaluate_method3+0x87/0x190 [asus_wmi] led_trigger_event+0x3f/0x60 [...]
--- drivers/platform/x86/asus-wmi.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/platform/x86/asus-wmi.c +4 -4
@@ -1619,14 +1619,14 @@ static void do_kbd_led_set(struct led_classdev *led_cdev, int value)kbd_led_update (asus); } -static void kbd_led_set (struct led_classdev *led_cdev, -enum led_brightness value) +static int kbd_led_set (struct led_classdev *led_cdev,enum led_brightness value) {/* Prevent disabling keyboard backlight on module unregister */ if (led_cdev->flags &LED_UNREGISTERING ) -return ; +return 0 ;do_kbd_led_set (led_cdev, value); +return 0 ; }static void kbd_led_set_by_kbd (struct asus_wmi *asus,enum led_brightness value)
@@ -1802,7 +1802,7 @@ static int asus_wmi_led_init(struct asus_wmi *asus) asus->kbd_led_wk = led_val; asus->kbd_led.name ="asus::kbd_backlight" ; asus->kbd_led.flags =LED_BRIGHT_HW_CHANGED ; - asus->kbd_led.brightness_set = kbd_led_set; + asus->kbd_led.brightness_set_blocking = kbd_led_set; asus->kbd_led.brightness_get = kbd_led_get; asus->kbd_led.max_brightness =3 ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 455/507 ASoC: bcm: bcm63xx-pcm-whistler: Check return value of of_dma_configure()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit 0ebbd45c33d0049ebf5a22c1434567f0c420b333 ]
bcm63xx_soc_pcm_new() does not check the return value of of_dma_configure(), which may fail with -EPROBE_DEFER or other errors, allowing PCM setup to continue with incomplete DMA configuration.
Add error checking for of_dma_configure() and return on failure.
--- sound/soc/bcm/bcm63xx-pcm-whistler.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
sound/soc/bcm/bcm63xx-pcm-whistler.c +3 -1
@@ -358,7 +358,9 @@ static int bcm63xx_soc_pcm_new(struct snd_soc_component *component, i2s_priv =dev_get_drvdata (snd_soc_rtd_to_cpu (rtd,0 )->dev); -of_dma_configure (pcm->card->dev, pcm->card->dev->of_node,1 ); + ret =of_dma_configure (pcm->card->dev, pcm->card->dev->of_node,1 ); +if (ret) +return ret; ret =dma_coerce_mask_and_coherent (pcm->card->dev,DMA_BIT_MASK (32 ));if (ret)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 456/507 ASoC: amd: acp: Audio is not resuming after s0ix
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hemalatha Pinnamreddy <[email protected]>
[ Upstream commit 3ee257aba1d56c3f0f1028669a8ad0f1a477f05b ]
Audio fails to resume after system exits suspend mode due to accessing incorrect ring buffer address during resume. This patch resolves issue by selecting correct address based on the ACP version.
--- sound/soc/amd/acp/acp-legacy-common.c | 30 +++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-)
sound/soc/amd/acp/acp-legacy-common.c +24 -6
@@ -219,7 +219,10 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,SP_PB_FIFO_ADDR_OFFSET ; reg_fifo_addr =ACP_I2S_TX_FIFOADDR (chip); reg_fifo_size =ACP_I2S_TX_FIFOSIZE (chip); - phy_addr =I2S_SP_TX_MEM_WINDOW_START + stream->reg_offset; +if (chip->acp_rev >=ACP70_PCI_ID ) + phy_addr = ACP7x_I2S_SP_TX_MEM_WINDOW_START; +else + phy_addr =I2S_SP_TX_MEM_WINDOW_START + stream->reg_offset;writel (phy_addr, chip->base +ACP_I2S_TX_RINGBUFADDR (chip)); }else { reg_dma_size =ACP_I2S_RX_DMA_SIZE (chip);
@@ -227,7 +230,10 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,SP_CAPT_FIFO_ADDR_OFFSET ; reg_fifo_addr =ACP_I2S_RX_FIFOADDR (chip); reg_fifo_size =ACP_I2S_RX_FIFOSIZE (chip); - phy_addr =I2S_SP_RX_MEM_WINDOW_START + stream->reg_offset; +if (chip->acp_rev >=ACP70_PCI_ID ) + phy_addr = ACP7x_I2S_SP_RX_MEM_WINDOW_START; +else + phy_addr =I2S_SP_RX_MEM_WINDOW_START + stream->reg_offset;writel (phy_addr, chip->base +ACP_I2S_RX_RINGBUFADDR (chip)); }break ;
@@ -238,7 +244,10 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,BT_PB_FIFO_ADDR_OFFSET ; reg_fifo_addr =ACP_BT_TX_FIFOADDR (chip); reg_fifo_size =ACP_BT_TX_FIFOSIZE (chip); - phy_addr =I2S_BT_TX_MEM_WINDOW_START + stream->reg_offset; +if (chip->acp_rev >=ACP70_PCI_ID ) + phy_addr = ACP7x_I2S_BT_TX_MEM_WINDOW_START; +else + phy_addr =I2S_BT_TX_MEM_WINDOW_START + stream->reg_offset;writel (phy_addr, chip->base +ACP_BT_TX_RINGBUFADDR (chip)); }else { reg_dma_size =ACP_BT_RX_DMA_SIZE (chip);
@@ -246,7 +255,10 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,BT_CAPT_FIFO_ADDR_OFFSET ; reg_fifo_addr =ACP_BT_RX_FIFOADDR (chip); reg_fifo_size =ACP_BT_RX_FIFOSIZE (chip); - phy_addr =I2S_BT_TX_MEM_WINDOW_START + stream->reg_offset; +if (chip->acp_rev >=ACP70_PCI_ID ) + phy_addr = ACP7x_I2S_BT_RX_MEM_WINDOW_START; +else + phy_addr =I2S_BT_RX_MEM_WINDOW_START + stream->reg_offset;writel (phy_addr, chip->base +ACP_BT_RX_RINGBUFADDR (chip)); }break ;
@@ -257,7 +269,10 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,HS_PB_FIFO_ADDR_OFFSET ; reg_fifo_addr =ACP_HS_TX_FIFOADDR ; reg_fifo_size =ACP_HS_TX_FIFOSIZE ; - phy_addr =I2S_HS_TX_MEM_WINDOW_START + stream->reg_offset; +if (chip->acp_rev >=ACP70_PCI_ID ) + phy_addr = ACP7x_I2S_HS_TX_MEM_WINDOW_START; +else + phy_addr =I2S_HS_TX_MEM_WINDOW_START + stream->reg_offset;writel (phy_addr, chip->base +ACP_HS_TX_RINGBUFADDR ); }else { reg_dma_size =ACP_HS_RX_DMA_SIZE ;
@@ -265,7 +280,10 @@ static int set_acp_i2s_dma_fifo(struct snd_pcm_substream *substream,HS_CAPT_FIFO_ADDR_OFFSET ; reg_fifo_addr =ACP_HS_RX_FIFOADDR ; reg_fifo_size =ACP_HS_RX_FIFOSIZE ; - phy_addr =I2S_HS_RX_MEM_WINDOW_START + stream->reg_offset; +if (chip->acp_rev >=ACP70_PCI_ID ) + phy_addr = ACP7x_I2S_HS_RX_MEM_WINDOW_START; +else + phy_addr =I2S_HS_RX_MEM_WINDOW_START + stream->reg_offset;writel (phy_addr, chip->base +ACP_HS_RX_RINGBUFADDR ); }break ;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 457/507 ASoC: ak4458: Disable regulator when error happens
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit ae585fabb9713a43e358cf606451386757225c95 ]
Disable regulator in runtime resume when error happens to balance the reference count of regulator.
--- sound/soc/codecs/ak4458.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/soc/codecs/ak4458.c +9 -1
@@ -671,7 +671,15 @@ static int ak4458_runtime_resume(struct device *dev)regcache_cache_only (ak4458->regmap, false);regcache_mark_dirty (ak4458->regmap); -return regcache_sync (ak4458->regmap); + ret =regcache_sync (ak4458->regmap); +if (ret) + goto err; + +return 0 ; +err: +regcache_cache_only (ak4458->regmap, true); +regulator_bulk_disable (ARRAY_SIZE (ak4458->supplies), ak4458->supplies); +return ret; }static const struct snd_soc_component_driver soc_codec_dev_ak4458 = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 458/507 ASoC: ak5558: Disable regulator when error happens
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shengjiu Wang <[email protected]>
[ Upstream commit 1f8f726a2a29c28f65b30880335a1610c5e63594 ]
Disable regulator in runtime resume when error happens to balance the reference count of regulator.
--- sound/soc/codecs/ak5558.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
sound/soc/codecs/ak5558.c +9 -1
@@ -372,7 +372,15 @@ static int ak5558_runtime_resume(struct device *dev)regcache_cache_only (ak5558->regmap, false);regcache_mark_dirty (ak5558->regmap); -return regcache_sync (ak5558->regmap); + ret =regcache_sync (ak5558->regmap); +if (ret) + goto err; + +return 0 ; +err: +regcache_cache_only (ak5558->regmap, true); +regulator_bulk_disable (ARRAY_SIZE (ak5558->supplies), ak5558->supplies); +return ret; }static const struct dev_pm_ops ak5558_pm = {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 459/507 f2fs: revert summary entry count from 2048 to 512 in 16kb block support
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daeho Jeong <[email protected]>
[ Upstream commit 7ee8bc3942f20964ad730871b885688ea3a2961a ]
The recent increase in the number of Segment Summary Area (SSA) entries from 512 to 2048 was an unintentional change in logic of 16kb block support. This commit corrects the issue.
To better utilize the space available from the erroneous 2048-entry calculation, we are implementing a solution to share the currently unused SSA space with neighboring segments. This enhances overall SSA utilization without impacting the established 8MB segment size.
--- fs/f2fs/f2fs.h | 2 + fs/f2fs/gc.c | 117 +++++++++++++++++++++++----------------- fs/f2fs/recovery.c | 2 +- fs/f2fs/segment.c | 38 +++++++++---- fs/f2fs/segment.h | 8 ++- fs/f2fs/super.c | 14 +++++ fs/f2fs/sysfs.c | 7 +++ include/linux/f2fs_fs.h | 5 +- 8 files changed, 130 insertions(+), 63 deletions(-)
fs/f2fs/f2fs.h +2 -0
@@ -230,6 +230,7 @@ struct f2fs_mount_info {#define F2FS_FEATURE_COMPRESSION 0x00002000#define F2FS_FEATURE_RO 0x00004000#define F2FS_FEATURE_DEVICE_ALIAS 0x00008000 +#define F2FS_FEATURE_PACKED_SSA 0x00010000#define __F2FS_HAS_FEATURE (raw_super, mask) \ ((raw_super->feature & cpu_to_le32(mask)) != 0)
@@ -4648,6 +4649,7 @@ F2FS_FEATURE_FUNCS(casefold, CASEFOLD);F2FS_FEATURE_FUNCS (compression,COMPRESSION );F2FS_FEATURE_FUNCS (readonly,RO );F2FS_FEATURE_FUNCS (device_alias,DEVICE_ALIAS ); +F2FS_FEATURE_FUNCS (packed_ssa,PACKED_SSA );#ifdef CONFIG_BLK_DEV_ZONED static inline bool f2fs_zone_is_seq(struct f2fs_sb_info *sbi, int devi,
fs/f2fs/gc.c +69 -48
166 lines not on this page · raw message
fs/f2fs/recovery.c +1 -1
@@ -519,7 +519,7 @@ static int check_index_in_prev_nodes(struct f2fs_sb_info *sbi, sum_folio =f2fs_get_sum_folio (sbi, segno);if (IS_ERR (sum_folio))return PTR_ERR (sum_folio); - sum_node =folio_address (sum_folio); + sum_node =SUM_BLK_PAGE_ADDR (sum_folio, segno); sum = sum_node->entries[blkoff];f2fs_folio_put (sum_folio, true); got_it:
fs/f2fs/segment.c +28 -10
@@ -2712,7 +2712,15 @@ struct folio *f2fs_get_sum_folio(struct f2fs_sb_info *sbi, unsigned int segno)void f2fs_update_meta_page (struct f2fs_sb_info *sbi,void *src,block_t blk_addr) { -struct folio *folio =f2fs_grab_meta_folio (sbi, blk_addr); +struct folio *folio; + +if (SUMS_PER_BLOCK ==1 ) + folio =f2fs_grab_meta_folio (sbi, blk_addr); +else + folio =f2fs_get_meta_folio_retry (sbi, blk_addr); + +if (IS_ERR (folio)) +return ;memcpy (folio_address (folio), src,PAGE_SIZE );folio_mark_dirty (folio);
@@ -2720,9 +2728,21 @@ void f2fs_update_meta_page(struct f2fs_sb_info *sbi, }static void write_sum_page (struct f2fs_sb_info *sbi, -struct f2fs_summary_block *sum_blk,block_t blk_addr) +struct f2fs_summary_block *sum_blk,unsigned int segno) { -f2fs_update_meta_page (sbi, (void *)sum_blk, blk_addr); +struct folio *folio; + +if (SUMS_PER_BLOCK ==1 ) +return f2fs_update_meta_page (sbi, (void *)sum_blk, +GET_SUM_BLOCK (sbi, segno)); + + folio =f2fs_get_sum_folio (sbi, segno); +if (IS_ERR (folio)) +return ; + +memcpy (SUM_BLK_PAGE_ADDR (folio, segno), sum_blk,sizeof (*sum_blk)); +folio_mark_dirty (folio); +f2fs_folio_put (folio, true); } static void write_current_sum_page(struct f2fs_sb_info *sbi,
@@ -2970,7 +2990,7 @@ static int new_curseg(struct f2fs_sb_info *sbi, int type, bool new_sec)int ret;if (curseg->inited) -write_sum_page (sbi, curseg->sum_blk,GET_SUM_BLOCK (sbi, segno)); +write_sum_page (sbi, curseg->sum_blk, segno); segno =__get_next_segno (sbi, type); ret =get_new_segment (sbi, &segno, new_sec, pinning);
@@ -3029,7 +3049,7 @@ static int change_curseg(struct f2fs_sb_info *sbi, int type)struct folio *sum_folio;if (curseg->inited) -write_sum_page (sbi, curseg->sum_blk,GET_SUM_BLOCK (sbi, curseg->segno)); +write_sum_page (sbi, curseg->sum_blk, curseg->segno);__set_test_and_inuse (sbi, new_segno);
@@ -3048,7 +3068,7 @@ static int change_curseg(struct f2fs_sb_info *sbi, int type)memset (curseg->sum_blk,0 ,SUM_ENTRY_SIZE );return PTR_ERR (sum_folio); } - sum_node =folio_address (sum_folio); + sum_node =SUM_BLK_PAGE_ADDR (sum_folio, new_segno);memcpy (curseg->sum_blk, sum_node,SUM_ENTRY_SIZE );f2fs_folio_put (sum_folio, true);return 0 ;
@@ -3137,8 +3157,7 @@ static void __f2fs_save_inmem_curseg(struct f2fs_sb_info *sbi, int type) goto out;if (get_valid_blocks (sbi, curseg->segno, false)) { -write_sum_page (sbi, curseg->sum_blk, -GET_SUM_BLOCK (sbi, curseg->segno)); +write_sum_page (sbi, curseg->sum_blk, curseg->segno); }else {mutex_lock (&DIRTY_I (sbi)->seglist_lock);__set_test_and_free (sbi, curseg->segno, true);
@@ -3815,8 +3834,7 @@ int f2fs_allocate_data_block(struct f2fs_sb_info *sbi, struct folio *folio,if (segment_full) {if (type ==CURSEG_COLD_DATA_PINNED && !((curseg->segno +1 ) % sbi->segs_per_sec)) { -write_sum_page (sbi, curseg->sum_blk, -GET_SUM_BLOCK (sbi, curseg->segno)); +write_sum_page (sbi, curseg->sum_blk, curseg->segno);reset_curseg_fields (curseg); goto skip_new_segment; }
fs/f2fs/segment.h +6 -2
@@ -85,8 +85,12 @@ static inline void sanity_check_seg_type(struct f2fs_sb_info *sbi,#define GET_ZONE_FROM_SEG (sbi, segno) \ GET_ZONE_FROM_SEC(sbi, GET_SEC_FROM_SEG(sbi, segno)) -#define GET_SUM_BLOCK (sbi, segno) \ - ((sbi)->sm_info->ssa_blkaddr + (segno)) +#define SUMS_PER_BLOCK (F2FS_BLKSIZE / F2FS_SUM_BLKSIZE) +#define GET_SUM_BLOCK (sbi, segno) \ + (SM_I(sbi)->ssa_blkaddr + (segno / SUMS_PER_BLOCK)) +#define GET_SUM_BLKOFF (segno) (segno % SUMS_PER_BLOCK) +#define SUM_BLK_PAGE_ADDR (folio, segno) \ + (folio_address(folio) + GET_SUM_BLKOFF(segno) * F2FS_SUM_BLKSIZE)#define GET_SUM_TYPE (footer) ((footer)->entry_type)#define SET_SUM_TYPE (footer, type) ((footer)->entry_type = (type))
fs/f2fs/super.c +14 -0
@@ -3965,6 +3965,20 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi,if (sanity_check_area_boundary (sbi, folio, index))return -EFSCORRUPTED ; +/* +* Check for legacy summary layout on 16KB+ block devices. +* Modern f2fs-tools packs multiple 4KB summary areas into one block, +* whereas legacy versions used one block per summary, leading +* to a much larger SSA. +*/ +if (SUMS_PER_BLOCK >1 && + !(__F2FS_HAS_FEATURE (raw_super,F2FS_FEATURE_PACKED_SSA ))) { +f2fs_info (sbi,"Error: Device formatted with a legacy version. " +"Please reformat with a tool supporting the packed ssa " +"feature for block sizes larger than 4kb." ); +return -EOPNOTSUPP ; + } +return 0 ; }
fs/f2fs/sysfs.c +7 -0
@@ -235,6 +235,9 @@ static ssize_t features_show(struct f2fs_attr *a,if (f2fs_sb_has_compression (sbi)) len +=sysfs_emit_at (buf, len,"%s%s" , len ?", " :"" ,"compression" ); +if (f2fs_sb_has_packed_ssa (sbi)) + len +=sysfs_emit_at (buf, len,"%s%s" , + len ?", " :"" ,"packed_ssa" ); len +=sysfs_emit_at (buf, len,"%s%s" , len ?", " :"" ,"pin_file" ); len +=sysfs_emit_at (buf, len,"\n" );
@@ -1255,6 +1258,7 @@ F2FS_FEATURE_RO_ATTR(pin_file);#ifdef CONFIG_UNICODE F2FS_FEATURE_RO_ATTR (linear_lookup);#endif +F2FS_FEATURE_RO_ATTR (packed_ssa);#define ATTR_LIST (name) (&f2fs_attr_##name.attr)static struct attribute *f2fs_attrs[] = {
@@ -1410,6 +1414,7 @@ static struct attribute *f2fs_feat_attrs[] = {#ifdef CONFIG_UNICODE BASE_ATTR_LIST (linear_lookup), #endif +BASE_ATTR_LIST (packed_ssa),NULL , };ATTRIBUTE_GROUPS (f2fs_feat);
@@ -1445,6 +1450,7 @@ F2FS_SB_FEATURE_RO_ATTR(casefold, CASEFOLD);F2FS_SB_FEATURE_RO_ATTR (compression,COMPRESSION );F2FS_SB_FEATURE_RO_ATTR (readonly,RO );F2FS_SB_FEATURE_RO_ATTR (device_alias,DEVICE_ALIAS ); +F2FS_SB_FEATURE_RO_ATTR (packed_ssa,PACKED_SSA );static struct attribute *f2fs_sb_feat_attrs[] = {ATTR_LIST (sb_encryption),
@@ -1462,6 +1468,7 @@ static struct attribute *f2fs_sb_feat_attrs[] = {ATTR_LIST (sb_compression),ATTR_LIST (sb_readonly),ATTR_LIST (sb_device_alias), +ATTR_LIST (sb_packed_ssa),NULL , };ATTRIBUTE_GROUPS (f2fs_sb_feat);
include/linux/f2fs_fs.h +3 -2
@@ -17,6 +17,7 @@#define F2FS_LOG_SECTORS_PER_BLOCK (PAGE_SHIFT - 9)/* log number for sector/blk */ #define F2FS_BLKSIZE PAGE_SIZE/* support only block == page */ #define F2FS_BLKSIZE_BITS PAGE_SHIFT/* bits for F2FS_BLKSIZE */ +#define F2FS_SUM_BLKSIZE 4096/* only support 4096 byte sum block */ #define F2FS_MAX_EXTENSION 64/* # of extension entries */ #define F2FS_EXTENSION_LEN 8/* max size of extension */
@@ -441,7 +442,7 @@ struct f2fs_sit_block {* from node's page's beginning to get a data block address. * ex) data_blkaddr = (block_t)(nodepage_start_address + ofs_in_node) */ -#define ENTRIES_IN_SUM (F2FS_BLKSIZE / 8) +#define ENTRIES_IN_SUM (F2FS_SUM_BLKSIZE / 8)#define SUMMARY_SIZE (7)/* sizeof(struct f2fs_summary) */ #define SUM_FOOTER_SIZE (5)/* sizeof(struct summary_footer) */ #define SUM_ENTRY_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM)
@@ -467,7 +468,7 @@ struct summary_footer {__le32 check_sum;/* summary checksum */ } __packed; -#define SUM_JOURNAL_SIZE (F2FS_BLKSIZE - SUM_FOOTER_SIZE -\ +#define SUM_JOURNAL_SIZE (F2FS_SUM_BLKSIZE - SUM_FOOTER_SIZE -\ SUM_ENTRY_SIZE)#define NAT_JOURNAL_ENTRIES ((SUM_JOURNAL_SIZE - 2) /\ sizeof(struct nat_journal_entry))
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 460/507 blk-mq: Abort suspend when wakeup events are pending
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cong Zhang <[email protected]>
[ Upstream commit c196bf43d706592d8801a7513603765080e495fb ]
During system suspend, wakeup capable IRQs for block device can be delayed, which can cause blk_mq_hctx_notify_offline() to hang indefinitely while waiting for pending request to complete. Skip the request waiting loop and abort suspend when wakeup events are pending to prevent the deadlock.
--- block/blk-mq.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-)
block/blk-mq.c +16 -2
@@ -23,6 +23,7 @@#include <linux/cache.h> #include <linux/sched/topology.h> #include <linux/sched/signal.h> +#include <linux/suspend.h> #include <linux/delay.h> #include <linux/crash_dump.h> #include <linux/prefetch.h>
@@ -3721,6 +3722,7 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node) {struct blk_mq_hw_ctx *hctx =hlist_entry_safe (node, struct blk_mq_hw_ctx, cpuhp_online); +int ret =0 ;if (blk_mq_hctx_has_online_cpu (hctx, cpu))return 0 ;
@@ -3741,12 +3743,24 @@ static int blk_mq_hctx_notify_offline(unsigned int cpu, struct hlist_node *node)* frozen and there are no requests. */ if (percpu_ref_tryget (&hctx->queue->q_usage_counter)) { -while (blk_mq_hctx_has_requests (hctx)) +while (blk_mq_hctx_has_requests (hctx)) { +/* +* The wakeup capable IRQ handler of block device is +* not called during suspend. Skip the loop by checking +* pm_wakeup_pending to prevent the deadlock and improve +* suspend latency. +*/ +if (pm_wakeup_pending ()) { +clear_bit (BLK_MQ_S_INACTIVE , &hctx->state); + ret = -EBUSY ; +break ; + }msleep (5 ); + }percpu_ref_put (&hctx->queue->q_usage_counter); } -return 0 ; +return ret; }/*
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 461/507 block: fix comment for op_is_zone_mgmt() to include RESET_ALL
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: shechenglong <[email protected]>
[ Upstream commit 8a32282175c964eb15638e8dfe199fc13c060f67 ]
REQ_OP_ZONE_RESET_ALL is a zone management request, and op_is_zone_mgmt() has returned true for it.
Update the comment to remove the misleading exception note so the documentation matches the implementation.
--- include/linux/blk_types.h | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-)
include/linux/blk_types.h +1 -4
@@ -471,10 +471,7 @@ static inline bool op_is_discard(blk_opf_t op) }/* -* Check if a bio or request operation is a zone management operation, with -* the exception of REQ_OP_ZONE_RESET_ALL which is treated as a special case -* due to its different handling in the block layer and device response in -* case of command failure. +* Check if a bio or request operation is a zone management operation. */ static inline bool op_is_zone_mgmt (enum req_op op) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 462/507 block: fix memory leak in __blkdev_issue_zero_pages
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shaurya Rane <[email protected]>
[ Upstream commit f7e3f852a42d7cd8f1af2c330d9d153e30c8adcf ]
Move the fatal signal check before bio_alloc() to prevent a memory leak when BLKDEV_ZERO_KILLABLE is set and a fatal signal is pending.
Previously, the bio was allocated before checking for a fatal signal. If a signal was pending, the code would break out of the loop without freeing or chaining the just-allocated bio, causing a memory leak.
This matches the pattern already used in __blkdev_issue_write_zeroes() where the signal check precedes the allocation.
--- block/blk-lib.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
block/blk-lib.c +3 -3
@@ -200,13 +200,13 @@ static void __blkdev_issue_zero_pages(struct block_device *bdev,unsigned int nr_vecs =__blkdev_sectors_to_bio_pages (nr_sects);struct bio *bio; - bio =bio_alloc (bdev, nr_vecs,REQ_OP_WRITE , gfp_mask); - bio->bi_iter.bi_sector = sector; -if ((flags &BLKDEV_ZERO_KILLABLE ) &&fatal_signal_pending (current))break ; + bio =bio_alloc (bdev, nr_vecs,REQ_OP_WRITE , gfp_mask); + bio->bi_iter.bi_sector = sector; + do { unsigned int len, added;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 463/507 nvme-auth: use kvfree() for memory allocated with kvcalloc()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Israel Rukshin <[email protected]>
[ Upstream commit bb9f4cca7c031de6f0e85f7ba24abf0172829f85 ]
Memory allocated by kvcalloc() may come from vmalloc or kmalloc, so use kvfree() instead of kfree() for proper deallocation.
--- drivers/nvme/host/auth.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/nvme/host/auth.c +1 -1
@@ -1122,7 +1122,7 @@ void nvme_auth_free(struct nvme_ctrl *ctrl)if (ctrl->dhchap_ctxs) {for (i =0 ; i <ctrl_max_dhchaps (ctrl); i++)nvme_auth_free_dhchap (&ctrl->dhchap_ctxs[i]); -kfree (ctrl->dhchap_ctxs); +kvfree (ctrl->dhchap_ctxs); }if (ctrl->host_key) {nvme_auth_free_key (ctrl->host_key);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 464/507 drm/plane: Fix IS_ERR() vs NULL check in drm_plane_create_hotspot_properties()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 479acb9db3199cdb70e5478a6f633b5f20c7d8df ]
The drm_property_create_signed_range() function doesn't return error pointers it returns NULL on error. Fix the error checking to match.
--- drivers/gpu/drm/drm_plane.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/drm_plane.c +4 -4
@@ -338,14 +338,14 @@ static int drm_plane_create_hotspot_properties(struct drm_plane *plane) prop_x =drm_property_create_signed_range (plane->dev,0 ,"HOTSPOT_X" ,INT_MIN ,INT_MAX ); -if (IS_ERR (prop_x)) -return PTR_ERR (prop_x); +if (!prop_x) +return -ENOMEM ; prop_y =drm_property_create_signed_range (plane->dev,0 ,"HOTSPOT_Y" ,INT_MIN ,INT_MAX ); -if (IS_ERR (prop_y)) { +if (!prop_y) {drm_property_destroy (plane->dev, prop_x); -return PTR_ERR (prop_y); +return -ENOMEM ; }drm_object_attach_property (&plane->base, prop_x,0 );
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 465/507 regulator: fixed: Rely on the core freeing the enable GPIO
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
[ Upstream commit 79a45ddcdbba330f5139c7c7ff7042d69cf147b2 ]
In order to simplify ownership rules for enable GPIOs supplied by drivers regulator_register() always takes ownership of them, even if it ends up failing for some other reason. We therefore should not free the GPIO if registration fails but just let the core worry about things.
--- drivers/regulator/fixed.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
drivers/regulator/fixed.c +4 -7
@@ -330,13 +330,10 @@ static int reg_fixed_voltage_probe(struct platform_device *pdev) drvdata->dev =devm_regulator_register (&pdev->dev, &drvdata->desc, &cfg); -if (IS_ERR (drvdata->dev)) { - ret =dev_err_probe (&pdev->dev,PTR_ERR (drvdata->dev), -"Failed to register regulator: %ld\n" , -PTR_ERR (drvdata->dev)); -gpiod_put (cfg.ena_gpiod); -return ret; - } +if (IS_ERR (drvdata->dev)) +return dev_err_probe (&pdev->dev,PTR_ERR (drvdata->dev), +"Failed to register regulator: %ld\n" , +PTR_ERR (drvdata->dev));platform_set_drvdata (pdev, drvdata);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 466/507 ALSA: firewire-motu: fix buffer overflow in hwdep read for DSP events
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 210d77cca3d0494ed30a5c628b20c1d95fa04fb1 ]
The DSP event handling code in hwdep_read() could write more bytes to the user buffer than requested, when a user provides a buffer smaller than the event header size (8 bytes).
Fix by using min_t() to clamp the copy size, This ensures we never copy more than the user requested.
--- sound/firewire/motu/motu-hwdep.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
sound/firewire/motu/motu-hwdep.c +3 -2
@@ -83,10 +83,11 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count, event.motu_register_dsp_change.type =SNDRV_FIREWIRE_EVENT_MOTU_REGISTER_DSP_CHANGE ; event.motu_register_dsp_change.count = (consumed -sizeof (event.motu_register_dsp_change)) /4 ; -if (copy_to_user (buf, &event,sizeof (event.motu_register_dsp_change))) +if (copy_to_user (buf, &event, +min_t (long, count,sizeof (event.motu_register_dsp_change))))return -EFAULT ; - count = consumed; + count =min_t (long, count, consumed); }else {spin_unlock_irq (&motu->lock);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 467/507 drm/nouveau: refactor deprecated strcpy
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Madhur Kumar <[email protected]>
[ Upstream commit 2bdc2c0e12fac56e41ec05fb771ead986ea6dac0 ]
strcpy() has been deprecated because it performs no bounds checking on the destination buffer, which can lead to buffer overflows. Use the safer strscpy() instead.
--- drivers/gpu/drm/nouveau/nouveau_fence.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/gpu/drm/nouveau/nouveau_fence.c +3 -3
@@ -183,11 +183,11 @@ nouveau_fence_context_new(struct nouveau_channel *chan, struct nouveau_fence_cha fctx->context = drm->runl[chan->runlist].context_base + chan->chid;if (chan == drm->cechan) -strcpy (fctx->name,"copy engine channel" ); +strscpy (fctx->name,"copy engine channel" );else if (chan == drm->channel) -strcpy (fctx->name,"generic kernel channel" ); +strscpy (fctx->name,"generic kernel channel" );else -strcpy (fctx->name, cli->name); +strscpy (fctx->name, cli->name);kref_init (&fctx->fence_ref);if (!priv->uevent)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 468/507 drm/nouveau: fix circular dep oops from vendored i2c encoder
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: René Rebe <[email protected]>
[ Upstream commit d84e47edf156a953ed340ba6a202dcd3ea39ba0a ]
Since commit a73583107af9 ("drm/nouveau: vendor in drm_encoder_slave API") nouveau appears to be broken for all dispnv04 GPUs (before NV50). Depending on the kernel version, either having no display output and hanging in kernel for a long time, or even oopsing in the cleanup path like:
Hardware name: PowerMac11,2 PPC970MP 0x440101 PowerMac ... nouveau 0000:0a:00.0: drm: 0x14C5: Parsing digital output script table BUG: Unable to handle kernel data access on read at 0x00041520 Faulting instruction address: 0xc0003d0001be0844 Oops: Kernel access of bad area, sig: 11 [#1] BE PAGE_SIZE=4K MMU=Hash SMP NR_CPUS=8 NUMA PowerMac Modules linked in: windfarm_cpufreq_clamp windfarm_smu_sensors windfarm_smu_controls windfarm_pm112 snd_aoa_codec_onyx snd_aoa_fabric_layout snd_aoa windfarm_pid jo apple_mfi_fastcharge rndis_host cdc_ether usbnet mii snd_aoa_i2sbus snd_aoa_soundbus snd_pcm snd_timer snd soundcore rack_meter windfarm_smu_sat windfarm_max6690_s
m75_sensor windfarm_core gpu_sched drm_gpuvm drm_exec drm_client_lib drm_ttm_helper ttm drm_display_helper drm_kms_helper drm drm_panel_orientation_quirks syscopyar _sys_fops i2c_algo_bit backlight uio_pdrv_genirq uio uninorth_agp agpgart zram dm_mod dax ipv6 nfsv4 dns_resolver nfs lockd grace sunrpc offb cfbfillrect cfbimgblt ont input_leds sr_mod cdrom sd_mod uas ata_generic hid_apple hid_generic usbhid hid usb_storage pata_macio sata_svw libata firewire_ohci scsi_mod firewire_core ohci ehci_pci ehci_hcd tg3 ohci_hcd libphy usbcore usb_common nls_base
led_class
CPU: 0 UID: 0 PID: 245 Comm: (udev-worker) Not tainted 6.14.0-09584-g7d06015d936c #7 PREEMPTLAZY Hardware name: PowerMac11,2 PPC970MP 0x440101 PowerMac NIP: c0003d0001be0844 LR: c0003d0001be0830 CTR: 0000000000000000 REGS: c0000000053f70e0 TRAP: 0300 Not tainted (6.14.0-09584-g7d06015d936c) MSR: 9000000000009032 <SF,HV,EE,ME,IR,DR,RI> CR: 24222220 XER: 00000000 DAR: 0000000000041520 DSISR: 40000000 IRQMASK: 0 \x0aGPR00: c0003d0001be0830 c0000000053f7380 c0003d0000911900 c000000007bc6800 \x0aGPR04: 0000000000000000 0000000000000000 c000000007bc6e70 0000000000000001 \x0aGPR08: 01f3040000000000 0000000000041520 0000000000000000 c0003d0000813958 \x0aGPR12: c000000000071a48 c000000000e28000 0000000000000020 0000000000000000 \x0aGPR16: 0000000000000000 0000000000f52630 0000000000000000 0000000000000000 \x0aGPR20: 0000000000000000 0000000000000000 0000000000000001 c0003d0000928528 \x0aGPR24: c0003d0000928598 0000000000000000 c000000007025480 c000000007025480 \x0aGPR28: c0000000010b4000 0000000000000000 c000000007bc1800 c000000007bc6800 NIP [c0003d0001be0844] nv_crtc_destroy+0x44/0xd4 [nouveau] LR [c0003d0001be0830] nv_crtc_destroy+0x30/0xd4 [nouveau] Call Trace: [c0000000053f7380] [c0003d0001be0830] nv_crtc_destroy+0x30/0xd4 [nouveau] (unreliable) [c0000000053f73c0] [c0003d00007f7bf4] drm_mode_config_cleanup+0x27c/0x30c [drm] [c0000000053f7490] [c0003d0001bdea50] nouveau_display_create+0x1cc/0x550 [nouveau] [c0000000053f7500] [c0003d0001bcc29c] nouveau_drm_device_init+0x1c8/0x844 [nouveau] [c0000000053f75e0] [c0003d0001bcc9ec] nouveau_drm_probe+0xd4/0x1e0 [nouveau] [c0000000053f7670] [c000000000557d24] local_pci_probe+0x50/0xa8 [c0000000053f76f0] [c000000000557fa8] pci_device_probe+0x22c/0x240 [c0000000053f7760] [c0000000005fff3c] really_probe+0x188/0x31c [c0000000053f77e0] [c000000000600204] __driver_probe_device+0x134/0x13c [c0000000053f7860] [c0000000006002c0] driver_probe_device+0x3c/0xb4 [c0000000053f78a0] [c000000000600534] __driver_attach+0x118/0x128 [c0000000053f78e0] [c0000000005fe038] bus_for_each_dev+0xa8/0xf4 [c0000000053f7950] [c0000000005ff460] driver_attach+0x2c/0x40 [c0000000053f7970] [c0000000005fea68] bus_add_driver+0x130/0x278 [c0000000053f7a00] [c00000000060117c] driver_register+0x9c/0x1a0 [c0000000053f7a80] [c00000000055623c] __pci_register_driver+0x5c/0x70 [c0000000053f7aa0] [c0003d0001c058a0] nouveau_drm_init+0x254/0x278 [nouveau] [c0000000053f7b10] [c00000000000e9bc] do_one_initcall+0x84/0x268 [c0000000053f7bf0] [c0000000001a0ba0] do_init_module+0x70/0x2d8 [c0000000053f7c70] [c0000000001a42bc] init_module_from_file+0xb4/0x108 [c0000000053f7d50] [c0000000001a4504] sys_finit_module+0x1ac/0x478 [c0000000053f7e10] [c000000000023230] system_call_exception+0x1a4/0x20c [c0000000053f7e50] [c00000000000c554] system_call_common+0xf4/0x258 --- interrupt: c00 at 0xfd5f988 NIP: 000000000fd5f988 LR: 000000000ff9b148 CTR: 0000000000000000 REGS: c0000000053f7e80 TRAP: 0c00 Not tainted (6.14.0-09584-g7d06015d936c) MSR: 100000000000d032 <HV,EE,PR,ME,IR,DR,RI> CR: 28222244 XER: 00000000
IRQMASK: 0 \x0aGPR00: 0000000000000161 00000000ffcdc2d0 00000000405db160 0000000000000020 \x0aGPR04: 000000000ffa2c9c 0000000000000000 000000000000001f 0000000000000045 \x0aGPR08: 0000000011a13770 0000000000000000 0000000000000000 0000000000000000 \x0aGPR12: 0000000000000000 0000000010249d8c 0000000000000020 0000000000000000 \x0aGPR16: 0000000000000000 0000000000f52630 0000000000000000 0000000000000000 \x0aGPR20: 0000000000000000 0000000000000000 0000000000000000 0000000011a11a70 \x0aGPR24: 0000000011a13580 0000000011a11950 0000000011a11a70 0000000000020000 \x0aGPR28: 000000000ffa2c9c 0000000000000000 000000000ffafc40 0000000011a11a70 NIP [000000000fd5f988] 0xfd5f988
LR [000000000ff9b148] 0xff9b148
--- interrupt: c00
Code: f821ffc1 418200ac e93f0000 e9290038 e9291468 eba90000 48026c0d e8410018 e93f06aa 3d290001 392982a4 79291f24 <7fdd482a> 2c3e0000 41820030 7fc3f378 ---[ end trace 0000000000000000 ]---
This is caused by the i2c encoder modules vendored into nouveau/ now depending on the equally vendored nouveau_i2c_encoder_destroy function. Trying to auto-load this modules hangs on nouveau initialization until timeout, and nouveau continues without i2c video encoders.
Fix by avoiding nouveau dependency by __always_inlining that helper functions into those i2c video encoder modules.
--- .../nouveau/dispnv04/nouveau_i2c_encoder.c | 20 ------------------- .../include/dispnv04/i2c/encoder_i2c.h | 19 +++++++++++++++++- 2 files changed, 18 insertions(+), 21 deletions(-)
drivers/gpu/drm/nouveau/dispnv04/nouveau_i2c_encoder.c +0 -20
@@ -94,26 +94,6 @@ int nouveau_i2c_encoder_init(struct drm_device *dev,return err; } -/** -* nouveau_i2c_encoder_destroy - Unregister the I2C device backing an encoder -* @drm_encoder: Encoder to be unregistered. -* -* This should be called from the @destroy method of an I2C slave -* encoder driver once I2C access is no longer needed. -*/ -void nouveau_i2c_encoder_destroy (struct drm_encoder *drm_encoder) -{ -struct nouveau_i2c_encoder *encoder =to_encoder_i2c (drm_encoder); -struct i2c_client *client =nouveau_i2c_encoder_get_client (drm_encoder); -struct module *module = client->dev.driver->owner; - -i2c_unregister_device (client); - encoder->i2c_client =NULL ; - -module_put (module); -} -EXPORT_SYMBOL (nouveau_i2c_encoder_destroy); -/* * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs: */
drivers/gpu/drm/nouveau/include/dispnv04/i2c/encoder_i2c.h +18 -1
@@ -202,7 +202,24 @@ static inline struct i2c_client *nouveau_i2c_encoder_get_client(struct drm_encodreturn to_encoder_i2c (encoder)->i2c_client; } -void nouveau_i2c_encoder_destroy (struct drm_encoder *encoder); +/** +* nouveau_i2c_encoder_destroy - Unregister the I2C device backing an encoder +* @drm_encoder: Encoder to be unregistered. +* +* This should be called from the @destroy method of an I2C slave +* encoder driver once I2C access is no longer needed. +*/ +static __always_inline void nouveau_i2c_encoder_destroy(struct drm_encoder *drm_encoder) +{ +struct nouveau_i2c_encoder *encoder =to_encoder_i2c (drm_encoder); +struct i2c_client *client =nouveau_i2c_encoder_get_client (drm_encoder); +struct module *module = client->dev.driver->owner; + +i2c_unregister_device (client); + encoder->i2c_client =NULL ; + +module_put (module); +}/* * Wrapper fxns which can be plugged in to drm_encoder_helper_funcs:
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 469/507 cifs: Fix handling of a beyond-EOF DIO/unbuffered read over SMB1
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 9d85ac939d52e93d80efb01a299c6f0bedb30487 ]
If a DIO read or an unbuffered read request extends beyond the EOF, the server will return a short read and a status code indicating that EOF was hit, which gets translated to -ENODATA. Note that the client does not cap the request at i_size, but asks for the amount requested in case there's a race on the server with a third party.
Now, on the client side, the request will get split into multiple subrequests if rsize is smaller than the full request size. A subrequest that starts before or at the EOF and returns short data up to the EOF will be correctly handled, with the NETFS_SREQ_HIT_EOF flag being set, indicating to netfslib that we can't read more.
If a subrequest, however, starts after the EOF and not at it, HIT_EOF will not be flagged, its error will be set to -ENODATA and it will be abandoned. This will cause the request as a whole to fail with -ENODATA.
Fix this by setting NETFS_SREQ_HIT_EOF on any subrequest that lies beyond the EOF marker.
This can be reproduced by mounting with "cache=none,sign,vers=1.0" and doing a read of a file that's significantly bigger than the size of the file (e.g. attempting to read 64KiB from a 16KiB file).
--- fs/smb/client/cifssmb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/cifssmb.c +1 -1
@@ -1364,7 +1364,7 @@ cifs_readv_callback(struct mid_q_entry *mid) }else {size_t trans = rdata->subreq.transferred + rdata->got_bytes;if (trans < rdata->subreq.len && - rdata->subreq.start + trans == ictx->remote_i_size) { + rdata->subreq.start + trans >= ictx->remote_i_size) { rdata->result =0 ;__set_bit (NETFS_SREQ_HIT_EOF , &rdata->subreq.flags); }else if (rdata->got_bytes >0 ) {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 470/507 cifs: Fix handling of a beyond-EOF DIO/unbuffered read over SMB2
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Howells <[email protected]>
[ Upstream commit 4ae4dde6f34a4124c65468ae4fa1f915fb40f900 ]
If a DIO read or an unbuffered read request extends beyond the EOF, the server will return a short read and a status code indicating that EOF was hit, which gets translated to -ENODATA. Note that the client does not cap the request at i_size, but asks for the amount requested in case there's a race on the server with a third party.
Now, on the client side, the request will get split into multiple subrequests if rsize is smaller than the full request size. A subrequest that starts before or at the EOF and returns short data up to the EOF will be correctly handled, with the NETFS_SREQ_HIT_EOF flag being set, indicating to netfslib that we can't read more.
If a subrequest, however, starts after the EOF and not at it, HIT_EOF will not be flagged, its error will be set to -ENODATA and it will be abandoned. This will cause the request as a whole to fail with -ENODATA.
Fix this by setting NETFS_SREQ_HIT_EOF on any subrequest that lies beyond the EOF marker.
--- fs/smb/client/smb2pdu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/smb/client/smb2pdu.c +1 -1
@@ -4629,7 +4629,7 @@ smb2_readv_callback(struct mid_q_entry *mid) }else {size_t trans = rdata->subreq.transferred + rdata->got_bytes;if (trans < rdata->subreq.len && - rdata->subreq.start + trans == ictx->remote_i_size) { + rdata->subreq.start + trans >= ictx->remote_i_size) {__set_bit (NETFS_SREQ_HIT_EOF , &rdata->subreq.flags); rdata->result =0 ; }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 471/507 docs: hwmon: fix link to g762 devicetree binding
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kathara Sasikumar <[email protected]>
[ Upstream commit 08bfcf4ff9d39228150a757803fc02dffce84ab0 ]
The devicetree binding for g762 was converted to YAML to match vendor prefix conventions. Update the reference accordingly.
--- Documentation/hwmon/g762.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
Documentation/hwmon/g762.rst +1 -1
@@ -17,7 +17,7 @@ done via a userland daemon like fancontrol. Note that those entries do not provide ways to setup the specific hardware characteristics of the system (reference clock, pulses per fan revolution, ...); Those can be modified via devicetree bindings -documented in Documentation/devicetree/bindings/hwmon/g762.txt or +documented in Documentation/devicetree/bindings/hwmon/gmt,g762.yaml or using a specific platform_data structure in board initialization file (see include/linux/platform_data/g762.h).
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 472/507 i2c: spacemit: fix detect issue
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Troy Mitchell <[email protected]>
[ Upstream commit 25faa5364638b86ec0d0edb4486daa9d40a0be8f ]
This commit addresses two issues causing i2c detect to fail.
The identified issues are:
1. Incorrect error handling for BED (Bus Error No ACK/NAK):
Before this commit, Both ALD (Arbitration Loss Detected) and BED returned -EAGAIN.
2. Missing interrupt status clear after initialization in xfer():
On the K1 SoC, simply fixing the first issue changed the error from -EAGAIN to -ETIMEOUT. Through tracing, it was determined that this is likely due to MSD (Master Stop Detected) latency issues.
That means the MSD bit in the ISR may still be set on the next transfer. As a result, the controller won't work — we can see from the scope that it doesn't issue any signal.
(This only occurs during rapid consecutive I2C transfers. That explains why the issue only shows up with i2cdetect.)
With these two fixes, i2c device detection now functions correctly on the K1 SoC.
--- drivers/i2c/busses/i2c-k1.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
drivers/i2c/busses/i2c-k1.c +13 -6
@@ -158,11 +158,16 @@ static int spacemit_i2c_handle_err(struct spacemit_i2c_dev *i2c) {dev_dbg (i2c->dev,"i2c error status: 0x%08x\n" , i2c->status); -if (i2c->status & (SPACEMIT_SR_BED |SPACEMIT_SR_ALD )) { +/* Arbitration Loss Detected */ +if (i2c->status &SPACEMIT_SR_ALD ) {spacemit_i2c_reset (i2c);return -EAGAIN ; } +/* Bus Error No ACK/NAK */ +if (i2c->status &SPACEMIT_SR_BED ) +spacemit_i2c_reset (i2c); +return i2c->status &SPACEMIT_SR_ACKNAK ? -ENXIO : -EIO ; }
@@ -224,6 +229,12 @@ static void spacemit_i2c_check_bus_release(struct spacemit_i2c_dev *i2c) } } +static inline void +spacemit_i2c_clear_int_status (struct spacemit_i2c_dev *i2c,u32 mask) +{ +writel (mask &SPACEMIT_I2C_INT_STATUS_MASK , i2c->base +SPACEMIT_ISR ); +} +static void spacemit_i2c_init (struct spacemit_i2c_dev *i2c) {u32 val;
@@ -267,12 +278,8 @@ static void spacemit_i2c_init(struct spacemit_i2c_dev *i2c) val =readl (i2c->base +SPACEMIT_IRCR ); val |=SPACEMIT_RCR_SDA_GLITCH_NOFIX ;writel (val, i2c->base +SPACEMIT_IRCR ); -} -static inline void -spacemit_i2c_clear_int_status (struct spacemit_i2c_dev *i2c,u32 mask) -{ -writel (mask &SPACEMIT_I2C_INT_STATUS_MASK , i2c->base +SPACEMIT_ISR ); +spacemit_i2c_clear_int_status (i2c,SPACEMIT_I2C_INT_STATUS_MASK ); }static void spacemit_i2c_start (struct spacemit_i2c_dev *i2c)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 473/507 dma/pool: eliminate alloc_pages warning in atomic_pool_expand
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Kleikamp <[email protected]>
[ Upstream commit 463d439becb81383f3a5a5d840800131f265a09c ]
atomic_pool_expand iteratively tries the allocation while decrementing the page order. There is no need to issue a warning if an attempted allocation fails.
--- kernel/dma/pool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/dma/pool.c +1 -1
@@ -93,7 +93,7 @@ static int atomic_pool_expand(struct gen_pool *pool, size_t pool_size, page =dma_alloc_from_contiguous (NULL ,1 << order, order, false);if (!page) - page =alloc_pages (gfp, order); + page =alloc_pages (gfp | __GFP_NOWARN, order); }while (!page && order-- >0 );if (!page) goto out;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 474/507 ALSA: uapi: Fix typo in asound.h comment
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andres J Rosa <[email protected]>
[ Upstream commit 9a97857db0c5655b8932f86b5d18bb959079b0ee ]
Fix 'level-shit' to 'level-shift' in struct snd_cea_861_aud_if comment.
--- include/uapi/sound/asound.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/sound/asound.h +1 -1
@@ -60,7 +60,7 @@ struct snd_cea_861_aud_if {unsigned char db2_sf_ss;/* sample frequency and size */ unsigned char db3;/* not used, all zeros */ unsigned char db4_ca;/* channel allocation code */ -unsigned char db5_dminh_lsv;/* downmix inhibit & level-shit values */ +unsigned char db5_dminh_lsv;/* downmix inhibit & level-shift values */ };/****************************************************************************
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 475/507 drm/amdkfd: Use huge page size to check split svm range alignment
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xiaogang Chen <[email protected]>
[ Upstream commit bf2084a7b1d75d093b6a79df4c10142d49fbaa0e ]
When split svm ranges that have been mapped using huge page should use huge page size(2MB) to check split range alignment, not prange->granularity that means migration granularity.
--- drivers/gpu/drm/amd/amdkfd/kfd_svm.c | 46 +++++++++++++++++++--------- 1 file changed, 32 insertions(+), 14 deletions(-)
drivers/gpu/drm/amd/amdkfd/kfd_svm.c +32 -14
@@ -1144,30 +1144,48 @@ static int svm_range_split_tail(struct svm_range *prange, uint64_t new_last, struct list_head *insert_list, struct list_head *remap_list) { + unsigned long last_align_down = ALIGN_DOWN(prange->last, 512); +unsigned long start_align =ALIGN (prange->start,512 ); +bool huge_page_mapping = last_align_down > start_align;struct svm_range *tail =NULL ; -int r =svm_range_split (prange, prange->start, new_last, &tail); +int r; -if (!r) { -list_add (&tail->list, insert_list); -if (!IS_ALIGNED (new_last +1 ,1UL << prange->granularity)) -list_add (&tail->update_list, remap_list); - } -return r; + r =svm_range_split (prange, prange->start, new_last, &tail); + +if (r) +return r; + +list_add (&tail->list, insert_list); + +if (huge_page_mapping && tail->start > start_align && + tail->start < last_align_down && (!IS_ALIGNED (tail->start,512 ))) +list_add (&tail->update_list, remap_list); + +return 0 ; }static int svm_range_split_head (struct svm_range *prange,uint64_t new_start,struct list_head *insert_list,struct list_head *remap_list) { +unsigned long last_align_down =ALIGN_DOWN (prange->last,512 ); +unsigned long start_align =ALIGN (prange->start,512 ); +bool huge_page_mapping = last_align_down > start_align;struct svm_range *head =NULL ; -int r =svm_range_split (prange, new_start, prange->last, &head); +int r; -if (!r) { -list_add (&head->list, insert_list); -if (!IS_ALIGNED (new_start,1UL << prange->granularity)) -list_add (&head->update_list, remap_list); - } -return r; + r =svm_range_split (prange, new_start, prange->last, &head); + +if (r) +return r; + +list_add (&head->list, insert_list); + +if (huge_page_mapping && head->last +1 > start_align && + head->last +1 < last_align_down && (!IS_ALIGNED (head->last,512 ))) +list_add (&head->update_list, remap_list); + +return 0 ; } static void
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 476/507 rtc: gamecube: Check the return value of ioremap()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit d1220e47e4bd2be8b84bc158f4dea44f2f88b226 ]
The function ioremap() in gamecube_rtc_read_offset_from_sram() can fail and return NULL, which is dereferenced without checking, leading to a NULL pointer dereference.
Add a check for the return value of ioremap() and return -ENOMEM on failure.
--- drivers/rtc/rtc-gamecube.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/rtc/rtc-gamecube.c +4 -0
@@ -242,6 +242,10 @@ static int gamecube_rtc_read_offset_from_sram(struct priv *d) } hw_srnprot =ioremap (res.start,resource_size (&res)); +if (!hw_srnprot) { +pr_err ("failed to ioremap hw_srnprot\n" ); +return -ENOMEM ; + } old =ioread32be (hw_srnprot);/* TODO: figure out why we use this magic constant. I obtained it by
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 477/507 rtc: max31335: Fix ignored return value in set_alarm
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nuno Sá <[email protected]>
[ Upstream commit f07640f9fb8df2158199da1da1f8282948385a84 ]
Return the result from regmap_update_bits() instead of ignoring it and always returning 0.
--- drivers/rtc/rtc-max31335.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/rtc/rtc-max31335.c +2 -4
@@ -391,10 +391,8 @@ static int max31335_set_alarm(struct device *dev, struct rtc_wkalrm *alrm)if (ret)return ret; - ret =regmap_update_bits (max31335->regmap, max31335->chip->int_status_reg, -MAX31335_STATUS1_A1F ,0 ); - -return 0 ; +return regmap_update_bits (max31335->regmap, max31335->chip->int_status_reg, +MAX31335_STATUS1_A1F ,0 ); }static int max31335_alarm_irq_enable (struct device *dev,unsigned int enabled)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 478/507 ALSA: firewire-motu: add bounds check in put_user loop for DSP events
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
[ Upstream commit 298e753880b6ea99ac30df34959a7a03b0878eed ]
In the DSP event handling code, a put_user() loop copies event data. When the user buffer size is not aligned to 4 bytes, it could overwrite beyond the buffer boundary.
Fix by adding a bounds check before put_user().
--- sound/firewire/motu/motu-hwdep.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/firewire/motu/motu-hwdep.c +1 -1
@@ -75,7 +75,7 @@ static long hwdep_read(struct snd_hwdep *hwdep, char __user *buf, long count,while (consumed < count &&snd_motu_register_dsp_message_parser_copy_event (motu, &ev)) { ptr = (u32 __user *)(buf + consumed); -if (put_user (ev, ptr)) +if (consumed +sizeof (ev) > count ||put_user (ev, ptr))return -EFAULT ; consumed +=sizeof (ev); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 479/507 ARM: 9464/1: fix input-only operand modification in load_unaligned_zeropad()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liyuan Pang <[email protected]>
[ Upstream commit edb924a7211c9aa7a4a415e03caee4d875e46b8e ]
In the inline assembly inside load_unaligned_zeropad(), the "addr" is
constrained as input-only operand. The compiler assumes that on exit
from the asm statement these operands contain the same values as they
had before executing the statement, but when kernel page fault happened, the assembly fixup code "bic %2 %2, #0x3" modify the value of "addr", which may lead to an unexpected behavior.
Use a temporary variable "tmp" to handle it, instead of modifying the input-only operand, just like what arm64's load_unaligned_zeropad() does.
--- arch/arm/include/asm/word-at-a-time.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/include/asm/word-at-a-time.h +5 -5
@@ -67,7 +67,7 @@ static inline unsigned long find_zero(unsigned long mask)*/ static inline unsigned long load_unaligned_zeropad (const void *addr) { -unsigned long ret, offset; +unsigned long ret, tmp;/* Load word from unaligned pointer addr */ asm(
@@ -75,9 +75,9 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)"2:\n" " .pushsection .text.fixup,\"ax\"\n" " .align 2\n" -"3: and %1, %2, #0x3\n" -" bic %2, %2, #0x3\n" -" ldr %0, [%2]\n" +"3: bic %1, %2, #0x3\n" +" ldr %0, [%1]\n" +" and %1, %2, #0x3\n" " lsl %1, %1, #0x3\n" #ifndef __ARMEB__" lsr %0, %0, %1\n"
@@ -90,7 +90,7 @@ static inline unsigned long load_unaligned_zeropad(const void *addr)" .align 3\n" " .long 1b, 3b\n" " .popsection" - : "=&r" (ret), "=&r" (offset) + : "=&r" (ret), "=&r" (tmp) : "r" (addr), "Qo" (*(unsigned long *)addr)); return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 480/507 drm/xe/fbdev: use the same 64-byte stride alignment as i915
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
[ Upstream commit 4a36b339a14ae6f2a366125e3d64f0c165193293 ]
For reasons unknown, xe uses XE_PAGE_SIZE alignment for stride. Presumably it's just a confusion between stride alignment and bo allocation size alignment. Switch to 64 byte alignment to, uh, align with i915.
This will also be helpful in deduplicating and unifying the xe and i915 framebuffer allocation.
Stable-dep-of: 460b31720369 ("drm/i915/fbdev: Hold runtime PM ref during fbdev BO creation")
--- drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/xe/display/intel_fbdev_fb.c +1 -1
@@ -33,7 +33,7 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper, mode_cmd.height = sizes->surface_height; mode_cmd.pitches[0 ] =ALIGN (mode_cmd.width * -DIV_ROUND_UP (sizes->surface_bpp,8 ),XE_PAGE_SIZE ); +DIV_ROUND_UP (sizes->surface_bpp,8 ),64 ); mode_cmd.pixel_format =drm_mode_legacy_fb_format (sizes->surface_bpp, sizes->surface_depth);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 481/507 drm/i915/fbdev: make intel_framebuffer_create() error return handling explicit
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
[ Upstream commit 6979d2c80c2a5b1f04157c4d6eb038bb32861cfa ]
It's sketchy to pass error pointers via to_intel_framebuffer(). It probably works as long as struct intel_framebuffer embeds struct drm_framebuffer at offset 0, but be explicit about it.
Stable-dep-of: 460b31720369 ("drm/i915/fbdev: Hold runtime PM ref during fbdev BO creation")
--- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/gpu/drm/i915/display/intel_fbdev_fb.c +7 -0
@@ -67,9 +67,16 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper, mode_cmd.pixel_format, mode_cmd.modifier[0]), &mode_cmd); +if (IS_ERR (fb)) { +i915_gem_object_put (obj); + goto err; + } +i915_gem_object_put (obj);return to_intel_framebuffer (fb); +err: +return ERR_CAST (fb); } int intel_fbdev_fb_fill_info(struct intel_display *display, struct fb_info *info,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 482/507 drm/{i915, xe}/fbdev: pass struct drm_device to intel_fbdev_fb_alloc()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
[ Upstream commit 9e5cf822a207ee8c9856024c047abaccb4d185e5 ]
The function doesn't actually need struct drm_fb_helper for anything, just pass struct drm_device.
Stable-dep-of: 460b31720369 ("drm/i915/fbdev: Hold runtime PM ref during fbdev BO creation")
--- drivers/gpu/drm/i915/display/intel_fbdev.c | 2 +- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 10 +++++----- drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 4 ++-- drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 7 +++---- 4 files changed, 11 insertions(+), 12 deletions(-)
drivers/gpu/drm/i915/display/intel_fbdev.c +1 -1
@@ -237,7 +237,7 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,if (!fb ||drm_WARN_ON (display->drm, !intel_fb_bo (&fb->base))) {drm_dbg_kms (display->drm,"no BIOS fb, allocating a new one\n" ); - fb =intel_fbdev_fb_alloc (helper, sizes); + fb =intel_fbdev_fb_alloc (display->drm, sizes);if (IS_ERR (fb))return PTR_ERR (fb); }else {
drivers/gpu/drm/i915/display/intel_fbdev_fb.c +5 -5
@@ -13,11 +13,11 @@#include "intel_fb.h" #include "intel_fbdev_fb.h" -struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_fb_helper *helper, +struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_device *drm,struct drm_fb_helper_surface_size *sizes) { -struct intel_display *display =to_intel_display (helper->dev); -struct drm_i915_private *dev_priv =to_i915 (display->drm); +struct intel_display *display =to_intel_display (drm); +struct drm_i915_private *dev_priv =to_i915 (drm);struct drm_framebuffer *fb;struct drm_mode_fb_cmd2 mode_cmd = {};struct drm_i915_gem_object *obj;
@@ -58,12 +58,12 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper, }if (IS_ERR (obj)) { -drm_err (display->drm,"failed to allocate framebuffer (%pe)\n" , obj); +drm_err (drm,"failed to allocate framebuffer (%pe)\n" , obj);return ERR_PTR (-ENOMEM ); } fb =intel_framebuffer_create (intel_bo_to_drm_bo (obj), -drm_get_format_info (display->drm, +drm_get_format_info (drm, mode_cmd.pixel_format, mode_cmd.modifier[0 ]), &mode_cmd);
drivers/gpu/drm/i915/display/intel_fbdev_fb.h +2 -2
@@ -6,14 +6,14 @@#ifndef __INTEL_FBDEV_FB_H__#define __INTEL_FBDEV_FB_H__ -struct drm_fb_helper ; +struct drm_device ;struct drm_fb_helper_surface_size ;struct drm_gem_object ;struct fb_info ;struct i915_vma ;struct intel_display ; -struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_fb_helper *helper, +struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_device *drm,struct drm_fb_helper_surface_size *sizes);int intel_fbdev_fb_fill_info (struct intel_display *display,struct fb_info *info,struct drm_gem_object *obj,struct i915_vma *vma);
drivers/gpu/drm/xe/display/intel_fbdev_fb.c +3 -4
@@ -15,12 +15,11 @@#include <generated/xe_wa_oob.h> -struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_fb_helper *helper, +struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_device *drm,struct drm_fb_helper_surface_size *sizes) {struct drm_framebuffer *fb; -struct drm_device *dev = helper->dev; -struct xe_device *xe =to_xe_device (dev); +struct xe_device *xe =to_xe_device (drm);struct drm_mode_fb_cmd2 mode_cmd = {};struct xe_bo *obj;int size;
@@ -67,7 +66,7 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_fb_helper *helper, } fb =intel_framebuffer_create (&obj->ttm.base, -drm_get_format_info (dev, +drm_get_format_info (drm, mode_cmd.pixel_format, mode_cmd.modifier[0 ]), &mode_cmd);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 483/507 drm/{i915, xe}/fbdev: deduplicate struct drm_mode_fb_cmd2 init
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jani Nikula <[email protected]>
[ Upstream commit f9ff39f940f5ddd1d4ffcff602de7206aa1ff05d ]
Pull struct drm_mode_fb_cmd2 initialization out of the driver dependent code into shared display code.
v2: Rebase on xe stride alignment change
Stable-dep-of: 460b31720369 ("drm/i915/fbdev: Hold runtime PM ref during fbdev BO creation")
--- drivers/gpu/drm/i915/display/intel_fbdev.c | 32 ++++++++++++++++++- drivers/gpu/drm/i915/display/intel_fbdev_fb.c | 25 ++++----------- drivers/gpu/drm/i915/display/intel_fbdev_fb.h | 4 +-- drivers/gpu/drm/xe/display/intel_fbdev_fb.c | 25 ++++----------- 4 files changed, 45 insertions(+), 41 deletions(-)
drivers/gpu/drm/i915/display/intel_fbdev.c +31 -1
@@ -207,6 +207,35 @@ static const struct drm_fb_helper_funcs intel_fb_helper_funcs = { .fb_set_suspend = intelfb_set_suspend, }; +static void intel_fbdev_fill_mode_cmd (struct drm_fb_helper_surface_size *sizes, +struct drm_mode_fb_cmd2 *mode_cmd) +{ +/* we don't do packed 24bpp */ +if (sizes->surface_bpp ==24 ) + sizes->surface_bpp =32 ; + + mode_cmd->width = sizes->surface_width; + mode_cmd->height = sizes->surface_height; + + mode_cmd->pitches[0 ] =ALIGN (mode_cmd->width *DIV_ROUND_UP (sizes->surface_bpp,8 ),64 ); + mode_cmd->pixel_format =drm_mode_legacy_fb_format (sizes->surface_bpp, + sizes->surface_depth); +} + +static struct intel_framebuffer * +__intel_fbdev_fb_alloc (struct intel_display *display, +struct drm_fb_helper_surface_size *sizes) +{ +struct drm_mode_fb_cmd2 mode_cmd = {}; +struct intel_framebuffer *fb; + +intel_fbdev_fill_mode_cmd (sizes, &mode_cmd); + + fb =intel_fbdev_fb_alloc (display->drm, &mode_cmd); + +return fb; +} +int intel_fbdev_driver_fbdev_probe (struct drm_fb_helper *helper,struct drm_fb_helper_surface_size *sizes) {
@@ -237,7 +266,8 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,if (!fb ||drm_WARN_ON (display->drm, !intel_fb_bo (&fb->base))) {drm_dbg_kms (display->drm,"no BIOS fb, allocating a new one\n" ); - fb =intel_fbdev_fb_alloc (display->drm, sizes); + + fb =__intel_fbdev_fb_alloc (display, sizes);if (IS_ERR (fb))return PTR_ERR (fb); }else {
drivers/gpu/drm/i915/display/intel_fbdev_fb.c +6 -19
@@ -3,7 +3,7 @@* Copyright © 2023 Intel Corporation */ -#include <drm/drm_fb_helper.h> +#include <linux/fb.h> #include "gem/i915_gem_lmem.h"
@@ -14,28 +14,15 @@#include "intel_fbdev_fb.h" struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_device *drm, -struct drm_fb_helper_surface_size *sizes) +struct drm_mode_fb_cmd2 *mode_cmd) {struct intel_display *display =to_intel_display (drm);struct drm_i915_private *dev_priv =to_i915 (drm);struct drm_framebuffer *fb; -struct drm_mode_fb_cmd2 mode_cmd = {};struct drm_i915_gem_object *obj;int size; -/* we don't do packed 24bpp */ -if (sizes->surface_bpp ==24 ) - sizes->surface_bpp =32 ; - - mode_cmd.width = sizes->surface_width; - mode_cmd.height = sizes->surface_height; - - mode_cmd.pitches[0 ] =ALIGN (mode_cmd.width * -DIV_ROUND_UP (sizes->surface_bpp,8 ),64 ); - mode_cmd.pixel_format =drm_mode_legacy_fb_format (sizes->surface_bpp, - sizes->surface_depth); - - size = mode_cmd.pitches[0 ] * mode_cmd.height; + size = mode_cmd->pitches[0 ] * mode_cmd->height; size =PAGE_ALIGN (size); obj =ERR_PTR (-ENODEV );
@@ -64,9 +51,9 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_device *drm, fb =intel_framebuffer_create (intel_bo_to_drm_bo (obj),drm_get_format_info (drm, - mode_cmd.pixel_format, - mode_cmd.modifier[0 ]), - &mode_cmd); + mode_cmd->pixel_format, + mode_cmd->modifier[0 ]), + mode_cmd);if (IS_ERR (fb)) {i915_gem_object_put (obj); goto err;
drivers/gpu/drm/i915/display/intel_fbdev_fb.h +2 -2
@@ -7,14 +7,14 @@#define __INTEL_FBDEV_FB_H__struct drm_device ; -struct drm_fb_helper_surface_size ;struct drm_gem_object ; +struct drm_mode_fb_cmd2 ;struct fb_info ;struct i915_vma ;struct intel_display ;struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_device *drm, -struct drm_fb_helper_surface_size *sizes); +struct drm_mode_fb_cmd2 *mode_cmd);int intel_fbdev_fb_fill_info (struct intel_display *display,struct fb_info *info,struct drm_gem_object *obj,struct i915_vma *vma);
drivers/gpu/drm/xe/display/intel_fbdev_fb.c +6 -19
@@ -3,7 +3,7 @@* Copyright © 2023 Intel Corporation */ -#include <drm/drm_fb_helper.h> +#include <linux/fb.h> #include "intel_display_core.h" #include "intel_display_types.h"
@@ -16,27 +16,14 @@#include <generated/xe_wa_oob.h> struct intel_framebuffer *intel_fbdev_fb_alloc (struct drm_device *drm, -struct drm_fb_helper_surface_size *sizes) +struct drm_mode_fb_cmd2 *mode_cmd) {struct drm_framebuffer *fb;struct xe_device *xe =to_xe_device (drm); -struct drm_mode_fb_cmd2 mode_cmd = {};struct xe_bo *obj;int size; -/* we don't do packed 24bpp */ -if (sizes->surface_bpp ==24 ) - sizes->surface_bpp =32 ; - - mode_cmd.width = sizes->surface_width; - mode_cmd.height = sizes->surface_height; - - mode_cmd.pitches[0 ] =ALIGN (mode_cmd.width * -DIV_ROUND_UP (sizes->surface_bpp,8 ),64 ); - mode_cmd.pixel_format =drm_mode_legacy_fb_format (sizes->surface_bpp, - sizes->surface_depth); - - size = mode_cmd.pitches[0 ] * mode_cmd.height; + size = mode_cmd->pitches[0 ] * mode_cmd->height; size =PAGE_ALIGN (size); obj =ERR_PTR (-ENODEV );
@@ -67,9 +54,9 @@ struct intel_framebuffer *intel_fbdev_fb_alloc(struct drm_device *drm, fb =intel_framebuffer_create (&obj->ttm.base,drm_get_format_info (drm, - mode_cmd.pixel_format, - mode_cmd.modifier[0 ]), - &mode_cmd); + mode_cmd->pixel_format, + mode_cmd->modifier[0 ]), + mode_cmd);if (IS_ERR (fb)) {xe_bo_unpin_map_no_vm (obj); goto err;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 484/507 drm/i915/fbdev: Hold runtime PM ref during fbdev BO creation
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dibin Moolakadan Subrahmanian <[email protected]>
[ Upstream commit 460b31720369fc77c23301708641cfa1bf2fcb8f ]
During fbdev probe, the xe driver allocates and pins a framebuffer BO (via xe_bo_create_pin_map_novm() → xe_ggtt_insert_bo()).
Without a runtime PM reference, xe_pm_runtime_get_noresume() warns about missing outer PM protection as below:
xe 0000:03:00.0: [drm] Missing outer runtime PM protection
Acquire a runtime PM reference before framebuffer allocation to ensure xe_ggtt_insert_bo() executes under active runtime PM context.
Changes in v2:
- Update commit message to add Fixes tag (Jani Nikula)
--- drivers/gpu/drm/i915/display/intel_fbdev.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/gpu/drm/i915/display/intel_fbdev.c +7 -4
@@ -263,13 +263,18 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper,drm_framebuffer_put (&fb->base); fb =NULL ; } + + wakeref =intel_display_rpm_get (display); +if (!fb ||drm_WARN_ON (display->drm, !intel_fb_bo (&fb->base))) {drm_dbg_kms (display->drm,"no BIOS fb, allocating a new one\n" ); fb =__intel_fbdev_fb_alloc (display, sizes); -if (IS_ERR (fb)) -return PTR_ERR (fb); +if (IS_ERR (fb)) { + ret =PTR_ERR (fb); + goto out_unlock; + } }else {drm_dbg_kms (display->drm,"re-using BIOS fb\n" ); prealloc = true;
@@ -277,8 +282,6 @@ int intel_fbdev_driver_fbdev_probe(struct drm_fb_helper *helper, sizes->fb_height = fb->base.height; } - wakeref =intel_display_rpm_get (display); -/* Pin the GGTT vma for our access via info->screen_base. * This also validates that any existing fb inherited from the * BIOS is suitable for own access.
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 485/507 block: Use RCU in blk_mq_[un]quiesce_tagset() instead of set->tag_list_lock
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mohamed Khalfella <[email protected]>
[ Upstream commit 59e25ef2b413c72da6686d431e7759302cfccafa ]
blk_mq_{add,del}_queue_tag_set() functions add and remove queues from tagset, the functions make sure that tagset and queues are marked as shared when two or more queues are attached to the same tagset. Initially a tagset starts as unshared and when the number of added queues reaches two, blk_mq_add_queue_tag_set() marks it as shared along with all the queues attached to it. When the number of attached queues drops to 1 blk_mq_del_queue_tag_set() need to mark both the tagset and the remaining queues as unshared.
Both functions need to freeze current queues in tagset before setting on unsetting BLK_MQ_F_TAG_QUEUE_SHARED flag. While doing so, both functions hold set->tag_list_lock mutex, which makes sense as we do not want queues to be added or deleted in the process. This used to work fine until commit 98d81f0df70c ("nvme: use blk_mq_[un]quiesce_tagset") made the nvme driver quiesce tagset instead of quiscing individual queues. blk_mq_quiesce_tagset() does the job and quiesce the queues in set->tag_list while holding set->tag_list_lock also.
This results in deadlock between two threads with these stacktraces:
__schedule+0x47c/0xbb0 ? timerqueue_add+0x66/0xb0 schedule+0x1c/0xa0 schedule_preempt_disabled+0xa/0x10 __mutex_lock.constprop.0+0x271/0x600 blk_mq_quiesce_tagset+0x25/0xc0 nvme_dev_disable+0x9c/0x250 nvme_timeout+0x1fc/0x520 blk_mq_handle_expired+0x5c/0x90 bt_iter+0x7e/0x90 blk_mq_queue_tag_busy_iter+0x27e/0x550 ? __blk_mq_complete_request_remote+0x10/0x10 ? __blk_mq_complete_request_remote+0x10/0x10 ? __call_rcu_common.constprop.0+0x1c0/0x210 blk_mq_timeout_work+0x12d/0x170 process_one_work+0x12e/0x2d0 worker_thread+0x288/0x3a0 ? rescuer_thread+0x480/0x480 kthread+0xb8/0xe0 ? kthread_park+0x80/0x80 ret_from_fork+0x2d/0x50 ? kthread_park+0x80/0x80 ret_from_fork_asm+0x11/0x20 __schedule+0x47c/0xbb0 ? xas_find+0x161/0x1a0 schedule+0x1c/0xa0 blk_mq_freeze_queue_wait+0x3d/0x70 ? destroy_sched_domains_rcu+0x30/0x30 blk_mq_update_tag_set_shared+0x44/0x80 blk_mq_exit_queue+0x141/0x150 del_gendisk+0x25a/0x2d0 nvme_ns_remove+0xc9/0x170 nvme_remove_namespaces+0xc7/0x100 nvme_remove+0x62/0x150 pci_device_remove+0x23/0x60 device_release_driver_internal+0x159/0x200 unbind_store+0x99/0xa0 kernfs_fop_write_iter+0x112/0x1e0 vfs_write+0x2b1/0x3d0 ksys_write+0x4e/0xb0 do_syscall_64+0x5b/0x160 entry_SYSCALL_64_after_hwframe+0x4b/0x53
The top stacktrace is showing nvme_timeout() called to handle nvme command timeout. timeout handler is trying to disable the controller and as a first step, it needs to blk_mq_quiesce_tagset() to tell blk-mq not to call queue callback handlers. The thread is stuck waiting for set->tag_list_lock as it tries to walk the queues in set->tag_list.
The lock is held by the second thread in the bottom stack which is waiting for one of queues to be frozen. The queue usage counter will drop to zero after nvme_timeout() finishes, and this will not happen because the thread will wait for this mutex forever.
Given that [un]quiescing queue is an operation that does not need to sleep, update blk_mq_[un]quiesce_tagset() to use RCU instead of taking set->tag_list_lock, update blk_mq_{add,del}_queue_tag_set() to use RCU safe list operations. Also, delete INIT_LIST_HEAD(&q->tag_set_list) in blk_mq_del_queue_tag_set() because we can not re-initialize it while the list is being traversed under RCU. The deleted queue will not be added/deleted to/from a tagset and it will be freed in blk_free_queue() after the end of RCU grace period.
--- block/blk-mq.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
block/blk-mq.c +8 -9
@@ -336,12 +336,12 @@ void blk_mq_quiesce_tagset(struct blk_mq_tag_set *set) {struct request_queue *q; -mutex_lock (&set->tag_list_lock); -list_for_each_entry (q, &set->tag_list, tag_set_list) { +rcu_read_lock (); +list_for_each_entry_rcu (q, &set->tag_list, tag_set_list) {if (!blk_queue_skip_tagset_quiesce (q))blk_mq_quiesce_queue_nowait (q); } -mutex_unlock (&set->tag_list_lock); +rcu_read_unlock ();blk_mq_wait_quiesce_done (set); }
@@ -351,12 +351,12 @@ void blk_mq_unquiesce_tagset(struct blk_mq_tag_set *set) {struct request_queue *q; -mutex_lock (&set->tag_list_lock); -list_for_each_entry (q, &set->tag_list, tag_set_list) { +rcu_read_lock (); +list_for_each_entry_rcu (q, &set->tag_list, tag_set_list) {if (!blk_queue_skip_tagset_quiesce (q))blk_mq_unquiesce_queue (q); } -mutex_unlock (&set->tag_list_lock); +rcu_read_unlock (); }EXPORT_SYMBOL_GPL (blk_mq_unquiesce_tagset);
@@ -4317,7 +4317,7 @@ static void blk_mq_del_queue_tag_set(struct request_queue *q)struct blk_mq_tag_set *set = q->tag_set;mutex_lock (&set->tag_list_lock); -list_del (&q->tag_set_list); +list_del_rcu (&q->tag_set_list);if (list_is_singular (&set->tag_list)) {/* just transitioned to unshared */ set->flags &= ~BLK_MQ_F_TAG_QUEUE_SHARED ;
@@ -4325,7 +4325,6 @@ static void blk_mq_del_queue_tag_set(struct request_queue *q)blk_mq_update_tag_set_shared (set, false); }mutex_unlock (&set->tag_list_lock); -INIT_LIST_HEAD (&q->tag_set_list); } static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set,
@@ -4344,7 +4343,7 @@ static void blk_mq_add_queue_tag_set(struct blk_mq_tag_set *set, }if (set->flags &BLK_MQ_F_TAG_QUEUE_SHARED )queue_set_hctx_shared (q, true); -list_add_tail (&q->tag_set_list, &set->tag_list); +list_add_tail_rcu (&q->tag_set_list, &set->tag_list);mutex_unlock (&set->tag_list_lock); }
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 486/507 ASoC: amd: acp: update tdm channels for specific DAI
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hemalatha Pinnamreddy <[email protected]>
[ Upstream commit f34836a8ddf9216ff919927cddb705022bf30aab ]
TDM channel updates were applied to all DAIs, causing configurations to overwrite for unrelated streams. The logic is modified to update channels only for targeted DAI. This prevents corruption of other DAI settings and resolves audio issues observed during system suspend and resume cycles.
--- sound/soc/amd/acp/acp-i2s.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/amd/acp/acp-i2s.c +2 -0
@@ -157,6 +157,8 @@ static int acp_i2s_set_tdm_slot(struct snd_soc_dai *dai, u32 tx_mask, u32 rx_masspin_lock_irq (&chip->acp_lock);list_for_each_entry (stream, &chip->stream_list, list) { +if (dai->id != stream->dai_id) +continue ;switch (chip->acp_rev) {case ACP_RN_PCI_ID :case ACP_RMB_PCI_ID :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 487/507 dm-raid: fix possible NULL dereference with undefined raid type
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alexey Simakov <[email protected]>
[ Upstream commit 2f6cfd6d7cb165a7af8877b838a9f6aab4159324 ]
rs->raid_type is assigned from get_raid_type_by_ll(), which may return NULL. This NULL value could be dereferenced later in the condition 'if (!(rs_is_raid10(rs) && rt_is_raid0(rs->raid_type)))'.
Add a fail-fast check to return early with an error if raid_type is NULL, similar to other uses of this function.
Found by Linux Verification Center (linuxtesting.org) with Svace.
--- drivers/md/dm-raid.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/md/dm-raid.c +2 -0
@@ -2287,6 +2287,8 @@ static int super_init_validation(struct raid_set *rs, struct md_rdev *rdev) mddev->reshape_position =le64_to_cpu (sb->reshape_position); rs->raid_type =get_raid_type_by_ll (mddev->level, mddev->layout); +if (!rs->raid_type) +return -EINVAL ; } }else {
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 488/507 dm log-writes: Add missing set_freezable() for freezable kthread
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotian Zhang <[email protected]>
[ Upstream commit ab08f9c8b363297cafaf45475b08f78bf19b88ef ]
The log_writes_kthread() calls try_to_freeze() but lacks set_freezable(), rendering the freeze attempt ineffective since kernel threads are non-freezable by default. This prevents proper thread suspension during system suspend/hibernate.
Add set_freezable() to explicitly mark the thread as freezable.
--- drivers/md/dm-log-writes.c | 1 + 1 file changed, 1 insertion(+)
drivers/md/dm-log-writes.c +1 -0
@@ -432,6 +432,7 @@ static int log_writes_kthread(void *arg)struct log_writes_c *lc = arg;sector_t sector =0 ; +set_freezable ();while (!kthread_should_stop ()) {bool super = false;bool logging_enabled;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 489/507 efi/cper: Add a new helper function to print bitmasks
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit a976d790f49499ccaa0f991788ad8ebf92e7fd5c ]
Add a helper function to print a string with names associated to each bit field.
A typical example is:
const char * const bits[] = {
"bit 3 name",
"bit 4 name",
"bit 5 name",
};
char str[120];
unsigned int bitmask = BIT(3) | BIT(5);
#define MASK GENMASK(5,3)
cper_bits_to_str(str, sizeof(str), FIELD_GET(MASK, bitmask),
bits, ARRAY_SIZE(bits));The above code fills string "str" with "bit 3 name|bit 5 name".
--- drivers/firmware/efi/cper.c | 60 +++++++++++++++++++++++++++++++++++++ include/linux/cper.h | 2 ++ 2 files changed, 62 insertions(+)
drivers/firmware/efi/cper.c +60 -0
@@ -12,6 +12,7 @@* Specification version 2.4. */ +#include <linux/bitmap.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/time.h>
@@ -106,6 +107,65 @@ void cper_print_bits(const char *pfx, unsigned int bits,printk ("%s\n" , buf); } +/** +* cper_bits_to_str - return a string for set bits +* @buf: buffer to store the output string +* @buf_size: size of the output string buffer +* @bits: bit mask +* @strs: string array, indexed by bit position +* @strs_size: size of the string array: @strs +* +* Add to @buf the bitmask in hexadecimal. Then, for each set bit in @bits, +* add the corresponding string describing the bit in @strs to @buf. +* +* A typical example is:: +* +* const char * const bits[] = { +* "bit 3 name", +* "bit 4 name", +* "bit 5 name", +* }; +* char str[120]; +* unsigned int bitmask = BIT(3) | BIT(5); +* #define MASK GENMASK(5,3) +* +* cper_bits_to_str(str, sizeof(str), FIELD_GET(MASK, bitmask), +* bits, ARRAY_SIZE(bits)); +* +* The above code fills the string ``str`` with ``bit 3 name|bit 5 name``. +* +* Return: number of bytes stored or an error code if lower than zero. +*/ +int cper_bits_to_str (char *buf,int buf_size,unsigned long bits, +const char *const strs[],unsigned int strs_size) +{ +int len = buf_size; +char *str = buf; +int i, size; + + *buf ='\0' ; + +for_each_set_bit (i, &bits, strs_size) { +if (!(bits &BIT_ULL (i))) +continue ; + +if (*buf && len >0 ) { + *str ='|' ; + len--; + str++; + } + + size =strscpy (str, strs[i], len); +if (size <0 ) +return size; + + len -= size; + str += size; + } +return len - buf_size; +} +EXPORT_SYMBOL_GPL (cper_bits_to_str); +static const char *const proc_type_strs[] = {"IA32/X64" ,"IA64" ,
include/linux/cper.h +2 -0
@@ -588,6 +588,8 @@ const char *cper_mem_err_type_str(unsigned int);const char *cper_mem_err_status_str (u64 status);void cper_print_bits (const char *prefix,unsigned int bits,const char *const strs[],unsigned int strs_size); +int cper_bits_to_str (char *buf,int buf_size,unsigned long bits, +const char *const strs[],unsigned int strs_size);void cper_mem_err_pack (const struct cper_sec_mem_err *,struct cper_mem_err_compact *); const char *cper_mem_err_unpack(struct trace_seq *,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 490/507 efi/cper: Adjust infopfx size to accept an extra space
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 8ad2c72e21efb3dc76c5b14089fa7984cdd87898 ]
Compiling with W=1 with werror enabled produces an error:
drivers/firmware/efi/cper-arm.c: In function ‘cper_print_proc_arm’:drivers/firmware/efi/cper-arm.c:298:64: error: ‘snprintf’ output may be truncated before the last format character [-Werror=format-truncation=]
298 | snprintf(infopfx, sizeof(infopfx), "%s ", newpfx);
| ^drivers/firmware/efi/cper-arm.c:298:25: note: ‘snprintf’ output between 2 and 65 bytes into a destination of size 64
298 | snprintf(infopfx, sizeof(infopfx), "%s ", newpfx);
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~As the logic there adds an space at the end of infopx buffer. Add an extra space to avoid such warning.
--- drivers/firmware/efi/cper-arm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/firmware/efi/cper-arm.c +1 -1
@@ -240,7 +240,7 @@ void cper_print_proc_arm(const char *pfx,int i, len, max_ctx_type;struct cper_arm_err_info *err_info;struct cper_arm_ctx_info *ctx_info; -char newpfx[64 ], infopfx[64 ]; +char newpfx[64 ], infopfx[ARRAY_SIZE (newpfx) +1 ];printk ("%sMIDR: 0x%016llx\n" , pfx, proc->midr);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 491/507 efi/cper: align ARM CPER type with UEFI 2.9A/2.10 specs
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 96b010536ee020e716d28d9b359a4bcd18800aeb ]
Up to UEFI spec 2.9, the type byte of CPER struct for ARM processor was defined simply as:
Type at byte offset 4:
- Cache error
- TLB Error
- Bus Error
- Micro-architectural Error
All other values are reserved
Yet, there was no information about how this would be encoded.
Spec 2.9A errata corrected it by defining:
- Bit 1 - Cache Error
- Bit 2 - TLB Error
- Bit 3 - Bus Error
- Bit 4 - Micro-architectural Error
All other values are reserved
That actually aligns with the values already defined on older versions at N.2.4.1. Generic Processor Error Section.
Spec 2.10 also preserve the same encoding as 2.9A.
Adjust CPER and GHES handling code for both generic and ARM processors to properly handle UEFI 2.9A and 2.10 encoding.
--- drivers/acpi/apei/ghes.c | 16 +++++++---- drivers/firmware/efi/cper-arm.c | 50 ++++++++++++++++----------------- include/linux/cper.h | 10 +++---- 3 files changed, 39 insertions(+), 37 deletions(-)
drivers/acpi/apei/ghes.c +10 -6
@@ -22,6 +22,7 @@#include <linux/moduleparam.h> #include <linux/init.h> #include <linux/acpi.h> +#include <linux/bitfield.h> #include <linux/io.h> #include <linux/interrupt.h> #include <linux/timer.h>
@@ -556,6 +557,7 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, {struct cper_sec_proc_arm *err =acpi_hest_get_payload (gdata);int flags = sync ?MF_ACTION_REQUIRED :0 ; +char error_type[120 ];bool queued = false;int sec_sev, i;char *p;
@@ -568,9 +570,8 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata, p = (char *)(err +1 );for (i =0 ; i < err->err_info_num; i++) {struct cper_arm_err_info *err_info = (struct cper_arm_err_info *)p; -bool is_cache = (err_info->type ==CPER_ARM_CACHE_ERROR ); +bool is_cache = err_info->type &CPER_ARM_CACHE_ERROR ;bool has_pa = (err_info->validation_bits &CPER_ARM_INFO_VALID_PHYSICAL_ADDR ); -const char *error_type ="unknown error" ;/* * The field (err_info->error_info & BIT(26)) is fixed to set to
@@ -584,12 +585,15 @@ static bool ghes_handle_arm_hw_error(struct acpi_hest_generic_data *gdata,continue ; } -if (err_info->type <ARRAY_SIZE (cper_proc_error_type_strs)) - error_type = cper_proc_error_type_strs[err_info->type]; +cper_bits_to_str (error_type,sizeof (error_type), +FIELD_GET (CPER_ARM_ERR_TYPE_MASK , err_info->type), + cper_proc_error_type_strs, +ARRAY_SIZE (cper_proc_error_type_strs)); pr_warn_ratelimited(FW_WARN GHES_PFX -"Unhandled processor error type: %s\n" , - error_type); +"Unhandled processor error type 0x%02x: %s%s\n" , + err_info->type, error_type, + (err_info->type & ~CPER_ARM_ERR_TYPE_MASK) ? " with reserved bit(s)" : ""); p += err_info->length; }
drivers/firmware/efi/cper-arm.c +24 -26
97 lines not on this page · raw message
include/linux/cper.h +5 -5
@@ -297,11 +297,11 @@ enum {#define CPER_ARM_INFO_FLAGS_PROPAGATED BIT(2)#define CPER_ARM_INFO_FLAGS_OVERFLOW BIT(3) -#define CPER_ARM_CACHE_ERROR 0 -#define CPER_ARM_TLB_ERROR 1 -#define CPER_ARM_BUS_ERROR 2 -#define CPER_ARM_VENDOR_ERROR 3 -#define CPER_ARM_MAX_TYPE CPER_ARM_VENDOR_ERROR +#define CPER_ARM_ERR_TYPE_MASK GENMASK(4,1) +#define CPER_ARM_CACHE_ERROR BIT(1) +#define CPER_ARM_TLB_ERROR BIT(2) +#define CPER_ARM_BUS_ERROR BIT(3) +#define CPER_ARM_VENDOR_ERROR BIT(4)#define CPER_ARM_ERR_VALID_TRANSACTION_TYPE BIT(0)#define CPER_ARM_ERR_VALID_OPERATION_TYPE BIT(1)
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 492/507 scsi: imm: Fix use-after-free bug caused by unfinished delayed work
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
[ Upstream commit ab58153ec64fa3fc9aea09ca09dc9322e0b54a7c ]
The delayed work item 'imm_tq' is initialized in imm_attach() and scheduled via imm_queuecommand() for processing SCSI commands. When the IMM parallel port SCSI host adapter is detached through imm_detach(), the imm_struct device instance is deallocated.
However, the delayed work might still be pending or executing when imm_detach() is called, leading to use-after-free bugs when the work function imm_interrupt() accesses the already freed imm_struct memory.
The race condition can occur as follows:
CPU 0(detach thread) | CPU 1
| imm_queuecommand()
| imm_queuecommand_lck()
imm_detach() | schedule_delayed_work()
kfree(dev) //FREE | imm_interrupt()
| dev = container_of(...) //USE
dev-> //USEAdd disable_delayed_work_sync() in imm_detach() to guarantee proper cancellation of the delayed work item before imm_struct is deallocated.
--- drivers/scsi/imm.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/imm.c +1 -0
@@ -1260,6 +1260,7 @@ static void imm_detach(struct parport *pb)imm_struct *dev;list_for_each_entry (dev, &imm_hosts, list) {if (dev->dev->port == pb) { +disable_delayed_work_sync (&dev->imm_tq);list_del_init (&dev->list);scsi_remove_host (dev->host);scsi_host_put (dev->host);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 493/507 perf/core: Fix missing read event generation on task exit
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thaumy Cheng <[email protected]>
[ Upstream commit c418d8b4d7a43a86b82ee39cb52ece3034383530 ]
For events with inherit_stat enabled, a "read" event will be generated to collect per task event counts on task exit.
The call chain is as follows:
do_exit
-> perf_event_exit_task
-> perf_event_exit_task_context
-> perf_event_exit_event
-> perf_remove_from_context
-> perf_child_detach
-> sync_child_event
-> perf_event_read_eventHowever, the child event context detaches the task too early in perf_event_exit_task_context, which causes sync_child_event to never generate the read event in this case, since child_event->ctx->task is always set to TASK_TOMBSTONE. Fix that by moving context lock section backward to ensure ctx->task is not set to TASK_TOMBSTONE before generating the read event.
Because perf_event_free_task calls perf_event_exit_task_context with exit = false to tear down all child events from the context, and the task never lived, accessing the task PID can lead to a use-after-free.
To fix that, let sync_child_event read task from argument and move the call to the only place it should be triggered to avoid the effect of setting ctx->task to TASK_TOMESTONE, and add a task parameter to perf_event_exit_event to trigger the sync_child_event properly when needed.
This bug can be reproduced by running "perf record -s" and attaching to any program that generates perf events in its child tasks. If we check the result with "perf report -T", the last line of the report will leave an empty table like "# PID TID", which is expected to contain the per-task event counts by design.
--- kernel/events/core.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
kernel/events/core.c +12 -10
@@ -2316,8 +2316,6 @@ static void perf_group_detach(struct perf_event *event)perf_event__header_size (leader); } -static void sync_child_event (struct perf_event *child_event); -static void perf_child_detach (struct perf_event *event) {struct perf_event *parent_event = event->parent;
@@ -2336,7 +2334,6 @@ static void perf_child_detach(struct perf_event *event)lockdep_assert_held(&parent_event->child_mutex); */ -sync_child_event (event);list_del_init (&event->child_list); }
@@ -4587,6 +4584,7 @@ static void perf_event_enable_on_exec(struct perf_event_context *ctx)static void perf_remove_from_owner (struct perf_event *event);static void perf_event_exit_event (struct perf_event *event,struct perf_event_context *ctx, +struct task_struct *task,bool revoke);/*
@@ -4614,7 +4612,7 @@ static void perf_event_remove_on_exec(struct perf_event_context *ctx) modified = true; -perf_event_exit_event (event, ctx, false); +perf_event_exit_event (event, ctx, ctx->task, false); }raw_spin_lock_irqsave (&ctx->lock, flags);
@@ -12431,7 +12429,7 @@ static void __pmu_detach_event(struct pmu *pmu, struct perf_event *event,/* * De-schedule the event and mark it REVOKED. */ -perf_event_exit_event (event, ctx, true); +perf_event_exit_event (event, ctx, ctx->task, true);/* * All _free_event() bits that rely on event->pmu:
@@ -13988,14 +13986,13 @@ void perf_pmu_migrate_context(struct pmu *pmu, int src_cpu, int dst_cpu) }EXPORT_SYMBOL_GPL (perf_pmu_migrate_context); -static void sync_child_event (struct perf_event *child_event) +static void sync_child_event (struct perf_event *child_event, +struct task_struct *task) {struct perf_event *parent_event = child_event->parent;u64 child_val;if (child_event->attr.inherit_stat) { -struct task_struct *task = child_event->ctx->task; -if (task && task !=TASK_TOMBSTONE )perf_event_read_event (child_event, task); }
@@ -14014,7 +14011,9 @@ static void sync_child_event(struct perf_event *child_event)static void perf_event_exit_event (struct perf_event *event, -struct perf_event_context *ctx,bool revoke) +struct perf_event_context *ctx, +struct task_struct *task, +bool revoke) {struct perf_event *parent_event = event->parent;unsigned long detach_flags =DETACH_EXIT ;
@@ -14037,6 +14036,9 @@ perf_event_exit_event(struct perf_event *event,mutex_lock (&parent_event->child_mutex);/* PERF_ATTACH_ITRACE might be set concurrently */ attach_state =READ_ONCE (event->attach_state); + +if (attach_state &PERF_ATTACH_CHILD ) +sync_child_event (event, task); }if (revoke)
@@ -14128,7 +14130,7 @@ static void perf_event_exit_task_context(struct task_struct *task, bool exit)perf_event_task (task, ctx,0 );list_for_each_entry_safe (child_event, next, &ctx->event_list, event_entry) -perf_event_exit_event (child_event, ctx, false); +perf_event_exit_event (child_event, ctx, exit ? task :NULL , false);mutex_unlock (&ctx->mutex);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 494/507 irqchip/mchp-eic: Fix error code in mchp_eic_domain_alloc()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 7dbc0d40d8347bd9de55c904f59ea44bcc8dedb7 ]
If irq_domain_translate_twocell() sets "hwirq" to >= MCHP_EIC_NIRQ (2) then it results in an out of bounds access.
The code checks for invalid values, but doesn't set the error code. Return -EINVAL in that case, instead of returning success.
--- drivers/irqchip/irq-mchp-eic.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/irqchip/irq-mchp-eic.c +1 -1
@@ -166,7 +166,7 @@ static int mchp_eic_domain_alloc(struct irq_domain *domain, unsigned int virq, ret =irq_domain_translate_twocell (domain, fwspec, &hwirq, &type);if (ret || hwirq >=MCHP_EIC_NIRQ ) -return ret; +return ret ?: -EINVAL ;switch (type) {case IRQ_TYPE_EDGE_RISING :
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 495/507 cpu: Make atomic hotplug callbacks run with interrupts disabled on UP
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
[ Upstream commit c94291914b200e10c72cef23c8e4c67eb4fdbcd9 ]
On SMP systems the CPU hotplug callbacks in the "starting" range are invoked while the CPU is brought up and interrupts are still disabled. Callbacks which are added later are invoked via the hotplug-thread on the target CPU and interrupts are explicitly disabled.
In the UP case callbacks which are added later are invoked directly without the thread indirection. This is in principle okay since there is just one CPU but those callbacks are invoked with interrupt disabled code. That's incorrect as those callbacks assume interrupt disabled context.
Disable interrupts before invoking the callbacks on UP if the state is atomic and interrupts are expected to be disabled. The "save" part is required because this is also invoked early in the boot process while interrupts are disabled and must not be enabled prematurely.
--- kernel/cpu.c | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-)
kernel/cpu.c +16 -9
@@ -249,6 +249,14 @@ static int cpuhp_invoke_callback(unsigned int cpu, enum cpuhp_state state,return ret; } +/* +* The former STARTING/DYING states, ran with IRQs disabled and must not fail. +*/ +static bool cpuhp_is_atomic_state (enum cpuhp_state state) +{ +return CPUHP_AP_IDLE_DEAD <= state && state <CPUHP_AP_ONLINE ; +} +#ifdef CONFIG_SMP static bool cpuhp_is_ap_state (enum cpuhp_state state) {
@@ -271,14 +279,6 @@ static inline void complete_ap_thread(struct cpuhp_cpu_state *st, bool bringup)complete (done); } -/* -* The former STARTING/DYING states, ran with IRQs disabled and must not fail. -*/ -static bool cpuhp_is_atomic_state (enum cpuhp_state state) -{ -return CPUHP_AP_IDLE_DEAD <= state && state <CPUHP_AP_ONLINE ; -} -/* Synchronization state management */ enum cpuhp_sync_state {SYNC_STATE_DEAD ,
@@ -2364,7 +2364,14 @@ static int cpuhp_issue_call(int cpu, enum cpuhp_state state, bool bringup, else ret =cpuhp_invoke_callback (cpu, state, bringup, node,NULL );#else - ret =cpuhp_invoke_callback (cpu, state, bringup, node,NULL ); +if (cpuhp_is_atomic_state (state)) { +guard (irqsave)(); + ret =cpuhp_invoke_callback (cpu, state, bringup, node,NULL ); +/* STARTING/DYING must not fail! */ +WARN_ON_ONCE (ret); + }else { + ret =cpuhp_invoke_callback (cpu, state, bringup, node,NULL ); + }#endif BUG_ON (ret && !bringup);return ret;
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 496/507 ocfs2: fix memory leak in ocfs2_merge_rec_left()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dmitry Antipov <[email protected]>
[ Upstream commit 2214ec4bf89d0fd27717322d3983a2f3b469c7f3 ]
In 'ocfs2_merge_rec_left()', do not reset 'left_path' to NULL after move, thus allowing 'ocfs2_free_path()' to free it before return.
--- fs/ocfs2/alloc.c | 1 - 1 file changed, 1 deletion(-)
fs/ocfs2/alloc.c +0 -1
@@ -3654,7 +3654,6 @@ static int ocfs2_merge_rec_left(struct ocfs2_path *right_path,* So we use the new rightmost path. */ ocfs2_mv_path (right_path, left_path); - left_path =NULL ; }else ocfs2_complete_edge_insert (handle, left_path, right_path, subtree_index);
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 497/507 perf/x86/intel: Fix NULL event dereference crash in handle_pmi_common()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Evan Li <[email protected]>
[ Upstream commit 9415f749d34b926b9e4853da1462f4d941f89a0d ]
handle_pmi_common() may observe an active bit set in cpuc->active_mask while the corresponding cpuc->events[] entry has already been cleared, which leads to a NULL pointer dereference.
This can happen when interrupt throttling stops all events in a group while PEBS processing is still in progress. perf_event_overflow() can trigger perf_event_throttle_group(), which stops the group and clears the cpuc->events[] entry, but the active bit may still be set when handle_pmi_common() iterates over the events.
The following recent fix:
7e772a93eb61 ("perf/x86: Fix NULL event access and potential PEBS record loss")
moved the cpuc->events[] clearing from x86_pmu_stop() to x86_pmu_del() and relied on cpuc->active_mask/pebs_enabled checks. However, handle_pmi_common() can still encounter a NULL cpuc->events[] entry despite the active bit being set.
Add an explicit NULL check on the event pointer before using it, to cover this legitimate scenario and avoid the NULL dereference crash.
--- arch/x86/events/intel/core.c | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/events/intel/core.c +3 -0
@@ -3249,6 +3249,9 @@ static int handle_pmi_common(struct pt_regs *regs, u64 status)if (!test_bit (bit, cpuc->active_mask))continue ; +/* Event may have already been cleared: */ +if (!event) +continue ;/* * There may be unprocessed PEBS records in the PEBS buffer,
Signature · 1 line
2.51.0
Greg Kroah-Hartman
maintainerPATCH 498/507 usb: gadget: tegra-xudc: Always reinitialize data toggle when clear halt
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Haotien Hsu <[email protected]>
commit 2585973c7f9ee31d21e5848c996fab2521fd383d upstream.
The driver previously skipped handling ClearFeature(ENDPOINT_HALT) when the endpoint was already not halted. This prevented the controller from resetting the data sequence number and reinitializing the endpoint state.
According to USB 3.2 specification Rev. 1.1, section 9.4.5, ClearFeature(ENDPOINT_HALT) must always reset the data sequence and set the stream state machine to Disabled, regardless of whether the endpoint was halted.
Remove the early return so that ClearFeature(ENDPOINT_HALT) always resets the endpoint sequence state as required by the specification.
--- drivers/usb/gadget/udc/tegra-xudc.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/usb/gadget/udc/tegra-xudc.c +0 -6
@@ -1559,12 +1559,6 @@ static int __tegra_xudc_ep_set_halt(strureturn -ENOTSUPP ; } -if (!!(xudc_readl (xudc,EP_HALT ) &BIT (ep->index)) == halt) { -dev_dbg (xudc->dev,"EP %u already %s\n" , ep->index, - halt ?"halted" :"not halted" ); -return 0 ; - } -if (halt) {ep_halt (xudc, ep->index); }else {
Greg Kroah-Hartman
maintainerPATCH 499/507 usb: typec: ucsi: fix probe failure in gaokun_ucsi_probe()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit 6b120ef99fbcba9e413783561f8cc160719db589 upstream.
The gaokun_ucsi_probe() uses ucsi_create() to allocate a UCSI instance. The ucsi_create() validates whether ops->poll_cci is defined, and if not, it directly returns -EINVAL. However, the gaokun_ucsi_ops structure does not define the poll_cci, causing ucsi_create() always fail with -EINVAL. This issue can be observed in the kernel log with the following error:
ucsi_huawei_gaokun.ucsi huawei_gaokun_ec.ucsi.0: probe with driver ucsi_huawei_gaokun.ucsi failed with error -22
Fix the issue by adding the missing poll_cci callback to gaokun_ucsi_ops.
--- drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c +1 -0
@@ -196,6 +196,7 @@ static void gaokun_ucsi_connector_status(struct ucsi_connector *con)const struct ucsi_operations gaokun_ucsi_ops = { .read_version = gaokun_ucsi_read_version, .read_cci = gaokun_ucsi_read_cci, + .poll_cci = gaokun_ucsi_read_cci, .read_message_in = gaokun_ucsi_read_message_in, .sync_control = ucsi_sync_control_common, .async_control = gaokun_ucsi_async_control,
Signature · 1 line
2.52.0
Greg Kroah-Hartman
maintainerPATCH 500/507 usb: phy: Initialize struct usb_phy list_head
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Diogo Ivo <[email protected]>
commit c69ff68b097b0f53333114f1b2c3dc128f389596 upstream.
As part of the registration of a new 'struct usb_phy' with the USB PHY core via either usb_add_phy(struct usb_phy *x, ...) or usb_add_phy_dev(struct usb_phy *x) these functions call list_add_tail(&x->head, phy_list) in order for the new instance x to be stored in phy_list, a static list kept internally by the core.
After 7d21114dc6a2 ("usb: phy: Introduce one extcon device into usb phy") when executing either of the registration functions above it is possible that usb_add_extcon() fails, leading to either function returning before the call to list_add_tail(), leaving x->head uninitialized.
Then, when a driver tries to undo the failed registration by calling usb_remove_phy(struct usb_phy *x) there will be an unconditional call to list_del(&x->head) acting on an uninitialized variable, and thus a possible NULL pointer dereference.
Fix this by initializing x->head before usb_add_extcon() has a chance to fail. Note that this was not needed before 7d21114dc6a2 since list_add_phy() was executed unconditionally and it guaranteed that x->head was initialized.
--- drivers/usb/phy/phy.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/phy/phy.c +4 -0
@@ -646,6 +646,8 @@ int usb_add_phy(struct usb_phy *x, enumreturn -EINVAL ; } +INIT_LIST_HEAD (&x->head); +usb_charger_init (x); ret =usb_add_extcon (x);if (ret)
@@ -696,6 +698,8 @@ int usb_add_phy_dev(struct usb_phy *x)return -EINVAL ; } +INIT_LIST_HEAD (&x->head); +usb_charger_init (x); ret =usb_add_extcon (x);if (ret)
Greg Kroah-Hartman
maintainerPATCH 501/507 usb: typec: ucsi: fix use-after-free caused by uec->work
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Duoming Zhou <[email protected]>
commit 2b7a0f47aaf2439d517ba0a6b29c66a535302154 upstream.
The delayed work uec->work is scheduled in gaokun_ucsi_probe() but never properly canceled in gaokun_ucsi_remove(). This creates use-after-free scenarios where the ucsi and gaokun_ucsi structure are freed after ucsi_destroy() completes execution, while the gaokun_ucsi_register_worker() might be either currently executing or still pending in the work queue. The already-freed gaokun_ucsi or ucsi structure may then be accessed.
Furthermore, the race window is 3 seconds, which is sufficiently long to make this bug easily reproducible. The following is the trace captured by KASAN:
==================================================================
BUG: KASAN: slab-use-after-free in __run_timers+0x5ec/0x630 Write of size 8 at addr ffff00000ec28cc8 by task swapper/0/0 ... Call trace: show_stack+0x18/0x24 (C) dump_stack_lvl+0x78/0x90 print_report+0x114/0x580 kasan_report+0xa4/0xf0 __asan_report_store8_noabort+0x20/0x2c __run_timers+0x5ec/0x630 run_timer_softirq+0xe8/0x1cc handle_softirqs+0x294/0x720 __do_softirq+0x14/0x20 ____do_softirq+0x10/0x1c call_on_irq_stack+0x30/0x48 do_softirq_own_stack+0x1c/0x28 __irq_exit_rcu+0x27c/0x364 irq_exit_rcu+0x10/0x1c el1_interrupt+0x40/0x60 el1h_64_irq_handler+0x18/0x24 el1h_64_irq+0x6c/0x70 arch_local_irq_enable+0x4/0x8 (P) do_idle+0x334/0x458 cpu_startup_entry+0x60/0x70 rest_init+0x158/0x174 start_kernel+0x2f8/0x394 __primary_switched+0x8c/0x94 Allocated by task 72 on cpu 0 at 27.510341s: kasan_save_stack+0x2c/0x54 kasan_save_track+0x24/0x5c kasan_save_alloc_info+0x40/0x54 __kasan_kmalloc+0xa0/0xb8 __kmalloc_node_track_caller_noprof+0x1c0/0x588 devm_kmalloc+0x7c/0x1c8 gaokun_ucsi_probe+0xa0/0x840 auxiliary_bus_probe+0x94/0xf8 really_probe+0x17c/0x5b8 __driver_probe_device+0x158/0x2c4 driver_probe_device+0x10c/0x264 __device_attach_driver+0x168/0x2d0 bus_for_each_drv+0x100/0x188 __device_attach+0x174/0x368 device_initial_probe+0x14/0x20 bus_probe_device+0x120/0x150 device_add+0xb3c/0x10fc __auxiliary_device_add+0x88/0x130
...
Freed by task 73 on cpu 1 at 28.910627s: kasan_save_stack+0x2c/0x54 kasan_save_track+0x24/0x5c __kasan_save_free_info+0x4c/0x74 __kasan_slab_free+0x60/0x8c kfree+0xd4/0x410 devres_release_all+0x140/0x1f0 device_unbind_cleanup+0x20/0x190 device_release_driver_internal+0x344/0x460 device_release_driver+0x18/0x24 bus_remove_device+0x198/0x274 device_del+0x310/0xa84
...
The buggy address belongs to the object at ffff00000ec28c00 which belongs to the cache kmalloc-512 of size 512 The buggy address is located 200 bytes inside of freed 512-byte region The buggy address belongs to the physical page: page: refcount:0 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x4ec28 head: order:2 mapcount:0 entire_mapcount:0 nr_pages_mapped:0 pincount:0 flags: 0x3fffe0000000040(head|node=0|zone=0|lastcpupid=0x1ffff) page_type: f5(slab) raw: 03fffe0000000040 ffff000008801c80 dead000000000122 0000000000000000 raw: 0000000000000000 0000000080100010 00000000f5000000 0000000000000000
head: 03fffe0000000040 ffff000008801c80 dead000000000122 0000000000000000
head: 0000000000000000 0000000080100010 00000000f5000000 0000000000000000
head: 03fffe0000000002 fffffdffc03b0a01 00000000ffffffff 00000000ffffffff
head: ffffffffffffffff 0000000000000000 00000000ffffffff 0000000000000004
page dumped because: kasan: bad access detected
Memory state around the buggy address:
ffff00000ec28b80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
ffff00000ec28c00: fa fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
>ffff00000ec28c80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
^
ffff00000ec28d00: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
ffff00000ec28d80: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================Add disable_delayed_work_sync() in gaokun_ucsi_remove() to ensure that uec->work is properly canceled and prevented from executing after the ucsi and gaokun_ucsi structure have been deallocated.
--- drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/typec/ucsi/ucsi_huawei_gaokun.c +1 -0
@@ -503,6 +503,7 @@ static void gaokun_ucsi_remove(struct au {struct gaokun_ucsi *uec =auxiliary_get_drvdata (adev); +disable_delayed_work_sync (&uec->work);gaokun_ec_unregister_notify (uec->ec, &uec->nb);ucsi_unregister (uec->ucsi);ucsi_destroy (uec->ucsi);
Greg Kroah-Hartman
maintainerPATCH 502/507 usb: dwc3: dwc3_power_off_all_roothub_ports: Use ioremap_np when required
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Peter <[email protected]>
commit 5ed9cc71432a8adf3c42223c935f714aac29901b upstream.
On Apple Silicon machines we can't use ioremap() / Device-nGnRE to map most regions but must use ioremap_np() / Device-nGnRnE whenever IORESOURCE_MEM_NONPOSTED is set. Make sure this is also done inside dwc3_power_off_all_roothub_ports to prevent SErrors.
--- drivers/usb/dwc3/host.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/usb/dwc3/host.c +4 -1
@@ -37,7 +37,10 @@ static void dwc3_power_off_all_roothub_p/* xhci regs are not mapped yet, do it temporarily here */ if (dwc->xhci_resources[0 ].start) { - xhci_regs =ioremap (dwc->xhci_resources[0 ].start,DWC3_XHCI_REGS_END ); +if (dwc->xhci_resources[0 ].flags &IORESOURCE_MEM_NONPOSTED ) + xhci_regs =ioremap_np (dwc->xhci_resources[0 ].start,DWC3_XHCI_REGS_END ); +else + xhci_regs =ioremap (dwc->xhci_resources[0 ].start,DWC3_XHCI_REGS_END );if (!xhci_regs) {dev_err (dwc->dev,"Failed to ioremap xhci_regs\n" );return ;
Greg Kroah-Hartman
maintainerPATCH 503/507 ALSA: dice: fix buffer overflow in detect_stream_formats()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
commit 324f3e03e8a85931ce0880654e3c3eb38b0f0bba upstream.
The function detect_stream_formats() reads the stream_count value directly from a FireWire device without validating it. This can lead to out-of-bounds writes when a malicious device provides a stream_count value greater than MAX_STREAMS.
Fix by applying the same validation to both TX and RX stream counts in detect_stream_formats().
--- sound/firewire/dice/dice-extension.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/firewire/dice/dice-extension.c +2 -2
@@ -116,7 +116,7 @@ static int detect_stream_formats(structbreak ; base_offset +=EXT_APP_STREAM_ENTRIES ; - stream_count =be32_to_cpu (reg[0 ]); + stream_count = min_t(unsigned int, be32_to_cpu(reg[0]), MAX_STREAMS); err = read_stream_entries(dice, section_addr, base_offset, stream_count, mode, dice->tx_pcm_chs,
@@ -125,7 +125,7 @@ static int detect_stream_formats(structbreak ; base_offset += stream_count *EXT_APP_STREAM_ENTRY_SIZE ; - stream_count =be32_to_cpu (reg[1 ]); + stream_count = min_t(unsigned int, be32_to_cpu(reg[1]), MAX_STREAMS); err = read_stream_entries(dice, section_addr, base_offset, stream_count, mode, dice->rx_pcm_chs,
Greg Kroah-Hartman
maintainerPATCH 504/507 ALSA: hda/realtek: Add match for ASUS Xbox Ally projects
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antheas Kapenekakis <[email protected]>
commit 18a4895370a79a3efb4a53ccd1efffef6c5b634e upstream.
Bind the realtek codec to TAS2781 I2C audio amps on ASUS Xbox Ally projects. While these projects work without a quirk, adding it increases the output volume significantly.
--- sound/hda/codecs/realtek/alc269.c | 2 ++ 1 file changed, 2 insertions(+)
sound/hda/codecs/realtek/alc269.c +2 -0
@@ -6725,6 +6725,8 @@ static const struct hda_quirk alc269_fixSND_PCI_QUIRK (0x1043 ,0x12f0 ,"ASUS X541UV" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1313 ,"Asus K42JZ" ,ALC269VB_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1314 ,"ASUS GA605K" ,ALC285_FIXUP_ASUS_GA605K_HEADSET_MIC ), +SND_PCI_QUIRK (0x1043 ,0x1384 ,"ASUS RC73XA" ,ALC287_FIXUP_TXNW2781_I2C ), +SND_PCI_QUIRK (0x1043 ,0x1394 ,"ASUS RC73YA" ,ALC287_FIXUP_TXNW2781_I2C ),SND_PCI_QUIRK (0x1043 ,0x13b0 ,"ASUS Z550SA" ,ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ),SND_PCI_QUIRK (0x1043 ,0x1427 ,"Asus Zenbook UX31E" ,ALC269VB_FIXUP_ASUS_ZENBOOK ), SND_PCI_QUIRK(0x1043, 0x1433, "ASUS GX650PY/PZ/PV/PU/PYV/PZV/PIV/PVV", ALC285_FIXUP_ASUS_I2C_HEADSET_MIC),
Greg Kroah-Hartman
maintainerPATCH 505/507 ALSA: hda/tas2781: fix speaker id retrieval for multiple probes
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Antheas Kapenekakis <[email protected]>
commit 945865a0ddf3e3950aea32e23e10d815ee9b21bc upstream.
Currently, on ASUS projects, the TAS2781 codec attaches the speaker GPIO to the first tasdevice_priv instance using devm. This causes tas2781_read_acpi to fail on subsequent probes since the GPIO is already managed by the first device. This causes a failure on Xbox Ally X, because it has two amplifiers, and prevents us from quirking both the Xbox Ally and Xbox Ally X in the realtek codec driver.
It is unnecessary to attach the GPIO to a device as it is static. Therefore, instead of attaching it and then reading it when loading the firmware, read its value directly in tas2781_read_acpi and store it in the private data structure. Then, make reading the value non-fatal so that ASUS projects that miss a speaker pin can still work, perhaps using fallback firmware.
--- include/sound/tas2781.h | 2 - sound/hda/codecs/side-codecs/tas2781_hda_i2c.c | 44 ++++++++++++++----------- 2 files changed, 26 insertions(+), 20 deletions(-)
include/sound/tas2781.h +1 -1
@@ -183,7 +183,6 @@ struct tasdevice_priv {struct acoustic_data acou_data;#endif struct tasdevice_fw *fmw; -struct gpio_desc *speaker_id;struct gpio_desc *reset;struct mutex codec_lock;struct regmap *regmap;
@@ -200,6 +199,7 @@ struct tasdevice_priv {unsigned int magic_num;unsigned int chip_id;unsigned int sysclk; +int speaker_id;int irq;int cur_prog;
sound/hda/codecs/side-codecs/tas2781_hda_i2c.c +25 -19
73 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 506/507 ALSA: hda: cs35l41: Fix NULL pointer dereference in cs35l41_hda_read_acpi()
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Denis Arefev <[email protected]>
commit c34b04cc6178f33c08331568c7fd25c5b9a39f66 upstream.
The acpi_get_first_physical_node() function can return NULL, in which case the get_device() function also returns NULL, but this value is then dereferenced without checking,so add a check to prevent a crash.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- sound/hda/codecs/side-codecs/cs35l41_hda.c | 2 ++ 1 file changed, 2 insertions(+)
sound/hda/codecs/side-codecs/cs35l41_hda.c +2 -0
@@ -1917,6 +1917,8 @@ static int cs35l41_hda_read_acpi(struct cs35l41->dacpi = adev; physdev =get_device (acpi_get_first_physical_node (adev)); +if (!physdev) +return -ENODEV ; sub =acpi_get_subsystem_id (ACPI_HANDLE (physdev));if (IS_ERR (sub))
Greg Kroah-Hartman
maintainerPATCH 507/507 ALSA: wavefront: Fix integer overflow in sample size validation
In reply to Greg Kroah-Hartman6.17-stable review patch. If anyone has any objections, please let me know.
------------------
From: Junrui Luo <[email protected]>
commit 0c4a13ba88594fd4a27292853e736c6b4349823d upstream.
The wavefront_send_sample() function has an integer overflow issue when validating sample size. The header->size field is u32 but gets cast to int for comparison with dev->freemem
Fix by using unsigned comparison to avoid integer overflow.
--- sound/isa/wavefront/wavefront_synth.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/isa/wavefront/wavefront_synth.c +2 -2
@@ -950,9 +950,9 @@ wavefront_send_sample (snd_wavefront_t *if (header->size) { dev->freemem =wavefront_freemem (dev); -if (dev->freemem < (int )header->size) { +if (dev->freemem <0 || dev->freemem < header->size) {dev_err (dev->card->dev, -"insufficient memory to load %d byte sample.\n" , +"insufficient memory to load %u byte sample.\n" , header->size);return -ENOMEM ; }
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.17.13 release. There are 507 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
git has 6.17.13-rc2 not rc1 ?
Greg Kroah-Hartman
maintainerQuoted 10 lines · Brett A C Sheffield
Quoted 7 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.17.13 release. There are 507 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
git has 6.17.13-rc2 not rc1 ?
Yes, -rc2 is now out, I forgot to drop a patch for -rc1.
thanks,
greg k-h
Quoted 7 lines · Greg Kroah-Hartman
Quoted 6 lines · Brett A C Sheffield
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 6.17.13 release. There are 507 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 6 lines
Quoted 4 lines
Quoted 2 lines
Responses should be made by Thu, 18 Dec 2025 11:12:22 +0000. Anything received after that time might be too late.
git has 6.17.13-rc2 not rc1 ?
Yes, -rc2 is now out, I forgot to drop a patch for -rc1.
Ah - the rc2 email hadn't hit the list when I last looked. Thanks.
Brett