6.12.43-rc1 review
Subsystems (4)
Greg Kroah-Hartman
maintainerPATCH 139/444 platform/chrome: cros_ec_sensorhub: Retries when a sensor is not ready
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gwendal Grignou <[email protected]>
[ Upstream commit 981d7f91aeda17424b29f033249f4fa7cd2a7556 ]
When the EC/ISH starts, it can take a while for all the sensors to be up and running or declared broken.
If the sensor stack return -EBUSY when checking for sensor information, retry up to 50 times.
It has been observed 100ms wait time is enough to have valid sensors ready. It can take more time in case a sensor is really broken and is not coming up.
--- drivers/platform/chrome/cros_ec_sensorhub.c | 23 +++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/platform/chrome/cros_ec_sensorhub.c +19 -4
@@ -8,6 +8,7 @@#include <linux/init.h> #include <linux/device.h> +#include <linux/delay.h> #include <linux/mod_devicetable.h> #include <linux/module.h> #include <linux/platform_data/cros_ec_commands.h>
@@ -18,6 +19,7 @@#include <linux/types.h> #define DRV_NAME "cros-ec-sensorhub" +#define CROS_EC_CMD_INFO_RETRIES 50static void cros_ec_sensorhub_free_sensor (void *arg) {
@@ -53,7 +55,7 @@ static int cros_ec_sensorhub_register(struct device *dev,int sensor_type[MOTIONSENSE_TYPE_MAX ] = {0 };struct cros_ec_command *msg = sensorhub->msg;struct cros_ec_dev *ec = sensorhub->ec; -int ret, i; +int ret, i, retries;char *name;
@@ -65,12 +67,25 @@ static int cros_ec_sensorhub_register(struct device *dev, sensorhub->params->cmd =MOTIONSENSE_CMD_INFO ; sensorhub->params->info.sensor_num = i; - ret =cros_ec_cmd_xfer_status (ec->ec_dev, msg); + retries =CROS_EC_CMD_INFO_RETRIES ; +do { + ret =cros_ec_cmd_xfer_status (ec->ec_dev, msg); +if (ret == -EBUSY ) { +/* The EC is still busy initializing sensors. */ +usleep_range (5000 ,6000 ); + retries--; + } + }while (ret == -EBUSY && retries); +if (ret <0 ) { -dev_warn (dev,"no info for EC sensor %d : %d/%d\n" , - i, ret, msg->result); +dev_err (dev,"no info for EC sensor %d : %d/%d\n" , + i, ret, msg->result);continue ; } +if (retries <CROS_EC_CMD_INFO_RETRIES ) { +dev_warn (dev,"%d retries needed to bring up sensor %d\n" , +CROS_EC_CMD_INFO_RETRIES - retries, i); + }switch (sensorhub->resp->info.type) {case MOTIONSENSE_TYPE_ACCEL :
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 140/444 ALSA: hda: Handle the jack polling always via a work
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 5f7e54b23e4d253eff3b10b12d6fa92d28d7dddc ]
We used to call directly hda_jackpoll_work() from a couple of places for updating the jack and notify to user-space, but this makes rather the code flow fragile. Namely, because of those direct calls, hda_jackpoll_work() uses snd_hda_power_up_pm() and *_down_pm() calls instead of the standard snd_hda_power_up() and *_down() calls. The latter pair assures the runtime PM resume sync, so it can avoid the race against the PM callbacks gracefully, while the former pair may continue if called concurrently, hence it may race (by design).
In this patch, we change the call pattern of hda_jackpoll_work(); now all callers are replaced with the standard snd_hda_jack_report_sync() and the additional schedule_delayed_work().
Since hda_jackpoll_work() is called only from the associated work, it's always outside the PM code path, and we can safely use snd_hda_power_up() and *_down() there instead. This allows us to remove the racy check of power-state in hda_jackpoll_work(), as well as the tricky cancel_delayed_work() and rescheduling at hda_codec_runtime_suspend().
--- sound/pci/hda/hda_codec.c | 41 +++++++++++++-------------------------- 1 file changed, 14 insertions(+), 27 deletions(-)
sound/pci/hda/hda_codec.c +14 -27
@@ -639,24 +639,16 @@ static void hda_jackpoll_work(struct work_struct *work)struct hda_codec *codec = container_of(work, struct hda_codec, jackpoll_work.work); -/* for non-polling trigger: we need nothing if already powered on */ -if (!codec->jackpoll_interval &&snd_hdac_is_power_on (&codec->core)) +if (!codec->jackpoll_interval)return ;/* the power-up/down sequence triggers the runtime resume */ -snd_hda_power_up_pm (codec); +snd_hda_power_up (codec);/* update jacks manually if polling is required, too */ -if (codec->jackpoll_interval) { -snd_hda_jack_set_dirty_all (codec); -snd_hda_jack_poll_all (codec); - } -snd_hda_power_down_pm (codec); - -if (!codec->jackpoll_interval) -return ; - -schedule_delayed_work (&codec->jackpoll_work, - codec->jackpoll_interval); +snd_hda_jack_set_dirty_all (codec); +snd_hda_jack_poll_all (codec); +schedule_delayed_work (&codec->jackpoll_work, codec->jackpoll_interval); +snd_hda_power_down (codec); }/* release all pincfg lists */
@@ -2926,12 +2918,12 @@ static void hda_call_codec_resume(struct hda_codec *codec)snd_hda_regmap_sync (codec); } -if (codec->jackpoll_interval) -hda_jackpoll_work (&codec->jackpoll_work.work); -else -snd_hda_jack_report_sync (codec); +snd_hda_jack_report_sync (codec); codec->core.dev.power.power_state =PMSG_ON ;snd_hdac_leave_pm (&codec->core); +if (codec->jackpoll_interval) +schedule_delayed_work (&codec->jackpoll_work, + codec->jackpoll_interval); }static int hda_codec_runtime_suspend (struct device *dev)
@@ -2943,8 +2935,6 @@ static int hda_codec_runtime_suspend(struct device *dev)if (!codec->card)return 0 ; -cancel_delayed_work_sync (&codec->jackpoll_work); - state =hda_call_codec_suspend (codec); if (codec->link_down_at_suspend || (codec_has_clkstop(codec) && codec_has_epss(codec) &&
@@ -2952,10 +2942,6 @@ static int hda_codec_runtime_suspend(struct device *dev)snd_hdac_codec_link_down (&codec->core);snd_hda_codec_display_power (codec, false); -if (codec->bus->jackpoll_in_suspend && - (dev->power.power_state.event !=PM_EVENT_SUSPEND )) -schedule_delayed_work (&codec->jackpoll_work, - codec->jackpoll_interval);return 0 ; }
@@ -3118,10 +3104,11 @@ int snd_hda_codec_build_controls(struct hda_codec *codec)if (err <0 )return err; +snd_hda_jack_report_sync (codec);/* call at the last init point */ if (codec->jackpoll_interval) -hda_jackpoll_work (&codec->jackpoll_work.work); -else -snd_hda_jack_report_sync (codec);/* call at the last init point */ +schedule_delayed_work (&codec->jackpoll_work, + codec->jackpoll_interval); +sync_power_up_states (codec);return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 141/444 ALSA: hda: Disable jack polling at shutdown
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Takashi Iwai <[email protected]>
[ Upstream commit 1adcbdf54f76e1004bdf71df4eb1888c26e7ad06 ]
Although the jack polling is canceled at shutdown in snd_hda_codec_shutdown(), it might be still re-triggered when the work is being processed at cancel_delayed_work_sync() call. This may result in the unexpected hardware access that should have been already disabled.
For assuring to stop the jack polling, clear codec->jackpoll_interval at shutdown.
--- sound/pci/hda/hda_codec.c | 1 + 1 file changed, 1 insertion(+)
sound/pci/hda/hda_codec.c +1 -0
@@ -3038,6 +3038,7 @@ void snd_hda_codec_shutdown(struct hda_codec *codec)if (!codec->core.registered)return ; + codec->jackpoll_interval =0 ;/* don't poll any longer */ cancel_delayed_work_sync (&codec->jackpoll_work);list_for_each_entry (cpcm, &codec->pcm_list_head, list)snd_pcm_suspend_all (cpcm->pcm);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 142/444 x86/bugs: Avoid warning when overriding return thunk
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pawan Gupta <[email protected]>
[ Upstream commit 9f85fdb9fc5a1bd308a10a0a7d7e34f2712ba58b ]
The purpose of the warning is to prevent an unexpected change to the return thunk mitigation. However, there are legitimate cases where the return thunk is intentionally set more than once. For example, ITS and SRSO both can set the return thunk after retbleed has set it. In both the cases retbleed is still mitigated.
Replace the warning with an info about the active return thunk.
--- arch/x86/kernel/cpu/bugs.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/x86/kernel/cpu/bugs.c +2 -3
@@ -71,10 +71,9 @@ void (*x86_return_thunk)(void) __ro_after_init = __x86_return_thunk;static void __init set_return_thunk (void *thunk) { -if (x86_return_thunk != __x86_return_thunk) -pr_warn ("x86/bugs: return thunk changed\n" ); - x86_return_thunk = thunk; + +pr_info ("active return thunk: %ps\n" , thunk); }/* Update SPEC_CTRL MSR and its cached copy unconditionally */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 143/444 ASoC: hdac_hdmi: Rate limit logging on connection and disconnection
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
[ Upstream commit c4ca928a6db1593802cd945f075a7e21dd0430c1 ]
We currently log parse failures for ELD data and some disconnection events as errors without rate limiting. These log messages can be triggered very frequently in some situations, especially ELD parsing when there is nothing connected to a HDMI port which will generate:
hdmi-audio-codec hdmi-audio-codec.1.auto: HDMI: Unknown ELD version 0
While there's doubtless work that could be done on reducing the number of connection notification callbacks it's possible these may be legitimately generated by poor quality physical connections so let's use rate limiting to mitigate the log spam for the parse errors and lower the severity for disconnect logging to debug level.
--- sound/soc/codecs/hdac_hdmi.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
sound/soc/codecs/hdac_hdmi.c +6 -4
@@ -1233,7 +1233,8 @@ static int hdac_hdmi_parse_eld(struct hdac_device *hdev, >> DRM_ELD_VER_SHIFT;if (ver !=ELD_VER_CEA_861D && ver !=ELD_VER_PARTIAL ) { -dev_err (&hdev->dev,"HDMI: Unknown ELD version %d\n" , ver); +dev_err_ratelimited (&hdev->dev, +"HDMI: Unknown ELD version %d\n" , ver);return -EINVAL ; }
@@ -1241,7 +1242,8 @@ static int hdac_hdmi_parse_eld(struct hdac_device *hdev, DRM_ELD_MNL_MASK) >> DRM_ELD_MNL_SHIFT;if (mnl >ELD_MAX_MNL ) { -dev_err (&hdev->dev,"HDMI: MNL Invalid %d\n" , mnl); +dev_err_ratelimited (&hdev->dev, +"HDMI: MNL Invalid %d\n" , mnl);return -EINVAL ; }
@@ -1300,8 +1302,8 @@ static void hdac_hdmi_present_sense(struct hdac_hdmi_pin *pin,if (!port->eld.monitor_present || !port->eld.eld_valid) { -dev_err (&hdev->dev,"%s: disconnect for pin:port %d:%d\n" , - __func__, pin->nid, port->id); +dev_dbg (&hdev->dev,"%s: disconnect for pin:port %d:%d\n" , + __func__, pin->nid, port->id);/* * PCMs are not registered during device probe, so don't
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 144/444 ALSA: intel8x0: Fix incorrect codec index usage in mixer for ICH4
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit 87aafc8580acf87fcaf1a7e30ed858d8c8d37d81 ]
code mistakenly used a hardcoded index (codec[1]) instead of iterating, over the codec array using the loop variable i. Use codec[i] instead of codec[1] to match the loop iteration.
--- sound/pci/intel8x0.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/intel8x0.c +1 -1
@@ -2249,7 +2249,7 @@ static int snd_intel8x0_mixer(struct intel8x0 *chip, int ac97_clock, tmp |= chip->ac97_sdin[0 ] <<ICH_DI1L_SHIFT ;for (i =1 ; i <4 ; i++) {if (pcm->r[0 ].codec[i]) { - tmp |= chip->ac97_sdin[pcm->r[0 ].codec[1 ]->num] <<ICH_DI2L_SHIFT ; + tmp |= chip->ac97_sdin[pcm->r[0 ].codec[i]->num] <<ICH_DI2L_SHIFT ;break ; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 145/444 ASoC: SOF: topology: Parse the dapm_widget_tokens in case of DSPless mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Ujfalusi <[email protected]>
[ Upstream commit 6b3cb7f4341cbf62d41ccf6ea906dbe66be8aa3d ]
Parsing the dapm_widget_tokens is also needed for DSPless mode as it is
setting the snd_soc_dapm_widget.no_wname_in_kcontrol_name flag for the
kcontrol creation from DAPM widgets.
Without that flag set, the following warnings might appear because of long
control names:
ALSA: Control name 'eqiir.2.1 Post Mixer Analog Playback IIR Eq bytes' truncated to 'eqiir.2.1 Post Mixer Analog Playback IIR Eq'
ALSA: Control name 'eqfir.2.1 Post Mixer Analog Playback FIR Eq bytes' truncated to 'eqfir.2.1 Post Mixer Analog Playback FIR Eq'
ALSA: Control name 'drc.2.1 Post Mixer Analog Playback DRC bytes' truncated to 'drc.2.1 Post Mixer Analog Playback DRC byte'
ALSA: Control name 'drc.2.1 Post Mixer Analog Playback DRC switch' truncated to 'drc.2.1 Post Mixer Analog Playback DRC swit'
ALSA: Control name 'gain.15.1 Pre Mixer Deepbuffer HDA Analog Volume' truncated to 'gain.15.1 Pre Mixer Deepbuffer HDA Analog V'
--- sound/soc/sof/topology.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
sound/soc/sof/topology.c +13 -2
@@ -2364,14 +2364,25 @@ static int sof_dspless_widget_ready(struct snd_soc_component *scomp, int index,struct snd_soc_dapm_widget *w, struct snd_soc_tplg_dapm_widget *tw) { + struct snd_soc_tplg_private *priv = &tw->priv; +int ret; + +/* for snd_soc_dapm_widget.no_wname_in_kcontrol_name */ + ret =sof_parse_tokens (scomp, w, dapm_widget_tokens, +ARRAY_SIZE (dapm_widget_tokens), + priv->array,le32_to_cpu (priv->size)); +if (ret <0 ) { +dev_err (scomp->dev,"failed to parse dapm widget tokens for %s\n" , + w->name); +return ret; + } +if (WIDGET_IS_DAI (w->id)) {static const struct sof_topology_token dai_tokens[] = { {SOF_TKN_DAI_TYPE ,SND_SOC_TPLG_TUPLE_TYPE_STRING , get_token_dai_type,0 }};struct snd_sof_dev *sdev =snd_soc_component_get_drvdata (scomp); -struct snd_soc_tplg_private *priv = &tw->priv;struct snd_sof_widget *swidget;struct snd_sof_dai *sdai; -int ret; swidget =kzalloc (sizeof (*swidget),GFP_KERNEL );if (!swidget)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 146/444 tty: serial: fix print format specifiers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joseph Tilahun <[email protected]>
[ Upstream commit 33a2515abd45c64911955ff1da179589db54f99f ]
The serial info sometimes produces negative TX/RX counts. E.g.:
3: uart:FSL_LPUART mmio:0x02970000 irq:46 tx:-1595870545 rx:339619 RTS|CTS|DTR|DSR|CD
It appears that the print format specifiers don't match with the types of the respective variables. E.g.: All of the fields in struct uart_icount are u32, but the format specifier used is %d, even though u32 is unsigned and %d is for signed integers. Update drivers/tty/serial/serial_core.c to use the proper format specifiers. Reference
https://docs.kernel.org/core-api/printk-formats.html as the documentation for what format specifiers are the proper ones to use for a given C type.
--- drivers/tty/serial/serial_core.c | 44 ++++++++++++++++---------------- 1 file changed, 22 insertions(+), 22 deletions(-)
drivers/tty/serial/serial_core.c +22 -22
@@ -1353,28 +1353,28 @@ static void uart_sanitize_serial_rs485_delays(struct uart_port *port,if (!port->rs485_supported.delay_rts_before_send) {if (rs485->delay_rts_before_send) {dev_warn_ratelimited (port->dev, -"%s (%d): RTS delay before sending not supported\n" , +"%s (%u): RTS delay before sending not supported\n" , port->name, port->line); } rs485->delay_rts_before_send =0 ; }else if (rs485->delay_rts_before_send >RS485_MAX_RTS_DELAY ) { rs485->delay_rts_before_send =RS485_MAX_RTS_DELAY ;dev_warn_ratelimited (port->dev, -"%s (%d): RTS delay before sending clamped to %u ms\n" , +"%s (%u): RTS delay before sending clamped to %u ms\n" , port->name, port->line, rs485->delay_rts_before_send); }if (!port->rs485_supported.delay_rts_after_send) {if (rs485->delay_rts_after_send) {dev_warn_ratelimited (port->dev, -"%s (%d): RTS delay after sending not supported\n" , +"%s (%u): RTS delay after sending not supported\n" , port->name, port->line); } rs485->delay_rts_after_send =0 ; }else if (rs485->delay_rts_after_send >RS485_MAX_RTS_DELAY ) { rs485->delay_rts_after_send =RS485_MAX_RTS_DELAY ;dev_warn_ratelimited (port->dev, -"%s (%d): RTS delay after sending clamped to %u ms\n" , +"%s (%u): RTS delay after sending clamped to %u ms\n" , port->name, port->line, rs485->delay_rts_after_send); } }
@@ -1404,14 +1404,14 @@ static void uart_sanitize_serial_rs485(struct uart_port *port, struct serial_rs4 rs485->flags &= ~SER_RS485_RTS_AFTER_SEND ;dev_warn_ratelimited (port->dev, -"%s (%d): invalid RTS setting, using RTS_ON_SEND instead\n" , +"%s (%u): invalid RTS setting, using RTS_ON_SEND instead\n" , port->name, port->line); }else { rs485->flags |=SER_RS485_RTS_AFTER_SEND ; rs485->flags &= ~SER_RS485_RTS_ON_SEND ;dev_warn_ratelimited (port->dev, -"%s (%d): invalid RTS setting, using RTS_AFTER_SEND instead\n" , +"%s (%u): invalid RTS setting, using RTS_AFTER_SEND instead\n" , port->name, port->line); } }
@@ -1850,7 +1850,7 @@ static void uart_wait_until_sent(struct tty_struct *tty, int timeout) expire = jiffies + timeout; -pr_debug ("uart_wait_until_sent(%d), jiffies=%lu, expire=%lu...\n" , +pr_debug ("uart_wait_until_sent(%u), jiffies=%lu, expire=%lu...\n" , port->line, jiffies, expire);/*
@@ -2046,7 +2046,7 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)return ; mmio = uport->iotype >=UPIO_MEM ; - seq_printf(m, "%d: uart:%s %s%08llX irq:%d", + seq_printf(m, "%u: uart:%s %s%08llX irq:%u", uport->line, uart_type(uport), mmio ? "mmio:0x" : "port:", mmio ? (unsigned long long)uport->mapbase
@@ -2068,18 +2068,18 @@ static void uart_line_info(struct seq_file *m, struct uart_driver *drv, int i)if (pm_state !=UART_PM_STATE_ON )uart_change_pm (state, pm_state); -seq_printf (m," tx:%d rx:%d" , +seq_printf (m," tx:%u rx:%u" , uport->icount.tx, uport->icount.rx);if (uport->icount.frame) -seq_printf (m," fe:%d" , uport->icount.frame); +seq_printf (m," fe:%u" , uport->icount.frame);if (uport->icount.parity) -seq_printf (m," pe:%d" , uport->icount.parity); +seq_printf (m," pe:%u" , uport->icount.parity);if (uport->icount.brk) -seq_printf (m," brk:%d" , uport->icount.brk); +seq_printf (m," brk:%u" , uport->icount.brk);if (uport->icount.overrun) -seq_printf (m," oe:%d" , uport->icount.overrun); +seq_printf (m," oe:%u" , uport->icount.overrun);if (uport->icount.buf_overrun) -seq_printf (m," bo:%d" , uport->icount.buf_overrun); +seq_printf (m," bo:%u" , uport->icount.buf_overrun);#define INFOBIT (bit, str) \ if (uport->mctrl & (bit)) \
@@ -2571,7 +2571,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)break ; } - pr_info("%s%s%s at %s (irq = %d, base_baud = %d) is a %s\n", + pr_info("%s%s%s at %s (irq = %u, base_baud = %u) is a %s\n", port->dev ? dev_name(port->dev) : "", port->dev ? ": " : "", port->name,
@@ -2579,7 +2579,7 @@ uart_report_port(struct uart_driver *drv, struct uart_port *port)/* The magic multiplier feature is a bit obscure, so report it too. */ if (port->flags &UPF_MAGIC_MULTIPLIER ) - pr_info("%s%s%s extra baud rates supported: %d, %d", + pr_info("%s%s%s extra baud rates supported: %u, %u", port->dev ? dev_name(port->dev) : "", port->dev ? ": " : "", port->name,
@@ -2978,7 +2978,7 @@ static ssize_t close_delay_show(struct device *dev,struct tty_port *port =dev_get_drvdata (dev);uart_get_info (port, &tmp); -return sprintf (buf,"%d\n" , tmp.close_delay); +return sprintf (buf,"%u\n" , tmp.close_delay); } static ssize_t closing_wait_show(struct device *dev,
@@ -2988,7 +2988,7 @@ static ssize_t closing_wait_show(struct device *dev,struct tty_port *port =dev_get_drvdata (dev);uart_get_info (port, &tmp); -return sprintf (buf,"%d\n" , tmp.closing_wait); +return sprintf (buf,"%u\n" , tmp.closing_wait); } static ssize_t custom_divisor_show(struct device *dev,
@@ -3008,7 +3008,7 @@ static ssize_t io_type_show(struct device *dev,struct tty_port *port =dev_get_drvdata (dev);uart_get_info (port, &tmp); -return sprintf (buf,"%d\n" , tmp.io_type); +return sprintf (buf,"%u\n" , tmp.io_type); } static ssize_t iomem_base_show(struct device *dev,
@@ -3028,7 +3028,7 @@ static ssize_t iomem_reg_shift_show(struct device *dev,struct tty_port *port =dev_get_drvdata (dev);uart_get_info (port, &tmp); -return sprintf (buf,"%d\n" , tmp.iomem_reg_shift); +return sprintf (buf,"%u\n" , tmp.iomem_reg_shift); } static ssize_t console_show(struct device *dev,
@@ -3168,7 +3168,7 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *u state->pm_state =UART_PM_STATE_UNDEFINED ;uart_port_set_cons (uport, drv->cons); uport->minor = drv->tty_driver->minor_start + uport->line; - uport->name =kasprintf (GFP_KERNEL ,"%s%d" , drv->dev_name, + uport->name =kasprintf (GFP_KERNEL ,"%s%u" , drv->dev_name, drv->tty_driver->name_base + uport->line);if (!uport->name) { ret = -ENOMEM ;
@@ -3211,7 +3211,7 @@ static int serial_core_add_one_port(struct uart_driver *drv, struct uart_port *udevice_set_wakeup_capable (tty_dev,1 ); }else { uport->flags |=UPF_DEAD ; -dev_err (uport->dev,"Cannot register tty device on line %d\n" , +dev_err (uport->dev,"Cannot register tty device on line %u\n" , uport->line); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 147/444 ASoC: core: Check for rtd == NULL in snd_soc_remove_pcm_runtime()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Ujfalusi <[email protected]>
[ Upstream commit 2d91cb261cac6d885954b8f5da28b5c176c18131 ]
snd_soc_remove_pcm_runtime() might be called with rtd == NULL which will leads to null pointer dereference.
This was reproduced with topology loading and marking a link as ignore due to missing hardware component on the system.
On module removal the soc_tplg_remove_link() would call snd_soc_remove_pcm_runtime() with rtd == NULL since the link was ignored, no runtime was created.
--- sound/soc/soc-core.c | 3 +++ 1 file changed, 3 insertions(+)
sound/soc/soc-core.c +3 -0
@@ -1138,6 +1138,9 @@ static int snd_soc_compensate_channel_connection_map(struct snd_soc_card *card,void snd_soc_remove_pcm_runtime (struct snd_soc_card *card,struct snd_soc_pcm_runtime *rtd) { +if (!rtd) +return ; +lockdep_assert_held (&client_mutex);/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 148/444 usb: typec: intel_pmc_mux: Defer probe if SCU IPC isnt present
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Michalec <[email protected]>
[ Upstream commit df9a825f330e76c72d1985bc9bdc4b8981e3d15f ]
If pmc_usb_probe is called before SCU IPC is registered, pmc_usb_probe will fail.
Return -EPROBE_DEFER when pmc_usb_probe doesn't get SCU IPC device, so the probe function can be called again after SCU IPC is initialized.
--- drivers/usb/typec/mux/intel_pmc_mux.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/typec/mux/intel_pmc_mux.c +1 -1
@@ -754,7 +754,7 @@ static int pmc_usb_probe(struct platform_device *pdev) pmc->ipc =devm_intel_scu_ipc_dev_get (&pdev->dev);if (!pmc->ipc) -return -ENODEV ; +return -EPROBE_DEFER ; pmc->dev = &pdev->dev;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 149/444 usb: core: usb_submit_urb: downgrade type check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit 503bbde34cc3dd2acd231f277ba70c3f9ed22e59 ]
Checking for the endpoint type is no reason for a WARN, as that can cause a reboot. A driver not checking the endpoint type must not cause a reboot, as there is just no point in this. We cannot prevent a device from doing something incorrect as a reaction to a transfer. Hence warning for a mere assumption being wrong is not sensible.
--- drivers/usb/core/urb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/core/urb.c +1 -1
@@ -500,7 +500,7 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)/* Check that the pipe's type matches the endpoint's type */ if (usb_pipe_type_check (urb->dev, urb->pipe)) -dev_WARN (&dev->dev,"BOGUS urb xfer, pipe %x != type %x\n" , +dev_warn_once (&dev->dev,"BOGUS urb xfer, pipe %x != type %x\n" ,usb_pipetype (urb->pipe), pipetypes[xfertype]);/* Check against a simple/standard policy */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 150/444 pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gautham R. Shenoy <[email protected]>
[ Upstream commit cda7ac8ce7de84cf32a3871ba5f318aa3b79381e ]
In the function mperf_start(), mperf_monitor snapshots the time, tsc and finally the aperf,mperf MSRs. However, this order of snapshotting in is reversed in mperf_stop(). As a result, the C0 residency (which is computed as delta_mperf * 100 / delta_tsc) is under-reported on CPUs that is 100% busy.
Fix this by snapshotting time, tsc and then aperf,mperf in mperf_stop() in the same order as in mperf_start().
--- tools/power/cpupower/utils/idle_monitor/mperf_monitor.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/power/cpupower/utils/idle_monitor/mperf_monitor.c +2 -2
@@ -240,9 +240,9 @@ static int mperf_stop(void)int cpu;for (cpu =0 ; cpu < cpu_count; cpu++) { -mperf_measure_stats (cpu); -mperf_get_tsc (&tsc_at_measure_end[cpu]);clock_gettime (CLOCK_REALTIME , &time_end[cpu]); +mperf_get_tsc (&tsc_at_measure_end[cpu]); +mperf_measure_stats (cpu); }return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 151/444 imx8m-blk-ctrl: set ISI panic write hurry level
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Krzysztof Hałasa <[email protected]>
[ Upstream commit c01fba0b4869cada5403fffff416cd1675dba078 ]
Apparently, ISI needs cache settings similar to LCDIF. Otherwise we get artefacts in the image. Tested on i.MX8MP.
--- drivers/pmdomain/imx/imx8m-blk-ctrl.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/pmdomain/imx/imx8m-blk-ctrl.c +10 -0
@@ -665,6 +665,11 @@ static const struct imx8m_blk_ctrl_data imx8mn_disp_blk_ctl_dev_data = {#define LCDIF_1_RD_HURRY GENMASK(15, 13)#define LCDIF_0_RD_HURRY GENMASK(12, 10) +#define ISI_CACHE_CTRL 0x50 +#define ISI_V_WR_HURRY GENMASK(28, 26) +#define ISI_U_WR_HURRY GENMASK(25, 23) +#define ISI_Y_WR_HURRY GENMASK(22, 20) +static int imx8mp_media_power_notifier (struct notifier_block *nb,unsigned long action,void *data) {
@@ -694,6 +699,11 @@ static int imx8mp_media_power_notifier(struct notifier_block *nb,regmap_set_bits (bc->regmap,LCDIF_ARCACHE_CTRL ,FIELD_PREP (LCDIF_1_RD_HURRY ,7 ) |FIELD_PREP (LCDIF_0_RD_HURRY ,7 )); +/* Same here for ISI */ +regmap_set_bits (bc->regmap,ISI_CACHE_CTRL , +FIELD_PREP (ISI_V_WR_HURRY ,7 ) | +FIELD_PREP (ISI_U_WR_HURRY ,7 ) | +FIELD_PREP (ISI_Y_WR_HURRY ,7 )); }return NOTIFY_OK ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 152/444 soc: qcom: mdt_loader: Actually use the e_phoff
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bjorn Andersson <[email protected]>
[ Upstream commit 47e339cac89143709e84a3b71ba8bd9b2fdd2368 ]
Rather than relying/assuming that the tools generating the firmware places the program headers immediately following the ELF header, use e_phoff as intended to find the program headers.
--- drivers/soc/qcom/mdt_loader.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/soc/qcom/mdt_loader.c +5 -5
@@ -83,7 +83,7 @@ ssize_t qcom_mdt_get_size(const struct firmware *fw)int i; ehdr = (struct elf32_hdr *)fw->data; - phdrs = (struct elf32_phdr *)(ehdr +1 ); + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff);for (i =0 ; i < ehdr->e_phnum; i++) { phdr = &phdrs[i];
@@ -135,7 +135,7 @@ void *qcom_mdt_read_metadata(const struct firmware *fw, size_t *data_len,void *data; ehdr = (struct elf32_hdr *)fw->data; - phdrs = (struct elf32_phdr *)(ehdr +1 ); + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff);if (ehdr->e_phnum <2 )return ERR_PTR (-EINVAL );
@@ -215,7 +215,7 @@ int qcom_mdt_pas_init(struct device *dev, const struct firmware *fw,int i; ehdr = (struct elf32_hdr *)fw->data; - phdrs = (struct elf32_phdr *)(ehdr +1 ); + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff);for (i =0 ; i < ehdr->e_phnum; i++) { phdr = &phdrs[i];
@@ -270,7 +270,7 @@ static bool qcom_mdt_bins_are_split(const struct firmware *fw, const char *fw_naint i; ehdr = (struct elf32_hdr *)fw->data; - phdrs = (struct elf32_phdr *)(ehdr +1 ); + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff);for (i =0 ; i < ehdr->e_phnum; i++) {/*
@@ -312,7 +312,7 @@ static int __qcom_mdt_load(struct device *dev, const struct firmware *fw, is_split =qcom_mdt_bins_are_split (fw, fw_name); ehdr = (struct elf32_hdr *)fw->data; - phdrs = (struct elf32_phdr *)(ehdr +1 ); + phdrs = (struct elf32_phdr *)(fw->data + ehdr->e_phoff);for (i =0 ; i < ehdr->e_phnum; i++) { phdr = &phdrs[i];
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 153/444 platform/x86: thinkpad_acpi: Handle KCOV __init vs inline mismatches
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kees Cook <[email protected]>
[ Upstream commit 6418a8504187dc7f5b6f9d0649c03e362cb0664b ]
When KCOV is enabled all functions get instrumented, unless the __no_sanitize_coverage attribute is used. To prepare for __no_sanitize_coverage being applied to __init functions[1], we have to handle differences in how GCC's inline optimizations get resolved. For thinkpad_acpi routines, this means forcing two functions to be inline with __always_inline.
--- drivers/platform/x86/thinkpad_acpi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/platform/x86/thinkpad_acpi.c +2 -2
@@ -561,12 +561,12 @@ static unsigned long __init tpacpi_check_quirks(return 0 ; } -static inline bool __pure __init tpacpi_is_lenovo (void ) +static __always_inline bool __pure __init tpacpi_is_lenovo(void) {return thinkpad_id.vendor ==PCI_VENDOR_ID_LENOVO ; } -static inline bool __pure __init tpacpi_is_ibm (void ) +static __always_inline bool __pure __init tpacpi_is_ibm(void) {return thinkpad_id.vendor ==PCI_VENDOR_ID_IBM ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 154/444 platform/chrome: cros_ec_typec: Defer probe on missing EC parent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tomasz Michalec <[email protected]>
[ Upstream commit 8866f4e557eba43e991f99711515217a95f62d2e ]
If cros_typec_probe is called before EC device is registered, cros_typec_probe will fail. It may happen when cros-ec-typec.ko is loaded before EC bus layer module (e.g. cros_ec_lpcs.ko, cros_ec_spi.ko).
Return -EPROBE_DEFER when cros_typec_probe doesn't get EC device, so the probe function can be called again after EC device is registered.
--- drivers/platform/chrome/cros_ec_typec.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/platform/chrome/cros_ec_typec.c +2 -2
@@ -1226,8 +1226,8 @@ static int cros_typec_probe(struct platform_device *pdev) typec->ec =dev_get_drvdata (pdev->dev.parent);if (!typec->ec) { -dev_err (dev,"couldn't find parent EC device\n" ); -return -ENODEV ; +dev_warn (dev,"couldn't find parent EC device\n" ); +return -EPROBE_DEFER ; }platform_set_drvdata (pdev, typec);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 155/444 ALSA: hda/ca0132: Fix buffer overflow in add_tuning_control
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lucy Thrun <[email protected]>
[ Upstream commit a409c60111e6bb98fcabab2aeaa069daa9434ca0 ]
The 'sprintf' call in 'add_tuning_control' may exceed the 44-byte buffer if either string argument is too long. This triggers a compiler warning.
Replaced 'sprintf' with 'snprintf' to limit string lengths to prevent overflow.
--- sound/pci/hda/patch_ca0132.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/pci/hda/patch_ca0132.c +1 -1
@@ -4410,7 +4410,7 @@ static int add_tuning_control(struct hda_codec *codec, } knew.private_value =HDA_COMPOSE_AMP_VAL (nid,1 ,0 , type); -sprintf (namestr,"%s %s Volume" , name, dirstr[dir]); +snprintf (namestr,sizeof (namestr),"%s %s Volume" , name, dirstr[dir]);return snd_hda_ctl_add (codec, nid,snd_ctl_new1 (&knew, codec)); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 156/444 ALSA: pcm: Rewrite recalculate_boundary() to avoid costly loop
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Christophe Leroy <[email protected]>
[ Upstream commit 92f59aeb13252265c20e7aef1379a8080c57e0a2 ]
At the time being recalculate_boundary() is implemented with a loop which shows up as costly in a perf profile, as depicted by the annotate below:
0.00 : c057e934: 3d 40 7f ff lis r10,32767
0.03 : c057e938: 61 4a ff ff ori r10,r10,65535
0.21 : c057e93c: 7d 49 50 50 subf r10,r9,r10
5.39 : c057e940: 7d 3c 4b 78 mr r28,r9
2.11 : c057e944: 55 29 08 3c slwi r9,r9,1
3.04 : c057e948: 7c 09 50 40 cmplw r9,r10
2.47 : c057e94c: 40 81 ff f4 ble c057e940 <snd_pcm_ioctl+0xee0>Total: 13.2% on that simple loop.
But what the loop does is to multiply the boundary by 2 until it is over the wanted border. This can be avoided by using fls() to get the boundary value order and shift it by the appropriate number of bits at once.
This change provides the following profile:
0.04 : c057f6e8: 3d 20 7f ff lis r9,32767
0.02 : c057f6ec: 61 29 ff ff ori r9,r9,65535
0.34 : c057f6f0: 7d 5a 48 50 subf r10,r26,r9
0.23 : c057f6f4: 7c 1a 50 40 cmplw r26,r10
0.02 : c057f6f8: 41 81 00 20 bgt c057f718 <snd_pcm_ioctl+0xf08>
0.26 : c057f6fc: 7f 47 00 34 cntlzw r7,r26
0.09 : c057f700: 7d 48 00 34 cntlzw r8,r10
0.22 : c057f704: 7d 08 38 50 subf r8,r8,r7
0.04 : c057f708: 7f 5a 40 30 slw r26,r26,r8
0.35 : c057f70c: 7c 0a d0 40 cmplw r10,r26
0.13 : c057f710: 40 80 05 f8 bge c057fd08 <snd_pcm_ioctl+0x14f8>
0.00 : c057f714: 57 5a f8 7e srwi r26,r26,1Total: 1.7% with that loopless alternative.
--- sound/core/pcm_native.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-)
sound/core/pcm_native.c +15 -4
@@ -24,6 +24,7 @@#include <sound/minors.h> #include <linux/uio.h> #include <linux/delay.h> +#include <linux/bitops.h> #include "pcm_local.h"
@@ -3130,13 +3131,23 @@ struct snd_pcm_sync_ptr32 {static snd_pcm_uframes_t recalculate_boundary (struct snd_pcm_runtime *runtime) {snd_pcm_uframes_t boundary; +snd_pcm_uframes_t border; +int order;if (! runtime->buffer_size)return 0 ; - boundary = runtime->buffer_size; -while (boundary *2 <=0x7fffffffUL - runtime->buffer_size) - boundary *=2 ; -return boundary; + + border =0x7fffffffUL - runtime->buffer_size; +if (runtime->buffer_size > border) +return runtime->buffer_size; + + order =__fls (border) -__fls (runtime->buffer_size); + boundary = runtime->buffer_size << order; + +if (boundary <= border) +return boundary; +else +return boundary /2 ; } static int snd_pcm_ioctl_sync_ptr_compat(struct snd_pcm_substream *substream,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 157/444 ALSA: usb-audio: Avoid precedence issues in mixer_quirks macros
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cristian Ciocaltea <[email protected]>
[ Upstream commit fd3ab72e42e9871a9902b945a2bf8bb87b49c718 ]
Fix all macro related issues identified by checkpatch.pl:
CHECK: Macro argument 'x' may be better as '(x)' to avoid precedence issues
--- sound/usb/mixer_quirks.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
sound/usb/mixer_quirks.c +7 -7
@@ -2152,15 +2152,15 @@ static int dell_dock_mixer_init(struct usb_mixer_interface *mixer)#define SND_RME_CLK_FREQMUL_SHIFT 18#define SND_RME_CLK_FREQMUL_MASK 0x7#define SND_RME_CLK_SYSTEM (x) \ - ((x >> SND_RME_CLK_SYSTEM_SHIFT) & SND_RME_CLK_SYSTEM_MASK) + (((x) >> SND_RME_CLK_SYSTEM_SHIFT) & SND_RME_CLK_SYSTEM_MASK)#define SND_RME_CLK_AES (x) \ - ((x >> SND_RME_CLK_AES_SHIFT) & SND_RME_CLK_AES_SPDIF_MASK) + (((x) >> SND_RME_CLK_AES_SHIFT) & SND_RME_CLK_AES_SPDIF_MASK)#define SND_RME_CLK_SPDIF (x) \ - ((x >> SND_RME_CLK_SPDIF_SHIFT) & SND_RME_CLK_AES_SPDIF_MASK) + (((x) >> SND_RME_CLK_SPDIF_SHIFT) & SND_RME_CLK_AES_SPDIF_MASK)#define SND_RME_CLK_SYNC (x) \ - ((x >> SND_RME_CLK_SYNC_SHIFT) & SND_RME_CLK_SYNC_MASK) + (((x) >> SND_RME_CLK_SYNC_SHIFT) & SND_RME_CLK_SYNC_MASK)#define SND_RME_CLK_FREQMUL (x) \ - ((x >> SND_RME_CLK_FREQMUL_SHIFT) & SND_RME_CLK_FREQMUL_MASK) + (((x) >> SND_RME_CLK_FREQMUL_SHIFT) & SND_RME_CLK_FREQMUL_MASK)#define SND_RME_CLK_AES_LOCK 0x1#define SND_RME_CLK_AES_SYNC 0x4#define SND_RME_CLK_SPDIF_LOCK 0x2
@@ -2169,9 +2169,9 @@ static int dell_dock_mixer_init(struct usb_mixer_interface *mixer)#define SND_RME_SPDIF_FORMAT_SHIFT 5#define SND_RME_BINARY_MASK 0x1#define SND_RME_SPDIF_IF (x) \ - ((x >> SND_RME_SPDIF_IF_SHIFT) & SND_RME_BINARY_MASK) + (((x) >> SND_RME_SPDIF_IF_SHIFT) & SND_RME_BINARY_MASK)#define SND_RME_SPDIF_FORMAT (x) \ - ((x >> SND_RME_SPDIF_FORMAT_SHIFT) & SND_RME_BINARY_MASK) + (((x) >> SND_RME_SPDIF_FORMAT_SHIFT) & SND_RME_BINARY_MASK)static const u32 snd_rme_rate_table[] = {32000 ,44100 ,48000 ,50000 ,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 158/444 iio: adc: ad7768-1: Ensure SYNC_IN pulse minimum timing requirement
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonathan Santos <[email protected]>
[ Upstream commit 7e54d932873d91a55d1b89b7389876d78aeeab32 ]
The SYNC_IN pulse width must be at least 1.5 x Tmclk, corresponding to ~2.5 µs at the lowest supported MCLK frequency. Add a 3 µs delay to ensure reliable synchronization timing even for the worst-case scenario.
--- drivers/iio/adc/ad7768-1.c | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-)
drivers/iio/adc/ad7768-1.c +19 -4
@@ -203,6 +203,24 @@ static int ad7768_spi_reg_write(struct ad7768_state *st,return spi_write (st->spi, st->data.d8,2 ); } +static int ad7768_send_sync_pulse (struct ad7768_state *st) +{ +/* +* The datasheet specifies a minimum SYNC_IN pulse width of 1.5 × Tmclk, +* where Tmclk is the MCLK period. The supported MCLK frequencies range +* from 0.6 MHz to 17 MHz, which corresponds to a minimum SYNC_IN pulse +* width of approximately 2.5 µs in the worst-case scenario (0.6 MHz). +* +* Add a delay to ensure the pulse width is always sufficient to +* trigger synchronization. +*/ +gpiod_set_value_cansleep (st->gpio_sync_in,1 ); +fsleep (3 ); +gpiod_set_value_cansleep (st->gpio_sync_in,0 ); + +return 0 ; +} +static int ad7768_set_mode (struct ad7768_state *st,enum ad7768_conv_mode mode) {
@@ -288,10 +306,7 @@ static int ad7768_set_dig_fil(struct ad7768_state *st,return ret;/* A sync-in pulse is required every time the filter dec rate changes */ -gpiod_set_value (st->gpio_sync_in,1 ); -gpiod_set_value (st->gpio_sync_in,0 ); - -return 0 ; +return ad7768_send_sync_pulse (st); } static int ad7768_set_freq(struct ad7768_state *st,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 159/444 ASoC: codecs: rt5640: Retry DEVICE_ID verification
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xinxin Wan <[email protected]>
[ Upstream commit 19f971057b2d7b99c80530ec1052b45de236a8da ]
To be more resilient to codec-detection failures when the hardware powers on slowly, add retry mechanism to the device verification check. Similar pattern is found throughout a number of Realtek codecs. Our tests show that 60ms delay is sufficient to address readiness issues on rt5640 chip.
--- sound/soc/codecs/rt5640.c | 5 +++++ 1 file changed, 5 insertions(+)
sound/soc/codecs/rt5640.c +5 -0
@@ -3013,6 +3013,11 @@ static int rt5640_i2c_probe(struct i2c_client *i2c) }regmap_read (rt5640->regmap,RT5640_VENDOR_ID2 , &val); +if (val !=RT5640_DEVICE_ID ) { +usleep_range (60000 ,100000 ); +regmap_read (rt5640->regmap,RT5640_VENDOR_ID2 , &val); + } +if (val !=RT5640_DEVICE_ID ) {dev_err (&i2c->dev,"Device with ID register %#x is not rt5640/39\n" , val);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 160/444 ASoC: qcom: use drvdata instead of component to keep id
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Srinivas Kandagatla <[email protected]>
[ Upstream commit 8167f4f42572818fa8153be2b03e4c2120846603 ]
Qcom lpass is using component->id to keep DAI ID (A).
(S) static int lpass_platform_pcmops_open(
sruct snd_soc_component *component,
struct snd_pcm_substream *substream)
{ ^^^^^^^^^(B0)
...
(B1) struct snd_soc_pcm_runtime *soc_runtime = snd_soc_substream_to_rtd(substream);
(B2) struct snd_soc_dai *cpu_dai = snd_soc_rtd_to_cpu(soc_runtime, 0);
...(B3) unsigned int dai_id = cpu_dai->driver->id;
(A) component->id = dai_id; ... }
This driver can get dai_id from substream (B0 - B3).
In this driver, below functions get dai_id from component->id (A).
(X) lpass_platform_pcmops_suspend()
(Y) lpass_platform_pcmops_resume()
(Z) lpass_platform_copy()
Here, (Z) can get it from substream (B0 - B3), don't need to use component->id (A). On suspend/resume (X)(Y), dai_id can only be obtained from component->id (A), because there is no substream (B0) in function parameter.
But, component->id (A) itself should not be used for such purpose. It is intilialized at snd_soc_component_initialize(), and parsed its ID (= component->id) from device name (a).
int snd_soc_component_initialize(...)
{
...
if (!component->name) {
(a) component->name = fmt_single_name(dev, &component->id);
... ^^^^^^^^^^^^^
}
...
}Unfortunately, current code is broken to start with.
There are many regmaps that the driver cares about, however its only managing one (either dp or i2s) in component suspend/resume path.
I2S regmap is mandatory however other regmaps are setup based on flags like "hdmi_port_enable" and "codec_dma_enable".
Correct thing for suspend/resume path to handle is by checking these flags, instead of using component->id.
--- sound/soc/qcom/lpass-platform.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
sound/soc/qcom/lpass-platform.c +17 -10
@@ -202,7 +202,6 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,struct regmap *map;unsigned int dai_id = cpu_dai->driver->id; - component->id = dai_id; data =kzalloc (sizeof (*data),GFP_KERNEL );if (!data)return -ENOMEM ;
@@ -1190,13 +1189,14 @@ static int lpass_platform_pcmops_suspend(struct snd_soc_component *component) {struct lpass_data *drvdata =snd_soc_component_get_drvdata (component);struct regmap *map; -unsigned int dai_id = component->id; -if (dai_id ==LPASS_DP_RX ) +if (drvdata->hdmi_port_enable) { map = drvdata->hdmiif_map; -else - map = drvdata->lpaif_map; +regcache_cache_only (map, true); +regcache_mark_dirty (map); + } + map = drvdata->lpaif_map;regcache_cache_only (map, true);regcache_mark_dirty (map);
@@ -1207,14 +1207,19 @@ static int lpass_platform_pcmops_resume(struct snd_soc_component *component) {struct lpass_data *drvdata =snd_soc_component_get_drvdata (component);struct regmap *map; -unsigned int dai_id = component->id; +int ret; -if (dai_id ==LPASS_DP_RX ) +if (drvdata->hdmi_port_enable) { map = drvdata->hdmiif_map; -else - map = drvdata->lpaif_map; +regcache_cache_only (map, false); + ret =regcache_sync (map); +if (ret) +return ret; + } + map = drvdata->lpaif_map;regcache_cache_only (map, false); +return regcache_sync (map); }
@@ -1224,7 +1229,9 @@ static int lpass_platform_copy(struct snd_soc_component *component, unsigned long bytes) {struct snd_pcm_runtime *rt = substream->runtime; -unsigned int dai_id = component->id; +struct snd_soc_pcm_runtime *soc_runtime =snd_soc_substream_to_rtd (substream); +struct snd_soc_dai *cpu_dai =snd_soc_rtd_to_cpu (soc_runtime,0 ); +unsigned int dai_id = cpu_dai->driver->id;int ret =0 ; void __iomem *dma_buf = (void __iomem *) (rt->dma_area + pos +
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 161/444 netfilter: nft_set_pipapo: prefer kvmalloc for scratch maps
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Westphal <[email protected]>
[ Upstream commit 897eefee2eb73ec6c119a0ca357d7b4a3e92c5ef ]
The scratchmap size depends on the number of elements in the set. For huge sets, each scratch map can easily require very large allocations, e.g. for 100k entries each scratch map will require close to 64kbyte of memory.
--- net/netfilter/nft_set_pipapo.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
net/netfilter/nft_set_pipapo.c +4 -5
@@ -1219,7 +1219,7 @@ static void pipapo_free_scratch(const struct nft_pipapo_match *m, unsigned int c mem = s; mem -= s->align_off; -kfree (mem); +kvfree (mem); }/**
@@ -1240,10 +1240,9 @@ static int pipapo_realloc_scratch(struct nft_pipapo_match *clone,void *scratch_aligned;u32 align_off;#endif - scratch =kzalloc_node (struct_size (scratch, map, - bsize_max *2 ) + -NFT_PIPAPO_ALIGN_HEADROOM , -GFP_KERNEL_ACCOUNT ,cpu_to_node (i)); + scratch =kvzalloc_node (struct_size (scratch, map, bsize_max *2 ) + +NFT_PIPAPO_ALIGN_HEADROOM , +GFP_KERNEL_ACCOUNT ,cpu_to_node (i));if (!scratch) {/* On failure, there's no need to undo previous * allocations: this means that some scratch maps have
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 162/444 selftests: netfilter: Enable CONFIG_INET_SCTP_DIAG
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
[ Upstream commit ba71a6e58b38aa6f86865d4e18579cb014903692 ]
The config snippet specifies CONFIG_SCTP_DIAG. This was never an option.
Replace CONFIG_SCTP_DIAG with the intended CONFIG_INET_SCTP_DIAG.
--- tools/testing/selftests/net/netfilter/config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/net/netfilter/config +1 -1
@@ -91,4 +91,4 @@ CONFIG_XFRM_STATISTICS=y CONFIG_NET_PKTGEN=m CONFIG_TUN=m CONFIG_INET_DIAG=m -CONFIG_SCTP_DIAG=m +CONFIG_INET_SCTP_DIAG=m
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 163/444 powerpc/thp: tracing: Hide hugepage events under CONFIG_PPC_BOOK3S_64
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
[ Upstream commit 43cf0e05089afe23dac74fa6e1e109d49f2903c4 ]
The events hugepage_set_pmd, hugepage_set_pud, hugepage_update_pmd and hugepage_update_pud are only called when CONFIG_PPC_BOOK3S_64 is defined. As each event can take up to 5K regardless if they are used or not, it's best not to define them when they are not used. Add #ifdef around these events when they are not used.
--- include/trace/events/thp.h | 2 ++ 1 file changed, 2 insertions(+)
include/trace/events/thp.h +2 -0
@@ -8,6 +8,7 @@#include <linux/types.h> #include <linux/tracepoint.h> +#ifdef CONFIG_PPC_BOOK3S_64 DECLARE_EVENT_CLASS(hugepage_set, TP_PROTO(unsigned long addr, unsigned long pte),
@@ -66,6 +67,7 @@ DEFINE_EVENT(hugepage_update, hugepage_update_pud, TP_PROTO(unsigned long addr, unsigned long pud, unsigned long clr, unsigned long set), TP_ARGS(addr, pud, clr, set) ); +#endif /* CONFIG_PPC_BOOK3S_64 */ DECLARE_EVENT_CLASS(migration_pmd,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 164/444 bootconfig: Fix unaligned access when building footer
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
[ Upstream commit 6ed5e20466c79e3b3350bae39f678f73cf564b4e ]
Currently we add padding between the bootconfig text and footer to ensure that the footer is aligned within the initramfs image. However, because only the bootconfig data is held in memory, not the full initramfs image, the footer may not be naturally aligned in memory.
This can result in an alignment fault (SIGBUS) when writing the footer on some architectures, such as sparc.
Build the footer in a struct on the stack before adding it to the buffer.
--- tools/bootconfig/main.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)
tools/bootconfig/main.c +13 -11
@@ -11,6 +11,7 @@#include <string.h> #include <errno.h> #include <endian.h> +#include <assert.h> #include <linux/bootconfig.h>
@@ -359,7 +360,12 @@ static int delete_xbc(const char *path)static int apply_xbc (const char *path,const char *xbc_path) { -char *buf, *data, *p; +struct { +uint32_t size; +uint32_t csum; +char magic[BOOTCONFIG_MAGIC_LEN ]; + } footer; +char *buf, *data;size_t total_size;struct stat stat;const char *msg;
@@ -430,17 +436,13 @@ static int apply_xbc(const char *path, const char *xbc_path) size += pad;/* Add a footer */ - p = data + size; - *(uint32_t *)p =htole32 (size); - p +=sizeof (uint32_t ); + footer.size =htole32 (size); + footer.csum =htole32 (csum); +memcpy (footer.magic,BOOTCONFIG_MAGIC ,BOOTCONFIG_MAGIC_LEN ); +static_assert (sizeof (footer) ==BOOTCONFIG_FOOTER_SIZE ); +memcpy (data + size, &footer,BOOTCONFIG_FOOTER_SIZE ); - *(uint32_t *)p =htole32 (csum); - p +=sizeof (uint32_t ); - -memcpy (p,BOOTCONFIG_MAGIC ,BOOTCONFIG_MAGIC_LEN ); - p +=BOOTCONFIG_MAGIC_LEN ; - - total_size = p - data; + total_size = size +BOOTCONFIG_FOOTER_SIZE ; ret =write (fd, data, total_size);if (ret < total_size) {
Signature · 1 line
2.39.5
Re: [PATCH 6.12 164/444] bootconfig: Fix unaligned access when building footer
Quoted 7 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ben Hutchings <[email protected]>
[ Upstream commit
6ed5e20466c79e3b3350bae39f678f73cf564b4e]
Please drop this from all stable queues.
This uses the BOOTCONFIG_FOOTER_SIZE macro that was introduced by commit 26dda5769509 "tools/bootconfig: Cleanup bootconfig footer size calculations". But you shouldn't add that as a dependency, because it will cause a regression for other configurations until
<https://lore.kernel.org/linux-trace-kernel/[email protected]/T/>
is applied.
If you prefer, I can provide a backport of this commit that doesn't use BOOTCONFIG_FOOTER_SIZE macro.
Ben.
Quoted 72 lines
Currently we add padding between the bootconfig text and footer to ensure that the footer is aligned within the initramfs image. However, because only the bootconfig data is held in memory, not the full initramfs image, the footer may not be naturally aligned in memory.
This can result in an alignment fault (SIGBUS) when writing the footer on some architectures, such as sparc.
Build the footer in a struct on the stack before adding it to the buffer.
Signed-off-by Ben Hutchings <[email protected]>Signed-off-by Masami Hiramatsu (Google) <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- tools/bootconfig/main.c | 24 +++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-)tools/bootconfig/main.c +13
-11@@ -11,6 +11,7 @@#include <string.h> #include <errno.h> #include <endian.h> +#include <assert.h> #include <linux/bootconfig.h> @@ -359,7 +360,12 @@ static int delete_xbc(const char *path)static int apply_xbc (const char *path,const char *xbc_path) { -char *buf, *data, *p; +struct { +uint32_t size; +uint32_t csum; +char magic[BOOTCONFIG_MAGIC_LEN ]; + } footer; +char *buf, *data;size_t total_size;struct stat stat;const char *msg;@@ -430,17 +436,13 @@ static int apply_xbc(const char *path, const char *xbc_path) size += pad;/* Add a footer */ - p = data + size; - *(uint32_t *)p =htole32 (size); - p +=sizeof (uint32_t ); + footer.size =htole32 (size); + footer.csum =htole32 (csum); +memcpy (footer.magic,BOOTCONFIG_MAGIC ,BOOTCONFIG_MAGIC_LEN ); +static_assert (sizeof (footer) ==BOOTCONFIG_FOOTER_SIZE ); +memcpy (data + size, &footer,BOOTCONFIG_FOOTER_SIZE ); - *(uint32_t *)p =htole32 (csum); - p +=sizeof (uint32_t ); - -memcpy (p,BOOTCONFIG_MAGIC ,BOOTCONFIG_MAGIC_LEN ); - p +=BOOTCONFIG_MAGIC_LEN ; - - total_size = p - data; + total_size = size +BOOTCONFIG_FOOTER_SIZE ; ret =write (fd, data, total_size);if (ret < total_size) {
Signature · 2 lines
Ben Hutchings - Debian developer, member of kernel, installer and LTS teams
Greg Kroah-Hartman
maintainerPATCH 165/444 Bluetooth: btusb: Add new VID/PID 0489/e14e for MT7925
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: En-Wei Wu <[email protected]>
[ Upstream commit 942873c8137fe0015ab37f62f159d88079859c5e ]
Add VID 0489 & PID e14e for MediaTek MT7925 USB Bluetooth chip.
The information in /sys/kernel/debug/usb/devices about the Bluetooth device is listed as the below.
T: Bus=01 Lev=01 Prnt=01 Port=03 Cnt=03 Dev#= 4 Spd=480 MxCh= 0 D: Ver= 2.10 Cls=ef(misc ) Sub=02 Prot=01 MxPS=64 #Cfgs= 1 P: Vendor=0489 ProdID=e14e Rev= 1.00 S: Manufacturer=MediaTek Inc. S: Product=Wireless_Device S: SerialNumber=000000000 C:* #Ifs= 3 Cfg#= 1 Atr=e0 MxPwr=100mA A: FirstIf#= 0 IfCount= 3 Cls=e0(wlcon) Sub=01 Prot=01 I:* If#= 0 Alt= 0 #EPs= 3 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=81(I) Atr=03(Int.) MxPS= 16 Ivl=125us E: Ad=82(I) Atr=02(Bulk) MxPS= 512 Ivl=0ms E: Ad=02(O) Atr=02(Bulk) MxPS= 512 Ivl=0ms I:* If#= 1 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 0 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 0 Ivl=1ms I: If#= 1 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 9 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 9 Ivl=1ms I: If#= 1 Alt= 2 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 17 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 17 Ivl=1ms I: If#= 1 Alt= 3 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 25 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 25 Ivl=1ms I: If#= 1 Alt= 4 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 33 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 33 Ivl=1ms I: If#= 1 Alt= 5 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 49 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 49 Ivl=1ms I: If#= 1 Alt= 6 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=83(I) Atr=01(Isoc) MxPS= 63 Ivl=1ms E: Ad=03(O) Atr=01(Isoc) MxPS= 63 Ivl=1ms I: If#= 2 Alt= 0 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 64 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 64 Ivl=125us I:* If#= 2 Alt= 1 #EPs= 2 Cls=e0(wlcon) Sub=01 Prot=01 Driver=btusb E: Ad=8a(I) Atr=03(Int.) MxPS= 512 Ivl=125us E: Ad=0a(O) Atr=03(Int.) MxPS= 512 Ivl=125us
--- drivers/bluetooth/btusb.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/bluetooth/btusb.c +2 -0
@@ -702,6 +702,8 @@ static const struct usb_device_id quirks_table[] = { BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0489, 0xe139), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, + { USB_DEVICE(0x0489, 0xe14e), .driver_info = BTUSB_MEDIATEK | + BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0489, 0xe14f), .driver_info = BTUSB_MEDIATEK | BTUSB_WIDEBAND_SPEECH }, { USB_DEVICE(0x0489, 0xe150), .driver_info = BTUSB_MEDIATEK |
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 166/444 Bluetooth: hci_sock: Reset cookie to zero in hci_sock_free_cookie()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zijun Hu <[email protected]>
[ Upstream commit 4d7936e8a5b1fa803f4a631d2da4a80fa4f0f37f ]
Reset cookie value to 0 instead of 0xffffffff in hci_sock_free_cookie() since:
0 : means cookie has not been assigned yet0xffffffff: means cookie assignment failure
Also fix generating cookie failure with usage shown below:
hci_sock_gen_cookie(sk) // generate cookie hci_sock_free_cookie(sk) // free cookie hci_sock_gen_cookie(sk) // Can't generate cookie any more
--- net/bluetooth/hci_sock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bluetooth/hci_sock.c +1 -1
@@ -118,7 +118,7 @@ static void hci_sock_free_cookie(struct sock *sk)int id =hci_pi (sk)->cookie;if (id) { -hci_pi (sk)->cookie =0xffffffff ; +hci_pi (sk)->cookie =0 ;ida_free (&sock_cookie_ida, id); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 167/444 xen/netfront: Fix TX response spurious interrupts
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anthoine Bourgeois <[email protected]>
[ Upstream commit 114a2de6fa86d99ed9546cc9113a3cad58beef79 ]
We found at Vates that there are lot of spurious interrupts when benchmarking the xen-net PV driver frontend. This issue appeared with a patch that addresses security issue XSA-391 (b27d47950e48 "xen/netfront:
harden netfront against event channel storms"). On an iperf benchmark, spurious interrupts can represent up to 50% of the interrupts.
Spurious interrupts are interrupts that are rised for nothing, there is no work to do. This appends because the function that handles the interrupts ("xennet_tx_buf_gc") is also called at the end of the request path to garbage collect the responses received during the transmission load.
The request path is doing the work that the interrupt handler should have done otherwise. This is particurary true when there is more than one vcpu and get worse linearly with the number of vcpu/queue.
Moreover, this problem is amplifyed by the penalty imposed by a spurious interrupt. When an interrupt is found spurious the interrupt chip will delay the EOI to slowdown the backend. This delay will allow more responses to be handled by the request path and then there will be more chance the next interrupt will not find any work to do, creating a new spurious interrupt.
This causes performance issue. The solution here is to remove the calls from the request path and let the interrupt handler do the processing of the responses. This approch removes most of the spurious interrupts (<0.05%) and also has the benefit of freeing up cycles in the request path, allowing it to process more work, which improves performance compared to masking the spurious interrupt one way or another.
This optimization changes a part of the code that is present since the net frontend driver was upstreamed. There is no similar pattern in the other xen PV drivers. Since the first commit of xen-netfront is a blob that doesn't explain all the design choices I can only guess why this specific mecanism was here. This could have been introduce to compensate a slow backend at the time (maybe the backend was fixed or optimize later) or a small queue. In 18 years, both frontend and backend gain lot of features and optimizations that could have obsolete the feature of reaping completions from the TX path.
Some vif throughput performance figures from a 8 vCPUs, 4GB of RAM HVM guest(s):
Without this patch on the :
vm -> dom0: 4.5Gb/s
vm -> vm: 7.0Gb/s
Without XSA-391 patch (revert of b27d47950e48):
vm -> dom0: 8.3Gb/s
vm -> vm: 8.7Gb/s
With XSA-391 and this patch:
vm -> dom0: 11.5Gb/s
vm -> vm: 12.6Gb/s
v2:
- add revewed and tested by tags
- resend with the maintainers in the recipients list
v3:
- remove Fixes tag but keep the commit ref in the explanation
- add a paragraph on why this code was here
Message-ID: <[email protected]>
--- drivers/net/xen-netfront.c | 5 ----- 1 file changed, 5 deletions(-)
drivers/net/xen-netfront.c +0 -5
@@ -637,8 +637,6 @@ static int xennet_xdp_xmit_one(struct net_device *dev, tx_stats->packets++;u64_stats_update_end (&tx_stats->syncp); -xennet_tx_buf_gc (queue); -return 0 ; }
@@ -848,9 +846,6 @@ static netdev_tx_t xennet_start_xmit(struct sk_buff *skb, struct net_device *dev tx_stats->packets++;u64_stats_update_end (&tx_stats->syncp); -/* Note: It is not safe to access skb after xennet_tx_buf_gc()! */ -xennet_tx_buf_gc (queue); -if (!netfront_tx_slot_available (queue))netif_tx_stop_queue (netdev_get_tx_queue (dev, queue->id));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 168/444 wifi: iwlwifi: mvm: avoid outdated reorder buffer head_sn
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avraham Stern <[email protected]>
[ Upstream commit 422850b29e05e67c9145895bfe559940caa0caa8 ]
If no frames are received on a queue for a while, the reorder buffer head_sn may be an old one. When the next frame that is received on that queue and buffered is a subframe of an AMSDU but not the last subframe, it will not update the buffer's head_sn. When the frame release notification arrives, it will not release the buffered frame because it will look like the notification's NSSN is lower than the buffer's head_sn (because of a wraparound).
Fix it by updating the head_sn when the first frame is buffered.
--- drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/intel/iwlwifi/mvm/rxmq.c +5 -0
@@ -854,10 +854,15 @@ static bool iwl_mvm_reorder(struct iwl_mvm *mvm,* already ahead and it will be dropped. * If the last sub-frame is not on this queue - we will get frame * release notification with up to date NSSN. +* If this is the first frame that is stored in the buffer, the head_sn +* may be outdated. Update it based on the last NSSN to make sure it +* will be released when the frame release notification arrives. */ if (!amsdu || last_subframe)iwl_mvm_release_frames (mvm, sta, napi, baid_data, buffer, nssn); +else if (buffer->num_stored ==1 ) + buffer->head_sn = nssn;spin_unlock_bh (&buffer->lock);return true;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 169/444 net: usb: cdc-ncm: check for filtering capability
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oliver Neukum <[email protected]>
[ Upstream commit 61c3e8940f2d8b5bfeaeec4bedc2f3e7d873abb3 ]
If the decice does not support filtering, filtering must not be used and all packets delivered for the upper layers to sort.
--- drivers/net/usb/cdc_ncm.c | 20 ++++++++++++++++---- include/linux/usb/cdc_ncm.h | 1 + 2 files changed, 17 insertions(+), 4 deletions(-)
drivers/net/usb/cdc_ncm.c +16 -4
@@ -893,6 +893,10 @@ int cdc_ncm_bind_common(struct usbnet *dev, struct usb_interface *intf, u8 data_ } } +if (ctx->func_desc) + ctx->filtering_supported = !!(ctx->func_desc->bmNetworkCapabilities + &USB_CDC_NCM_NCAP_ETH_FILTER ); + iface_no = ctx->data->cur_altsetting->desc.bInterfaceNumber;/* Device-specific flags */
@@ -1899,6 +1903,14 @@ static void cdc_ncm_status(struct usbnet *dev, struct urb *urb) } } +static void cdc_ncm_update_filter (struct usbnet *dev) +{ +struct cdc_ncm_ctx *ctx = (struct cdc_ncm_ctx *)dev->data[0 ]; + +if (ctx->filtering_supported) +usbnet_cdc_update_filter (dev); +} +static const struct driver_info cdc_ncm_info = { .description ="CDC NCM (NO ZLP)" , .flags =FLAG_POINTTOPOINT |FLAG_NO_SETINT |FLAG_MULTI_PACKET
@@ -1909,7 +1921,7 @@ static const struct driver_info cdc_ncm_info = { .status = cdc_ncm_status, .rx_fixup = cdc_ncm_rx_fixup, .tx_fixup = cdc_ncm_tx_fixup, - .set_rx_mode = usbnet_cdc_update_filter, + .set_rx_mode = cdc_ncm_update_filter, };/* Same as cdc_ncm_info, but with FLAG_SEND_ZLP */
@@ -1923,7 +1935,7 @@ static const struct driver_info cdc_ncm_zlp_info = { .status = cdc_ncm_status, .rx_fixup = cdc_ncm_rx_fixup, .tx_fixup = cdc_ncm_tx_fixup, - .set_rx_mode = usbnet_cdc_update_filter, + .set_rx_mode = cdc_ncm_update_filter, };/* Same as cdc_ncm_info, but with FLAG_SEND_ZLP */
@@ -1965,7 +1977,7 @@ static const struct driver_info wwan_info = { .status = cdc_ncm_status, .rx_fixup = cdc_ncm_rx_fixup, .tx_fixup = cdc_ncm_tx_fixup, - .set_rx_mode = usbnet_cdc_update_filter, + .set_rx_mode = cdc_ncm_update_filter, };/* Same as wwan_info, but with FLAG_NOARP */
@@ -1979,7 +1991,7 @@ static const struct driver_info wwan_noarp_info = { .status = cdc_ncm_status, .rx_fixup = cdc_ncm_rx_fixup, .tx_fixup = cdc_ncm_tx_fixup, - .set_rx_mode = usbnet_cdc_update_filter, + .set_rx_mode = cdc_ncm_update_filter, };static const struct usb_device_id cdc_devs[] = {
include/linux/usb/cdc_ncm.h +1 -0
@@ -119,6 +119,7 @@ struct cdc_ncm_ctx {u32 timer_interval;u32 max_ndp_size;u8 is_ndp16; +u8 filtering_supported;union {struct usb_cdc_ncm_ndp16 *delayed_ndp16;struct usb_cdc_ncm_ndp32 *delayed_ndp32;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 170/444 wifi: ath12k: Correct tid cleanup when tid setup fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarika Sharma <[email protected]>
[ Upstream commit 4a2bf707270f897ab8077baee8ed5842a5321686 ]
Currently, if any error occurs during ath12k_dp_rx_peer_tid_setup(), the tid value is already incremented, even though the corresponding TID is not actually allocated. Proceed to ath12k_dp_rx_peer_tid_delete() starting from unallocated tid, which might leads to freeing unallocated TID and cause potential crash or out-of-bounds access.
Hence, fix by correctly decrementing tid before cleanup to match only the successfully allocated TIDs.
Also, remove tid-- from failure case of ath12k_dp_rx_peer_frag_setup(), as decrementing the tid before cleanup in loop will take care of this.
Compile tested only.
--- drivers/net/wireless/ath/ath12k/dp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/dp.c +1 -1
@@ -96,7 +96,7 @@ int ath12k_dp_peer_setup(struct ath12k *ar, int vdev_id, const u8 *addr)return -ENOENT ; } -for (; tid >=0 ; tid--) +for (tid--; tid >=0 ; tid--)ath12k_dp_rx_peer_tid_delete (ar, peer, tid);spin_unlock_bh (&ab->base_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 171/444 ktest.pl: Prevent recursion of default variable options
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Steven Rostedt <[email protected]>
[ Upstream commit 61f7e318e99d3b398670518dd3f4f8510d1800fc ]
If a default variable contains itself, do not recurse on it.
For example:
ADD_CONFIG := ${CONFIG_DIR}/temp_config
DEFAULTS
ADD_CONFIG = ${CONFIG_DIR}/default_config ${ADD_CONFIG}The above works because the temp variable ADD_CONFIG (is a temp because it is created with ":=") is already defined, it will be substituted in the variable option. But if it gets commented out:
# ADD_CONFIG := ${CONFIG_DIR}/temp_config
DEFAULTS
ADD_CONFIG = ${CONFIG_DIR}/default_config ${ADD_CONFIG}Then the above will go into a recursive loop where ${ADD_CONFIG} will get replaced with the current definition of ADD_CONFIG which contains the ${ADD_CONFIG} and that will also try to get converted. ktest.pl will error after 100 attempts of recursion and fail.
When replacing a variable with the default variable, if the default variable contains itself, do not replace it.
--- tools/testing/ktest/ktest.pl | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/testing/ktest/ktest.pl +4 -1
@@ -1371,7 +1371,10 @@ sub __eval_option { # If a variable contains itself, use the default var if (($var eq $name) && defined($opt{$var})) { $o = $opt{$var}; - $retval = "$retval$o"; + # Only append if the default doesn't contain itself + if ($o !~ m/\$\{$var\}/) { + $retval = "$retval$o"; + } } elsif (defined($opt{$o})) { $o = $opt{$o}; $retval = "$retval$o";
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 172/444 wifi: cfg80211: reject HTC bit for management frames
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit be06a8c7313943109fa870715356503c4c709cbc ]
Management frames sent by userspace should never have the order/HTC bit set, reject that. It could also cause some confusion with the length of the buffer and the header so the validation might end up wrong.
--- net/wireless/mlme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/wireless/mlme.c +2 -1
@@ -843,7 +843,8 @@ int cfg80211_mlme_mgmt_tx(struct cfg80211_registered_device *rdev, mgmt = (const struct ieee80211_mgmt *)params->buf; -if (!ieee80211_is_mgmt (mgmt->frame_control)) +if (!ieee80211_is_mgmt (mgmt->frame_control) || +ieee80211_has_order (mgmt->frame_control))return -EINVAL ; stype =le16_to_cpu (mgmt->frame_control) &IEEE80211_FCTL_STYPE ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 173/444 s390/time: Use monotonic clock in get_cycles()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
[ Upstream commit 09e7e29d2b49ba84bcefb3dc1657726d2de5bb24 ]
Otherwise the code might not work correctly when the clock is changed.
--- arch/s390/include/asm/timex.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
arch/s390/include/asm/timex.h +6 -7
@@ -192,13 +192,6 @@ static inline unsigned long get_tod_clock_fast(void) asmvolatile ("stckf %0" :"=Q" (clk) : :"cc" );return clk; } - -static inline cycles_t get_cycles (void ) -{ -return (cycles_t )get_tod_clock () >>2 ; -} -#define get_cycles get_cycles -int get_phys_clock (unsigned long *clock);void init_cpu_timer (void );
@@ -226,6 +219,12 @@ static inline unsigned long get_tod_clock_monotonic(void)return tod; } +static inline cycles_t get_cycles (void ) +{ +return (cycles_t )get_tod_clock_monotonic () >>2 ; +} +#define get_cycles get_cycles +/** * tod_to_ns - convert a TOD format value to nanoseconds * @todval: to be converted TOD format value
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 174/444 be2net: Use correct byte order and format string for TCP seq and ack_seq
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit 4701ee5044fb3992f1c910630a9673c2dc600ce5 ]
The TCP header fields seq and ack_seq are 32-bit values in network byte order as (__be32). these fields were earlier printed using ntohs(), which converts only 16-bit values and produces incorrect results for 32-bit fields. This patch is changeing the conversion to ntohl(), ensuring correct interpretation of these sequence numbers.
Notably, the format specifier is updated from %d to %u to reflect the unsigned nature of these fields.
improves the accuracy of debug log messages for TCP sequence and acknowledgment numbers during TX timeouts.
--- drivers/net/ethernet/emulex/benet/be_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/emulex/benet/be_main.c +4 -4
@@ -1465,10 +1465,10 @@ static void be_tx_timeout(struct net_device *netdev, unsigned int txqueue) ntohs(tcphdr->source));dev_info (dev,"TCP dest port %d\n" ,ntohs (tcphdr->dest)); -dev_info (dev,"TCP sequence num %d\n" , -ntohs (tcphdr->seq)); -dev_info (dev,"TCP ack_seq %d\n" , -ntohs (tcphdr->ack_seq)); +dev_info (dev,"TCP sequence num %u\n" , +ntohl (tcphdr->seq)); +dev_info (dev,"TCP ack_seq %u\n" , +ntohl (tcphdr->ack_seq)); }else if (ip_hdr (skb)->protocol ==IPPROTO_UDP ) { udphdr =udp_hdr (skb);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 175/444 libbpf: Verify that arena map exists when adding arena relocations
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduard Zingerman <[email protected]>
[ Upstream commit 42be23e8f2dcb100cb9944b2b54b6bf41aff943d ]
Fuzzer reported a memory access error in bpf_program__record_reloc() that happens when:
- ".addr_space.1" section exists
- there is a relocation referencing this section
- there are no arena maps defined in BTF.
Sanity checks for maps existence are already present in bpf_program__record_reloc(), hence this commit adds another one.
[1] https://github.com/libbpf/libbpf/actions/runs/16375110681/job/46272998064
--- tools/lib/bpf/libbpf.c | 5 +++++ 1 file changed, 5 insertions(+)
tools/lib/bpf/libbpf.c +5 -0
@@ -4546,6 +4546,11 @@ static int bpf_program__record_reloc(struct bpf_program *prog,/* arena data relocation */ if (shdr_idx == obj->efile.arena_data_shndx) { +if (obj->arena_map_idx <0 ) { +pr_warn ("prog '%s': bad arena data relocation at insn %u, no arena maps defined\n" , + prog->name, insn_idx); +return -LIBBPF_ERRNO__RELOC ; + } reloc_desc->type =RELO_DATA ; reloc_desc->insn_idx = insn_idx; reloc_desc->map_idx = obj->arena_map_idx;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 176/444 idpf: preserve coalescing settings across resets
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ahmed Zaki <[email protected]>
[ Upstream commit e1e3fec3e34b4934a9d2c98e4ee00a4d87b19179 ]
The IRQ coalescing config currently reside only inside struct idpf_q_vector. However, all idpf_q_vector structs are de-allocated and re-allocated during resets. This leads to user-set coalesce configuration to be lost.
Add new fields to struct idpf_vport_user_config_data to save the user settings and re-apply them after reset.
--- drivers/net/ethernet/intel/idpf/idpf.h | 19 ++++++++++ .../net/ethernet/intel/idpf/idpf_ethtool.c | 36 ++++++++++++++----- drivers/net/ethernet/intel/idpf/idpf_lib.c | 18 +++++++++- drivers/net/ethernet/intel/idpf/idpf_main.c | 1 + drivers/net/ethernet/intel/idpf/idpf_txrx.c | 13 ++++--- 5 files changed, 74 insertions(+), 13 deletions(-)
drivers/net/ethernet/intel/idpf/idpf.h +19 -0
@@ -369,10 +369,28 @@ struct idpf_rss_data {u32 *cached_lut; }; +/** +* struct idpf_q_coalesce - User defined coalescing configuration values for +* a single queue. +* @tx_intr_mode: Dynamic TX ITR or not +* @rx_intr_mode: Dynamic RX ITR or not +* @tx_coalesce_usecs: TX interrupt throttling rate +* @rx_coalesce_usecs: RX interrupt throttling rate +* +* Used to restore user coalescing configuration after a reset. +*/ +struct idpf_q_coalesce { +u32 tx_intr_mode; +u32 rx_intr_mode; +u32 tx_coalesce_usecs; +u32 rx_coalesce_usecs; +}; +/** * struct idpf_vport_user_config_data - User defined configuration values for * each vport. * @rss_data: See struct idpf_rss_data +* @q_coalesce: Array of per queue coalescing data * @num_req_tx_qs: Number of user requested TX queues through ethtool * @num_req_rx_qs: Number of user requested RX queues through ethtool * @num_req_txq_desc: Number of user requested TX queue descriptors through
@@ -386,6 +404,7 @@ struct idpf_rss_data {*/ struct idpf_vport_user_config_data {struct idpf_rss_data rss_data; +struct idpf_q_coalesce *q_coalesce;u16 num_req_tx_qs;u16 num_req_rx_qs;u32 num_req_txq_desc;
drivers/net/ethernet/intel/idpf/idpf_ethtool.c +28 -8
@@ -1089,12 +1089,14 @@ static int idpf_get_per_q_coalesce(struct net_device *netdev, u32 q_num,/** * __idpf_set_q_coalesce - set ITR values for specific queue * @ec: ethtool structure from user to update ITR settings +* @q_coal: per queue coalesce settings * @qv: queue vector for which itr values has to be set * @is_rxq: is queue type rx * * Returns 0 on success, negative otherwise. */ static int __idpf_set_q_coalesce (const struct ethtool_coalesce *ec, +struct idpf_q_coalesce *q_coal,struct idpf_q_vector *qv,bool is_rxq) {u32 use_adaptive_coalesce, coalesce_usecs;
@@ -1138,20 +1140,25 @@ static int __idpf_set_q_coalesce(const struct ethtool_coalesce *ec,if (is_rxq) { qv->rx_itr_value = coalesce_usecs; + q_coal->rx_coalesce_usecs = coalesce_usecs;if (use_adaptive_coalesce) { qv->rx_intr_mode =IDPF_ITR_DYNAMIC ; + q_coal->rx_intr_mode =IDPF_ITR_DYNAMIC ; }else { qv->rx_intr_mode = !IDPF_ITR_DYNAMIC ; -idpf_vport_intr_write_itr (qv, qv->rx_itr_value, - false); + q_coal->rx_intr_mode = !IDPF_ITR_DYNAMIC ; +idpf_vport_intr_write_itr (qv, coalesce_usecs, false); } }else { qv->tx_itr_value = coalesce_usecs; + q_coal->tx_coalesce_usecs = coalesce_usecs;if (use_adaptive_coalesce) { qv->tx_intr_mode =IDPF_ITR_DYNAMIC ; + q_coal->tx_intr_mode =IDPF_ITR_DYNAMIC ; }else { qv->tx_intr_mode = !IDPF_ITR_DYNAMIC ; -idpf_vport_intr_write_itr (qv, qv->tx_itr_value, true); + q_coal->tx_intr_mode = !IDPF_ITR_DYNAMIC ; +idpf_vport_intr_write_itr (qv, coalesce_usecs, true); } }
@@ -1164,6 +1171,7 @@ static int __idpf_set_q_coalesce(const struct ethtool_coalesce *ec,/** * idpf_set_q_coalesce - set ITR values for specific queue * @vport: vport associated to the queue that need updating +* @q_coal: per queue coalesce settings * @ec: coalesce settings to program the device with * @q_num: update ITR/INTRL (coalesce) settings for this queue number/index * @is_rxq: is queue type rx
@@ -1171,6 +1179,7 @@ static int __idpf_set_q_coalesce(const struct ethtool_coalesce *ec,* Return 0 on success, and negative on failure */ static int idpf_set_q_coalesce (const struct idpf_vport *vport, +struct idpf_q_coalesce *q_coal,const struct ethtool_coalesce *ec,int q_num,bool is_rxq) {
@@ -1179,7 +1188,7 @@ static int idpf_set_q_coalesce(const struct idpf_vport *vport, qv = is_rxq ?idpf_find_rxq_vec (vport, q_num) :idpf_find_txq_vec (vport, q_num); -if (qv &&__idpf_set_q_coalesce (ec, qv, is_rxq)) +if (qv &&__idpf_set_q_coalesce (ec, q_coal, qv, is_rxq))return -EINVAL ;return 0 ;
@@ -1200,9 +1209,13 @@ static int idpf_set_coalesce(struct net_device *netdev, struct netlink_ext_ack *extack) {struct idpf_netdev_priv *np =netdev_priv (netdev); +struct idpf_vport_user_config_data *user_config; +struct idpf_q_coalesce *q_coal;struct idpf_vport *vport;int i, err =0 ; + user_config = &np->adapter->vport_config[np->vport_idx]->user_config; +idpf_vport_ctrl_lock (netdev); vport =idpf_netdev_to_vport (netdev);
@@ -1210,13 +1223,15 @@ static int idpf_set_coalesce(struct net_device *netdev, goto unlock_mutex;for (i =0 ; i < vport->num_txq; i++) { - err =idpf_set_q_coalesce (vport, ec, i, false); + q_coal = &user_config->q_coalesce[i]; + err =idpf_set_q_coalesce (vport, q_coal, ec, i, false);if (err) goto unlock_mutex; }for (i =0 ; i < vport->num_rxq; i++) { - err =idpf_set_q_coalesce (vport, ec, i, true); + q_coal = &user_config->q_coalesce[i]; + err =idpf_set_q_coalesce (vport, q_coal, ec, i, true);if (err) goto unlock_mutex; }
@@ -1238,20 +1253,25 @@ static int idpf_set_coalesce(struct net_device *netdev,static int idpf_set_per_q_coalesce (struct net_device *netdev,u32 q_num,struct ethtool_coalesce *ec) { +struct idpf_netdev_priv *np =netdev_priv (netdev); +struct idpf_vport_user_config_data *user_config; +struct idpf_q_coalesce *q_coal;struct idpf_vport *vport;int err;idpf_vport_ctrl_lock (netdev); vport =idpf_netdev_to_vport (netdev); + user_config = &np->adapter->vport_config[np->vport_idx]->user_config; + q_coal = &user_config->q_coalesce[q_num]; - err =idpf_set_q_coalesce (vport, ec, q_num, false); + err =idpf_set_q_coalesce (vport, q_coal, ec, q_num, false);if (err) {idpf_vport_ctrl_unlock (netdev);return err; } - err =idpf_set_q_coalesce (vport, ec, q_num, true); + err =idpf_set_q_coalesce (vport, q_coal, ec, q_num, true);idpf_vport_ctrl_unlock (netdev);
drivers/net/ethernet/intel/idpf/idpf_lib.c +17 -1
@@ -1089,8 +1089,10 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,if (!vport)return vport; + num_max_q =max (max_q->max_txq, max_q->max_rxq);if (!adapter->vport_config[idx]) {struct idpf_vport_config *vport_config; +struct idpf_q_coalesce *q_coal; vport_config =kzalloc (sizeof (*vport_config),GFP_KERNEL );if (!vport_config) {
@@ -1099,6 +1101,21 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter,return NULL ; } + q_coal =kcalloc (num_max_q,sizeof (*q_coal),GFP_KERNEL ); +if (!q_coal) { +kfree (vport_config); +kfree (vport); + +return NULL ; + } +for (int i =0 ; i < num_max_q; i++) { + q_coal[i].tx_intr_mode =IDPF_ITR_DYNAMIC ; + q_coal[i].tx_coalesce_usecs =IDPF_ITR_TX_DEF ; + q_coal[i].rx_intr_mode =IDPF_ITR_DYNAMIC ; + q_coal[i].rx_coalesce_usecs =IDPF_ITR_RX_DEF ; + } + vport_config->user_config.q_coalesce = q_coal; + adapter->vport_config[idx] = vport_config; }
@@ -1108,7 +1125,6 @@ static struct idpf_vport *idpf_vport_alloc(struct idpf_adapter *adapter, vport->default_vport = adapter->num_alloc_vports <idpf_get_default_vports (adapter); - num_max_q =max (max_q->max_txq, max_q->max_rxq); vport->q_vector_idxs =kcalloc (num_max_q,sizeof (u16),GFP_KERNEL );if (!vport->q_vector_idxs) goto free_vport;
drivers/net/ethernet/intel/idpf/idpf_main.c +1 -0
@@ -62,6 +62,7 @@ static void idpf_remove(struct pci_dev *pdev)destroy_workqueue (adapter->vc_event_wq);for (i =0 ; i < adapter->max_vports; i++) { +kfree (adapter->vport_config[i]->user_config.q_coalesce);kfree (adapter->vport_config[i]); adapter->vport_config[i] =NULL ; }
drivers/net/ethernet/intel/idpf/idpf_txrx.c +9 -4
@@ -4190,9 +4190,13 @@ static void idpf_vport_intr_napi_add_all(struct idpf_vport *vport)int idpf_vport_intr_alloc (struct idpf_vport *vport) {u16 txqs_per_vector, rxqs_per_vector, bufqs_per_vector; +struct idpf_vport_user_config_data *user_config;struct idpf_q_vector *q_vector; +struct idpf_q_coalesce *q_coal;u32 complqs_per_vector, v_idx; +u16 idx = vport->idx; + user_config = &vport->adapter->vport_config[idx]->user_config; vport->q_vectors =kcalloc (vport->num_q_vectors,sizeof (struct idpf_q_vector ),GFP_KERNEL );if (!vport->q_vectors)
@@ -4210,14 +4214,15 @@ int idpf_vport_intr_alloc(struct idpf_vport *vport)for (v_idx =0 ; v_idx < vport->num_q_vectors; v_idx++) { q_vector = &vport->q_vectors[v_idx]; + q_coal = &user_config->q_coalesce[v_idx]; q_vector->vport = vport; - q_vector->tx_itr_value =IDPF_ITR_TX_DEF ; - q_vector->tx_intr_mode =IDPF_ITR_DYNAMIC ; + q_vector->tx_itr_value = q_coal->tx_coalesce_usecs; + q_vector->tx_intr_mode = q_coal->tx_intr_mode; q_vector->tx_itr_idx =VIRTCHNL2_ITR_IDX_1 ; - q_vector->rx_itr_value =IDPF_ITR_RX_DEF ; - q_vector->rx_intr_mode =IDPF_ITR_DYNAMIC ; + q_vector->rx_itr_value = q_coal->rx_coalesce_usecs; + q_vector->rx_intr_mode = q_coal->rx_intr_mode; q_vector->rx_itr_idx =VIRTCHNL2_ITR_IDX_0 ;if (!zalloc_cpumask_var (&q_vector->affinity_mask,GFP_KERNEL ))
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 177/444 wifi: rtw89: wow: Add Basic Rate IE to probe request in scheduled scan mode
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chin-Yen Lee <[email protected]>
[ Upstream commit 37c23874d13eb369d8b384a1ce5992ff6c23d56f ]
In scheduled scan mode, the current probe request only includes the SSID IE, but omits the Basic Rate IE. Some APs do not respond to such incomplete probe requests, causing net-detect failures. To improve interoperability and ensure APs respond correctly, add the Basic Rate IE to the probe request in driver.
--- drivers/net/wireless/realtek/rtw89/wow.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtw89/wow.c +4 -1
@@ -1415,6 +1415,8 @@ static void rtw89_fw_release_pno_pkt_list(struct rtw89_dev *rtwdev,static int rtw89_pno_scan_update_probe_req (struct rtw89_dev *rtwdev,struct rtw89_vif_link *rtwvif_link) { +static const u8 basic_rate_ie[] = {WLAN_EID_SUPP_RATES ,0x08 , +0x0c ,0x12 ,0x18 ,0x24 ,0x30 ,0x48 ,0x60 ,0x6c };struct rtw89_wow_param *rtw_wow = &rtwdev->wow;struct cfg80211_sched_scan_request *nd_config = rtw_wow->nd_config;u8 num = nd_config->n_match_sets, i;
@@ -1426,10 +1428,11 @@ static int rtw89_pno_scan_update_probe_req(struct rtw89_dev *rtwdev, skb =ieee80211_probereq_get (rtwdev->hw, rtwvif_link->mac_addr, nd_config->match_sets[i].ssid.ssid, nd_config->match_sets[i].ssid.ssid_len, - nd_config->ie_len); + nd_config->ie_len +sizeof (basic_rate_ie));if (!skb)return -ENOMEM ; +skb_put_data (skb, basic_rate_ie,sizeof (basic_rate_ie));skb_put_data (skb, nd_config->ie, nd_config->ie_len); info =kzalloc (sizeof (*info),GFP_KERNEL );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 178/444 wifi: rtw89: Lower the timeout in rtw89_fw_read_c2h_reg() for USB
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bitterblue Smith <[email protected]>
[ Upstream commit 671be46afd1f03de9dc6e4679c88e1a7a81cdff6 ]
This read_poll_timeout_atomic() with a delay of 1 µs and a timeout of 1000000 µs can take ~250 seconds in the worst case because sending a USB control message takes ~250 µs.
Lower the timeout to 4000 for USB in order to reduce the maximum polling time to ~1 second.
This problem was observed with RTL8851BU while suspending to RAM with WOWLAN enabled. The computer sat for 4 minutes with a black screen before suspending.
--- drivers/net/wireless/realtek/rtw89/fw.c | 9 +++++++-- drivers/net/wireless/realtek/rtw89/fw.h | 2 ++ 2 files changed, 9 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw89/fw.c +7 -2
@@ -5934,13 +5934,18 @@ static int rtw89_fw_read_c2h_reg(struct rtw89_dev *rtwdev,const struct rtw89_chip_info *chip = rtwdev->chip;struct rtw89_fw_info *fw_info = &rtwdev->fw;const u32 *c2h_reg = chip->c2h_regs; -u32 ret; +u32 ret, timeout;u8 i, val; info->id =RTW89_FWCMD_C2HREG_FUNC_NULL ; +if (rtwdev->hci.type ==RTW89_HCI_TYPE_USB ) + timeout =RTW89_C2H_TIMEOUT_USB ; +else + timeout =RTW89_C2H_TIMEOUT ; + ret =read_poll_timeout_atomic (rtw89_read8, val, val,1 , -RTW89_C2H_TIMEOUT , false, rtwdev, + timeout, false, rtwdev, chip->c2h_ctrl_reg);if (ret) {rtw89_warn (rtwdev,"c2h reg timeout\n" );
drivers/net/wireless/realtek/rtw89/fw.h +2 -0
@@ -97,6 +97,8 @@ struct rtw89_h2creg_sch_tx_en {#define RTW89_C2HREG_HDR_LEN 2#define RTW89_H2CREG_HDR_LEN 2#define RTW89_C2H_TIMEOUT 1000000 +#define RTW89_C2H_TIMEOUT_USB 4000 +struct rtw89_mac_c2h_info {u8 id;u8 content_len;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 179/444 et131x: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit d61f6cb6f6ef3c70d2ccc0d9c85c508cb8017da9 ]
The DMA map functions can fail and should be tested for errors. If the mapping fails, unmap and return an error.
--- drivers/net/ethernet/agere/et131x.c | 36 +++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+)
drivers/net/ethernet/agere/et131x.c +36 -0
@@ -2459,6 +2459,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb) skb->data,skb_headlen (skb), DMA_TO_DEVICE); +if (dma_mapping_error (&adapter->pdev->dev, + dma_addr)) +return -ENOMEM ; + desc[frag].addr_lo =lower_32_bits (dma_addr); desc[frag].addr_hi =upper_32_bits (dma_addr); frag++;
@@ -2468,6 +2472,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb) skb->data,skb_headlen (skb) /2 , DMA_TO_DEVICE); +if (dma_mapping_error (&adapter->pdev->dev, + dma_addr)) +return -ENOMEM ; + desc[frag].addr_lo =lower_32_bits (dma_addr); desc[frag].addr_hi =upper_32_bits (dma_addr); frag++;
@@ -2478,6 +2486,10 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)skb_headlen (skb) /2 ,skb_headlen (skb) /2 , DMA_TO_DEVICE); +if (dma_mapping_error (&adapter->pdev->dev, + dma_addr)) + goto unmap_first_out; + desc[frag].addr_lo =lower_32_bits (dma_addr); desc[frag].addr_hi =upper_32_bits (dma_addr); frag++;
@@ -2489,6 +2501,9 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb)0 , desc[frag].len_vlan, DMA_TO_DEVICE); +if (dma_mapping_error (&adapter->pdev->dev, dma_addr)) + goto unmap_out; + desc[frag].addr_lo =lower_32_bits (dma_addr); desc[frag].addr_hi =upper_32_bits (dma_addr); frag++;
@@ -2578,6 +2593,27 @@ static int nic_send_packet(struct et131x_adapter *adapter, struct tcb *tcb) &adapter->regs->global.watchdog_timer); }return 0 ; + +unmap_out: +// Unmap the body of the packet with map_page +while (--i) { + frag--; + dma_addr = desc[frag].addr_lo; + dma_addr |= (u64 )desc[frag].addr_hi <<32 ; +dma_unmap_page (&adapter->pdev->dev, dma_addr, + desc[frag].len_vlan,DMA_TO_DEVICE ); + } + +unmap_first_out: +// Unmap the header with map_single +while (frag--) { + dma_addr = desc[frag].addr_lo; + dma_addr |= (u64 )desc[frag].addr_hi <<32 ; +dma_unmap_single (&adapter->pdev->dev, dma_addr, + desc[frag].len_vlan,DMA_TO_DEVICE ); + } + +return -ENOMEM ; }static int send_packet (struct sk_buff *skb,struct et131x_adapter *adapter)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 180/444 net: ag71xx: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 96a1e15e60216b52da0e6da5336b6d7f5b0188b0 ]
The DMA map functions can fail and should be tested for errors.
--- drivers/net/ethernet/atheros/ag71xx.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/net/ethernet/atheros/ag71xx.c +9 -0
@@ -1213,6 +1213,11 @@ static bool ag71xx_fill_rx_buf(struct ag71xx *ag, struct ag71xx_buf *buf, buf->rx.rx_buf = data; buf->rx.dma_addr =dma_map_single (&ag->pdev->dev, data, ag->rx_buf_size,DMA_FROM_DEVICE ); +if (dma_mapping_error (&ag->pdev->dev, buf->rx.dma_addr)) { +skb_free_frag (data); + buf->rx.rx_buf =NULL ; +return false; + } desc->data = (u32 )buf->rx.dma_addr + offset;return true; }
@@ -1511,6 +1516,10 @@ static netdev_tx_t ag71xx_hard_start_xmit(struct sk_buff *skb, dma_addr =dma_map_single (&ag->pdev->dev, skb->data, skb->len,DMA_TO_DEVICE ); +if (dma_mapping_error (&ag->pdev->dev, dma_addr)) { +netif_dbg (ag, tx_err, ndev,"DMA mapping error\n" ); + goto err_drop; + } i = ring->curr & ring_mask; desc =ag71xx_ring_desc (ring, i);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 181/444 net/mlx5e: Properly access RCU protected qdisc_sleeping variable
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Leon Romanovsky <[email protected]>
[ Upstream commit 2a601b2d35623065d31ebaf697b07502d54878c9 ]
qdisc_sleeping variable is declared as "struct Qdisc __rcu" and as such needs proper annotation while accessing it.
Without rtnl_dereference(), the following error is generated by sparse:
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c:377:40: warning:
incorrect type in initializer (different address spaces)drivers/net/ethernet/mellanox/mlx5/core/en/qos.c:377:40: expected
struct Qdisc *qdiscdrivers/net/ethernet/mellanox/mlx5/core/en/qos.c:377:40: got struct
Qdisc [noderef] __rcu *qdisc_sleeping
--- drivers/net/ethernet/mellanox/mlx5/core/en/qos.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en/qos.c +1 -1
@@ -374,7 +374,7 @@ void mlx5e_reactivate_qos_sq(struct mlx5e_priv *priv, u16 qid, struct netdev_quevoid mlx5e_reset_qdisc (struct net_device *dev,u16 qid) {struct netdev_queue *dev_queue =netdev_get_tx_queue (dev, qid); -struct Qdisc *qdisc = dev_queue->qdisc_sleeping; +struct Qdisc *qdisc =rtnl_dereference (dev_queue->qdisc_sleeping);if (!qdisc)return ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 182/444 net: pcs: xpcs: mask readl() return value to 16 bits
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jack Ping CHNG <[email protected]>
[ Upstream commit 2b0ba7b5b010455c4e43ab557860f8b1089e7424 ]
readl() returns 32-bit value but Clause 22/45 registers are 16-bit wide. Masking with 0xFFFF avoids using garbage upper bits.
--- drivers/net/pcs/pcs-xpcs-plat.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/pcs/pcs-xpcs-plat.c +2 -2
@@ -66,7 +66,7 @@ static int xpcs_mmio_read_reg_indirect(struct dw_xpcs_plat *pxpcs,switch (pxpcs->reg_width) {case 4 :writel (page, pxpcs->reg_base + (DW_VR_CSR_VIEWPORT <<2 )); - ret =readl (pxpcs->reg_base + (ofs <<2 )); + ret =readl (pxpcs->reg_base + (ofs <<2 )) &0xffff ;break ;default :writew (page, pxpcs->reg_base + (DW_VR_CSR_VIEWPORT <<1 ));
@@ -124,7 +124,7 @@ static int xpcs_mmio_read_reg_direct(struct dw_xpcs_plat *pxpcs,switch (pxpcs->reg_width) {case 4 : - ret =readl (pxpcs->reg_base + (csr <<2 )); + ret =readl (pxpcs->reg_base + (csr <<2 )) &0xffff ;break ;default : ret =readw (pxpcs->reg_base + (csr <<1 ));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 183/444 arm64: Mark kernel as tainted on SAE and SError panic
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit d7ce7e3a84642aadf7c4787f7ec4f58eb163d129 ]
Set TAINT_MACHINE_CHECK when SError or Synchronous External Abort (SEA) interrupts trigger a panic to flag potential hardware faults. This tainting mechanism aids in debugging and enables correlation of hardware-related crashes in large-scale deployments.
This change aligns with similar patches[1] that mark machine check events when the system crashes due to hardware errors.
--- arch/arm64/kernel/traps.c | 1 + arch/arm64/mm/fault.c | 1 + 2 files changed, 2 insertions(+)
arch/arm64/kernel/traps.c +1 -0
@@ -921,6 +921,7 @@ void __noreturn panic_bad_stack(struct pt_regs *regs, unsigned long esr, unsignevoid __noreturn arm64_serror_panic (struct pt_regs *regs,unsigned long esr) { +add_taint (TAINT_MACHINE_CHECK ,LOCKDEP_STILL_OK );console_verbose (); pr_crit("SError Interrupt on CPU%d, code 0x%016lx -- %s\n",
arch/arm64/mm/fault.c +1 -0
@@ -798,6 +798,7 @@ static int do_sea(unsigned long far, unsigned long esr, struct pt_regs *regs)*/ siaddr =untagged_addr (far); } +add_taint (TAINT_MACHINE_CHECK ,LOCKDEP_STILL_OK );arm64_notify_die (inf->name, regs, inf->sig, inf->code, siaddr, esr);return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 184/444 drm/amd/pm: fix null pointer access
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Umio Yasuno <[email protected]>
[ Upstream commit d524d40e3a6152a3ea1125af729f8cd8ca65efde ]
Writing a string without delimiters (' ', '\n', '\0') to the under gpu_od/fan_ctrl sysfs or pp_power_profile_mode for the CUSTOM profile will result in a null pointer dereference.
--- drivers/gpu/drm/amd/pm/amdgpu_pm.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/pm/amdgpu_pm.c +5 -0
@@ -1490,6 +1490,8 @@ static ssize_t amdgpu_set_pp_power_profile_mode(struct device *dev,if (ret)return -EINVAL ; parameter_size++; +if (!tmp_str) +break ;while (isspace (*tmp_str)) tmp_str++; }
@@ -3853,6 +3855,9 @@ static int parse_input_od_command_lines(const char *buf,return -EINVAL ; parameter_size++; +if (!tmp_str) +break ; +while (isspace (*tmp_str)) tmp_str++; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 185/444 rcu: Protect ->defer_qs_iw_pending from data race
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul E. McKenney <[email protected]>
[ Upstream commit 90c09d57caeca94e6f3f87c49e96a91edd40cbfd ]
On kernels built with CONFIG_IRQ_WORK=y, when rcu_read_unlock() is invoked within an interrupts-disabled region of code [1], it will invoke rcu_read_unlock_special(), which uses an irq-work handler to force the system to notice when the RCU read-side critical section actually ends. That end won't happen until interrupts are enabled at the soonest.
In some kernels, such as those booted with rcutree.use_softirq=y, the irq-work handler is used unconditionally.
The per-CPU rcu_data structure's ->defer_qs_iw_pending field is updated by the irq-work handler and is both read and updated by rcu_read_unlock_special(). This resulted in the following KCSAN splat:
------------------------------------------------------------------------
BUG: KCSAN: data-race in rcu_preempt_deferred_qs_handler / rcu_read_unlock_special
read to 0xffff96b95f42d8d8 of 1 bytes by task 90 on cpu 8:
rcu_read_unlock_special+0x175/0x260 __rcu_read_unlock+0x92/0xa0 rt_spin_unlock+0x9b/0xc0 __local_bh_enable+0x10d/0x170 __local_bh_enable_ip+0xfb/0x150 rcu_do_batch+0x595/0xc40 rcu_cpu_kthread+0x4e9/0x830 smpboot_thread_fn+0x24d/0x3b0 kthread+0x3bd/0x410 ret_from_fork+0x35/0x40 ret_from_fork_asm+0x1a/0x30
write to 0xffff96b95f42d8d8 of 1 bytes by task 88 on cpu 8:
rcu_preempt_deferred_qs_handler+0x1e/0x30 irq_work_single+0xaf/0x160 run_irq_workd+0x91/0xc0 smpboot_thread_fn+0x24d/0x3b0 kthread+0x3bd/0x410 ret_from_fork+0x35/0x40 ret_from_fork_asm+0x1a/0x30
no locks held by irq_work/8/88.
irq event stamp: 200272 hardirqs last enabled at (200272): [<ffffffffb0f56121>] finish_task_switch+0x131/0x320 hardirqs last disabled at (200271): [<ffffffffb25c7859>] __schedule+0x129/0xd70 softirqs last enabled at (0): [<ffffffffb0ee093f>] copy_process+0x4df/0x1cc0 softirqs last disabled at (0): [<0000000000000000>] 0x0
------------------------------------------------------------------------
The problem is that irq-work handlers run with interrupts enabled, which means that rcu_preempt_deferred_qs_handler() could be interrupted, and that interrupt handler might contain an RCU read-side critical section, which might invoke rcu_read_unlock_special(). In the strict KCSAN mode of operation used by RCU, this constitutes a data race on the ->defer_qs_iw_pending field.
This commit therefore disables interrupts across the portion of the rcu_preempt_deferred_qs_handler() that updates the ->defer_qs_iw_pending field. This suffices because this handler is not a fast path.
--- kernel/rcu/tree_plugin.h | 3 +++ 1 file changed, 3 insertions(+)
kernel/rcu/tree_plugin.h +3 -0
@@ -623,10 +623,13 @@ notrace void rcu_preempt_deferred_qs(struct task_struct *t)*/ static void rcu_preempt_deferred_qs_handler (struct irq_work *iwp) { +unsigned long flags;struct rcu_data *rdp; rdp = container_of(iwp, struct rcu_data, defer_qs_iw); +local_irq_save (flags); rdp->defer_qs_iw_pending = false; +local_irq_restore (flags); }/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 186/444 drm/amd/display: limit clear_update_flags to dcn32 and above
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charlene Liu <[email protected]>
[ Upstream commit f354556e29f40ef44fa8b13dc914817db3537e20 ]
[why]
dc has some code out of sync:dc_commit_updates_for_stream handles v1/v2/v3, but dc_update_planes_and_stream makes v1 asic to use v2.
as a reression fix: limit clear_update_flags to dcn32 or newer asic. need to follow up that v1 asic using v2 issue.
--- drivers/gpu/drm/amd/display/dc/core/dc.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc.c +2 -3
@@ -5121,8 +5121,7 @@ bool dc_update_planes_and_stream(struct dc *dc,else ret =update_planes_and_stream_v2 (dc, srf_updates, surface_count, stream, stream_update); - -if (ret) +if (ret && dc->ctx->dce_version >=DCN_VERSION_3_2 )clear_update_flags (srf_updates, surface_count, stream);return ret;
@@ -5153,7 +5152,7 @@ void dc_commit_updates_for_stream(struct dc *dc, ret =update_planes_and_stream_v1 (dc, srf_updates, surface_count, stream, stream_update, state); -if (ret) +if (ret && dc->ctx->dce_version >=DCN_VERSION_3_2 )clear_update_flags (srf_updates, surface_count, stream); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 187/444 can: ti_hecc: fix -Woverflow compiler warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vincent Mailhol <[email protected]>
[ Upstream commit 7cae4d04717b002cffe41169da3f239c845a0723 ]
Fix below default (W=0) warning:
drivers/net/can/ti_hecc.c: In function 'ti_hecc_start':
drivers/net/can/ti_hecc.c:386:20: warning: conversion from 'long unsigned int' to 'u32' {aka 'unsigned int'} changes value from '18446744073709551599' to '4294967279' [-Woverflow]
386 | mbx_mask = ~BIT(HECC_RX_LAST_MBOX);
| ^--- drivers/net/can/ti_hecc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/can/ti_hecc.c +1 -1
@@ -383,7 +383,7 @@ static void ti_hecc_start(struct net_device *ndev)* overflows instead of the hardware silently dropping the * messages. */ - mbx_mask = ~BIT (HECC_RX_LAST_MBOX ); + mbx_mask = ~BIT_U32 (HECC_RX_LAST_MBOX );hecc_write (priv,HECC_CANOPC , mbx_mask);/* Enable interrupts */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 188/444 net: mctp: Prevent duplicate binds
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Johnston <[email protected]>
[ Upstream commit 3954502377ec05a1b37e2dc9bef0bacd4bbd71b2 ]
Disallow bind() calls that have the same arguments as existing bound sockets. Previously multiple sockets could bind() to the same type/local address, with an arbitrary socket receiving matched messages.
This is only a partial fix, a future commit will define precedence order for MCTP_ADDR_ANY versus specific EID bind(), which are allowed to exist together.
--- net/mctp/af_mctp.c | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-)
net/mctp/af_mctp.c +23 -3
@@ -73,7 +73,6 @@ static int mctp_bind(struct socket *sock, struct sockaddr *addr, int addrlen)lock_sock (sk); -/* TODO: allow rebind */ if (sk_hashed (sk)) { rc = -EADDRINUSE ; goto out_release;
@@ -629,15 +628,36 @@ static void mctp_sk_close(struct sock *sk, long timeout)static int mctp_sk_hash (struct sock *sk) {struct net *net =sock_net (sk); +struct sock *existing; +struct mctp_sock *msk; +int rc; + + msk = container_of(sk, struct mctp_sock, sk);/* Bind lookup runs under RCU, remain live during that. */ sock_set_flag (sk,SOCK_RCU_FREE );mutex_lock (&net->mctp.bind_lock); + +/* Prevent duplicate binds. */ +sk_for_each (existing, &net->mctp.binds) { +struct mctp_sock *mex = + container_of(existing, struct mctp_sock, sk); + +if (mex->bind_type == msk->bind_type && + mex->bind_addr == msk->bind_addr && + mex->bind_net == msk->bind_net) { + rc = -EADDRINUSE ; + goto out; + } + } +sk_add_node_rcu (sk, &net->mctp.binds); -mutex_unlock (&net->mctp.bind_lock); + rc =0 ; -return 0 ; +out: +mutex_unlock (&net->mctp.bind_lock); +return rc; }static void mctp_sk_unhash (struct sock *sk)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 189/444 wifi: cfg80211: Fix interface type validation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilan Peer <[email protected]>
[ Upstream commit 14450be2332a49445106403492a367412b8c23f4 ]
Fix a condition that verified valid values of interface types.
--- include/net/cfg80211.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/net/cfg80211.h +1 -1
@@ -633,7 +633,7 @@ ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband,const struct ieee80211_sband_iftype_data *data;int i; -if (WARN_ON (iftype >=NL80211_IFTYPE_MAX )) +if (WARN_ON (iftype >=NUM_NL80211_IFTYPES ))return NULL ;if (iftype ==NL80211_IFTYPE_AP_VLAN )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 190/444 wifi: mac80211: dont unreserve never reserved chanctx
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit a6d521bafcb290294128a51b13dbf4baae5748fc ]
If a link has no chanctx, indicating it is an inactive link that we tracked CSA for, then attempting to unreserve the reserved chanctx will throw a warning and fail, since there never was a reserved chanctx. Skip the unreserve.
--- net/mac80211/mlme.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/mac80211/mlme.c +2 -1
@@ -2243,7 +2243,8 @@ ieee80211_sta_abort_chanswitch(struct ieee80211_link_data *link)if (!local->ops->abort_channel_switch)return ; -ieee80211_link_unreserve_chanctx (link); +if (rcu_access_pointer (link->conf->chanctx_conf)) +ieee80211_link_unreserve_chanctx (link);ieee80211_vif_unblock_queues_csa (sdata);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 191/444 net: ipv4: fix incorrect MTU in broadcast routes
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oscar Maes <[email protected]>
[ Upstream commit 9e30ecf23b1b8f091f7d08b27968dea83aae7908 ]
Currently, __mkroute_output overrules the MTU value configured for broadcast routes.
This buggy behaviour can be reproduced with:
ip link set dev eth1 mtu 9000
ip route del broadcast 192.168.0.255 dev eth1 proto kernel scope link src 192.168.0.2 ip route add broadcast 192.168.0.255 dev eth1 proto kernel scope link src 192.168.0.2 mtu 1500
The maximum packet size should be 1500, but it is actually 8000:
ping -b 192.168.0.255 -s 8000
Fix __mkroute_output to allow MTU values to be configured for for broadcast routes (to support a mixed-MTU local-area-network).
--- net/ipv4/route.c | 1 - 1 file changed, 1 deletion(-)
net/ipv4/route.c +0 -1
@@ -2545,7 +2545,6 @@ static struct rtable *__mkroute_output(const struct fib_result *res, do_cache = true;if (type ==RTN_BROADCAST ) { flags |=RTCF_BROADCAST |RTCF_LOCAL ; - fi =NULL ; } else if (type == RTN_MULTICAST) { flags |= RTCF_MULTICAST | RTCF_LOCAL; if (!ip_check_mc_rcu(in_dev, fl4->daddr, fl4->saddr,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 192/444 net: thunderx: Fix format-truncation warning in bgx_acpi_match_id()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit 53d20606c40678d425cc03f0978c614dca51f25e ]
The buffer bgx_sel used in snprintf() was too small to safely hold the formatted string "BGX%d" for all valid bgx_id values. This caused a -Wformat-truncation warning with Werror enabled during build.
Increase the buffer size from 5 to 7 and use sizeof(bgx_sel) in snprintf() to ensure safety and suppress the warning.
Build warning:
CC drivers/net/ethernet/cavium/thunder/thunder_bgx.o
drivers/net/ethernet/cavium/thunder/thunder_bgx.c: In function
‘bgx_acpi_match_id’:
drivers/net/ethernet/cavium/thunder/thunder_bgx.c:1434:27: error: ‘%d’
directive output may be truncated writing between 1 and 3 bytes into a region of size 2 [-Werror=format-truncation=]
snprintf(bgx_sel, 5, "BGX%d", bgx->bgx_id);
^~
drivers/net/ethernet/cavium/thunder/thunder_bgx.c:1434:23: note:
directive argument in the range [0, 255]
snprintf(bgx_sel, 5, "BGX%d", bgx->bgx_id);
^~~~~~~
drivers/net/ethernet/cavium/thunder/thunder_bgx.c:1434:2: note:
‘snprintf’ output between 5 and 7 bytes into a destination of size 5
snprintf(bgx_sel, 5, "BGX%d", bgx->bgx_id);compiler warning due to insufficient snprintf buffer size.
--- drivers/net/ethernet/cavium/thunder/thunder_bgx.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/cavium/thunder/thunder_bgx.c +2 -2
@@ -1429,9 +1429,9 @@ static acpi_status bgx_acpi_match_id(acpi_handle handle, u32 lvl, {struct acpi_buffer string = {ACPI_ALLOCATE_BUFFER ,NULL };struct bgx *bgx = context; -char bgx_sel[5 ]; +char bgx_sel[7 ]; -snprintf (bgx_sel,5 ,"BGX%d" , bgx->bgx_id); +snprintf (bgx_sel,sizeof (bgx_sel),"BGX%d" , bgx->bgx_id);if (ACPI_FAILURE (acpi_get_name (handle,ACPI_SINGLE_NAME , &string))) {pr_warn ("Invalid link device\n" );return AE_OK ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 193/444 net: phy: micrel: Add ksz9131_resume()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Biju Das <[email protected]>
[ Upstream commit f25a7eaa897f21396e99f90809af82ca553c9d14 ]
The Renesas RZ/G3E SMARC EVK uses KSZ9131RNXC phy. On deep power state, PHY loses the power and on wakeup the rgmii delays are not reconfigured causing it to fail.
Replace the callback kszphy_resume()->ksz9131_resume() for reconfiguring the rgmii_delay when it exits from PM suspend state.
--- drivers/net/phy/micrel.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-)
drivers/net/phy/micrel.c +9 -1
@@ -5394,6 +5394,14 @@ static int lan8841_suspend(struct phy_device *phydev)return kszphy_generic_suspend (phydev); } +static int ksz9131_resume (struct phy_device *phydev) +{ +if (phydev->suspended &&phy_interface_is_rgmii (phydev)) +ksz9131_config_rgmii_delay (phydev); + +return kszphy_resume (phydev); +} +static struct phy_driver ksphy_driver[] = { { .phy_id =PHY_ID_KS8737 ,
@@ -5639,7 +5647,7 @@ static struct phy_driver ksphy_driver[] = { .get_strings = kszphy_get_strings, .get_stats = kszphy_get_stats, .suspend = kszphy_suspend, - .resume = kszphy_resume, + .resume = ksz9131_resume, .cable_test_start = ksz9x31_cable_test_start, .cable_test_get_status = ksz9x31_cable_test_get_status, .get_features = ksz9477_get_features,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 194/444 perf/cxlpmu: Remove unintended newline from IRQ name format string
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit 3e870815ccf5bc75274158f0b5e234fce6f93229 ]
The IRQ name format string used in devm_kasprintf() mistakenly included a newline character "\n".
This could lead to confusing log output or misformatted names in sysfs or debug messages.
This fix removes the newline to ensure proper IRQ naming.
--- drivers/perf/cxl_pmu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/perf/cxl_pmu.c +1 -1
@@ -870,7 +870,7 @@ static int cxl_pmu_probe(struct device *dev)return rc; irq = rc; - irq_name =devm_kasprintf (dev,GFP_KERNEL ,"%s_overflow\n" , dev_name); + irq_name =devm_kasprintf (dev,GFP_KERNEL ,"%s_overflow" , dev_name);if (!irq_name)return -ENOMEM ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 195/444 sched/deadline: Fix accounting after global limits change
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Juri Lelli <[email protected]>
[ Upstream commit 440989c10f4e32620e9e2717ca52c3ed7ae11048 ]
A global limits change (sched_rt_handler() logic) currently leaves stale and/or incorrect values in variables related to accounting (e.g. extra_bw).
Properly clean up per runqueue variables before implementing the change and rebuild scheduling domains (so that accounting is also properly restored) after such a change is complete.
--- kernel/sched/deadline.c | 4 +++- kernel/sched/rt.c | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-)
kernel/sched/deadline.c +3 -1
@@ -3227,6 +3227,9 @@ void sched_dl_do_global(void)if (global_rt_runtime () !=RUNTIME_INF ) new_bw =to_ratio (global_rt_period (),global_rt_runtime ()); +for_each_possible_cpu (cpu) +init_dl_rq_bw_ratio (&cpu_rq (cpu)->dl); +for_each_possible_cpu (cpu) {rcu_read_lock_sched ();
@@ -3242,7 +3245,6 @@ void sched_dl_do_global(void)raw_spin_unlock_irqrestore (&dl_b->lock, flags);rcu_read_unlock_sched (); -init_dl_rq_bw_ratio (&cpu_rq (cpu)->dl); } }
kernel/sched/rt.c +6 -0
@@ -2951,6 +2951,12 @@ static int sched_rt_handler(const struct ctl_table *table, int write, void *buff }mutex_unlock (&mutex); +/* +* After changing maximum available bandwidth for DEADLINE, we need to +* recompute per root domain and per cpus variables accordingly. +*/ +rebuild_sched_domains (); +return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 196/444 bpf: Forget ranges when refining tnum after JSET
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Chaignon <[email protected]>
[ Upstream commit 6279846b9b2532e1b04559ef8bd0dec049f29383 ]
Syzbot reported a kernel warning due to a range invariant violation on the following BPF program.
0: call bpf_get_netns_cookie
1: if r0 == 0 goto <exit>
2: if r0 & Oxffffffff goto <exit>
The issue is on the path where we fall through both jumps.
That path is unreachable at runtime: after insn 1, we know r0 != 0, but with the sign extension on the jset, we would only fallthrough insn 2 if r0 == 0. Unfortunately, is_branch_taken() isn't currently able to figure this out, so the verifier walks all branches. The verifier then refines the register bounds using the second condition and we end up with inconsistent bounds on this unreachable path:
1: if r0 == 0 goto <exit>
r0: u64=[0x1, 0xffffffffffffffff] var_off=(0, 0xffffffffffffffff)
2: if r0 & 0xffffffff goto <exit>
r0 before reg_bounds_sync: u64=[0x1, 0xffffffffffffffff] var_off=(0, 0)
r0 after reg_bounds_sync: u64=[0x1, 0] var_off=(0, 0)Improving the range refinement for JSET to cover all cases is tricky. We also don't expect many users to rely on JSET given LLVM doesn't generate those instructions. So instead of improving the range refinement for JSETs, Eduard suggested we forget the ranges whenever we're narrowing tnums after a JSET. This patch implements that approach.
--- kernel/bpf/verifier.c | 4 ++++ 1 file changed, 4 insertions(+)
kernel/bpf/verifier.c +4 -0
@@ -15052,6 +15052,10 @@ static void regs_refine_cond_op(struct bpf_reg_state *reg1, struct bpf_reg_stateif (!is_reg_const (reg2, is_jmp32))break ; val =reg_const_value (reg2, is_jmp32); +/* Forget the ranges before narrowing tnums, to avoid invariant +* violations if we're on a dead branch. +*/ +__mark_reg_unbounded (reg1);if (is_jmp32) { t =tnum_and (tnum_subreg (reg1->var_off),tnum_const (~val)); reg1->var_off =tnum_with_subreg (reg1->var_off, t);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 197/444 wifi: iwlwifi: mvm: set gtk id also in older FWs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit 61be9803f322ab46f31ba944c6ef7de195891f64 ]
We use gtk[i].id, but it is not even set in older FW APIs (iwl_wowlan_status_v6 and iwl_wowlan_status_v7). Set it also in older FWs.
--- drivers/net/wireless/intel/iwlwifi/mvm/d3.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/intel/iwlwifi/mvm/d3.c +2 -0
@@ -2375,6 +2375,7 @@ static void iwl_mvm_convert_gtk_v2(struct iwl_wowlan_status_data *status, status->gtk[0 ].len = data->key_len; status->gtk[0 ].flags = data->key_flags; + status->gtk[0 ].id = status->gtk[0 ].flags &IWL_WOWLAN_GTK_IDX_MASK ;memcpy (status->gtk[0 ].key, data->key,sizeof (data->key));
@@ -2686,6 +2687,7 @@ iwl_mvm_send_wowlan_get_status(struct iwl_mvm *mvm, u8 sta_id)* currently used key. */ status->gtk[0 ].flags = v6->gtk.key_index |BIT (7 ); + status->gtk[0 ].id = v6->gtk.key_index; }else if (notif_ver ==7 ) {struct iwl_wowlan_status_v7 *v7 = (void *)cmd.resp_pkt->data;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 198/444 um: Re-evaluate thread flags repeatedly
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit b9e2f2246eb2b5617d53af7b5e4e1b8c916f26a8 ]
The thread flags may change during their processing.
For example a task_work can queue a new signal to be sent. This signal should be delivered before returning to usespace again.
Evaluate the flags repeatedly similar to other architectures.
--- arch/um/include/asm/thread_info.h | 4 ++++ arch/um/kernel/process.c | 20 ++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-)
arch/um/include/asm/thread_info.h +4 -0
@@ -68,7 +68,11 @@ static inline struct thread_info *current_thread_info(void)#define _TIF_NOTIFY_SIGNAL (1 << TIF_NOTIFY_SIGNAL)#define _TIF_MEMDIE (1 << TIF_MEMDIE)#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT) +#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)#define _TIF_SECCOMP (1 << TIF_SECCOMP)#define _TIF_SINGLESTEP (1 << TIF_SINGLESTEP) +#define _TIF_WORK_MASK (_TIF_NEED_RESCHED | _TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL | \ + _TIF_NOTIFY_RESUME) +#endif
arch/um/kernel/process.c +12 -8
@@ -81,14 +81,18 @@ struct task_struct *__switch_to(struct task_struct *from, struct task_struct *tovoid interrupt_end (void ) {struct pt_regs *regs = ¤t->thread.regs; - -if (need_resched ()) -schedule (); -if (test_thread_flag (TIF_SIGPENDING ) || -test_thread_flag (TIF_NOTIFY_SIGNAL )) -do_signal (regs); -if (test_thread_flag (TIF_NOTIFY_RESUME )) -resume_user_mode_work (regs); +unsigned long thread_flags; + + thread_flags =read_thread_flags (); +while (thread_flags & _TIF_WORK_MASK) { +if (thread_flags & _TIF_NEED_RESCHED) +schedule (); +if (thread_flags & (_TIF_SIGPENDING | _TIF_NOTIFY_SIGNAL)) +do_signal (regs); +if (thread_flags & _TIF_NOTIFY_RESUME) +resume_user_mode_work (regs); + thread_flags =read_thread_flags (); + } }int get_current_pid (void )
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 199/444 wifi: iwlwifi: mvm: fix scan request validation
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Avraham Stern <[email protected]>
[ Upstream commit 7c2f3ec7707188d8d5269ae2dce97d7be3e9f261 ]
The scan request validation function uses bitwise and instead of logical and. Fix it.
--- drivers/net/wireless/intel/iwlwifi/mvm/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/mvm/scan.c +1 -1
@@ -835,7 +835,7 @@ static inline bool iwl_mvm_scan_fits(struct iwl_mvm *mvm, int n_ssids, int n_channels) { return ((n_ssids <= PROBE_OPTION_MAX) && - (n_channels <= mvm->fw->ucode_capa.n_scan_channels) & + (n_channels <= mvm->fw->ucode_capa.n_scan_channels) && (ies->common_ie_len + ies->len[NL80211_BAND_2GHZ] + ies->len[NL80211_BAND_5GHZ] + ies->len[NL80211_BAND_6GHZ] <=
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 200/444 s390/stp: Remove udelay from stp_sync_clock()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sven Schnelle <[email protected]>
[ Upstream commit b367017cdac21781a74eff4e208d3d38e1f38d3f ]
When an stp sync check is handled on a system with multiple cpus each cpu gets a machine check but only the first one actually handles the sync operation. All other CPUs spin waiting for the first one to finish with a short udelay(). But udelay can't be used here as the first CPU modifies tod_clock_base before performing the sync op. During this timeframe get_tod_clock_monotonic() might return a non-monotonic time.
The time spent waiting should be very short and udelay is a busy loop anyways, therefore simply remove the udelay.
--- arch/s390/kernel/time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/s390/kernel/time.c +1 -1
@@ -579,7 +579,7 @@ static int stp_sync_clock(void *data)atomic_dec (&sync->cpus);/* Wait for in_sync to be set. */ while (READ_ONCE (sync->in_sync) ==0 ) -__udelay (1 ); + ; }if (sync->in_sync !=1 )/* Didn't work. Clear per-cpu in sync bit again. */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 201/444 net: phy: bcm54811: PHY initialization
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kamil Horák - 2N <[email protected]>
[ Upstream commit 3117a11fff5af9e74f4946f07cb3ca083cbbdf4b ]
Reset the bit 12 in PHY's LRE Control register upon initialization. According to the datasheet, this bit must be written to zero after every device reset.
--- drivers/net/phy/broadcom.c | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-)
drivers/net/phy/broadcom.c +21 -4
@@ -655,7 +655,7 @@ static int bcm5481x_read_abilities(struct phy_device *phydev) {struct device_node *np = phydev->mdio.dev.of_node;struct bcm54xx_phy_priv *priv = phydev->priv; -int i, val, err; +int i, val, err, aneg;for (i =0 ; i <ARRAY_SIZE (bcm54811_linkmodes); i++)linkmode_clear_bit (bcm54811_linkmodes[i], phydev->supported);
@@ -676,9 +676,19 @@ static int bcm5481x_read_abilities(struct phy_device *phydev)if (val <0 )return val; +/* BCM54811 is not capable of LDS but the corresponding bit +* in LRESR is set to 1 and marked "Ignore" in the datasheet. +* So we must read the bcm54811 as unable to auto-negotiate +* in BroadR-Reach mode. +*/ +if (BRCM_PHY_MODEL (phydev) ==PHY_ID_BCM54811 ) + aneg =0 ; +else + aneg = val &LRESR_LDSABILITY ; +linkmode_mod_bit (ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported, - val &LRESR_LDSABILITY ); + aneg);linkmode_mod_bit (ETHTOOL_LINK_MODE_100baseT1_Full_BIT, phydev->supported, val &LRESR_100_1PAIR );
@@ -735,8 +745,15 @@ static int bcm54811_config_aneg(struct phy_device *phydev)/* Aneg firstly. */ if (priv->brr_mode) { -/* BCM54811 is only capable of autonegotiation in IEEE mode */ - phydev->autoneg =0 ; +/* BCM54811 is only capable of autonegotiation in IEEE mode. +* In BroadR-Reach mode, disable the Long Distance Signaling, +* the BRR mode autoneg as supported in other Broadcom PHYs. +* This bit is marked as "Reserved" and "Default 1, must be +* written to 0 after every device reset" in the datasheet. +*/ + ret =phy_modify (phydev,MII_BCM54XX_LRECR ,LRECR_LDSEN ,0 ); +if (ret <0 ) +return ret; ret =bcm_config_lre_aneg (phydev, false); }else { ret =genphy_config_aneg (phydev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 202/444 sched/fair: Bump sd->max_newidle_lb_cost when newidle balance fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
[ Upstream commit 155213a2aed42c85361bf4f5c817f5cb68951c3b ]
schbench (https://github.com/masoncl/schbench.git) is showing a regression from previous production kernels that bisected down to:
sched/fair: Remove sysctl_sched_migration_cost condition (c5b0a7eefc)
The schbench command line was:
schbench -L -m 4 -M auto -t 256 -n 0 -r 0 -s 0
This creates 4 message threads pinned to CPUs 0-3, and 256x4 worker threads spread across the rest of the CPUs. Neither the worker threads or the message threads do any work, they just wake each other up and go back to sleep as soon as possible.
The end result is the first 4 CPUs are pegged waking up those 1024 workers, and the rest of the CPUs are constantly banging in and out of idle. If I take a v6.9 Linus kernel and revert that one commit, performance goes from 3.4M RPS to 5.4M RPS.
schedstat shows there are ~100x more new idle balance operations, and profiling shows the worker threads are spending ~20% of their CPU time on new idle balance. schedstats also shows that almost all of these new idle balance attemps are failing to find busy groups.
The fix used here is to crank up the cost of the newidle balance whenever it fails. Since we don't want sd->max_newidle_lb_cost to grow out of control, this also changes update_newidle_cost() to use sysctl_sched_migration_cost as the upper limit on max_newidle_lb_cost.
--- kernel/sched/fair.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
kernel/sched/fair.c +16 -3
@@ -12220,8 +12220,14 @@ static inline bool update_newidle_cost(struct sched_domain *sd, u64 cost)/* * Track max cost of a domain to make sure to not delay the * next wakeup on the CPU. +* +* sched_balance_newidle() bumps the cost whenever newidle +* balance fails, and we don't want things to grow out of +* control. Use the sysctl_sched_migration_cost as the upper +* limit, plus a litle extra to avoid off by ones. */ - sd->max_newidle_lb_cost = cost; + sd->max_newidle_lb_cost = +min (cost, sysctl_sched_migration_cost +200 ); sd->last_decay_max_lb_cost = jiffies; }else if (time_after (jiffies, sd->last_decay_max_lb_cost +HZ )) {/*
@@ -12926,10 +12932,17 @@ static int sched_balance_newidle(struct rq *this_rq, struct rq_flags *rf) t1 =sched_clock_cpu (this_cpu); domain_cost = t1 - t0; -update_newidle_cost (sd, domain_cost); - curr_cost += domain_cost; t0 = t1; + +/* +* Failing newidle means it is not effective; +* bump the cost so we end up doing less of it. +*/ +if (!pulled_task) + domain_cost = (3 * sd->max_newidle_lb_cost) /2 ; + +update_newidle_cost (sd, domain_cost); }/*
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 203/444 wifi: mac80211: dont complete management TX on SAE commit
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
[ Upstream commit 6b04716cdcac37bdbacde34def08bc6fdb5fc4e2 ]
When SAE commit is sent and received in response, there's no ordering for the SAE confirm messages. As such, don't call drivers to stop listening on the channel when the confirm message is still expected.
This fixes an issue if the local confirm is transmitted later than the AP's confirm, for iwlwifi (and possibly mt76) the AP's confirm would then get lost since the device isn't on the channel at the time the AP transmit the confirm.
For iwlwifi at least, this also improves the overall timing of the authentication handshake (by about 15ms according to the report), likely since the session protection won't be aborted and rescheduled.
Note that even before this, mgd_complete_tx() wasn't always called for each call to mgd_prepare_tx() (e.g. in the case of WEP key shared authentication), and the current drivers that have the complete callback don't seem to mind. Document this as well though.
--- include/net/mac80211.h | 2 ++ net/mac80211/mlme.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-)
include/net/mac80211.h +2 -0
@@ -4269,6 +4269,8 @@ struct ieee80211_prep_tx_info {* @mgd_complete_tx: Notify the driver that the response frame for a previously * transmitted frame announced with @mgd_prepare_tx was received, the data * is filled similarly to @mgd_prepare_tx though the duration is not used. +* Note that this isn't always called for each mgd_prepare_tx() call, for +* example for SAE the 'confirm' messages can be on the air in any order. * * @mgd_protect_tdls_discover: Protect a TDLS discovery session. After sending * a TDLS discovery-request, we expect a reply to arrive on the AP's
net/mac80211/mlme.c +8 -1
@@ -4292,6 +4292,7 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,struct ieee80211_prep_tx_info info = { .subtype =IEEE80211_STYPE_AUTH , }; +bool sae_need_confirm = false;lockdep_assert_wiphy (sdata->local->hw.wiphy);
@@ -4337,6 +4338,8 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, jiffies +IEEE80211_AUTH_WAIT_SAE_RETRY ; ifmgd->auth_data->timeout_started = true;run_again (sdata, ifmgd->auth_data->timeout); +if (auth_transaction ==1 ) + sae_need_confirm = true; goto notify_driver; }
@@ -4379,6 +4382,9 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata, ifmgd->auth_data->expected_transaction == 2)) {if (!ieee80211_mark_sta_auth (sdata))return ;/* ignore frame -- wait for timeout */ + } else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE && + auth_transaction == 1) { + sae_need_confirm = true; } else if (ifmgd->auth_data->algorithm == WLAN_AUTH_SAE && auth_transaction == 2) {sdata_info (sdata,"SAE peer confirmed\n" );
@@ -4387,7 +4393,8 @@ static void ieee80211_rx_mgmt_auth(struct ieee80211_sub_if_data *sdata,cfg80211_rx_mlme_mgmt (sdata->dev, (u8 *)mgmt, len); notify_driver: -drv_mgd_complete_tx (sdata->local, sdata, &info); +if (!sae_need_confirm) +drv_mgd_complete_tx (sdata->local, sdata, &info); }#define case_WLAN (type) \
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 204/444 wifi: mac80211: avoid weird state in error path
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miri Korenblit <[email protected]>
[ Upstream commit be1ba9ed221ffb95a8bb15f4c83d0694225ba808 ]
If we get to the error path of ieee80211_prep_connection, for example because of a FW issue, then ieee80211_vif_set_links is called with 0.
But the call to drv_change_vif_links from ieee80211_vif_update_links will probably fail as well, for the same reason.
In this case, the valid_links and active_links bitmaps will be reverted to the value of the failing connection.
Then, in the next connection, due to the logic of ieee80211_set_vif_links_bitmaps, valid_links will be set to the ID of the new connection assoc link, but the active_links will remain with the ID of the old connection's assoc link.
If those IDs are different, we get into a weird state of valid_links and active_links being different. One of the consequences of this state is to call drv_change_vif_links with new_links as 0, since the & operation between the bitmaps will be 0.
Since a removal of a link should always succeed, ignore the return value of drv_change_vif_links if it was called to only remove links, which is the case for the ieee80211_prep_connection's error path. That way, the bitmaps will not be reverted to have the value from the failing connection and will have 0, so the next connection will have a good state.
--- include/net/mac80211.h | 2 ++ net/mac80211/link.c | 9 ++++++++- 2 files changed, 10 insertions(+), 1 deletion(-)
include/net/mac80211.h +2 -0
@@ -4435,6 +4435,8 @@ struct ieee80211_prep_tx_info {* new links bitmaps may be 0 if going from/to a non-MLO situation. * The @old array contains pointers to the old bss_conf structures * that were already removed, in case they're needed. +* Note that removal of link should always succeed, so the return value +* will be ignored in a removal only case. * This callback can sleep. * @change_sta_links: Change the valid links of a station, similar to * @change_vif_links. This callback can sleep.
net/mac80211/link.c +8 -1
@@ -2,7 +2,7 @@/* * MLO link handling * -* Copyright (C) 2022-2024 Intel Corporation +* Copyright (C) 2022-2025 Intel Corporation */ #include <linux/slab.h> #include <linux/kernel.h>
@@ -365,6 +365,13 @@ static int ieee80211_vif_update_links(struct ieee80211_sub_if_data *sdata,ieee80211_update_apvlan_links (sdata); } +/* +* Ignore errors if we are only removing links as removal should +* always succeed +*/ +if (!new_links) + ret =0 ; +if (ret) {/* restore config */ memcpy (sdata->link, old_data,sizeof (old_data));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 205/444 s390/early: Copy last breaking event address to pt_regs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiko Carstens <[email protected]>
[ Upstream commit 7cf636c99b257c1b4b12066ab34fd5f06e8d892f ]
In case of an early crash the early program check handler also prints the last breaking event address which is contained within the pt_regs structure. However it is not initialized, and therefore a more or less random value is printed in case of a crash.
Copy the last breaking event address from lowcore to pt_regs in case of an early program check to address this. This also makes it easier to analyze early crashes.
--- arch/s390/kernel/early.c | 1 + 1 file changed, 1 insertion(+)
arch/s390/kernel/early.c +1 -0
@@ -183,6 +183,7 @@ void __init __do_early_pgm_check(struct pt_regs *regs) regs->int_code = lc->pgm_int_code; regs->int_parm_long = lc->trans_exc_code; + regs->last_break = lc->pgm_last_break; ip =__rewind_psw (regs->psw, regs->int_code >>16 );/* Monitor Event? Might be a warning */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 206/444 (powerpc/512) Fix possible `dma_unmap_single()` on uninitialized pointer
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 760b9b4f6de9a33ca56a05f950cabe82138d25bd ]
If the device configuration fails (if dma_dev->device_config()), sg_dma_address(&sg) is not initialized and the jump to err_dma_prep leads to calling dma_unmap_single() on sg_dma_address(&sg).
--- arch/powerpc/platforms/512x/mpc512x_lpbfifo.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
arch/powerpc/platforms/512x/mpc512x_lpbfifo.c +2 -4
@@ -240,10 +240,8 @@ static int mpc512x_lpbfifo_kick(void) dma_conf.src_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;/* Make DMA channel work with LPB FIFO data register */ -if (dma_dev->device_config (lpbfifo.chan, &dma_conf)) { - ret = -EINVAL ; - goto err_dma_prep; - } +if (dma_dev->device_config (lpbfifo.chan, &dma_conf)) +return -EINVAL ;sg_init_table (&sg,1 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 207/444 ipv6: mcast: Check inet6_dev->dead under idev->mc_lock in __ipv6_dev_mc_inc().
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kuniyuki Iwashima <[email protected]>
[ Upstream commit dbd40f318cf2f59759bd170c401adc20ba360a3e ]
Since commit 63ed8de4be81 ("mld: add mc_lock for protecting per-interface mld data"), every multicast resource is protected by inet6_dev->mc_lock.
RTNL is unnecessary in terms of protection but still needed for synchronisation between addrconf_ifdown() and __ipv6_dev_mc_inc().
Once we removed RTNL, there would be a race below, where we could add a multicast address to a dead inet6_dev.
CPU1 CPU2
==== ====
addrconf_ifdown() __ipv6_dev_mc_inc()
if (idev->dead) <-- false
dead = true return -ENODEV;
ipv6_mc_destroy_dev() / ipv6_mc_down()
mutex_lock(&idev->mc_lock)
...
mutex_unlock(&idev->mc_lock)
mutex_lock(&idev->mc_lock)
...
mutex_unlock(&idev->mc_lock)The race window can be easily closed by checking inet6_dev->dead under inet6_dev->mc_lock in __ipv6_dev_mc_inc() as addrconf_ifdown() will acquire it after marking inet6_dev dead.
Let's check inet6_dev->dead under mc_lock in __ipv6_dev_mc_inc().
Note that now __ipv6_dev_mc_inc() no longer depends on RTNL and we can remove ASSERT_RTNL() there and the RTNL comment above addrconf_join_solict().
--- net/ipv6/addrconf.c | 7 +++---- net/ipv6/mcast.c | 11 +++++------ 2 files changed, 8 insertions(+), 10 deletions(-)
net/ipv6/addrconf.c +3 -4
@@ -2228,13 +2228,12 @@ void addrconf_dad_failure(struct sk_buff *skb, struct inet6_ifaddr *ifp)in6_ifa_put (ifp); } -/* Join to solicited addr multicast group. -* caller must hold RTNL */ +/* Join to solicited addr multicast group. */ void addrconf_join_solict (struct net_device *dev,const struct in6_addr *addr) {struct in6_addr maddr; -if (dev->flags&(IFF_LOOPBACK |IFF_NOARP )) +if (READ_ONCE (dev->flags) & (IFF_LOOPBACK |IFF_NOARP ))return ;addrconf_addr_solict_mult (addr, &maddr);
@@ -3883,7 +3882,7 @@ static int addrconf_ifdown(struct net_device *dev, bool unregister)* Do not dev_put! */ if (unregister) { - idev->dead =1 ; +WRITE_ONCE (idev->dead,1 );/* protected by rtnl_lock */ RCU_INIT_POINTER (dev->ip6_ptr,NULL );
net/ipv6/mcast.c +5 -6
@@ -907,23 +907,22 @@ static struct ifmcaddr6 *mca_alloc(struct inet6_dev *idev,static int __ipv6_dev_mc_inc (struct net_device *dev,const struct in6_addr *addr,unsigned int mode) { -struct ifmcaddr6 *mc;struct inet6_dev *idev; - -ASSERT_RTNL (); +struct ifmcaddr6 *mc;/* we need to take a reference on idev */ idev =in6_dev_get (dev); -if (!idev)return -EINVAL ; -if (idev->dead) { +mutex_lock (&idev->mc_lock); + +if (READ_ONCE (idev->dead)) { +mutex_unlock (&idev->mc_lock);in6_dev_put (idev);return -ENODEV ; } -mutex_lock (&idev->mc_lock);for_each_mc_mclock (idev, mc) {if (ipv6_addr_equal (&mc->mca_addr, addr)) { mc->mca_users++;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 208/444 rcu/nocb: Fix possible invalid rdps->nocb_cb_kthread pointer access
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zqiang <[email protected]>
[ Upstream commit 1bba3900ca18bdae28d1b9fa10f16a8f8cb2ada1 ]
In the preparation stage of CPU online, if the corresponding the rdp's->nocb_cb_kthread does not exist, will be created, there is a situation where the rdp's rcuop kthreads creation fails, and then de-offload this CPU's rdp, does not assign this CPU's rdp->nocb_cb_kthread pointer, but this rdp's->nocb_gp_rdp and rdp's->rdp_gp->nocb_gp_kthread is still valid.
This will cause the subsequent re-offload operation of this offline CPU, which will pass the conditional check and the kthread_unpark() will access invalid rdp's->nocb_cb_kthread pointer.
This commit therefore use rdp's->nocb_gp_kthread instead of rdp_gp's->nocb_gp_kthread for safety check.
--- kernel/rcu/tree_nocb.h | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
kernel/rcu/tree_nocb.h +2 -3
@@ -1152,7 +1152,6 @@ static bool rcu_nocb_rdp_offload_wait_cond(struct rcu_data *rdp)static int rcu_nocb_rdp_offload (struct rcu_data *rdp) {int wake_gp; -struct rcu_data *rdp_gp = rdp->nocb_gp_rdp;WARN_ON_ONCE (cpu_online (rdp->cpu));/*
@@ -1162,7 +1161,7 @@ static int rcu_nocb_rdp_offload(struct rcu_data *rdp)if (!rdp->nocb_gp_rdp)return -EINVAL ; -if (WARN_ON_ONCE (!rdp_gp->nocb_gp_kthread)) +if (WARN_ON_ONCE (!rdp->nocb_gp_kthread))return -EINVAL ;pr_info ("Offloading %d\n" , rdp->cpu);
@@ -1172,7 +1171,7 @@ static int rcu_nocb_rdp_offload(struct rcu_data *rdp) wake_gp =rcu_nocb_queue_toggle_rdp (rdp);if (wake_gp) -wake_up_process (rdp_gp->nocb_gp_kthread); +wake_up_process (rdp->nocb_gp_kthread);swait_event_exclusive (rdp->nocb_state_wq,rcu_nocb_rdp_offload_wait_cond (rdp));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 209/444 wifi: mac80211: fix rx link assignment for non-MLO stations
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hari Chandrakanthan <[email protected]>
[ Upstream commit cc2b722132893164bcb3cee4f08ed056e126eb6c ]
Currently, ieee80211_rx_data_set_sta() does not correctly handle the case where the interface supports multiple links (MLO), but the station does not (non-MLO). This can lead to incorrect link assignment or unexpected warnings when accessing link information.
Hence, add a fix to check if the station lacks valid link support and use its default link ID for rx->link assignment. If the station unexpectedly has valid links, fall back to the default link.
This ensures correct link association and prevents potential issues in mixed MLO/non-MLO environments.
--- net/mac80211/rx.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
net/mac80211/rx.c +9 -3
@@ -4283,10 +4283,16 @@ static bool ieee80211_rx_data_set_sta(struct ieee80211_rx_data *rx, rx->link_sta =NULL ; } -if (link_id <0 ) - rx->link = &rx->sdata->deflink; -else if (!ieee80211_rx_data_set_link (rx, link_id)) +if (link_id <0 ) { +if (ieee80211_vif_is_mld (&rx->sdata->vif) && + sta && !sta->sta.valid_links) + rx->link = +rcu_dereference (rx->sdata->link[sta->deflink.link_id]); +else + rx->link = &rx->sdata->deflink; + }else if (!ieee80211_rx_data_set_link (rx, link_id)) {return false; + }return true; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 210/444 drm/msm: use trylock for debugfs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rob Clark <[email protected]>
[ Upstream commit 0a1ff88ec5b60b41ba830c5bf08b6cd8f45ab411 ]
This resolves a potential deadlock vs msm_gem_vm_close(). Otherwise for _NO_SHARE buffers msm_gem_describe() could be trying to acquire the shared vm resv, while already holding priv->obj_lock. But _vm_close() might drop the last reference to a GEM obj while already holding the vm resv, and msm_gem_free_object() needs to grab priv->obj_lock, a locking inversion.
OTOH this is only for debugfs and it isn't critical if we undercount by skipping a locked obj. So just use trylock() and move along if we can't get the lock.
Patchwork: https://patchwork.freedesktop.org/patch/661525/
--- drivers/gpu/drm/msm/msm_gem.c | 3 ++- drivers/gpu/drm/msm/msm_gem.h | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_gem.c +2 -1
@@ -963,7 +963,8 @@ void msm_gem_describe(struct drm_gem_object *obj, struct seq_file *m,uint64_t off =drm_vma_node_start (&obj->vma_node);const char *madv; -msm_gem_lock (obj); +if (!msm_gem_trylock (obj)) +return ; stats->all.count++; stats->all.size += obj->size;
drivers/gpu/drm/msm/msm_gem.h +6 -0
@@ -188,6 +188,12 @@ msm_gem_lock(struct drm_gem_object *obj)dma_resv_lock (obj->resv,NULL ); } +static inline bool __must_check +msm_gem_trylock (struct drm_gem_object *obj) +{ +return dma_resv_trylock (obj->resv); +} +static inline int msm_gem_lock_interruptible (struct drm_gem_object *obj) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 211/444 drm/msm: Add error handling for krealloc in metadata setup
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit 1c8c354098ea9d4376a58c96ae6b65288a6f15d8 ]
Function msm_ioctl_gem_info_set_metadata() now checks for krealloc failure and returns -ENOMEM, avoiding potential NULL pointer dereference. Explicitly avoids __GFP_NOFAIL due to deadlock risks and allocation constraints.
Patchwork: https://patchwork.freedesktop.org/patch/661235/
--- drivers/gpu/drm/msm/msm_drv.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/gpu/drm/msm/msm_drv.c +8 -1
@@ -550,6 +550,7 @@ static int msm_ioctl_gem_info_set_metadata(struct drm_gem_object *obj, u32 metadata_size) {struct msm_gem_object *msm_obj =to_msm_bo (obj); +void *new_metadata;void *buf;int ret;
@@ -567,8 +568,14 @@ static int msm_ioctl_gem_info_set_metadata(struct drm_gem_object *obj,if (ret) goto out; - msm_obj->metadata = + new_metadata =krealloc (msm_obj->metadata, metadata_size,GFP_KERNEL ); +if (!new_metadata) { + ret = -ENOMEM ; + goto out; + } + + msm_obj->metadata = new_metadata; msm_obj->metadata_size = metadata_size;memcpy (msm_obj->metadata, buf, metadata_size);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 212/444 perf/arm: Add missing .suppress_bind_attrs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Robin Murphy <[email protected]>
[ Upstream commit 860a831de138a7ad6bc86019adaf10eb84c02655 ]
PMU drivers should set .suppress_bind_attrs so that userspace is denied the opportunity to pull the driver out from underneath an in-use PMU (with predictably unpleasant consequences). Somehow both the CMN and NI drivers have managed to miss this; put that right.
--- drivers/perf/arm-cmn.c | 1 + drivers/perf/arm-ni.c | 1 + 2 files changed, 2 insertions(+)
drivers/perf/arm-cmn.c +1 -0
@@ -2661,6 +2661,7 @@ static struct platform_driver arm_cmn_driver = { .name = "arm-cmn", .of_match_table = of_match_ptr(arm_cmn_of_match), .acpi_match_table = ACPI_PTR(arm_cmn_acpi_match), + .suppress_bind_attrs = true, }, .probe = arm_cmn_probe, .remove_new = arm_cmn_remove,
drivers/perf/arm-ni.c +1 -0
@@ -710,6 +710,7 @@ static struct platform_driver arm_ni_driver = { .name = "arm-ni", .of_match_table = of_match_ptr(arm_ni_of_match), .acpi_match_table = ACPI_PTR(arm_ni_acpi_match), + .suppress_bind_attrs = true, }, .probe = arm_ni_probe, .remove = arm_ni_remove,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 213/444 drm/imagination: Clear runtime PM errors while resetting the GPU
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alessio Belle <[email protected]>
[ Upstream commit 551507e0d0bf32ce1d7d27533c4b98307380804c ]
The runtime PM might be left in error state if one of the callbacks returned an error, e.g. if the (auto)suspend callback failed following a firmware crash.
When that happens, any further attempt to acquire or release a power reference will then also fail, making it impossible to do anything else with the GPU. The driver logic will eventually reach the reset code.
In pvr_power_reset(), replace pvr_power_get() with a new API pvr_power_get_clear() which also attempts to clear any runtime PM error state if acquiring a power reference is not possible.
--- drivers/gpu/drm/imagination/pvr_power.c | 59 ++++++++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-)
drivers/gpu/drm/imagination/pvr_power.c +58 -1
@@ -317,6 +317,63 @@ pvr_power_device_idle(struct device *dev)return pvr_power_is_idle (pvr_dev) ?0 : -EBUSY ; } +static int +pvr_power_clear_error (struct pvr_device *pvr_dev) +{ +struct device *dev =from_pvr_device (pvr_dev)->dev; +int err; + +/* Ensure the device state is known and nothing is happening past this point */ +pm_runtime_disable (dev); + +/* Attempt to clear the runtime PM error by setting the current state again */ +if (pm_runtime_status_suspended (dev)) + err =pm_runtime_set_suspended (dev); +else + err =pm_runtime_set_active (dev); + +if (err) { +drm_err (from_pvr_device (pvr_dev), +"%s: Failed to clear runtime PM error (new error %d)\n" , + __func__, err); + } + +pm_runtime_enable (dev); + +return err; +} + +/** +* pvr_power_get_clear() - Acquire a power reference, correcting any errors +* @pvr_dev: Device pointer +* +* Attempt to acquire a power reference on the device. If the runtime PM +* is in error state, attempt to clear the error and retry. +* +* Returns: +* * 0 on success, or +* * Any error code returned by pvr_power_get() or the runtime PM API. +*/ +static int +pvr_power_get_clear (struct pvr_device *pvr_dev) +{ +int err; + + err =pvr_power_get (pvr_dev); +if (err ==0 ) +return err; + +drm_warn (from_pvr_device (pvr_dev), +"%s: pvr_power_get returned error %d, attempting recovery\n" , + __func__, err); + + err =pvr_power_clear_error (pvr_dev); +if (err) +return err; + +return pvr_power_get (pvr_dev); +} +/** * pvr_power_reset() - Reset the GPU * @pvr_dev: Device pointer
@@ -341,7 +398,7 @@ pvr_power_reset(struct pvr_device *pvr_dev, bool hard_reset)* Take a power reference during the reset. This should prevent any interference with the * power state during reset. */ -WARN_ON (pvr_power_get (pvr_dev)); +WARN_ON (pvr_power_get_clear (pvr_dev));down_write (&pvr_dev->reset_sem);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 214/444 wifi: rtw89: Fix rtw89_mac_power_switch() for USB
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bitterblue Smith <[email protected]>
[ Upstream commit e2b71603333a9dd73ee88347d8894fffc3456ac1 ]
Clear some bits in some registers in order to allow RTL8851BU to power on. This is done both when powering on and when powering off because that's what the vendor driver does.
Also tested with RTL8832BU and RTL8832CU.
--- drivers/net/wireless/realtek/rtw89/mac.c | 19 +++++++++++++++++++ drivers/net/wireless/realtek/rtw89/reg.h | 1 + 2 files changed, 20 insertions(+)
drivers/net/wireless/realtek/rtw89/mac.c +19 -0
@@ -1441,6 +1441,23 @@ void rtw89_mac_notify_wake(struct rtw89_dev *rtwdev)rtw89_mac_send_rpwm (rtwdev, state, true); } +static void rtw89_mac_power_switch_boot_mode (struct rtw89_dev *rtwdev) +{ +u32 boot_mode; + +if (rtwdev->hci.type !=RTW89_HCI_TYPE_USB ) +return ; + + boot_mode =rtw89_read32_mask (rtwdev,R_AX_GPIO_MUXCFG ,B_AX_BOOT_MODE ); +if (!boot_mode) +return ; + +rtw89_write32_clr (rtwdev,R_AX_SYS_PW_CTRL ,B_AX_APFN_ONMAC ); +rtw89_write32_clr (rtwdev,R_AX_SYS_STATUS1 ,B_AX_AUTO_WLPON ); +rtw89_write32_clr (rtwdev,R_AX_GPIO_MUXCFG ,B_AX_BOOT_MODE ); +rtw89_write32_clr (rtwdev,R_AX_RSV_CTRL ,B_AX_R_DIS_PRST ); +} +static int rtw89_mac_power_switch (struct rtw89_dev *rtwdev,bool on) {#define PWR_ACT 1
@@ -1450,6 +1467,8 @@ static int rtw89_mac_power_switch(struct rtw89_dev *rtwdev, bool on)int ret;u8 val; +rtw89_mac_power_switch_boot_mode (rtwdev); +if (on) { cfg_seq = chip->pwr_on_seq; cfg_func = chip->ops->pwr_on_func;
drivers/net/wireless/realtek/rtw89/reg.h +1 -0
@@ -182,6 +182,7 @@#define R_AX_SYS_STATUS1 0x00F4#define B_AX_SEL_0XC0_MASK GENMASK(17, 16) +#define B_AX_AUTO_WLPON BIT(10)#define B_AX_PAD_HCI_SEL_V2_MASK GENMASK(5, 3)#define MAC_AX_HCI_SEL_SDIO_UART 0#define MAC_AX_HCI_SEL_MULTI_USB 1
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 215/444 wifi: mt76: mt7915: mcu: re-init MCU before loading FW patch
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Bauer <[email protected]>
[ Upstream commit ac9c50c79eaef5fca0f165e45d0c5880606db53e ]
Restart the MCU and release the patch semaphore before loading the MCU patch firmware from the host.
This fixes failures upon error recovery in case the semaphore was previously taken and never released by the host.
This happens from time to time upon triggering a full-chip error recovery. Under this circumstance, the hardware restart fails and the radio is rendered inoperational.
--- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +15 -10
@@ -2071,16 +2071,21 @@ static int mt7915_load_firmware(struct mt7915_dev *dev) {int ret; -/* make sure fw is download state */ -if (mt7915_firmware_state (dev, false)) { -/* restart firmware once */ -mt76_connac_mcu_restart (&dev->mt76); - ret =mt7915_firmware_state (dev, false); -if (ret) { -dev_err (dev->mt76.dev, -"Firmware is not ready for download\n" ); -return ret; - } +/* Release Semaphore if taken by previous failed attempt */ + ret =mt76_connac_mcu_patch_sem_ctrl (&dev->mt76, false); +if (ret !=PATCH_REL_SEM_SUCCESS ) { +dev_err (dev->mt76.dev,"Could not release semaphore\n" ); +/* Continue anyways */ + } + +/* Always restart MCU firmware */ +mt76_connac_mcu_restart (&dev->mt76); + +/* Check if MCU is ready */ + ret =mt7915_firmware_state (dev, false); +if (ret) { +dev_err (dev->mt76.dev,"Firmware did not enter download state\n" ); +return ret; } ret =mt76_connac2_load_patch (&dev->mt76,fw_name_var (dev,ROM_PATCH ));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 216/444 kselftest/arm64: Specify SVE data when testing VL set in sve-ptrace
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Brown <[email protected]>
[ Upstream commit 9e8ebfe677f9101bbfe1f75d548a5aec581e8213 ]
Since f916dd32a943 ("arm64/fpsimd: ptrace: Mandate SVE payload for streaming-mode state") we reject attempts to write to the streaming mode regset even if there is no register data supplied, causing the tests for setting vector lengths and setting SVE_VL_INHERIT in sve-ptrace to spuriously fail. Set the flag to avoid the issue, we still support not supplying register data.
--- tools/testing/selftests/arm64/fp/sve-ptrace.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/testing/selftests/arm64/fp/sve-ptrace.c +2 -1
@@ -168,7 +168,7 @@ static void ptrace_set_get_inherit(pid_t child, const struct vec_type *type)memset (&sve,0 ,sizeof (sve)); sve.size =sizeof (sve); sve.vl =sve_vl_from_vq (SVE_VQ_MIN ); - sve.flags =SVE_PT_VL_INHERIT ; + sve.flags =SVE_PT_VL_INHERIT |SVE_PT_REGS_SVE ; ret =set_sve (child, type, &sve);if (ret !=0 ) { ksft_test_result_fail("Failed to set %s SVE_PT_VL_INHERIT\n",
@@ -233,6 +233,7 @@ static void ptrace_set_get_vl(pid_t child, const struct vec_type *type,/* Set the VL by doing a set with no register payload */ memset (&sve,0 ,sizeof (sve)); sve.size =sizeof (sve); + sve.flags =SVE_PT_REGS_SVE ; sve.vl = vl; ret =set_sve (child, type, &sve);if (ret !=0 ) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 217/444 drm/xe/xe_query: Use separate iterator while filling GT list
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matt Roper <[email protected]>
[ Upstream commit d4eb4a010262ea7801e576d1033b355910f2f7d4 ]
The 'id' value updated by for_each_gt() is the uapi GT ID of the GTs being iterated over, and may skip over values if a GT is not present on the device. Use a separate iterator for GT list array assignments to ensure that the array will be filled properly on future platforms where index in the GT query list may not match the uapi ID.
v2:
- Include the missing increment of the iterator. (Jonathan)
--- drivers/gpu/drm/xe/xe_query.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-)
drivers/gpu/drm/xe/xe_query.c +15 -12
@@ -366,6 +366,7 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *querystruct drm_xe_query_gt_list __user *query_ptr =u64_to_user_ptr (query->data);struct drm_xe_query_gt_list *gt_list; +int iter =0 ;u8 id;if (query->size ==0 ) {
@@ -383,12 +384,12 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *queryfor_each_gt (gt, xe, id) {if (xe_gt_is_media_type (gt)) - gt_list->gt_list[id].type =DRM_XE_QUERY_GT_TYPE_MEDIA ; + gt_list->gt_list[iter].type =DRM_XE_QUERY_GT_TYPE_MEDIA ;else - gt_list->gt_list[id].type =DRM_XE_QUERY_GT_TYPE_MAIN ; - gt_list->gt_list[id].tile_id =gt_to_tile (gt)->id; - gt_list->gt_list[id].gt_id = gt->info.id; - gt_list->gt_list[id].reference_clock = gt->info.reference_clock; + gt_list->gt_list[iter].type =DRM_XE_QUERY_GT_TYPE_MAIN ; + gt_list->gt_list[iter].tile_id =gt_to_tile (gt)->id; + gt_list->gt_list[iter].gt_id = gt->info.id; + gt_list->gt_list[iter].reference_clock = gt->info.reference_clock;/* * The mem_regions indexes in the mask below need to * directly identify the struct
@@ -404,19 +405,21 @@ static int query_gt_list(struct xe_device *xe, struct drm_xe_device_query *query* assumption. */ if (!IS_DGFX (xe)) - gt_list->gt_list[id].near_mem_regions =0x1 ; + gt_list->gt_list[iter].near_mem_regions =0x1 ;else - gt_list->gt_list[id].near_mem_regions = + gt_list->gt_list[iter].near_mem_regions =BIT (gt_to_tile (gt)->id) <<1 ; - gt_list->gt_list[id].far_mem_regions = xe->info.mem_region_mask ^ - gt_list->gt_list[id].near_mem_regions; + gt_list->gt_list[iter].far_mem_regions = xe->info.mem_region_mask ^ + gt_list->gt_list[iter].near_mem_regions; - gt_list->gt_list[id].ip_ver_major = + gt_list->gt_list[iter].ip_ver_major =REG_FIELD_GET (GMD_ID_ARCH_MASK , gt->info.gmdid); - gt_list->gt_list[id].ip_ver_minor = + gt_list->gt_list[iter].ip_ver_minor =REG_FIELD_GET (GMD_ID_RELEASE_MASK , gt->info.gmdid); - gt_list->gt_list[id].ip_ver_rev = + gt_list->gt_list[iter].ip_ver_rev =REG_FIELD_GET (GMD_ID_REVID , gt->info.gmdid); + + iter++; }if (copy_to_user (query_ptr, gt_list, size)) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 218/444 net: thunderbolt: Enable end-to-end flow control also in transmit
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhangjianrong <[email protected]>
[ Upstream commit a8065af3346ebd7c76ebc113451fb3ba94cf7769 ]
According to USB4 specification, if E2E flow control is disabled for the Transmit Descriptor Ring, the Host Interface Adapter Layer shall not require any credits to be available before transmitting a Tunneled Packet from this Transmit Descriptor Ring, so e2e flow control should be enabled in both directions.
--- drivers/net/thunderbolt/main.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/net/thunderbolt/main.c +6 -7
@@ -924,8 +924,12 @@ static int tbnet_open(struct net_device *dev)netif_carrier_off (dev); - ring =tb_ring_alloc_tx (xd->tb->nhi,-1 ,TBNET_RING_SIZE , -RING_FLAG_FRAME ); + flags =RING_FLAG_FRAME ; +/* Only enable full E2E if the other end supports it too */ +if (tbnet_e2e && net->svc->prtcstns &TBNET_E2E ) + flags |=RING_FLAG_E2E ; + + ring =tb_ring_alloc_tx (xd->tb->nhi,-1 ,TBNET_RING_SIZE , flags);if (!ring) {netdev_err (dev,"failed to allocate Tx ring\n" );return -ENOMEM ;
@@ -944,11 +948,6 @@ static int tbnet_open(struct net_device *dev) sof_mask =BIT (TBIP_PDF_FRAME_START ); eof_mask =BIT (TBIP_PDF_FRAME_END ); - flags =RING_FLAG_FRAME ; -/* Only enable full E2E if the other end supports it too */ -if (tbnet_e2e && net->svc->prtcstns &TBNET_E2E ) - flags |=RING_FLAG_E2E ; - ring =tb_ring_alloc_rx (xd->tb->nhi,-1 ,TBNET_RING_SIZE , flags, net->tx_ring.ring->hop, sof_mask, eof_mask, tbnet_start_poll, net);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 219/444 net: thunderbolt: Fix the parameter passing of tb_xdomain_enable_paths()/tb_xdomain_disable_paths()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: zhangjianrong <[email protected]>
[ Upstream commit 8ec31cb17cd355cea25cdb8496d9b3fbf1321647 ]
According to the description of tb_xdomain_enable_paths(), the third parameter represents the transmit ring and the fifth parameter represents the receive ring. tb_xdomain_disable_paths() is the same case.
[Jakub] Mika says: it works now because both rings ->hop is the same
--- drivers/net/thunderbolt/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/thunderbolt/main.c +4 -4
@@ -396,9 +396,9 @@ static void tbnet_tear_down(struct tbnet *net, bool send_logout) ret =tb_xdomain_disable_paths (net->xd, net->local_transmit_path, - net->rx_ring.ring->hop, + net->tx_ring.ring->hop, net->remote_transmit_path, - net->tx_ring.ring->hop); + net->rx_ring.ring->hop);if (ret)netdev_warn (net->dev,"failed to disable DMA paths\n" );
@@ -662,9 +662,9 @@ static void tbnet_connected_work(struct work_struct *work) goto err_free_rx_buffers; ret =tb_xdomain_enable_paths (net->xd, net->local_transmit_path, - net->rx_ring.ring->hop, + net->tx_ring.ring->hop, net->remote_transmit_path, - net->tx_ring.ring->hop); + net->rx_ring.ring->hop);if (ret) {netdev_err (net->dev,"failed to enable DMA paths\n" ); goto err_free_tx_buffers;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 220/444 xfrm: Duplicate SPI Handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aakash Kumar S <[email protected]>
[ Upstream commit 94f39804d891cffe4ce17737d295f3b195bc7299 ]
The issue originates when Strongswan initiates an XFRM_MSG_ALLOCSPI Netlink message, which triggers the kernel function xfrm_alloc_spi(). This function is expected to ensure uniqueness of the Security Parameter Index (SPI) for inbound Security Associations (SAs). However, it can return success even when the requested SPI is already in use, leading to duplicate SPIs assigned to multiple inbound SAs, differentiated only by their destination addresses.
This behavior causes inconsistencies during SPI lookups for inbound packets. Since the lookup may return an arbitrary SA among those with the same SPI, packet processing can fail, resulting in packet drops.
According to RFC 4301 section 4.4.2 , for inbound processing a unicast SA is uniquely identified by the SPI and optionally protocol.
Reproducing the Issue Reliably:
To consistently reproduce the problem, restrict the available SPI range in charon.conf : spi_min = 0x10000000 spi_max = 0x10000002
This limits the system to only 2 usable SPI values.
Next, create more than 2 Child SA. each using unique pair of src/dst address. As soon as the 3rd Child SA is initiated, it will be assigned a duplicate SPI, since the SPI pool is already exhausted.
With a narrow SPI range, the issue is consistently reproducible. With a broader/default range, it becomes rare and unpredictable.
Current implementation:xfrm_spi_hash() lookup function computes hash using daddr, proto, and family. So if two SAs have the same SPI but different destination addresses, then they will:
a. Hash into different buckets
b. Be stored in different linked lists (byspi + h)
c. Not be seen in the same hlist_for_each_entry_rcu() iteration.
As a result, the lookup will result in NULL and kernel allows that Duplicate SPI
Proposed Change:xfrm_state_lookup_spi_proto() does a truly global search - across all states, regardless of hash bucket and matches SPI and proto.
--- net/xfrm/xfrm_state.c | 72 ++++++++++++++++++++++++++----------------- 1 file changed, 43 insertions(+), 29 deletions(-)
net/xfrm/xfrm_state.c +43 -29
@@ -1637,6 +1637,26 @@ struct xfrm_state *xfrm_state_lookup_byspi(struct net *net, __be32 spi, }EXPORT_SYMBOL (xfrm_state_lookup_byspi); +static struct xfrm_state *xfrm_state_lookup_spi_proto (struct net *net,__be32 spi,u8 proto) +{ +struct xfrm_state *x; +unsigned int i; + +rcu_read_lock (); +for (i =0 ; i <= net->xfrm.state_hmask; i++) { +hlist_for_each_entry_rcu (x, &net->xfrm.state_byspi[i], byspi) { +if (x->id.spi == spi && x->id.proto == proto) { +if (!xfrm_state_hold_rcu (x)) +continue ; +rcu_read_unlock (); +return x; + } + } + } +rcu_read_unlock (); +return NULL ; +} +static void __xfrm_state_insert (struct xfrm_state *x) {struct net *net =xs_net (x);
@@ -2465,10 +2485,8 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high,unsigned int h;struct xfrm_state *x0;int err = -ENOENT ; -__be32 minspi =htonl (low); -__be32 maxspi =htonl (high); +u32 range = high - low +1 ;__be32 newspi =0 ; -u32 mark = x->mark.v & x->mark.m;spin_lock_bh (&x->lock);if (x->km.state ==XFRM_STATE_DEAD ) {
@@ -2482,38 +2500,34 @@ int xfrm_alloc_spi(struct xfrm_state *x, u32 low, u32 high, err = -ENOENT ; -if (minspi == maxspi) { - x0 =xfrm_state_lookup (net, mark, &x->id.daddr, minspi, x->id.proto, x->props.family); -if (x0) { -NL_SET_ERR_MSG (extack,"Requested SPI is already in use" ); -xfrm_state_put (x0); +for (h =0 ; h < range; h++) { +u32 spi = (low == high) ? low :get_random_u32_inclusive (low, high); + newspi =htonl (spi); + +spin_lock_bh (&net->xfrm.xfrm_state_lock); + x0 =xfrm_state_lookup_spi_proto (net, newspi, x->id.proto); +if (!x0) { + x->id.spi = newspi; + h =xfrm_spi_hash (net, &x->id.daddr, newspi, x->id.proto, x->props.family); +XFRM_STATE_INSERT (byspi, &x->byspi, net->xfrm.state_byspi + h, x->xso.type); +spin_unlock_bh (&net->xfrm.xfrm_state_lock); + err =0 ; goto unlock; } - newspi = minspi; - }else { -u32 spi =0 ; -for (h =0 ; h < high-low+1 ; h++) { - spi =get_random_u32_inclusive (low, high); - x0 =xfrm_state_lookup (net, mark, &x->id.daddr,htonl (spi), x->id.proto, x->props.family); -if (x0 ==NULL ) { - newspi =htonl (spi); -break ; - } -xfrm_state_put (x0); +xfrm_state_put (x0); +spin_unlock_bh (&net->xfrm.xfrm_state_lock); + +if (signal_pending (current)) { + err = -ERESTARTSYS ; + goto unlock; } + +if (low == high) +break ; } -if (newspi) { -spin_lock_bh (&net->xfrm.xfrm_state_lock); - x->id.spi = newspi; - h =xfrm_spi_hash (net, &x->id.daddr, x->id.spi, x->id.proto, x->props.family); -XFRM_STATE_INSERT (byspi, &x->byspi, net->xfrm.state_byspi + h, - x->xso.type); -spin_unlock_bh (&net->xfrm.xfrm_state_lock); - err =0 ; - }else { +if (err)NL_SET_ERR_MSG (extack,"No SPI available in the requested range" ); - } unlock:spin_unlock_bh (&x->lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 221/444 net: atlantic: add set_power to fw_ops for atl2 to fix wol
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Work <[email protected]>
[ Upstream commit fad9cf216597a71936ac87143d1618fbbcf97cbe ]
Aquantia AQC113(C) using ATL2FW doesn't properly prepare the NIC for enabling wake-on-lan. The FW operation set_power was only implemented for hw_atl and not hw_atl2. Implement the set_power functionality for hw_atl2.
Tested with both AQC113 and AQC113C devices. Confirmed you can shutdown the system and wake from S5 using magic packets. NIC was previously powered off when entering S5. If the NIC was configured for WOL by the Windows driver, loading the atlantic driver would disable WOL.
Partially cherry-picks changes from commit,
https://github.com/Aquantia/AQtion/commit/37bd5cc
Attributing original authors from Marvell for the referenced commit.
--- .../net/ethernet/aquantia/atlantic/aq_hw.h | 2 + .../atlantic/hw_atl2/hw_atl2_utils_fw.c | 39 +++++++++++++++++++ 2 files changed, 41 insertions(+)
drivers/net/ethernet/aquantia/atlantic/aq_hw.h +2 -0
@@ -113,6 +113,8 @@ struct aq_stats_s {#define AQ_HW_POWER_STATE_D0 0U#define AQ_HW_POWER_STATE_D3 3U +#define AQ_FW_WAKE_ON_LINK_RTPM BIT(10) +#define AQ_HW_FLAG_STARTED 0x00000004U#define AQ_HW_FLAG_STOPPING 0x00000008U#define AQ_HW_FLAG_RESETTING 0x00000010U
drivers/net/ethernet/aquantia/atlantic/hw_atl2/hw_atl2_utils_fw.c +39 -0
@@ -462,6 +462,44 @@ static int aq_a2_fw_get_mac_temp(struct aq_hw_s *self, int *temp)return aq_a2_fw_get_phy_temp (self, temp); } +static int aq_a2_fw_set_wol_params (struct aq_hw_s *self,const u8 *mac,u32 wol) +{ +struct mac_address_aligned_s mac_address; +struct link_control_s link_control; +struct wake_on_lan_s wake_on_lan; + +memcpy (mac_address.aligned.mac_address, mac,ETH_ALEN ); +hw_atl2_shared_buffer_write (self, mac_address, mac_address); + +memset (&wake_on_lan,0 ,sizeof (wake_on_lan)); + +if (wol &WAKE_MAGIC ) + wake_on_lan.wake_on_magic_packet =1U ; + +if (wol & (WAKE_PHY |AQ_FW_WAKE_ON_LINK_RTPM )) + wake_on_lan.wake_on_link_up =1U ; + +hw_atl2_shared_buffer_write (self, sleep_proxy, wake_on_lan); + +hw_atl2_shared_buffer_get (self, link_control, link_control); + link_control.mode =AQ_HOST_MODE_SLEEP_PROXY ; +hw_atl2_shared_buffer_write (self, link_control, link_control); + +return hw_atl2_shared_buffer_finish_ack (self); +} + +static int aq_a2_fw_set_power (struct aq_hw_s *self,unsigned int power_state, +const u8 *mac) +{ +u32 wol = self->aq_nic_cfg->wol; +int err =0 ; + +if (wol) + err =aq_a2_fw_set_wol_params (self, mac, wol); + +return err; +} +static int aq_a2_fw_set_eee_rate (struct aq_hw_s *self,u32 speed) {struct link_options_s link_options;
@@ -605,6 +643,7 @@ const struct aq_fw_ops aq_a2_fw_ops = { .set_state = aq_a2_fw_set_state, .update_link_status = aq_a2_fw_update_link_status, .update_stats = aq_a2_fw_update_stats, + .set_power = aq_a2_fw_set_power, .get_mac_temp = aq_a2_fw_get_mac_temp, .get_phy_temp = aq_a2_fw_get_phy_temp, .set_eee_rate = aq_a2_fw_set_eee_rate,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 222/444 ACPI: Suppress misleading SPCR console message when SPCR table is absent
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Chen <[email protected]>
[ Upstream commit bad3fa2fb9206f4dcec6ddef094ec2fbf6e8dcb2 ]
The kernel currently alway prints:
"Use ACPI SPCR as default console: No/Yes "
even on systems that lack an SPCR table. This can mislead users into thinking the SPCR table exists on the machines without SPCR.
With this change, the "Yes" is only printed if the SPCR table is present, parsed and !param_acpi_nospcr. This avoids user confusion on SPCR-less systems.
--- arch/arm64/kernel/acpi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
arch/arm64/kernel/acpi.c +7 -3
@@ -197,6 +197,8 @@ static int __init acpi_fadt_sanity_check(void)*/ void __init acpi_boot_table_init (void ) { +int ret; +/* * Enable ACPI instead of device tree unless * - ACPI has been disabled explicitly (acpi=off), or
@@ -250,10 +252,12 @@ void __init acpi_boot_table_init(void)* behaviour, use acpi=nospcr to disable console in ACPI SPCR * table as default serial console. */ -acpi_parse_spcr (earlycon_acpi_spcr_enable, + ret =acpi_parse_spcr (earlycon_acpi_spcr_enable, !param_acpi_nospcr); -pr_info ("Use ACPI SPCR as default console: %s\n" , - param_acpi_nospcr ?"No" :"Yes" ); +if (!ret || param_acpi_nospcr || !IS_ENABLED (CONFIG_ACPI_SPCR_TABLE )) +pr_info ("Use ACPI SPCR as default console: No\n" ); +else +pr_info ("Use ACPI SPCR as default console: Yes\n" );if (IS_ENABLED (CONFIG_ACPI_BGRT ))acpi_table_parse (ACPI_SIG_BGRT , acpi_parse_bgrt);
Signature · 1 line
2.39.5
Re: [PATCH 6.12 222/444] ACPI: Suppress misleading SPCR console message when SPCR table is absent
Hi Greg,
Quoted 42 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Chen <[email protected]>
[ Upstream commit
bad3fa2fb9206f4dcec6ddef094ec2fbf6e8dcb2]The kernel currently alway prints:
"Use ACPI SPCR as default console: No/Yes"even on systems that lack an SPCR table. This can mislead users into thinking the SPCR table exists on the machines without SPCR.
With this change, the "Yes" is only printed if the SPCR table is present, parsed and !param_acpi_nospcr. This avoids user confusion on SPCR-less systems.
Signed-off-by Li Chen <[email protected]>Acked-by Hanjun Guo <[email protected]>Signed-off-by Catalin Marinas <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- arch/arm64/kernel/acpi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)arch/arm64/kernel/acpi.c +2
-0@@ -197,6 +197,8 @@ static int __init acpi_fadt_sanity_check(void)*/ void __init acpi_boot_table_init (void ) { +int ret; +/* * Enable ACPI instead of device tree unless * - ACPI has been disabled explicitly (acpi=off), or
arch/arm64/kernel/acpi.c void __init acpi_boot_table_init(void) · line 257
Quoted 9 lines
arch/arm64/kernel/acpi.c +2
-3@@ -250,10 +252,12 @@ void __init acpi_boot_table_init(void)* behaviour, use acpi=nospcr to disable console in ACPI SPCR * table as default serial console. */ -acpi_parse_spcr (earlycon_acpi_spcr_enable, + ret =acpi_parse_spcr (earlycon_acpi_spcr_enable, !param_acpi_nospcr); -pr_info ("Use ACPI SPCR as default console: %s\n" , - param_acpi_nospcr ?"No" :"Yes" ); +if (!ret || param_acpi_nospcr || !IS_ENABLED (CONFIG_ACPI_SPCR_TABLE ))
We also need to backport this preparing patch:
b9f58d3572a8 ACPI: Return -ENODEV from acpi_parse_spcr() when SPCR support is disabled
Or it will print the wrong message.
It applies for 6.15 and 6.16 kernel as well.
Thanks
Hanjun
Greg Kroah-Hartman
maintainerRe: [PATCH 6.12 222/444] ACPI: Suppress misleading SPCR console message when SPCR table is absent
Quoted 57 lines · Hanjun Guo
Hi Greg,
Quoted 42 lines · Greg Kroah-Hartman
6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Li Chen <[email protected]>
[ Upstream commit
bad3fa2fb9206f4dcec6ddef094ec2fbf6e8dcb2]The kernel currently alway prints:
"Use ACPI SPCR as default console: No/Yes"even on systems that lack an SPCR table. This can mislead users into thinking the SPCR table exists on the machines without SPCR.
With this change, the "Yes" is only printed if the SPCR table is present, parsed and !param_acpi_nospcr. This avoids user confusion on SPCR-less systems.
Signed-off-by Li Chen <[email protected]>Acked-by Hanjun Guo <[email protected]>Signed-off-by Catalin Marinas <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- arch/arm64/kernel/acpi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)arch/arm64/kernel/acpi.c +2
-0@@ -197,6 +197,8 @@ static int __init acpi_fadt_sanity_check(void)*/ void __init acpi_boot_table_init (void ) { +int ret; +/* * Enable ACPI instead of device tree unless * - ACPI has been disabled explicitly (acpi=off), or arch/arm64/kernel/acpi.c void __init acpi_boot_table_init(void) · line 257
Quoted 9 lines
arch/arm64/kernel/acpi.c +2
-3@@ -250,10 +252,12 @@ void __init acpi_boot_table_init(void)* behaviour, use acpi=nospcr to disable console in ACPI SPCR * table as default serial console. */ -acpi_parse_spcr (earlycon_acpi_spcr_enable, + ret =acpi_parse_spcr (earlycon_acpi_spcr_enable, !param_acpi_nospcr); -pr_info ("Use ACPI SPCR as default console: %s\n" , - param_acpi_nospcr ?"No" :"Yes" ); +if (!ret || param_acpi_nospcr || !IS_ENABLED (CONFIG_ACPI_SPCR_TABLE ))We also need to backport this preparing patch:
Quoted 6 lines
b9f58d3572a8ACPI: Return-ENODEVfromacpi_parse_spcr()when SPCR support is disabledOr it will print the wrong message.
It applies for 6.15 and 6.16 kernel as well.
Thanks, now queued up.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 223/444 net: ieee8021q: fix insufficient table-size assertion
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: RubenKelevra <[email protected]>
[ Upstream commit 21deb2d966920f0d4dd098ca6c3a55efbc0b2f23 ]
_Static_assert(ARRAY_SIZE(map) != IEEE8021Q_TT_MAX - 1) rejects only a length of 7 and allows any other mismatch. Replace it with a strict equality test via a helper macro so that every mapping table must have exactly IEEE8021Q_TT_MAX (8) entries.
--- net/core/ieee8021q_helpers.c | 44 +++++++++++------------------------- 1 file changed, 13 insertions(+), 31 deletions(-)
net/core/ieee8021q_helpers.c +13 -31
@@ -7,6 +7,11 @@#include <net/dscp.h> #include <net/ieee8021q.h> +/* verify that table covers all 8 traffic types */ +#define TT_MAP_SIZE_OK (tbl) \ + compiletime_assert(ARRAY_SIZE(tbl) == IEEE8021Q_TT_MAX, \ + #tbl " size mismatch") +/* The following arrays map Traffic Types (TT) to traffic classes (TC) for * different number of queues as shown in the example provided by * IEEE 802.1Q-2022 in Annex I "I.3 Traffic type to traffic class mapping" and
@@ -101,51 +106,28 @@ int ieee8021q_tt_to_tc(enum ieee8021q_traffic_type tt, unsigned int num_queues)switch (num_queues) {case 8 : -compiletime_assert (ARRAY_SIZE (ieee8021q_8queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_8queue_tt_tc_map != max - 1" ); +TT_MAP_SIZE_OK (ieee8021q_8queue_tt_tc_map);return ieee8021q_8queue_tt_tc_map[tt];case 7 : -compiletime_assert (ARRAY_SIZE (ieee8021q_7queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_7queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_7queue_tt_tc_map);return ieee8021q_7queue_tt_tc_map[tt];case 6 : -compiletime_assert (ARRAY_SIZE (ieee8021q_6queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_6queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_6queue_tt_tc_map);return ieee8021q_6queue_tt_tc_map[tt];case 5 : -compiletime_assert (ARRAY_SIZE (ieee8021q_5queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_5queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_5queue_tt_tc_map);return ieee8021q_5queue_tt_tc_map[tt];case 4 : -compiletime_assert (ARRAY_SIZE (ieee8021q_4queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_4queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_4queue_tt_tc_map);return ieee8021q_4queue_tt_tc_map[tt];case 3 : -compiletime_assert (ARRAY_SIZE (ieee8021q_3queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_3queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_3queue_tt_tc_map);return ieee8021q_3queue_tt_tc_map[tt];case 2 : -compiletime_assert (ARRAY_SIZE (ieee8021q_2queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_2queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_2queue_tt_tc_map);return ieee8021q_2queue_tt_tc_map[tt];case 1 : -compiletime_assert (ARRAY_SIZE (ieee8021q_1queue_tt_tc_map) != -IEEE8021Q_TT_MAX -1 , -"ieee8021q_1queue_tt_tc_map != max - 1" ); - +TT_MAP_SIZE_OK (ieee8021q_1queue_tt_tc_map);return ieee8021q_1queue_tt_tc_map[tt]; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 224/444 net: fec: allow disable coalescing
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jonas Rebmann <[email protected]>
[ Upstream commit b7ad21258f9e9a7f58b19595d5ceed2cde3bed68 ]
In the current implementation, IP coalescing is always enabled and cannot be disabled.
As setting maximum frames to 0 or 1, or setting delay to zero implies immediate delivery of single packets/IRQs, disable coalescing in hardware in these cases.
This also guarantees that coalescing is never enabled with ICFT or ICTT set to zero, a configuration that could lead to unpredictable behaviour according to i.MX8MP reference manual.
--- drivers/net/ethernet/freescale/fec_main.c | 34 +++++++++++------------ 1 file changed, 16 insertions(+), 18 deletions(-)
drivers/net/ethernet/freescale/fec_main.c +16 -18
@@ -3122,27 +3122,25 @@ static int fec_enet_us_to_itr_clock(struct net_device *ndev, int us)static void fec_enet_itr_coal_set (struct net_device *ndev) {struct fec_enet_private *fep =netdev_priv (ndev); -int rx_itr, tx_itr; +u32 rx_itr =0 , tx_itr =0 ; +int rx_ictt, tx_ictt; -/* Must be greater than zero to avoid unpredictable behavior */ -if (!fep->rx_time_itr || !fep->rx_pkts_itr || - !fep->tx_time_itr || !fep->tx_pkts_itr) -return ; - -/* Select enet system clock as Interrupt Coalescing -* timer Clock Source -*/ - rx_itr =FEC_ITR_CLK_SEL ; - tx_itr =FEC_ITR_CLK_SEL ; + rx_ictt =fec_enet_us_to_itr_clock (ndev, fep->rx_time_itr); + tx_ictt =fec_enet_us_to_itr_clock (ndev, fep->tx_time_itr); -/* set ICFT and ICTT */ - rx_itr |=FEC_ITR_ICFT (fep->rx_pkts_itr); - rx_itr |=FEC_ITR_ICTT (fec_enet_us_to_itr_clock (ndev, fep->rx_time_itr)); - tx_itr |=FEC_ITR_ICFT (fep->tx_pkts_itr); - tx_itr |=FEC_ITR_ICTT (fec_enet_us_to_itr_clock (ndev, fep->tx_time_itr)); +if (rx_ictt >0 && fep->rx_pkts_itr >1 ) { +/* Enable with enet system clock as Interrupt Coalescing timer Clock Source */ + rx_itr =FEC_ITR_EN |FEC_ITR_CLK_SEL ; + rx_itr |=FEC_ITR_ICFT (fep->rx_pkts_itr); + rx_itr |=FEC_ITR_ICTT (rx_ictt); + } - rx_itr |=FEC_ITR_EN ; - tx_itr |=FEC_ITR_EN ; +if (tx_ictt >0 && fep->tx_pkts_itr >1 ) { +/* Enable with enet system clock as Interrupt Coalescing timer Clock Source */ + tx_itr =FEC_ITR_EN |FEC_ITR_CLK_SEL ; + tx_itr |=FEC_ITR_ICFT (fep->tx_pkts_itr); + tx_itr |=FEC_ITR_ICTT (tx_ictt); + }writel (tx_itr, fep->hwp +FEC_TXIC0 );writel (rx_itr, fep->hwp +FEC_RXIC0 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 225/444 drm/amd/display: Separate set_gsl from set_gsl_source_select
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ilya Bakoulin <[email protected]>
[ Upstream commit 660a467a5e7366cd6642de61f1aaeaf0d253ee68 ]
[Why/How]
Separate the checks for set_gsl and set_gsl_source_select, since source_select may not be implemented/necessary.
--- drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +4 -5
@@ -273,14 +273,13 @@ void dcn20_setup_gsl_group_as_lock( }/* at this point we want to program whether it's to enable or disable */ -if (pipe_ctx->stream_res.tg->funcs->set_gsl !=NULL && - pipe_ctx->stream_res.tg->funcs->set_gsl_source_select !=NULL ) { +if (pipe_ctx->stream_res.tg->funcs->set_gsl !=NULL ) { pipe_ctx->stream_res.tg->funcs->set_gsl ( pipe_ctx->stream_res.tg, &gsl); - - pipe_ctx->stream_res.tg->funcs->set_gsl_source_select ( - pipe_ctx->stream_res.tg, group_idx, enable ?4 :0 ); +if (pipe_ctx->stream_res.tg->funcs->set_gsl_source_select !=NULL ) + pipe_ctx->stream_res.tg->funcs->set_gsl_source_select ( + pipe_ctx->stream_res.tg, group_idx, enable ?4 :0 ); }else BREAK_TO_DEBUGGER (); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 226/444 wifi: ath10k: shutdown driver when hardware is unreliable
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kang Yang <[email protected]>
[ Upstream commit c256a94d1b1b15109740306f7f2a7c2173e12072 ]
In rare cases, ath10k may lose connection with the PCIe bus due to some unknown reasons, which could further lead to system crashes during resuming due to watchdog timeout:
ath10k_pci 0000:01:00.0: wmi command 20486 timeout, restarting hardware ath10k_pci 0000:01:00.0: already restartingath10k_pci 0000:01:00.0: failed to stop WMI vdev 0: -11 ath10k_pci 0000:01:00.0: failed to stop vdev 0: -11 ieee80211 phy0: PM: **** DPM device timeout ****
Call Trace: panic+0x125/0x315 dpm_watchdog_set+0x54/0x54 dpm_watchdog_handler+0x57/0x57 call_timer_fn+0x31/0x13c
At this point, all WMI commands will timeout and attempt to restart device. So set a threshold for consecutive restart failures. If the threshold is exceeded, consider the hardware is unreliable and all ath10k operations should be skipped to avoid system crash.
fail_cont_count and pending_recovery are atomic variables, and do not involve complex conditional logic. Therefore, even if recovery check and reconfig complete are executed concurrently, the recovery mechanism will not be broken.
Tested-on: QCA6174 hw3.2 PCI WLAN.RM.4.4.1-00288-QCARMSWPZ-1
--- drivers/net/wireless/ath/ath10k/core.c | 48 +++++++++++++++++++++++--- drivers/net/wireless/ath/ath10k/core.h | 11 ++++-- drivers/net/wireless/ath/ath10k/mac.c | 7 +++- drivers/net/wireless/ath/ath10k/wmi.c | 6 ++++ 4 files changed, 63 insertions(+), 9 deletions(-)
drivers/net/wireless/ath/ath10k/core.c +43 -5
@@ -2484,12 +2484,50 @@ static int ath10k_init_hw_params(struct ath10k *ar)return 0 ; } +static bool ath10k_core_needs_recovery (struct ath10k *ar) +{ +long time_left; + +/* Sometimes the recovery will fail and then the next all recovery fail, +* so avoid infinite recovery. +*/ +if (atomic_read (&ar->fail_cont_count) >=ATH10K_RECOVERY_MAX_FAIL_COUNT ) { +ath10k_err (ar,"consecutive fail %d times, will shutdown driver!" , +atomic_read (&ar->fail_cont_count)); + ar->state =ATH10K_STATE_WEDGED ; +return false; + } + +ath10k_dbg (ar,ATH10K_DBG_BOOT ,"total recovery count: %d" , ++ar->recovery_count); + +if (atomic_read (&ar->pending_recovery)) { +/* Sometimes it happened another recovery work before the previous one +* completed, then the second recovery work will destroy the previous +* one, thus below is to avoid that. +*/ + time_left =wait_for_completion_timeout (&ar->driver_recovery, +ATH10K_RECOVERY_TIMEOUT_HZ ); +if (time_left) { +ath10k_warn (ar,"previous recovery succeeded, skip this!\n" ); +return false; + } + +/* Record the continuous recovery fail count when recovery failed. */ +atomic_inc (&ar->fail_cont_count); + +/* Avoid having multiple recoveries at the same time. */ +return false; + } + +atomic_inc (&ar->pending_recovery); + +return true; +} +void ath10k_core_start_recovery (struct ath10k *ar) { -if (test_and_set_bit (ATH10K_FLAG_RESTARTING , &ar->dev_flags)) { -ath10k_warn (ar,"already restarting\n" ); +if (!ath10k_core_needs_recovery (ar))return ; - }queue_work (ar->workqueue, &ar->restart_work); }
@@ -2525,6 +2563,8 @@ static void ath10k_core_restart(struct work_struct *work) struct ath10k *ar = container_of(work, struct ath10k, restart_work);int ret; +reinit_completion (&ar->driver_recovery); +set_bit (ATH10K_FLAG_CRASH_FLUSH , &ar->dev_flags);/* Place a barrier to make sure the compiler doesn't reorder
@@ -2589,8 +2629,6 @@ static void ath10k_core_restart(struct work_struct *work)if (ret)ath10k_warn (ar,"failed to send firmware crash dump via devcoredump: %d" , ret); - -complete (&ar->driver_recovery); }static void ath10k_core_set_coverage_class_work (struct work_struct *work)
drivers/net/wireless/ath/ath10k/core.h +8 -3
@@ -4,6 +4,7 @@* Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2022 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #ifndef _CORE_H_
@@ -87,6 +88,8 @@ IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER)#define ATH10K_ITER_RESUME_FLAGS (IEEE80211_IFACE_ITER_RESUME_ALL |\ IEEE80211_IFACE_SKIP_SDATA_NOT_IN_DRIVER) +#define ATH10K_RECOVERY_TIMEOUT_HZ (5 * HZ) +#define ATH10K_RECOVERY_MAX_FAIL_COUNT 4struct ath10k ;
@@ -865,9 +868,6 @@ enum ath10k_dev_flags {/* Per Station statistics service */ ATH10K_FLAG_PEER_STATS , -/* Indicates that ath10k device is during recovery process and not complete */ -ATH10K_FLAG_RESTARTING , -/* protected by conf_mutex */ ATH10K_FLAG_NAPI_ENABLED, };
@@ -1211,6 +1211,11 @@ struct ath10k {struct work_struct bundle_tx_work;struct work_struct tx_complete_work; +atomic_t pending_recovery; +unsigned int recovery_count; +/* continuous recovery fail count */ +atomic_t fail_cont_count; +/* cycle count is reported twice for each visited channel during scan. * access protected by data_lock */
drivers/net/wireless/ath/ath10k/mac.c +6 -1
@@ -8125,7 +8125,12 @@ static void ath10k_reconfig_complete(struct ieee80211_hw *hw,ath10k_info (ar,"device successfully recovered\n" ); ar->state =ATH10K_STATE_ON ;ieee80211_wake_queues (ar->hw); -clear_bit (ATH10K_FLAG_RESTARTING , &ar->dev_flags); + +/* Clear recovery state. */ +complete (&ar->driver_recovery); +atomic_set (&ar->fail_cont_count,0 ); +atomic_set (&ar->pending_recovery,0 ); +if (ar->hw_params.hw_restart_disconnect) {list_for_each_entry (arvif, &ar->arvifs, list) {if (arvif->is_up && arvif->vdev_type ==WMI_VDEV_TYPE_STA )
drivers/net/wireless/ath/ath10k/wmi.c +6 -0
@@ -4,6 +4,7 @@* Copyright (c) 2011-2017 Qualcomm Atheros, Inc. * Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. * Copyright (c) 2021-2024 Qualcomm Innovation Center, Inc. All rights reserved. +* Copyright (c) Qualcomm Technologies, Inc. and/or its subsidiaries. */ #include <linux/skbuff.h>
@@ -1941,6 +1942,11 @@ int ath10k_wmi_cmd_send(struct ath10k *ar, struct sk_buff *skb, u32 cmd_id) } wait_event_timeout(ar->wmi.tx_credits_wq, ({ + if (ar->state == ATH10K_STATE_WEDGED) { + ret = -ESHUTDOWN; + ath10k_dbg(ar, ATH10K_DBG_WMI, + "drop wmi command %d, hardware is wedged\n", cmd_id); + } /* try to send pending beacons first. they take priority */ ath10k_wmi_tx_beacons_nowait(ar);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 227/444 wifi: ath12k: Add memset and update default rate value in wmi tx completion
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sarika Sharma <[email protected]>
[ Upstream commit 9903c0986f782dfc511d7638b6f15fb6e8600cd3 ]
When both AP/STA and monitor interfaces are enabled, ieee80211_tx_status() is invoked from two paths: the TX completion handler for data frames and the WMI TX completion handler for management frames.
In the data path, the skb->cb is properly zeroed using memset, but in the WMI path, this step is missing.
As a result, mac80211 encountered uninitialized (junk) values in skb->cb when generating the radiotap header for monitor mode, leading to invalid radiotap lengths.
Hence, explicitly zero the status field in the skb->cb using memset in WMI TX completion path to ensure consistent and correct behavior during WMI tx completion path.
Additionally, set info->status.rates[0].idx = -1 to indicate that no valid rate information is available, avoiding misinterpretation of garbage values.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath12k/wmi.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/ath/ath12k/wmi.c +5 -0
@@ -5229,6 +5229,11 @@ static int wmi_process_mgmt_tx_comp(struct ath12k *ar, u32 desc_id,dma_unmap_single (ar->ab->dev, skb_cb->paddr, msdu->len,DMA_TO_DEVICE ); info =IEEE80211_SKB_CB (msdu); +memset (&info->status,0 ,sizeof (info->status)); + +/* skip tx rate update from ieee80211_status*/ + info->status.rates[0 ].idx =-1 ; +if ((!(info->flags &IEEE80211_TX_CTL_NO_ACK )) && !status) info->flags |=IEEE80211_TX_STAT_ACK ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 228/444 wifi: ath12k: Fix station association with MBSSID Non-TX BSS
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hari Chandrakanthan <[email protected]>
[ Upstream commit 70eeacc1a92a444f4b5777ab19e1c378a5edc8dd ]
ath12k station is unable to associate with non-transmitting BSSes in a Multiple BSS set because the user-space does not receive information about the non-transmitting BSSes from mac80211's scan results.
The ath12k driver does not advertise its MBSSID capability to mac80211, resulting in wiphy->support_mbssid not being set. Consequently, the information about non-transmitting BSS is not parsed from received Beacon/Probe response frames and is therefore not included in the scan results.
Fix this by advertising the MBSSID capability of ath12k driver to mac80211.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
Tested-on: WCN7850 hw2.0 PCI WLAN.HMT.1.1.c5-00284-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1
--- drivers/net/wireless/ath/ath12k/mac.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/ath/ath12k/mac.c +1 -0
@@ -9218,6 +9218,7 @@ static int ath12k_mac_hw_register(struct ath12k_hw *ah) wiphy->mbssid_max_interfaces = mbssid_max_interfaces; wiphy->ema_max_profile_periodicity =TARGET_EMA_MAX_PROFILE_PERIOD ; +ieee80211_hw_set (hw,SUPPORTS_MULTI_BSSID );if (is_6ghz) { wiphy_ext_feature_set(wiphy,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 229/444 lib: packing: Include necessary headers
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nathan Lynch <[email protected]>
[ Upstream commit 8bd0af3154b2206ce19f8b1410339f7a2a56d0c3 ]
packing.h uses ARRAY_SIZE(), BUILD_BUG_ON_MSG(), min(), max(), and sizeof_field() without including the headers where they are defined, potentially causing build failures.
Fix this in packing.h and sort the result.
--- include/linux/packing.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
include/linux/packing.h +5 -1
@@ -5,8 +5,12 @@#ifndef _LINUX_PACKING_H#define _LINUX_PACKING_H -#include <linux/types.h> +#include <linux/array_size.h> #include <linux/bitops.h> +#include <linux/build_bug.h> +#include <linux/minmax.h> +#include <linux/stddef.h> +#include <linux/types.h> #define QUIRK_MSB_ON_THE_RIGHT BIT(0)#define QUIRK_LITTLE_ENDIAN BIT(1)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 230/444 wifi: iwlwifi: dvm: fix potential overflow in rs_fill_link_cmd()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rand Deeb <[email protected]>
[ Upstream commit e3ad987e9dc7d1e12e3f2f1e623f0e174cd0ca78 ]
The 'index' variable in the rs_fill_link_cmd() function can reach LINK_QUAL_MAX_RETRY_NUM during the execution of the inner loop. This variable is used as an index for the lq_cmd->rs_table array, which has a size of LINK_QUAL_MAX_RETRY_NUM, without proper validation.
Modify the condition of the inner loop to ensure that the 'index' variable does not exceed LINK_QUAL_MAX_RETRY_NUM - 1, thereby preventing any potential overflow issues.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/net/wireless/intel/iwlwifi/dvm/rs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/dvm/rs.c +1 -1
@@ -2899,7 +2899,7 @@ static void rs_fill_link_cmd(struct iwl_priv *priv,/* Repeat initial/next rate. * For legacy IWL_NUMBER_TRY == 1, this loop will not execute. * For HT IWL_HT_NUMBER_TRY == 3, this executes twice. */ -while (repeat_rate >0 && (index <LINK_QUAL_MAX_RETRY_NUM )) { +while (repeat_rate >0 && index < (LINK_QUAL_MAX_RETRY_NUM -1 )) {if (is_legacy (tbl_type.lq_type)) {if (ant_toggle_cnt <NUM_TRY_BEFORE_ANT_TOGGLE ) ant_toggle_cnt++;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 231/444 wifi: iwlwifi: fw: Fix possible memory leak in iwl_fw_dbg_collect
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pagadala Yesu Anjaneyulu <[email protected]>
[ Upstream commit cc8d9cbf269dab363c768bfa9312265bc807fca5 ]
Ensure descriptor is freed on error to avoid memory leak.
--- drivers/net/wireless/intel/iwlwifi/fw/dbg.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlwifi/fw/dbg.c +6 -1
@@ -2955,6 +2955,7 @@ int iwl_fw_dbg_collect(struct iwl_fw_runtime *fwrt,struct iwl_fw_dump_desc *desc;unsigned int delay =0 ;bool monitor_only = false; +int ret;if (trigger) {u16 occurrences =le16_to_cpu (trigger->occurrences) -1 ;
@@ -2985,7 +2986,11 @@ int iwl_fw_dbg_collect(struct iwl_fw_runtime *fwrt, desc->trig_desc.type =cpu_to_le32 (trig);memcpy (desc->trig_desc.data, str, len); -return iwl_fw_dbg_collect_desc (fwrt, desc, monitor_only, delay); + ret =iwl_fw_dbg_collect_desc (fwrt, desc, monitor_only, delay); +if (ret) +kfree (desc); + +return ret; }IWL_EXPORT_SYMBOL (iwl_fw_dbg_collect);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 232/444 drm/amd/display: Fix failed to blank crtc!
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wen Chen <[email protected]>
[ Upstream commit 01f60348d8fb6b3fbcdfc7bdde5d669f95b009a4 ]
[why]
DCN35 is having “DC: failed to blank crtc!” when running HPO test cases. It's caused by not having sufficient udelay time.
[how]
Replace the old wait_for_blank_complete function with fsleep function to sleep just until the next frame should come up. This way it doesn't poll in case the pixel clock or other clock was bugged or until vactive and the vblank are hit again.
--- drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/hwss/dcn20/dcn20_hwseq.c +1 -1
@@ -945,7 +945,7 @@ enum dc_status dcn20_enable_stream_timing(return DC_ERROR_UNEXPECTED ; } - hws->funcs.wait_for_blank_complete (pipe_ctx->stream_res.opp); +fsleep (stream->timing.v_total * (stream->timing.h_total *10000u / stream->timing.pix_clk_100hz)); params.vertical_total_min = stream->adjust.v_total_min; params.vertical_total_max = stream->adjust.v_total_max;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 233/444 drm/amd/display: Initialize mode_select to 0
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Hung <[email protected]>
[ Upstream commit 592ddac93f8c02e13f19175745465f8c4d0f56cd ]
[WHAT]mode_select was supposed to be initialized in mpc_read_gamut_remap but is not set in default case. This can cause indeterminate behaviors.
This is reported as an UNINIT error by Coverity.
--- drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/mpc/dcn401/dcn401_mpc.c +1 -1
@@ -571,7 +571,7 @@ void mpc401_get_gamut_remap(struct mpc *mpc, struct mpc_grph_gamut_adjustment *adjust) {uint16_t arr_reg_val[12 ] = {0 }; -uint32_t mode_select; +uint32_t mode_select =MPCC_GAMUT_REMAP_MODE_SELECT_0 ;read_gamut_remap (mpc, mpcc_id, arr_reg_val, adjust->mpcc_gamut_remap_block_id, &mode_select);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 234/444 wifi: mac80211: update radar_required in channel context after channel switch
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ramya Gnanasekar <[email protected]>
[ Upstream commit 140c6a61d83cbd85adba769b5ef8d61acfa5b392 ]
Currently, when a non-DFS channel is brought up and the bandwidth is expanded from 80 MHz to 160 MHz, where the primary 80 MHz is non-DFS and the secondary 80 MHz consists of DFS channels, radar detection fails if radar occurs in the secondary 80 MHz.
When the channel is switched from 80 MHz to 160 MHz, with the primary 80 MHz being non-DFS and the secondary 80 MHz consisting of DFS channels, the radar required flag in the channel switch parameters is set to true. However, when using a reserved channel context, it is not updated in sdata, which disables radar detection in the secondary 80 MHz DFS channels.
Update the radar required flag in sdata to fix this issue when using a reserved channel context.
--- net/mac80211/chan.c | 1 + 1 file changed, 1 insertion(+)
net/mac80211/chan.c +1 -0
@@ -1349,6 +1349,7 @@ ieee80211_link_use_reserved_reassign(struct ieee80211_link_data *link) goto out; } + link->radar_required = link->reserved_radar_required;list_move (&link->assigned_chanctx_list, &new_ctx->assigned_links);rcu_assign_pointer (link_conf->chanctx_conf, &new_ctx->conf);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 235/444 wifi: rtlwifi: fix possible skb memory leak in `_rtl_pci_rx_interrupt()`.
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 44c0e191004f0e3aa1bdee3be248be14dbe5b020 ]
The function _rtl_pci_init_one_rxdesc() can fail even when the new skb is passed because of a DMA mapping error. If it fails, the skb is not saved in the rx ringbuffer and thus lost.
Compile tested only
--- drivers/net/wireless/realtek/rtlwifi/pci.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-)
drivers/net/wireless/realtek/rtlwifi/pci.c +12 -6
@@ -802,13 +802,19 @@ static void _rtl_pci_rx_interrupt(struct ieee80211_hw *hw) skb = new_skb; no_new:if (rtlpriv->use_new_trx_flow) { -_rtl_pci_init_one_rxdesc (hw, skb, (u8 *)buffer_desc, - rxring_idx, - rtlpci->rx_ring[rxring_idx].idx); +if (!_rtl_pci_init_one_rxdesc (hw, skb, (u8 *)buffer_desc, + rxring_idx, + rtlpci->rx_ring[rxring_idx].idx)) { +if (new_skb) +dev_kfree_skb_any (skb); + } }else { -_rtl_pci_init_one_rxdesc (hw, skb, (u8 *)pdesc, - rxring_idx, - rtlpci->rx_ring[rxring_idx].idx); +if (!_rtl_pci_init_one_rxdesc (hw, skb, (u8 *)pdesc, + rxring_idx, + rtlpci->rx_ring[rxring_idx].idx)) { +if (new_skb) +dev_kfree_skb_any (skb); + }if (rtlpci->rx_ring[rxring_idx].idx == rtlpci->rxringcount -1 ) rtlpriv->cfg->ops->set_desc(hw, (u8 *)pdesc,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 236/444 wifi: ath12k: Enable REO queue lookup table feature on QCN9274 hw2.0
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Raj Kumar Bhagat <[email protected]>
[ Upstream commit b79742b84e16e41c4a09f3126436f39f36e75c06 ]
The commit 89ac53e96217 ("wifi: ath12k: Enable REO queue lookup table feature on QCN9274") originally intended to enable the reoq_lut_support hardware parameter flag for both QCN9274 hw1.0 and hw2.0. However, it enabled it only for QCN9274 hw1.0.
Hence, enable REO queue lookup table feature on QCN9274 hw2.0.
Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.4.1-00199-QCAHKSWPL_SILICONZ-1
--- drivers/net/wireless/ath/ath12k/hw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath12k/hw.c +1 -1
@@ -1084,7 +1084,7 @@ static const struct ath12k_hw_params ath12k_hw_params[] = { .download_calib = true, .supports_suspend = false, .tcl_ring_retry = true, - .reoq_lut_support = false, + .reoq_lut_support = true, .supports_shadow_regs = false, .num_tcl_banks = 48,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 237/444 wifi: ath12k: Decrement TID on RX peer frag setup error handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karthikeyan Kathirvel <[email protected]>
[ Upstream commit 7c0884fcd2ddde0544d2e77f297ae461e1f53f58 ]
Currently, TID is not decremented before peer cleanup, during error handling path of ath12k_dp_rx_peer_frag_setup(). This could lead to out-of-bounds access in peer->rx_tid[].
Hence, add a decrement operation for TID, before peer cleanup to ensures proper cleanup and prevents out-of-bounds access issues when the RX peer frag setup fails.
Found during code review. Compile tested only.
--- drivers/net/wireless/ath/ath12k/dp.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/ath/ath12k/dp.c +1 -0
@@ -79,6 +79,7 @@ int ath12k_dp_peer_setup(struct ath12k *ar, int vdev_id, const u8 *addr) ret =ath12k_dp_rx_peer_frag_setup (ar, addr, vdev_id);if (ret) {ath12k_warn (ab,"failed to setup rx defrag context\n" ); + tid--; goto peer_clean; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 238/444 powerpc: floppy: Add missing checks after DMA map
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit cf183c1730f2634245da35e9b5d53381b787d112 ]
The DMA map functions can fail and should be tested for errors.
--- arch/powerpc/include/asm/floppy.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/floppy.h +4 -1
@@ -144,9 +144,12 @@ static int hard_dma_setup(char *addr, unsigned long size, int mode, int io) bus_addr =0 ; } -if (!bus_addr)/* need to map it */ +if (!bus_addr) {/* need to map it */ bus_addr =dma_map_single (&isa_bridge_pcidev->dev, addr, size, dir); +if (dma_mapping_error (&isa_bridge_pcidev->dev, bus_addr)) +return -ENOMEM ; + }/* remember this one as prev */ prev_addr = addr;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 239/444 netmem: fix skb_frag_address_safe with unreadable skbs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mina Almasry <[email protected]>
[ Upstream commit 4672aec56d2e8edabcb74c3e2320301d106a377e ]
skb_frag_address_safe() needs a check that the skb_frag_page exists check similar to skb_frag_address().
--- include/linux/skbuff.h | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
include/linux/skbuff.h +7 -1
@@ -3638,7 +3638,13 @@ static inline void *skb_frag_address(const skb_frag_t *frag)*/ static inline void *skb_frag_address_safe (const skb_frag_t *frag) { -void *ptr =page_address (skb_frag_page (frag)); +struct page *page =skb_frag_page (frag); +void *ptr; + +if (!page) +return NULL ; + + ptr =page_address (page);if (unlikely (!ptr))return NULL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 240/444 arm64: stacktrace: Check kretprobe_find_ret_addr() return value
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mark Rutland <[email protected]>
[ Upstream commit beecfd6a88a675e20987e70ec532ba734b230fa4 ]
If kretprobe_find_ret_addr() fails to find the original return address, it returns 0. Check for this case so that a reliable stacktrace won't silently ignore it.
--- arch/arm64/kernel/stacktrace.c | 2 ++ 1 file changed, 2 insertions(+)
arch/arm64/kernel/stacktrace.c +2 -0
@@ -123,6 +123,8 @@ kunwind_recover_return_address(struct kunwind_state *state) orig_pc =kretprobe_find_ret_addr (state->task, (void *)state->common.fp, &state->kr_cur); +if (!orig_pc) +return -EINVAL ; state->common.pc = orig_pc; }#endif /* CONFIG_KRETPROBES */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 241/444 wifi: iwlegacy: Check rate_idx range after addition
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Stanislaw Gruszka <[email protected]>
[ Upstream commit 0de19d5ae0b2c5b18b88c5c7f0442f707a207409 ]
Limit rate_idx to IL_LAST_OFDM_RATE for 5GHz band for thinkable case the index is incorrect.
--- drivers/net/wireless/intel/iwlegacy/4965-mac.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/intel/iwlegacy/4965-mac.c +4 -1
@@ -1575,8 +1575,11 @@ il4965_tx_cmd_build_rate(struct il_priv *il, || rate_idx > RATE_COUNT_LEGACY) rate_idx =rate_lowest_index (&il->bands[info->band], sta);/* For 5 GHZ band, remap mac80211 rate indices into driver indices */ -if (info->band ==NL80211_BAND_5GHZ ) +if (info->band ==NL80211_BAND_5GHZ ) { rate_idx +=IL_FIRST_OFDM_RATE ; +if (rate_idx >IL_LAST_OFDM_RATE ) + rate_idx =IL_LAST_OFDM_RATE ; + }/* Get PLCP rate for tx_cmd->rate_n_flags */ rate_plcp = il_rates[rate_idx].plcp;/* Zero out flags for this packet */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 242/444 neighbour: add support for NUD_PERMANENT proxy entries
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicolas Escande <[email protected]>
[ Upstream commit c7d78566bbd30544a0618a6ffbc97bc0ddac7035 ]
As discussesd before in [0] proxy entries (which are more configuration than runtime data) should stay when the link (carrier) goes does down. This is what happens for regular neighbour entries.
So lets fix this by:
- storing in proxy entries the fact that it was added as NUD_PERMANENT
- not removing NUD_PERMANENT proxy entries when the carrier goes down (same as how it's done in neigh_flush_dev() for regular neigh entries)
[0]: https://lore.kernel.org/netdev/[email protected]/
--- include/net/neighbour.h | 1 + net/core/neighbour.c | 12 +++++++++--- 2 files changed, 10 insertions(+), 3 deletions(-)
include/net/neighbour.h +1 -0
@@ -180,6 +180,7 @@ struct pneigh_entry {netdevice_tracker dev_tracker;u32 flags;u8 protocol; +bool permanent;u32 key[]; };
net/core/neighbour.c +9 -3
@@ -55,7 +55,8 @@ static void __neigh_notify(struct neighbour *n, int type, int flags, u32 pid);static void neigh_update_notify (struct neighbour *neigh,u32 nlmsg_pid);static int pneigh_ifdown_and_unlock (struct neigh_table *tbl, -struct net_device *dev); +struct net_device *dev, +bool skip_perm);#ifdef CONFIG_PROC_FS static const struct seq_operations neigh_stat_seq_ops;
@@ -444,7 +445,7 @@ static int __neigh_ifdown(struct neigh_table *tbl, struct net_device *dev, {write_lock_bh (&tbl->lock);neigh_flush_dev (tbl, dev, skip_perm); -pneigh_ifdown_and_unlock (tbl, dev); +pneigh_ifdown_and_unlock (tbl, dev, skip_perm);pneigh_queue_purge (&tbl->proxy_queue, dev ?dev_net (dev) :NULL , tbl->family);if (skb_queue_empty_lockless (&tbl->proxy_queue))
@@ -847,7 +848,8 @@ int pneigh_delete(struct neigh_table *tbl, struct net *net, const void *pkey, }static int pneigh_ifdown_and_unlock (struct neigh_table *tbl, -struct net_device *dev) +struct net_device *dev, +bool skip_perm) {struct pneigh_entry *n, **np, *freelist =NULL ;u32 h;
@@ -855,12 +857,15 @@ static int pneigh_ifdown_and_unlock(struct neigh_table *tbl,for (h =0 ; h <=PNEIGH_HASHMASK ; h++) { np = &tbl->phash_buckets[h];while ((n = *np) !=NULL ) { +if (skip_perm && n->permanent) + goto skip;if (!dev || n->dev == dev) { *np = n->next; n->next = freelist; freelist = n;continue ; } +skip: np = &n->next; } }
@@ -2041,6 +2046,7 @@ static int neigh_add(struct sk_buff *skb, struct nlmsghdr *nlh, pn =pneigh_lookup (tbl, net, dst, dev,1 );if (pn) { pn->flags = ndm_flags; + pn->permanent = !!(ndm->ndm_state &NUD_PERMANENT );if (protocol) pn->protocol = protocol; err =0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 243/444 dpaa_eth: dont use fixed_phy_change_carrier
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit d8155c1df5c8b717052567b188455d41fa7a8908 ]
This effectively reverts 6e8b0ff1ba4c ("dpaa_eth: Add change_carrier() for Fixed PHYs"). Usage of fixed_phy_change_carrier() requires that fixed_phy_register() has been called before, directly or indirectly. And that's not the case in this driver.
--- drivers/net/ethernet/freescale/dpaa/dpaa_eth.c | 2 -- 1 file changed, 2 deletions(-)
drivers/net/ethernet/freescale/dpaa/dpaa_eth.c +0 -2
@@ -28,7 +28,6 @@#include <linux/percpu.h> #include <linux/dma-mapping.h> #include <linux/sort.h> -#include <linux/phy_fixed.h> #include <linux/bpf.h> #include <linux/bpf_trace.h> #include <soc/fsl/bman.h>
@@ -3129,7 +3128,6 @@ static const struct net_device_ops dpaa_ops = { .ndo_stop = dpaa_eth_stop, .ndo_tx_timeout = dpaa_tx_timeout, .ndo_get_stats64 = dpaa_get_stats64, - .ndo_change_carrier = fixed_phy_change_carrier, .ndo_set_mac_address = dpaa_set_mac_address, .ndo_validate_addr = eth_validate_addr, .ndo_set_rx_mode = dpaa_set_rx_mode,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 244/444 drm/amd: Allow printing VanGogh OD SCLK levels without setting dpm to manual
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit 2d1ec1e955414e8e8358178011c35afca1a1c0b1 ]
Several other ASICs allow printing OD SCLK levels without setting DPM control to manual. When OD is disabled it will show the range the hardware supports. When OD is enabled it will show what values have been programmed. Adjust VanGogh to work the same.
--- .../gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c | 37 ++++++++----------- 1 file changed, 15 insertions(+), 22 deletions(-)
drivers/gpu/drm/amd/pm/swsmu/smu11/vangogh_ppt.c +15 -22
@@ -664,7 +664,6 @@ static int vangogh_print_clk_levels(struct smu_context *smu, {DpmClocks_t *clk_table = smu->smu_table.clocks_table;SmuMetrics_t metrics; -struct smu_dpm_context *smu_dpm_ctx = &(smu->smu_dpm);int i, idx, size =0 , ret =0 ;uint32_t cur_value =0 , value =0 , count =0 ;bool cur_value_match_level = false;
@@ -680,31 +679,25 @@ static int vangogh_print_clk_levels(struct smu_context *smu,switch (clk_type) {case SMU_OD_SCLK : -if (smu_dpm_ctx->dpm_level ==AMD_DPM_FORCED_LEVEL_MANUAL ) { - size +=sysfs_emit_at (buf, size,"%s:\n" ,"OD_SCLK" ); - size +=sysfs_emit_at (buf, size,"0: %10uMhz\n" , - (smu->gfx_actual_hard_min_freq >0 ) ? smu->gfx_actual_hard_min_freq : smu->gfx_default_hard_min_freq); - size +=sysfs_emit_at (buf, size,"1: %10uMhz\n" , - (smu->gfx_actual_soft_max_freq >0 ) ? smu->gfx_actual_soft_max_freq : smu->gfx_default_soft_max_freq); - } + size +=sysfs_emit_at (buf, size,"%s:\n" ,"OD_SCLK" ); + size +=sysfs_emit_at (buf, size,"0: %10uMhz\n" , + (smu->gfx_actual_hard_min_freq >0 ) ? smu->gfx_actual_hard_min_freq : smu->gfx_default_hard_min_freq); + size +=sysfs_emit_at (buf, size,"1: %10uMhz\n" , + (smu->gfx_actual_soft_max_freq >0 ) ? smu->gfx_actual_soft_max_freq : smu->gfx_default_soft_max_freq);break ;case SMU_OD_CCLK : -if (smu_dpm_ctx->dpm_level ==AMD_DPM_FORCED_LEVEL_MANUAL ) { - size +=sysfs_emit_at (buf, size,"CCLK_RANGE in Core%d:\n" , smu->cpu_core_id_select); - size +=sysfs_emit_at (buf, size,"0: %10uMhz\n" , - (smu->cpu_actual_soft_min_freq >0 ) ? smu->cpu_actual_soft_min_freq : smu->cpu_default_soft_min_freq); - size +=sysfs_emit_at (buf, size,"1: %10uMhz\n" , - (smu->cpu_actual_soft_max_freq >0 ) ? smu->cpu_actual_soft_max_freq : smu->cpu_default_soft_max_freq); - } + size +=sysfs_emit_at (buf, size,"CCLK_RANGE in Core%d:\n" , smu->cpu_core_id_select); + size +=sysfs_emit_at (buf, size,"0: %10uMhz\n" , + (smu->cpu_actual_soft_min_freq >0 ) ? smu->cpu_actual_soft_min_freq : smu->cpu_default_soft_min_freq); + size +=sysfs_emit_at (buf, size,"1: %10uMhz\n" , + (smu->cpu_actual_soft_max_freq >0 ) ? smu->cpu_actual_soft_max_freq : smu->cpu_default_soft_max_freq);break ;case SMU_OD_RANGE : -if (smu_dpm_ctx->dpm_level ==AMD_DPM_FORCED_LEVEL_MANUAL ) { - size +=sysfs_emit_at (buf, size,"%s:\n" ,"OD_RANGE" ); - size +=sysfs_emit_at (buf, size,"SCLK: %7uMhz %10uMhz\n" , - smu->gfx_default_hard_min_freq, smu->gfx_default_soft_max_freq); - size +=sysfs_emit_at (buf, size,"CCLK: %7uMhz %10uMhz\n" , - smu->cpu_default_soft_min_freq, smu->cpu_default_soft_max_freq); - } + size +=sysfs_emit_at (buf, size,"%s:\n" ,"OD_RANGE" ); + size +=sysfs_emit_at (buf, size,"SCLK: %7uMhz %10uMhz\n" , + smu->gfx_default_hard_min_freq, smu->gfx_default_soft_max_freq); + size +=sysfs_emit_at (buf, size,"CCLK: %7uMhz %10uMhz\n" , + smu->cpu_default_soft_min_freq, smu->cpu_default_soft_max_freq);break ;case SMU_SOCCLK :/* the level 3 ~ 6 of socclk use the same frequency for vangogh */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 245/444 net: vlan: Make is_vlan_dev() a stub when VLAN is not configured
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gal Pressman <[email protected]>
[ Upstream commit 2de1ba0887e5d3bf02d7c212f380039b34e10aa3 ]
Add a stub implementation of is_vlan_dev() that returns false when VLAN support is not compiled in (CONFIG_VLAN_8021Q=n).
This allows us to compile-out VLAN-dependent dead code when it is not needed.
This also resolves the following compilation error when:
* CONFIG_VLAN_8021Q=n
* CONFIG_OBJTOOL=y
* CONFIG_OBJTOOL_WERROR=y
drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.o: error: objtool: parse_mirred.isra.0+0x370: mlx5e_tc_act_vlan_add_push_action() missing __noreturn in .c/.h or NORETURN() in noreturns.h
The error occurs because objtool cannot determine that unreachable BUG() (which doesn't return) calls in VLAN code paths are actually dead code when VLAN support is disabled.
--- include/linux/if_vlan.h | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
include/linux/if_vlan.h +10 -5
@@ -79,11 +79,6 @@ static inline struct vlan_ethhdr *skb_vlan_eth_hdr(const struct sk_buff *skb)/* found in socket.c */ extern void vlan_ioctl_set (int (*hook)(struct net *,void __user *)); -static inline bool is_vlan_dev (const struct net_device *dev) -{ -return dev->priv_flags &IFF_802_1Q_VLAN ; -} -#define skb_vlan_tag_present (__skb) (!!(__skb)->vlan_all)#define skb_vlan_tag_get (__skb) ((__skb)->vlan_tci)#define skb_vlan_tag_get_id (__skb) ((__skb)->vlan_tci & VLAN_VID_MASK)
@@ -199,6 +194,11 @@ struct vlan_dev_priv {#endif }; +static inline bool is_vlan_dev (const struct net_device *dev) +{ +return dev->priv_flags &IFF_802_1Q_VLAN ; +} +static inline struct vlan_dev_priv *vlan_dev_priv (const struct net_device *dev) {return netdev_priv (dev);
@@ -236,6 +236,11 @@ extern void vlan_vids_del_by_dev(struct net_device *dev,extern bool vlan_uses_dev (const struct net_device *dev);#else +static inline bool is_vlan_dev (const struct net_device *dev) +{ +return false; +} +static inline struct net_device *__vlan_find_dev_deep_rcu (struct net_device *real_dev,__be16 vlan_proto,u16 vlan_id)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 246/444 net: vlan: Replace BUG() with WARN_ON_ONCE() in vlan_dev_* stubs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gal Pressman <[email protected]>
[ Upstream commit 60a8b1a5d0824afda869f18dc0ecfe72f8dfda42 ]
When CONFIG_VLAN_8021Q=n, a set of stub helpers are used, three of these helpers use BUG() unconditionally.
This code should not be reached, as callers of these functions should always check for is_vlan_dev() first, but the usage of BUG() is not recommended, replace it with WARN_ON() instead.
--- include/linux/if_vlan.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
include/linux/if_vlan.h +3 -3
@@ -258,19 +258,19 @@ vlan_for_each(struct net_device *dev,static inline struct net_device *vlan_dev_real_dev (const struct net_device *dev) { -BUG (); +WARN_ON_ONCE (1 );return NULL ; }static inline u16 vlan_dev_vlan_id (const struct net_device *dev) { -BUG (); +WARN_ON_ONCE (1 );return 0 ; }static inline __be16 vlan_dev_vlan_proto (const struct net_device *dev) { -BUG (); +WARN_ON_ONCE (1 );return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 247/444 gve: Return error for unknown admin queue command
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alok Tiwari <[email protected]>
[ Upstream commit b11344f63fdd9e8c5121148a6965b41079071dd2 ]
In gve_adminq_issue_cmd(), return -EINVAL instead of 0 when an unknown admin queue command opcode is encountered.
This prevents the function from silently succeeding on invalid input and prevents undefined behavior by ensuring the function fails gracefully when an unrecognized opcode is provided.
These changes improve error handling.
--- drivers/net/ethernet/google/gve/gve_adminq.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/ethernet/google/gve/gve_adminq.c +1 -0
@@ -564,6 +564,7 @@ static int gve_adminq_issue_cmd(struct gve_priv *priv,break ;default :dev_err (&priv->pdev->dev,"unknown AQ command opcode %d\n" , opcode); +return -EINVAL ; }return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 248/444 net: dsa: b53: ensure BCM5325 PHYs are enabled
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit 966a83df36c6f27476ac3501771422e7852098bc ]
According to the datasheet, BCM5325 uses B53_PD_MODE_CTRL_25 register to disable clocking to individual PHYs.
Only ports 1-4 can be enabled or disabled and the datasheet is explicit about not toggling BIT(0) since it disables the PLL power and the switch.
--- drivers/net/dsa/b53/b53_common.c | 13 +++++++++++++ drivers/net/dsa/b53/b53_regs.h | 5 ++++- 2 files changed, 17 insertions(+), 1 deletion(-)
drivers/net/dsa/b53/b53_common.c +13 -0
@@ -613,6 +613,19 @@ int b53_setup_port(struct dsa_switch *ds, int port)if (dsa_is_user_port (ds, port))b53_set_eap_mode (dev, port,EAP_MODE_SIMPLIFIED ); +if (is5325 (dev) && +in_range (port,1 ,4 )) { +u8 reg; + +b53_read8 (dev,B53_CTRL_PAGE ,B53_PD_MODE_CTRL_25 , ®); + reg &= ~PD_MODE_POWER_DOWN_PORT (0 ); +if (dsa_is_unused_port (ds, port)) + reg |=PD_MODE_POWER_DOWN_PORT (port); +else + reg &= ~PD_MODE_POWER_DOWN_PORT (port); +b53_write8 (dev,B53_CTRL_PAGE ,B53_PD_MODE_CTRL_25 , reg); + } +return 0 ; }EXPORT_SYMBOL (b53_setup_port);
drivers/net/dsa/b53/b53_regs.h +4 -1
@@ -101,8 +101,11 @@#define PORT_OVERRIDE_SPEED_2000M BIT(6)/* BCM5301X only, requires setting 1000M */ #define PORT_OVERRIDE_EN BIT(7)/* Use the register contents */ -/* Power-down mode control */ +/* Power-down mode control (8 bit) */ #define B53_PD_MODE_CTRL_25 0x0f +#define PD_MODE_PORT_MASK 0x1f +/* Bit 0 also powers down the switch. */ +#define PD_MODE_POWER_DOWN_PORT (i) BIT(i)/* IP Multicast control (8 bit) */ #define B53_IP_MULTICAST_CTRL 0x21
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 249/444 net: dsa: b53: fix b53_imp_vlan_setup for BCM5325
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit c00df1018791185ea398f78af415a2a0aaa0c79c ]
CPU port should be B53_CPU_PORT instead of B53_CPU_PORT_25 for B53_PVLAN_PORT_MASK register.
--- drivers/net/dsa/b53/b53_common.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/dsa/b53/b53_common.c +4 -0
@@ -527,6 +527,10 @@ void b53_imp_vlan_setup(struct dsa_switch *ds, int cpu_port)unsigned int i;u16 pvlan; +/* BCM5325 CPU port is at 8 */ +if ((is5325 (dev) ||is5365 (dev)) && cpu_port ==B53_CPU_PORT_25 ) + cpu_port =B53_CPU_PORT ; +/* Enable the IMP port to be in the same VLAN as the other ports * on a per-port basis such that we only have Port i and IMP in * the same VLAN.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 250/444 net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit 37883bbc45a8555d6eca88d3a9730504d2dac86c ]
BCM5325 doesn't implement GMII_PORT_OVERRIDE_CTRL register so we should avoid reading or writing it.PORT_OVERRIDE_RX_FLOW and PORT_OVERRIDE_TX_FLOW aren't defined on BCM5325 and we should use PORT_OVERRIDE_LP_FLOW_25 instead.
--- drivers/net/dsa/b53/b53_common.c | 21 +++++++++++++++++---- drivers/net/dsa/b53/b53_regs.h | 1 + 2 files changed, 18 insertions(+), 4 deletions(-)
drivers/net/dsa/b53/b53_common.c +17 -4
@@ -1269,6 +1269,8 @@ static void b53_force_link(struct b53_device *dev, int port, int link)if (port == dev->imp_port) { off =B53_PORT_OVERRIDE_CTRL ; val =PORT_OVERRIDE_EN ; + }else if (is5325 (dev)) { +return ; }else { off =B53_GMII_PORT_OVERRIDE_CTRL (port); val =GMII_PO_EN ;
@@ -1293,6 +1295,8 @@ static void b53_force_port_config(struct b53_device *dev, int port,if (port == dev->imp_port) { off =B53_PORT_OVERRIDE_CTRL ; val =PORT_OVERRIDE_EN ; + }else if (is5325 (dev)) { +return ; }else { off =B53_GMII_PORT_OVERRIDE_CTRL (port); val =GMII_PO_EN ;
@@ -1323,10 +1327,19 @@ static void b53_force_port_config(struct b53_device *dev, int port,return ; } -if (rx_pause) - reg |=PORT_OVERRIDE_RX_FLOW ; -if (tx_pause) - reg |=PORT_OVERRIDE_TX_FLOW ; +if (rx_pause) { +if (is5325 (dev)) + reg |=PORT_OVERRIDE_LP_FLOW_25 ; +else + reg |=PORT_OVERRIDE_RX_FLOW ; + } + +if (tx_pause) { +if (is5325 (dev)) + reg |=PORT_OVERRIDE_LP_FLOW_25 ; +else + reg |=PORT_OVERRIDE_TX_FLOW ; + }b53_write8 (dev,B53_CTRL_PAGE , off, reg); }
drivers/net/dsa/b53/b53_regs.h +1 -0
@@ -95,6 +95,7 @@#define PORT_OVERRIDE_SPEED_10M (0 << PORT_OVERRIDE_SPEED_S)#define PORT_OVERRIDE_SPEED_100M (1 << PORT_OVERRIDE_SPEED_S)#define PORT_OVERRIDE_SPEED_1000M (2 << PORT_OVERRIDE_SPEED_S) +#define PORT_OVERRIDE_LP_FLOW_25 BIT(3)/* BCM5325 only */ #define PORT_OVERRIDE_RV_MII_25 BIT(4)/* BCM5325 only */ #define PORT_OVERRIDE_RX_FLOW BIT(4)#define PORT_OVERRIDE_TX_FLOW BIT(5)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 251/444 net: dsa: b53: prevent DIS_LEARNING access on BCM5325
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit 800728abd9f83bda4de62a30ce62a8b41c242020 ]
BCM5325 doesn't implement DIS_LEARNING register so we should avoid reading or writing it.
--- drivers/net/dsa/b53/b53_common.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/net/dsa/b53/b53_common.c +10 -1
@@ -581,6 +581,9 @@ static void b53_port_set_learning(struct b53_device *dev, int port, {u16 reg; +if (is5325 (dev)) +return ; +b53_read16 (dev,B53_CTRL_PAGE ,B53_DIS_LEARNING , ®);if (learning) reg &= ~BIT (port);
@@ -2197,7 +2200,13 @@ int b53_br_flags_pre(struct dsa_switch *ds, int port,struct switchdev_brport_flags flags, struct netlink_ext_ack *extack) { -if (flags.mask & ~(BR_FLOOD |BR_MCAST_FLOOD |BR_LEARNING )) + struct b53_device *dev = ds->priv; +unsigned long mask = (BR_FLOOD |BR_MCAST_FLOOD ); + +if (!is5325 (dev)) + mask |=BR_LEARNING ; + +if (flags.mask & ~mask)return -EINVAL ;return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 252/444 net: dsa: b53: prevent SWITCH_CTRL access on BCM5325
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit 22ccaaca43440e90a3b68d2183045b42247dc4be ]
BCM5325 doesn't implement SWITCH_CTRL register so we should avoid reading or writing it.
--- drivers/net/dsa/b53/b53_common.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/net/dsa/b53/b53_common.c +6 -5
@@ -359,11 +359,12 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)b53_write8 (dev,B53_CTRL_PAGE ,B53_SWITCH_MODE , mgmt); -/* Include IMP port in dumb forwarding mode -*/ -b53_read8 (dev,B53_CTRL_PAGE ,B53_SWITCH_CTRL , &mgmt); - mgmt |=B53_MII_DUMB_FWDG_EN ; -b53_write8 (dev,B53_CTRL_PAGE ,B53_SWITCH_CTRL , mgmt); +if (!is5325 (dev)) { +/* Include IMP port in dumb forwarding mode */ +b53_read8 (dev,B53_CTRL_PAGE ,B53_SWITCH_CTRL , &mgmt); + mgmt |=B53_MII_DUMB_FWDG_EN ; +b53_write8 (dev,B53_CTRL_PAGE ,B53_SWITCH_CTRL , mgmt); + }/* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether * frames should be flooded or not.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 253/444 bpftool: Fix JSON writer resource leak in version command
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuan Chen <[email protected]>
[ Upstream commit 85cd83fed8267cde0dd1cea719808aad95ae4de7 ]
When using bpftool --version -j/-p, the JSON writer object created in do_version() was not properly destroyed after use. This caused a memory leak each time the version command was executed with JSON output.
Fix: 004b45c0e51a (tools: bpftool: provide JSON output for all possible commands)
--- tools/bpf/bpftool/main.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
tools/bpf/bpftool/main.c +3 -3
@@ -534,9 +534,9 @@ int main(int argc, char **argv)usage ();if (version_requested) -return do_version (argc, argv); - - ret =cmd_select (commands, argc, argv, do_help); + ret =do_version (argc, argv); +else + ret =cmd_select (commands, argc, argv, do_help);if (json_output)jsonw_destroy (&json_wtr);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 254/444 ptp: Use ratelimite for freerun error message
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit e9a7795e75b78b56997fb0070c18d6e1057b6462 ]
Replace pr_err() with pr_err_ratelimited() in ptp_clock_settime() to prevent log flooding when the physical clock is free running, which happens on some of my hosts. This ensures error messages are rate-limited and improves kernel log readability.
--- drivers/ptp/ptp_clock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/ptp/ptp_clock.c +1 -1
@@ -96,7 +96,7 @@ static int ptp_clock_settime(struct posix_clock *pc, const struct timespec64 *tp struct ptp_clock *ptp = container_of(pc, struct ptp_clock, clock);if (ptp_clock_freerun (ptp)) { -pr_err ("ptp: physical clock is free running\n" ); +pr_err_ratelimited ("ptp: physical clock is free running\n" );return -EBUSY ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 255/444 wifi: rtw89: scan abort when assign/unassign_vif
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chih-Kang Chang <[email protected]>
[ Upstream commit 3db8563bac6c34018cbb96b14549a95c368b0304 ]
If scan happen during start_ap, the register which control TX might be turned off during scan. Additionally, if set_channel occurs during scan will backup this register and set to firmware after set_channel done. When scan complete, firmware will also set TX by this register, causing TX to be disabled and beacon can't be TX. Therefore, in assign/unassign_vif call scan abort before set_channel to avoid scan racing with set_channel.
--- drivers/net/wireless/realtek/rtw89/chan.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/wireless/realtek/rtw89/chan.c +6 -0
@@ -2682,6 +2682,9 @@ int rtw89_chanctx_ops_assign_vif(struct rtw89_dev *rtwdev, rtwvif_link->chanctx_assigned = true; cfg->ref_count++; +if (rtwdev->scanning) +rtw89_hw_scan_abort (rtwdev, rtwdev->scan_info.scanning_vif); +if (list_empty (&rtwvif->mgnt_entry))list_add_tail (&rtwvif->mgnt_entry, &mgnt->active_list);
@@ -2715,6 +2718,9 @@ void rtw89_chanctx_ops_unassign_vif(struct rtw89_dev *rtwdev, rtwvif_link->chanctx_assigned = false; cfg->ref_count--; +if (rtwdev->scanning) +rtw89_hw_scan_abort (rtwdev, rtwdev->scan_info.scanning_vif); +if (!rtw89_vif_is_active_role (rtwvif))list_del_init (&rtwvif->mgnt_entry);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 256/444 wifi: rtlwifi: fix possible skb memory leak in _rtl_pci_init_one_rxdesc()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Fourier <[email protected]>
[ Upstream commit 76b3e5078d76f0eeadb7aacf9845399f8473da0d ]
When dma_mapping_error() is true, if a new skb has been allocated, then it must be de-allocated.
Compile tested only
--- drivers/net/wireless/realtek/rtlwifi/pci.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/net/wireless/realtek/rtlwifi/pci.c +4 -1
@@ -572,8 +572,11 @@ static int _rtl_pci_init_one_rxdesc(struct ieee80211_hw *hw,dma_map_single (&rtlpci->pdev->dev,skb_tail_pointer (skb), rtlpci->rxbuffersize,DMA_FROM_DEVICE ); bufferaddress = *((dma_addr_t *)skb->cb); -if (dma_mapping_error (&rtlpci->pdev->dev, bufferaddress)) +if (dma_mapping_error (&rtlpci->pdev->dev, bufferaddress)) { +if (!new_skb) +kfree_skb (skb);return 0 ; + } rtlpci->rx_ring[rxring_idx].rx_buf[desc_idx] = skb;if (rtlpriv->use_new_trx_flow) {/* skb->cb may be 64 bit address */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 257/444 ionic: clean dbpage in de-init
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shannon Nelson <[email protected]>
[ Upstream commit c9080abea1e69b8b1408ec7dec0acdfdc577a3e2 ]
Since the kern_dbpage gets set up in ionic_lif_init() and that function's error path will clean it if needed, the kern_dbpage on teardown should be cleaned in ionic_lif_deinit(), not in ionic_lif_free(). As it is currently we get a double call to iounmap() on kern_dbpage if the PCI ionic fails setting up the lif. One example of this is when firmware isn't responding to AdminQ requests and ionic's first AdminQ call fails to setup the NotifyQ.
--- drivers/net/ethernet/pensando/ionic/ionic_lif.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/net/ethernet/pensando/ionic/ionic_lif.c +3 -4
@@ -3526,10 +3526,6 @@ void ionic_lif_free(struct ionic_lif *lif) lif->info =NULL ; lif->info_pa =0 ; -/* unmap doorbell page */ -ionic_bus_unmap_dbpage (lif->ionic, lif->kern_dbpage); - lif->kern_dbpage =NULL ; -mutex_destroy (&lif->config_lock);mutex_destroy (&lif->queue_lock);
@@ -3555,6 +3551,9 @@ void ionic_lif_deinit(struct ionic_lif *lif)ionic_lif_qcq_deinit (lif, lif->notifyqcq);ionic_lif_qcq_deinit (lif, lif->adminqcq); +ionic_bus_unmap_dbpage (lif->ionic, lif->kern_dbpage); + lif->kern_dbpage =NULL ; +ionic_lif_reset (lif); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 258/444 drm/xe: Make dma-fences compliant with the safe access rules
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
[ Upstream commit 6bd90e700b4285e6a7541e00f969cab0d696adde ]
Xe can free some of the data pointed to by the dma-fences it exports. Most notably the timeline name can get freed if userspace closes the associated submit queue. At the same time the fence could have been exported to a third party (for example a sync_fence fd) which will then cause an use- after-free on subsequent access.
To make this safe we need to make the driver compliant with the newly documented dma-fence rules. Driver has to ensure a RCU grace period between signalling a fence and freeing any data pointed to by said fence.
For the timeline name we simply make the queue be freed via kfree_rcu and for the shared lock associated with multiple queues we add a RCU grace period before freeing the per GT structure holding the lock.
--- drivers/gpu/drm/xe/xe_guc_exec_queue_types.h | 2 ++ drivers/gpu/drm/xe/xe_guc_submit.c | 7 ++++++- drivers/gpu/drm/xe/xe_hw_fence.c | 3 +++ 3 files changed, 11 insertions(+), 1 deletion(-)
drivers/gpu/drm/xe/xe_guc_exec_queue_types.h +2 -0
@@ -20,6 +20,8 @@ struct xe_exec_queue;struct xe_guc_exec_queue {/** @q: Backpointer to parent xe_exec_queue */ struct xe_exec_queue *q; +/** @rcu: For safe freeing of exported dma fences */ +struct rcu_head rcu;/** @sched: GPU scheduler for this xe_exec_queue */ struct xe_gpu_scheduler sched;/** @entity: Scheduler entity for this xe_exec_queue */
drivers/gpu/drm/xe/xe_guc_submit.c +6 -1
@@ -1241,7 +1241,11 @@ static void __guc_exec_queue_fini_async(struct work_struct *w)xe_sched_entity_fini (&ge->entity);xe_sched_fini (&ge->sched); -kfree (ge); +/* +* RCU free due sched being exported via DRM scheduler fences +* (timeline name). +*/ +kfree_rcu (ge, rcu);xe_exec_queue_fini (q);xe_pm_runtime_put (guc_to_xe (guc)); }
@@ -1427,6 +1431,7 @@ static int guc_exec_queue_init(struct xe_exec_queue *q) q->guc = ge; ge->q = q; +init_rcu_head (&ge->rcu);init_waitqueue_head (&ge->suspend_wait);for (i =0 ; i <MAX_STATIC_MSG_TYPE ; ++i)
drivers/gpu/drm/xe/xe_hw_fence.c +3 -0
@@ -100,6 +100,9 @@ void xe_hw_fence_irq_finish(struct xe_hw_fence_irq *irq)spin_unlock_irqrestore (&irq->lock, flags);dma_fence_end_signalling (tmp); } + +/* Safe release of the irq->lock used in dma_fence_init. */ +synchronize_rcu (); }void xe_hw_fence_irq_run (struct xe_hw_fence_irq *irq)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 259/444 net: ncsi: Fix buffer overflow in fetching version id
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hari Kalavakunta <[email protected]>
[ Upstream commit 8e16170ae972c7fed132bc928914a2ffb94690fc ]
In NC-SI spec v1.2 section 8.4.44.2, the firmware name doesn't need to be null terminated while its size occupies the full size of the field. Fix the buffer overflow issue by adding one additional byte for null terminator.
--- net/ncsi/internal.h | 2 +- net/ncsi/ncsi-rsp.c | 1 + 2 files changed, 2 insertions(+), 1 deletion(-)
net/ncsi/internal.h +1 -1
@@ -110,7 +110,7 @@ struct ncsi_channel_version {u8 update;/* NCSI version update */ char alpha1;/* NCSI version alpha1 */ char alpha2;/* NCSI version alpha2 */ -u8 fw_name[12 ];/* Firmware name string */ +u8 fw_name[12 +1 ];/* Firmware name string */ u32 fw_version;/* Firmware version */ u16 pci_ids[4 ];/* PCI identification */ u32 mf_id;/* Manufacture ID */
net/ncsi/ncsi-rsp.c +1 -0
@@ -775,6 +775,7 @@ static int ncsi_rsp_handler_gvi(struct ncsi_request *nr) ncv->alpha1 = rsp->alpha1; ncv->alpha2 = rsp->alpha2;memcpy (ncv->fw_name, rsp->fw_name,12 ); + ncv->fw_name[12 ] ='\0' ; ncv->fw_version =ntohl (rsp->fw_version);for (i =0 ; i <ARRAY_SIZE (ncv->pci_ids); i++) ncv->pci_ids[i] =ntohs (rsp->pci_ids[i]);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 260/444 drm: renesas: rz-du: mipi_dsi: Add min check for VCLK range
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lad Prabhakar <[email protected]>
[ Upstream commit e37a95d01d5acce211da8446fefbd8684c67f516 ]
The VCLK range for Renesas RZ/G2L SoC is 5.803 MHz to 148.5 MHz. Add a minimum clock check in the mode_valid callback to ensure that the clock value does not fall below the valid range.
--- drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/renesas/rz-du/rzg2l_mipi_dsi.c +3 -0
@@ -585,6 +585,9 @@ rzg2l_mipi_dsi_bridge_mode_valid(struct drm_bridge *bridge,if (mode->clock >148500 )return MODE_CLOCK_HIGH ; +if (mode->clock <5803 ) +return MODE_CLOCK_LOW ; +return MODE_OK ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 261/444 drm/ttm: Should to return the evict error
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emily Deng <[email protected]>
[ Upstream commit 4e16a9a00239db5d819197b9a00f70665951bf50 ]
For the evict fail case, the evict error should be returned.
v2: Consider ENOENT case.
v3: Abort directly when the eviction failed for some reason (except for -ENOENT)
and not wait for the move to finish
--- drivers/gpu/drm/ttm/ttm_resource.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/ttm/ttm_resource.c +3 -0
@@ -501,6 +501,9 @@ int ttm_resource_manager_evict_all(struct ttm_device *bdev,cond_resched (); }while (!ret); +if (ret && ret != -ENOENT ) +return ret; +spin_lock (&man->move_lock); fence =dma_fence_get (man->move);spin_unlock (&man->move_lock);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 262/444 uapi: in6: restore visibility of most IPv6 socket options
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jakub Kicinski <[email protected]>
[ Upstream commit 31557b3487b349464daf42bc4366153743c1e727 ]
A decade ago commit 6d08acd2d32e ("in6: fix conflict with glibc") hid the definitions of IPV6 options, because GCC was complaining about duplicates. The commit did not list the warnings seen, but trying to recreate them now I think they are (building iproute2):
In file included from ./include/uapi/rdma/rdma_user_cm.h:39,
from rdma.h:16,
from res.h:9,
from res-ctx.c:7:
../include/uapi/linux/in6.h:171:9: warning: ‘IPV6_ADD_MEMBERSHIP’ redefined
171 | #define IPV6_ADD_MEMBERSHIP 20
| ^~~~~~~~~~~~~~~~~~~
In file included from /usr/include/netinet/in.h:37,
from rdma.h:13:
/usr/include/bits/in.h:233:10: note: this is the location of the previous definition
233 | # define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP
| ^~~~~~~~~~~~~~~~~~~
../include/uapi/linux/in6.h:172:9: warning: ‘IPV6_DROP_MEMBERSHIP’ redefined
172 | #define IPV6_DROP_MEMBERSHIP 21
| ^~~~~~~~~~~~~~~~~~~~
/usr/include/bits/in.h:234:10: note: this is the location of the previous definition
234 | # define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP
| ^~~~~~~~~~~~~~~~~~~~Compilers don't complain about redefinition if the defines are identical, but here we have the kernel using the literal value, and glibc using an indirection (defining to a name of another define, with the same numerical value).
Problem is, the commit in question hid all the IPV6 socket options, and glibc has a pretty sparse list. For instance it lacks Flow Label related options. Willem called this out in commit 3fb321fde22d ("selftests/net: ipv6 flowlabel"):
/* uapi/glibc weirdness may leave this undefined */ #ifndef IPV6_FLOWINFO #define IPV6_FLOWINFO 11 #endif
More interestingly some applications (socat) use a #ifdef IPV6_FLOWINFO to gate compilation of thier rudimentary flow label support. (For added confusion socat misspells it as IPV4_FLOWINFO in some places.)
Hide only the two defines we know glibc has a problem with. If we discover more warnings we can hide more but we should avoid covering the entire block of defines for "IPV6 socket options".
--- include/uapi/linux/in6.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
include/uapi/linux/in6.h +2 -2
@@ -152,7 +152,6 @@ struct in6_flowlabel_req {/* * IPV6 socket options */ -#if __UAPI_DEF_IPV6_OPTIONS#define IPV6_ADDRFORM 1#define IPV6_2292PKTINFO 2#define IPV6_2292HOPOPTS 3
@@ -169,8 +168,10 @@ struct in6_flowlabel_req {#define IPV6_MULTICAST_IF 17#define IPV6_MULTICAST_HOPS 18#define IPV6_MULTICAST_LOOP 19 +#if __UAPI_DEF_IPV6_OPTIONS#define IPV6_ADD_MEMBERSHIP 20#define IPV6_DROP_MEMBERSHIP 21 +#endif #define IPV6_ROUTER_ALERT 22#define IPV6_MTU_DISCOVER 23#define IPV6_MTU 24
@@ -203,7 +204,6 @@ struct in6_flowlabel_req {#define IPV6_IPSEC_POLICY 34#define IPV6_XFRM_POLICY 35#define IPV6_HDRINCL 36 -#endif /* * Multicast:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 263/444 bpf: Make reg_not_null() true for CONST_PTR_TO_MAP
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ihor Solodrai <[email protected]>
[ Upstream commit 5534e58f2e9bd72b253d033ee0af6e68eb8ac96b ]
When reg->type is CONST_PTR_TO_MAP, it can not be null. However the verifier explores the branches under rX == 0 in check_cond_jmp_op() even if reg->type is CONST_PTR_TO_MAP, because it was not checked for in reg_not_null().
Fix this by adding CONST_PTR_TO_MAP to the set of types that are considered non nullable in reg_not_null().
An old "unpriv: cmp map pointer with zero" selftest fails with this change, because now early out correctly triggers in check_cond_jmp_op(), making the verification to pass.
In practice verifier may allow pointer to null comparison in unpriv, since in many cases the relevant branch and comparison op are removed as dead code. So change the expected test result to __success_unpriv.
--- kernel/bpf/verifier.c | 3 ++- tools/testing/selftests/bpf/progs/verifier_unpriv.c | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-)
kernel/bpf/verifier.c +2 -1
@@ -400,7 +400,8 @@ static bool reg_not_null(const struct bpf_reg_state *reg) type ==PTR_TO_MAP_KEY || type ==PTR_TO_SOCK_COMMON || (type ==PTR_TO_BTF_ID &&is_trusted_reg (reg)) || - type ==PTR_TO_MEM ; + type ==PTR_TO_MEM || + type ==CONST_PTR_TO_MAP ; }static struct btf_record *reg_btf_record (const struct bpf_reg_state *reg)
tools/testing/selftests/bpf/progs/verifier_unpriv.c +1 -1
@@ -619,7 +619,7 @@ __naked void pass_pointer_to_tail_call(void) SEC("socket") __description("unpriv: cmp map pointer with zero") -__success __failure_unpriv __msg_unpriv("R1 pointer comparison") +__success __success_unpriv __retval(0) __naked void cmp_map_pointer_with_zero(void) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 264/444 selftests/bpf: Fix ringbuf/ringbuf_write test failure with arm64 64KB page size
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonghong Song <[email protected]>
[ Upstream commit 8c8c5e3c854a2593ec90dacd868f3066b67de1c4 ]
The ringbuf max_entries must be PAGE_ALIGNED. See kernel function ringbuf_map_alloc(). So for arm64 64KB page size, adjust max_entries and other related metrics properly.
--- tools/testing/selftests/bpf/prog_tests/ringbuf.c | 4 ++-- tools/testing/selftests/bpf/progs/test_ringbuf_write.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/bpf/prog_tests/ringbuf.c +2 -2
@@ -97,7 +97,7 @@ static void ringbuf_write_subtest(void)if (!ASSERT_OK_PTR (skel,"skel_open" ))return ; - skel->maps.ringbuf.max_entries =0x4000 ; + skel->maps.ringbuf.max_entries =0x40000 ; err =test_ringbuf_write_lskel__load (skel);if (!ASSERT_OK (err,"skel_load" ))
@@ -108,7 +108,7 @@ static void ringbuf_write_subtest(void) mmap_ptr =mmap (NULL , page_size,PROT_READ |PROT_WRITE ,MAP_SHARED , rb_fd,0 );if (!ASSERT_OK_PTR (mmap_ptr,"rw_cons_pos" )) goto cleanup; - *mmap_ptr =0x3000 ; + *mmap_ptr =0x30000 ;ASSERT_OK (munmap (mmap_ptr, page_size),"unmap_rw" ); skel->bss->pid =getpid ();
tools/testing/selftests/bpf/progs/test_ringbuf_write.c +2 -2
@@ -26,11 +26,11 @@ int test_ringbuf_write(void *ctx)if (cur_pid != pid)return 0 ; - sample1 =bpf_ringbuf_reserve (&ringbuf,0x3000 ,0 ); + sample1 =bpf_ringbuf_reserve (&ringbuf,0x30000 ,0 );if (!sample1)return 0 ;/* first one can pass */ - sample2 =bpf_ringbuf_reserve (&ringbuf,0x3000 ,0 ); + sample2 =bpf_ringbuf_reserve (&ringbuf,0x30000 ,0 );if (!sample2) {bpf_ringbuf_discard (sample1,0 );__sync_fetch_and_add (&discarded,1 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 265/444 selftests/bpf: Fix a user_ringbuf failure with arm64 64KB page size
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yonghong Song <[email protected]>
[ Upstream commit bbc7bd658ddc662083639b9e9a280b90225ecd9a ]
The ringbuf max_entries must be PAGE_ALIGNED. See kernel function ringbuf_map_alloc(). So for arm64 64KB page size, adjust max_entries properly.
--- tools/testing/selftests/bpf/prog_tests/user_ringbuf.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
tools/testing/selftests/bpf/prog_tests/user_ringbuf.c +7 -3
@@ -21,8 +21,7 @@#include "../progs/test_user_ringbuf.h" static const long c_sample_size =sizeof (struct sample ) +BPF_RINGBUF_HDR_SZ ; -static const long c_ringbuf_size =1 <<12 ;/* 1 small page */ -static const long c_max_entries = c_ringbuf_size / c_sample_size; +static long c_ringbuf_size, c_max_entries;static void drain_current_samples (void ) {
@@ -424,7 +423,9 @@ static void test_user_ringbuf_loop(void)uint32_t remaining_samples = total_samples;int err; -BUILD_BUG_ON (total_samples <= c_max_entries); +if (!ASSERT_LT (c_max_entries, total_samples,"compare_c_max_entries" )) +return ; + err =load_skel_create_user_ringbuf (&skel, &ringbuf);if (err)return ;
@@ -686,6 +687,9 @@ void test_user_ringbuf(void) {int i; + c_ringbuf_size =getpagesize ();/* 1 page */ + c_max_entries = c_ringbuf_size / c_sample_size; +for (i =0 ; i <ARRAY_SIZE (success_tests); i++) {if (!test__start_subtest (success_tests[i].test_name))continue ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 266/444 drm/amd/display: Update DMCUB loading sequence for DCN3.5
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Kazlauskas <[email protected]>
[ Upstream commit d42b2331e158fa6bcdc89e4c8c470dc5da20be1f ]
[Why]
New sequence from HW for reset and firmware reloading has been provided that aims to stabilize the reload sequence in the case the firmware is hung or has outstanding requests.
[How]
Update the sequence to remove the DMUIF reset and the redundant writes in the release.
--- .../gpu/drm/amd/display/dmub/src/dmub_dcn35.c | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-)
drivers/gpu/drm/amd/display/dmub/src/dmub_dcn35.c +3 -13
@@ -92,19 +92,15 @@ void dmub_dcn35_reset(struct dmub_srv *dmub)uint32_t in_reset, is_enabled, scratch, i, pwait_mode;REG_GET (DMCUB_CNTL2 ,DMCUB_SOFT_RESET , &in_reset); +REG_GET (DMCUB_CNTL ,DMCUB_ENABLE , &is_enabled); -if (in_reset ==0 ) { +if (in_reset ==0 && is_enabled !=0 ) { cmd.bits.status =1 ; cmd.bits.command_code =DMUB_GPINT__STOP_FW ; cmd.bits.param =0 ; dmub->hw_funcs.set_gpint (dmub, cmd); -/** -* Timeout covers both the ACK and the wait -* for remaining work to finish. -*/ -for (i =0 ; i < timeout; ++i) {if (dmub->hw_funcs.is_gpint_acked (dmub, cmd))break ;
@@ -130,11 +126,9 @@ void dmub_dcn35_reset(struct dmub_srv *dmub)/* Force reset in case we timed out, DMCUB is likely hung. */ } -REG_GET (DMCUB_CNTL ,DMCUB_ENABLE , &is_enabled); -if (is_enabled) {REG_UPDATE (DMCUB_CNTL2 ,DMCUB_SOFT_RESET ,1 ); -REG_UPDATE (MMHUBBUB_SOFT_RESET ,DMUIF_SOFT_RESET ,1 ); +udelay (1 );REG_UPDATE (DMCUB_CNTL ,DMCUB_ENABLE ,0 ); }
@@ -160,11 +154,7 @@ void dmub_dcn35_reset_release(struct dmub_srv *dmub)LONO_SOCCLK_GATE_DISABLE ,1 , LONO_DMCUBCLK_GATE_DISABLE, 1); -REG_UPDATE (MMHUBBUB_SOFT_RESET ,DMUIF_SOFT_RESET ,1 ); -udelay (1 );REG_UPDATE_2 (DMCUB_CNTL ,DMCUB_ENABLE ,1 ,DMCUB_TRACEPORT_EN ,1 ); -REG_UPDATE (DMCUB_CNTL2 ,DMCUB_SOFT_RESET ,1 ); -udelay (1 );REG_UPDATE (MMHUBBUB_SOFT_RESET ,DMUIF_SOFT_RESET ,0 );REG_UPDATE (DMCUB_CNTL2 ,DMCUB_SOFT_RESET ,0 ); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 267/444 drm/amd/display: Avoid trying AUX transactions on disconnected ports
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wayne Lin <[email protected]>
[ Upstream commit deb24e64c8881c462b29e2c69afd9e6669058be5 ]
[Why & How]
Observe that we try to access DPCD 0x600h of disconnected DP ports. In order not to wasting time on retrying these ports, call dpcd_write_rx_power_ctrl() after checking its connection status.
--- drivers/gpu/drm/amd/display/dc/link/link_dpms.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/link/link_dpms.c +2 -1
@@ -140,7 +140,8 @@ void link_blank_dp_stream(struct dc_link *link, bool hw_init) } } -if ((!link->wa_flags.dp_keep_receiver_powered) || hw_init) +if (((!link->wa_flags.dp_keep_receiver_powered) || hw_init) && + (link->type != dc_connection_none))dpcd_write_rx_power_ctrl (link, false); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 268/444 drm/ttm: Respect the shrinker core free target
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tvrtko Ursulin <[email protected]>
[ Upstream commit eac21f8ebeb4f84d703cf41dc3f81d16fa9dc00a ]
Currently the TTM shrinker aborts shrinking as soon as it frees pages from any of the page order pools and by doing so it can fail to respect the freeing target which was configured by the shrinker core.
We use the wording "can fail" because the number of freed pages will depend on the presence of pages in the pools and the order of the pools on the LRU list. For example if there are no free pages in the high order pools the shrinker core may require multiple passes over the TTM shrinker before it will free the default target of 128 pages (assuming there are free pages in the low order pools). This inefficiency can be compounded by the pool LRU where multiple further calls into the TTM shrinker are required to end up looking at the pool with pages.
Improve this by never freeing less than the shrinker core has requested.
At the same time we start reporting the number of scanned pages (freed in this case), which prevents the core shrinker from giving up on the TTM shrinker too soon and moving on.
v2:
* Simplify loop logic. (Christian)
* Improve commit message.
--- drivers/gpu/drm/ttm/ttm_pool.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/gpu/drm/ttm/ttm_pool.c +5 -3
@@ -630,7 +630,6 @@ void ttm_pool_fini(struct ttm_pool *pool) }EXPORT_SYMBOL (ttm_pool_fini); -/* As long as pages are available make sure to release at least one */ static unsigned long ttm_pool_shrinker_scan (struct shrinker *shrink,struct shrink_control *sc) {
@@ -638,9 +637,12 @@ static unsigned long ttm_pool_shrinker_scan(struct shrinker *shrink,do num_freed +=ttm_pool_shrink (); -while (!num_freed &&atomic_long_read (&allocated_pages)); +while (num_freed < sc->nr_to_scan && +atomic_long_read (&allocated_pages)); -return num_freed; + sc->nr_scanned = num_freed; + +return num_freed ?:SHRINK_STOP ; }/* Return the number of pages available or SHRINK_EMPTY if we have none */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 269/444 rcu: Fix rcu_read_unlock() deadloop due to IRQ work
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Joel Fernandes <[email protected]>
[ Upstream commit b41642c87716bbd09797b1e4ea7d904f06c39b7b ]
During rcu_read_unlock_special(), if this happens during irq_exit(), we can lockup if an IPI is issued. This is because the IPI itself triggers the irq_exit() path causing a recursive lock up.
This is precisely what Xiongfeng found when invoking a BPF program on the trace_tick_stop() tracepoint As shown in the trace below. Fix by managing the irq_work state correctly.
irq_exit()
__irq_exit_rcu()
/* in_hardirq() returns false after this */
preempt_count_sub(HARDIRQ_OFFSET)
tick_irq_exit()
tick_nohz_irq_exit()
tick_nohz_stop_sched_tick()
trace_tick_stop() /* a bpf prog is hooked on this trace point */
__bpf_trace_tick_stop()
bpf_trace_run2()
rcu_read_unlock_special()
/* will send a IPI to itself */
irq_work_queue_on(&rdp->defer_qs_iw, rdp->cpu);A simple reproducer can also be obtained by doing the following in tick_irq_exit(). It will hang on boot without the patch:
static inline void tick_irq_exit(void)
{
+ rcu_read_lock();
+ WRITE_ONCE(current->rcu_read_unlock_special.b.need_qs, true);
+ rcu_read_unlock();
+
--- kernel/rcu/tree.h | 13 ++++++++++++- kernel/rcu/tree_plugin.h | 37 ++++++++++++++++++++++++++----------- 2 files changed, 38 insertions(+), 12 deletions(-)
kernel/rcu/tree.h +12 -1
@@ -174,6 +174,17 @@ struct rcu_snap_record {unsigned long jiffies;/* Track jiffies value */ }; +/* +* An IRQ work (deferred_qs_iw) is used by RCU to get the scheduler's attention. +* to report quiescent states at the soonest possible time. +* The request can be in one of the following states: +* - DEFER_QS_IDLE: An IRQ work is yet to be scheduled. +* - DEFER_QS_PENDING: An IRQ work was scheduled but either not yet run, or it +* ran and we still haven't reported a quiescent state. +*/ +#define DEFER_QS_IDLE 0 +#define DEFER_QS_PENDING 1 +/* Per-CPU data for read-copy update. */ struct rcu_data {/* 1) quiescent-state and grace-period handling : */
@@ -191,7 +202,7 @@ struct rcu_data {/* during and after the last grace */ /* period it is aware of. */ struct irq_work defer_qs_iw;/* Obtain later scheduler attention. */ -bool defer_qs_iw_pending;/* Scheduler attention pending? */ +int defer_qs_iw_pending;/* Scheduler attention pending? */ struct work_struct strict_work;/* Schedule readers for strict GPs. */ /* 2) batch handling */
kernel/rcu/tree_plugin.h +26 -11
@@ -485,13 +485,16 @@ rcu_preempt_deferred_qs_irqrestore(struct task_struct *t, unsigned long flags)struct rcu_node *rnp;union rcu_special special; + rdp =this_cpu_ptr (&rcu_data); +if (rdp->defer_qs_iw_pending ==DEFER_QS_PENDING ) + rdp->defer_qs_iw_pending =DEFER_QS_IDLE ; +/* * If RCU core is waiting for this CPU to exit its critical section, * report the fact that it has exited. Because irqs are disabled, * t->rcu_read_unlock_special cannot change. */ special = t->rcu_read_unlock_special; - rdp =this_cpu_ptr (&rcu_data);if (!special.s && !rdp->cpu_no_qs.b.exp) {local_irq_restore (flags);return ;
@@ -628,7 +631,23 @@ static void rcu_preempt_deferred_qs_handler(struct irq_work *iwp) rdp = container_of(iwp, struct rcu_data, defer_qs_iw);local_irq_save (flags); - rdp->defer_qs_iw_pending = false; + +/* +* If the IRQ work handler happens to run in the middle of RCU read-side +* critical section, it could be ineffective in getting the scheduler's +* attention to report a deferred quiescent state (the whole point of the +* IRQ work). For this reason, requeue the IRQ work. +* +* Basically, we want to avoid following situation: +* 1. rcu_read_unlock() queues IRQ work (state -> DEFER_QS_PENDING) +* 2. CPU enters new rcu_read_lock() +* 3. IRQ work runs but cannot report QS due to rcu_preempt_depth() > 0 +* 4. rcu_read_unlock() does not re-queue work (state still PENDING) +* 5. Deferred QS reporting does not happen. +*/ +if (rcu_preempt_depth () >0 ) +WRITE_ONCE (rdp->defer_qs_iw_pending,DEFER_QS_IDLE ); +local_irq_restore (flags); }
@@ -675,17 +694,13 @@ static void rcu_read_unlock_special(struct task_struct *t)set_tsk_need_resched (current);set_preempt_need_resched ();if (IS_ENABLED (CONFIG_IRQ_WORK ) && irqs_were_disabled && - expboost && !rdp->defer_qs_iw_pending &&cpu_online (rdp->cpu)) { + expboost && rdp->defer_qs_iw_pending !=DEFER_QS_PENDING && +cpu_online (rdp->cpu)) {// Get scheduler to re-evaluate and call hooks. // If !IRQ_WORK, FQS scan will eventually IPI. -if (IS_ENABLED (CONFIG_RCU_STRICT_GRACE_PERIOD ) && -IS_ENABLED (CONFIG_PREEMPT_RT )) - rdp->defer_qs_iw =IRQ_WORK_INIT_HARD ( - rcu_preempt_deferred_qs_handler); -else -init_irq_work (&rdp->defer_qs_iw, - rcu_preempt_deferred_qs_handler); - rdp->defer_qs_iw_pending = true; + rdp->defer_qs_iw = +IRQ_WORK_INIT_HARD (rcu_preempt_deferred_qs_handler); + rdp->defer_qs_iw_pending =DEFER_QS_PENDING ;irq_work_queue_on (&rdp->defer_qs_iw, rdp->cpu); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 270/444 net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Álvaro Fernández Rojas <[email protected]>
[ Upstream commit 044d5ce2788b165798bfd173548e61bf7b6baf4d ]
BCM5325 doesn't implement B53_UC_FWD_EN, B53_MC_FWD_EN or B53_IPMC_FWD_EN.
--- drivers/net/dsa/b53/b53_common.c | 18 +++++++++++------- drivers/net/dsa/b53/b53_regs.h | 1 + 2 files changed, 12 insertions(+), 7 deletions(-)
drivers/net/dsa/b53/b53_common.c +11 -7
@@ -364,14 +364,18 @@ static void b53_set_forwarding(struct b53_device *dev, int enable)b53_read8 (dev,B53_CTRL_PAGE ,B53_SWITCH_CTRL , &mgmt); mgmt |=B53_MII_DUMB_FWDG_EN ;b53_write8 (dev,B53_CTRL_PAGE ,B53_SWITCH_CTRL , mgmt); - } -/* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether -* frames should be flooded or not. -*/ -b53_read8 (dev,B53_CTRL_PAGE ,B53_IP_MULTICAST_CTRL , &mgmt); - mgmt |=B53_UC_FWD_EN |B53_MC_FWD_EN |B53_IPMC_FWD_EN ; -b53_write8 (dev,B53_CTRL_PAGE ,B53_IP_MULTICAST_CTRL , mgmt); +/* Look at B53_UC_FWD_EN and B53_MC_FWD_EN to decide whether +* frames should be flooded or not. +*/ +b53_read8 (dev,B53_CTRL_PAGE ,B53_IP_MULTICAST_CTRL , &mgmt); + mgmt |=B53_UC_FWD_EN |B53_MC_FWD_EN |B53_IPMC_FWD_EN ; +b53_write8 (dev,B53_CTRL_PAGE ,B53_IP_MULTICAST_CTRL , mgmt); + }else { +b53_read8 (dev,B53_CTRL_PAGE ,B53_IP_MULTICAST_CTRL , &mgmt); + mgmt |=B53_IP_MCAST_25 ; +b53_write8 (dev,B53_CTRL_PAGE ,B53_IP_MULTICAST_CTRL , mgmt); + } } static void b53_enable_vlan(struct b53_device *dev, int port, bool enable,
drivers/net/dsa/b53/b53_regs.h +1 -0
@@ -110,6 +110,7 @@/* IP Multicast control (8 bit) */ #define B53_IP_MULTICAST_CTRL 0x21 +#define B53_IP_MCAST_25 BIT(0)#define B53_IPMC_FWD_EN BIT(1)#define B53_UC_FWD_EN BIT(6)#define B53_MC_FWD_EN BIT(7)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 271/444 vsock/virtio: Resize receive buffers so that each SKB fits in a 4K page
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
[ Upstream commit 03a92f036a04fed2b00d69f5f46f1a486e70dc5c ]
When allocating receive buffers for the vsock virtio RX virtqueue, an SKB is allocated with a 4140 data payload (the 44-byte packet header + VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE). Even when factoring in the SKB overhead, the resulting 8KiB allocation thanks to the rounding in kmalloc_reserve() is wasteful (~3700 unusable bytes) and results in a higher-order page allocation on systems with 4KiB pages just for the sake of a few hundred bytes of packet data.
Limit the vsock virtio RX buffers to 4KiB per SKB, resulting in much better memory utilisation and removing the need to allocate higher-order pages entirely.
Message-Id: <[email protected]>
--- include/linux/virtio_vsock.h | 7 ++++++- net/vmw_vsock/virtio_transport.c | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-)
include/linux/virtio_vsock.h +6 -1
@@ -111,7 +111,12 @@ static inline size_t virtio_vsock_skb_len(struct sk_buff *skb)return (size_t )(skb_end_pointer (skb) - skb->head); } -#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE (1024 * 4) +/* Dimension the RX SKB so that the entire thing fits exactly into +* a single 4KiB page. This avoids wasting memory due to alloc_skb() +* rounding up to the next page order and also means that we +* don't leave higher-order pages sitting around in the RX queue. +*/ +#define VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE SKB_WITH_OVERHEAD(1024 * 4)#define VIRTIO_VSOCK_MAX_BUF_SIZE 0xFFFFFFFFUL#define VIRTIO_VSOCK_MAX_PKT_BUF_SIZE (1024 * 64)
net/vmw_vsock/virtio_transport.c +1 -1
@@ -307,7 +307,7 @@ virtio_transport_cancel_pkt(struct vsock_sock *vsk)static void virtio_vsock_rx_fill (struct virtio_vsock *vsock) { -int total_len =VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE +VIRTIO_VSOCK_SKB_HEADROOM ; +int total_len =VIRTIO_VSOCK_DEFAULT_RX_BUF_SIZE ;struct scatterlist pkt, *p;struct virtqueue *vq;struct sk_buff *skb;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 272/444 vhost: fail early when __vhost_add_used() fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Wang <[email protected]>
[ Upstream commit b4ba1207d45adaafa2982c035898b36af2d3e518 ]
This patch fails vhost_add_used_n() early when __vhost_add_used() fails to make sure used idx is not updated with stale used ring information.
Message-Id: <[email protected]>
--- drivers/vhost/vhost.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/vhost/vhost.c +3 -0
@@ -2971,6 +2971,9 @@ int vhost_add_used_n(struct vhost_virtqueue *vq, struct vring_used_elem *heads, } r =__vhost_add_used_n (vq, heads, count); +if (r <0 ) +return r; +/* Make sure buffer is written before we update index. */ smp_wmb ();if (vhost_put_used_idx (vq)) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 273/444 drm/amd/display: Only finalize atomic_obj if it was initialized
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit b174084b3fe15ad1acc69530e673c1535d2e4f85 ]
[Why]
If amdgpu_dm failed to initalize before amdgpu_dm_initialize_drm_device() completed then freeing atomic_obj will lead to list corruption.
[How]
Check if atomic_obj state is initialized before trying to free.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +2 -1
@@ -5223,7 +5223,8 @@ static int amdgpu_dm_initialize_drm_device(struct amdgpu_device *adev)static void amdgpu_dm_destroy_drm_device (struct amdgpu_display_manager *dm) { -drm_atomic_private_obj_fini (&dm->atomic_obj); +if (dm->atomic_obj.state) +drm_atomic_private_obj_fini (&dm->atomic_obj); }/******************************************************************************
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 274/444 drm/amd/display: Avoid configuring PSR granularity if PSR-SU not supported
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mario Limonciello <[email protected]>
[ Upstream commit a5ce8695d6d1b40d6960d2d298b579042c158f25 ]
[Why]
If PSR-SU is disabled on the link, then configuring su_y granularity in mod_power_calc_psr_configs() can lead to assertions in psr_su_set_dsc_slice_height().
[How]
Check the PSR version in amdgpu_dm_link_setup_psr() to determine whether or not to configure granularity.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_psr.c +4 -2
@@ -127,8 +127,10 @@ bool amdgpu_dm_link_setup_psr(struct dc_stream_state *stream) psr_config.allow_multi_disp_optimizations = (amdgpu_dc_feature_mask &DC_PSR_ALLOW_MULTI_DISP_OPT ); -if (!psr_su_set_dsc_slice_height (dc, link, stream, &psr_config)) -return false; +if (link->psr_settings.psr_version ==DC_PSR_VERSION_SU_1 ) { +if (!psr_su_set_dsc_slice_height (dc, link, stream, &psr_config)) +return false; + } ret =dc_link_setup_psr (link, stream, &psr_config, &psr_context);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 275/444 drm/amd/display: Disable dsc_power_gate for dcn314 by default
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Roman Li <[email protected]>
[ Upstream commit 02f3ec53177243d32ee8b6f8ba99136d7887ee3a ]
[Why]
"REG_WAIT timeout 1us * 1000 tries - dcn314_dsc_pg_control line" warnings seen after resuming from s2idle.
DCN314 has issues with DSC power gating that cause REG_WAIT timeouts when attempting to power down DSC blocks.
[How]
Disable dsc_power_gate for dcn314 by default.
--- drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c | 1 + 1 file changed, 1 insertion(+)
drivers/gpu/drm/amd/display/dc/resource/dcn314/dcn314_resource.c +1 -0
@@ -927,6 +927,7 @@ static const struct dc_debug_options debug_defaults_drv = { .seamless_boot_odm_combine = true, .enable_legacy_fast_update = true, .using_dml2 = false, + .disable_dsc_power_gate = true, };static const struct dc_panel_config panel_config_defaults = {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 276/444 watchdog: sbsa: Adjust keepalive timeout to avoid MediaTek WS0 race condition
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Aaron Plattner <[email protected]>
[ Upstream commit 48defdf6b083f74a44e1f742db284960d3444aec ]
The MediaTek implementation of the sbsa_gwdt watchdog has a race condition where a write to SBSA_GWDT_WRR is ignored if it occurs while the hardware is processing a timeout refresh that asserts WS0.
Detect this based on the hardware implementer and adjust wdd->min_hw_heartbeat_ms to avoid the race by forcing the keepalive ping to be one second later.
--- drivers/watchdog/sbsa_gwdt.c | 50 +++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-)
drivers/watchdog/sbsa_gwdt.c +47 -3
@@ -75,11 +75,17 @@#define SBSA_GWDT_VERSION_MASK 0xF#define SBSA_GWDT_VERSION_SHIFT 16 +#define SBSA_GWDT_IMPL_MASK 0x7FF +#define SBSA_GWDT_IMPL_SHIFT 0 +#define SBSA_GWDT_IMPL_MEDIATEK 0x426 +/** * struct sbsa_gwdt - Internal representation of the SBSA GWDT * @wdd: kernel watchdog_device structure * @clk: store the System Counter clock frequency, in Hz. * @version: store the architecture version +* @need_ws0_race_workaround: +* indicate whether to adjust wdd->timeout to avoid a race with WS0 * @refresh_base: Virtual address of the watchdog refresh frame * @control_base: Virtual address of the watchdog control frame */
@@ -87,6 +93,7 @@ struct sbsa_gwdt {struct watchdog_device wdd;u32 clk;int version; +bool need_ws0_race_workaround;void __iomem *refresh_base;void __iomem *control_base; };
@@ -161,6 +168,31 @@ static int sbsa_gwdt_set_timeout(struct watchdog_device *wdd,*/ sbsa_gwdt_reg_write (((u64 )gwdt->clk /2 ) * timeout, gwdt); +/* +* Some watchdog hardware has a race condition where it will ignore +* sbsa_gwdt_keepalive() if it is called at the exact moment that a +* timeout occurs and WS0 is being asserted. Unfortunately, the default +* behavior of the watchdog core is very likely to trigger this race +* when action=0 because it programs WOR to be half of the desired +* timeout, and watchdog_next_keepalive() chooses the exact same time to +* send keepalive pings. +* +* This triggers a race where sbsa_gwdt_keepalive() can be called right +* as WS0 is being asserted, and affected hardware will ignore that +* write and continue to assert WS0. After another (timeout / 2) +* seconds, the same race happens again. If the driver wins then the +* explicit refresh will reset WS0 to false but if the hardware wins, +* then WS1 is asserted and the system resets. +* +* Avoid the problem by scheduling keepalive heartbeats one second later +* than the WOR timeout. +* +* This workaround might not be needed in a future revision of the +* hardware. +*/ +if (gwdt->need_ws0_race_workaround) + wdd->min_hw_heartbeat_ms = timeout *500 +1000 ; +return 0 ; }
@@ -202,12 +234,15 @@ static int sbsa_gwdt_keepalive(struct watchdog_device *wdd)static void sbsa_gwdt_get_version (struct watchdog_device *wdd) {struct sbsa_gwdt *gwdt =watchdog_get_drvdata (wdd); -int ver; +int iidr, ver, impl; - ver =readl (gwdt->control_base +SBSA_GWDT_W_IIDR ); - ver = (ver >>SBSA_GWDT_VERSION_SHIFT ) &SBSA_GWDT_VERSION_MASK ; + iidr =readl (gwdt->control_base +SBSA_GWDT_W_IIDR ); + ver = (iidr >>SBSA_GWDT_VERSION_SHIFT ) &SBSA_GWDT_VERSION_MASK ; + impl = (iidr >>SBSA_GWDT_IMPL_SHIFT ) &SBSA_GWDT_IMPL_MASK ; gwdt->version = ver; + gwdt->need_ws0_race_workaround = + !action && (impl ==SBSA_GWDT_IMPL_MEDIATEK ); }static int sbsa_gwdt_start (struct watchdog_device *wdd)
@@ -299,6 +334,15 @@ static int sbsa_gwdt_probe(struct platform_device *pdev)else wdd->max_hw_heartbeat_ms =GENMASK_ULL (47 ,0 ) / gwdt->clk *1000 ; +if (gwdt->need_ws0_race_workaround) { +/* +* A timeout of 3 seconds means that WOR will be set to 1.5 +* seconds and the heartbeat will be scheduled every 2.5 +* seconds. +*/ + wdd->min_timeout =3 ; + } + status =readl (cf_base +SBSA_GWDT_WCS );if (status &SBSA_GWDT_WCS_WS1 ) {dev_warn (dev,"System reset by WDT.\n" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 277/444 cifs: Fix calling CIFSFindFirst() for root path without msearch
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pali Rohár <[email protected]>
[ Upstream commit b460249b9a1dab7a9f58483e5349d045ad6d585c ]
To query root path (without msearch wildcard) it is needed to send pattern '\' instead of '' (empty string).
This allows to use CIFSFindFirst() to query information about root path which is being used in followup changes.
This change fixes the stat() syscall called on the root path on the mount. It is because stat() syscall uses the cifs_query_path_info() function and it can fallback to the CIFSFindFirst() usage with msearch=false.
--- fs/smb/client/cifssmb.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
fs/smb/client/cifssmb.c +10 -0
@@ -4028,6 +4028,12 @@ CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon, pSMB->FileName[name_len] =0 ; pSMB->FileName[name_len+1 ] =0 ; name_len +=2 ; + }else if (!searchName[0 ]) { + pSMB->FileName[0 ] =CIFS_DIR_SEP (cifs_sb); + pSMB->FileName[1 ] =0 ; + pSMB->FileName[2 ] =0 ; + pSMB->FileName[3 ] =0 ; + name_len =4 ; } }else { name_len =copy_path_name (pSMB->FileName, searchName);
@@ -4039,6 +4045,10 @@ CIFSFindFirst(const unsigned int xid, struct cifs_tcon *tcon, pSMB->FileName[name_len] ='*' ; pSMB->FileName[name_len+1 ] =0 ; name_len +=2 ; + }else if (!searchName[0 ]) { + pSMB->FileName[0 ] =CIFS_DIR_SEP (cifs_sb); + pSMB->FileName[1 ] =0 ; + name_len =2 ; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 278/444 fbdev: fix potential buffer overflow in do_register_framebuffer()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yongzhen Zhang <[email protected]>
[ Upstream commit 523b84dc7ccea9c4d79126d6ed1cf9033cf83b05 ]
The current implementation may lead to buffer overflow when:
1. Unregistration creates NULL gaps in registered_fb[] 2. All array slots become occupied despite num_registered_fb < FB_MAX 3. The registration loop exceeds array bounds
Add boundary check to prevent registered_fb[FB_MAX] access.
--- drivers/video/fbdev/core/fbmem.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/video/fbdev/core/fbmem.c +3 -0
@@ -403,6 +403,9 @@ static int do_register_framebuffer(struct fb_info *fb_info)if (!registered_fb[i])break ; +if (i >=FB_MAX ) +return -ENXIO ; +if (!fb_info->modelist.prev || !fb_info->modelist.next)INIT_LIST_HEAD (&fb_info->modelist);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 279/444 crypto: hisilicon/hpre - fix dma unmap sequence
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zhiqi Song <[email protected]>
[ Upstream commit 982fd1a74de63c388c060e4fa6f7fbd088d6d02e ]
Perform DMA unmapping operations before processing data. Otherwise, there may be unsynchronized data accessed by the CPU when the SWIOTLB is enabled.
--- drivers/crypto/hisilicon/hpre/hpre_crypto.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/crypto/hisilicon/hpre/hpre_crypto.c +6 -2
@@ -1487,11 +1487,13 @@ static void hpre_ecdh_cb(struct hpre_ctx *ctx, void *resp)if (overtime_thrhld &&hpre_is_bd_timeout (req, overtime_thrhld))atomic64_inc (&dfx[HPRE_OVER_THRHLD_CNT ].value); +/* Do unmap before data processing */ +hpre_ecdh_hw_data_clr_all (ctx, req, areq->dst, areq->src); + p =sg_virt (areq->dst);memmove (p, p + ctx->key_sz - curve_sz, curve_sz);memmove (p + curve_sz, p + areq->dst_len - curve_sz, curve_sz); -hpre_ecdh_hw_data_clr_all (ctx, req, areq->dst, areq->src);kpp_request_complete (areq, ret);atomic64_inc (&dfx[HPRE_RECV_CNT ].value);
@@ -1801,9 +1803,11 @@ static void hpre_curve25519_cb(struct hpre_ctx *ctx, void *resp)if (overtime_thrhld &&hpre_is_bd_timeout (req, overtime_thrhld))atomic64_inc (&dfx[HPRE_OVER_THRHLD_CNT ].value); +/* Do unmap before data processing */ +hpre_curve25519_hw_data_clr_all (ctx, req, areq->dst, areq->src); +hpre_key_to_big_end (sg_virt (areq->dst),CURVE25519_KEY_SIZE ); -hpre_curve25519_hw_data_clr_all (ctx, req, areq->dst, areq->src);kpp_request_complete (areq, ret);atomic64_inc (&dfx[HPRE_RECV_CNT ].value);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 280/444 ext4: do not BUG when INLINE_DATA_FL lacks system.data xattr
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Theodore Ts'o <[email protected]>
[ Upstream commit 099b847ccc6c1ad2f805d13cfbcc83f5b6d4bc42 ]
A syzbot fuzzed image triggered a BUG_ON in ext4_update_inline_data() when an inode had the INLINE_DATA_FL flag set but was missing the system.data extended attribute.
Since this can happen due to a maiciouly fuzzed file system, we shouldn't BUG, but rather, report it as a corrupted file system.
Add similar replacements of BUG_ON with EXT4_ERROR_INODE() ii ext4_create_inline_data() and ext4_inline_data_truncate().
--- fs/ext4/inline.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
fs/ext4/inline.c +16 -3
@@ -298,7 +298,11 @@ static int ext4_create_inline_data(handle_t *handle,if (error) goto out; -BUG_ON (!is.s.not_found); +if (!is.s.not_found) { +EXT4_ERROR_INODE (inode,"unexpected inline data xattr" ); + error = -EFSCORRUPTED ; + goto out; + } error =ext4_xattr_ibody_set (handle, inode, &i, &is);if (error) {
@@ -349,7 +353,11 @@ static int ext4_update_inline_data(handle_t *handle, struct inode *inode,if (error) goto out; -BUG_ON (is.s.not_found); +if (is.s.not_found) { +EXT4_ERROR_INODE (inode,"missing inline data xattr" ); + error = -EFSCORRUPTED ; + goto out; + } len -=EXT4_MIN_INLINE_DATA_SIZE ; value =kzalloc (len,GFP_NOFS );
@@ -1969,7 +1977,12 @@ int ext4_inline_data_truncate(struct inode *inode, int *has_inline)if ((err =ext4_xattr_ibody_find (inode, &i, &is)) !=0 ) goto out_error; -BUG_ON (is.s.not_found); +if (is.s.not_found) { +EXT4_ERROR_INODE (inode, +"missing inline data xattr" ); + err = -EFSCORRUPTED ; + goto out_error; + } value_len =le32_to_cpu (is.s.here->e_value_size); value =kmalloc (value_len,GFP_NOFS );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 281/444 clk: tegra: periph: Fix error handling and resolve unsigned compare warning
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pei Xiao <[email protected]>
[ Upstream commit 2dc2ca9000eea2eb749f658196204cb84d4306f7 ]
./drivers/clk/tegra/clk-periph.c:59:5-9: WARNING:
Unsigned expression compared with zero: rate < 0
The unsigned long 'rate' variable caused:
- Incorrect handling of negative errors
- Compile warning: "Unsigned expression compared with zero"
Fix by changing to long type and adding req->rate cast.
--- drivers/clk/tegra/clk-periph.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/tegra/clk-periph.c +2 -2
@@ -51,7 +51,7 @@ static int clk_periph_determine_rate(struct clk_hw *hw,struct tegra_clk_periph *periph =to_clk_periph (hw);const struct clk_ops *div_ops = periph->div_ops;struct clk_hw *div_hw = &periph->divider.hw; -unsigned long rate; +long rate;__clk_hw_set_clk (div_hw, hw);
@@ -59,7 +59,7 @@ static int clk_periph_determine_rate(struct clk_hw *hw,if (rate <0 )return rate; - req->rate = rate; + req->rate = (unsigned long )rate;return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 282/444 mfd: axp20x: Set explicit ID for AXP313 regulator
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
[ Upstream commit 88828c7e940dd45d139ad4a39d702b23840a37c5 ]
On newer boards featuring the A523 SoC, the AXP323 (related to the AXP313) is paired with the AXP717 and serves as a secondary PMIC providing additional regulator outputs. However the MFD cells are all registered with PLATFORM_DEVID_NONE, which causes the regulator cells to conflict with each other.
Commit e37ec3218870 ("mfd: axp20x: Allow multiple regulators") attempted to fix this by switching to PLATFORM_DEVID_AUTO so that the device names would all be different, however that broke IIO channel mapping, which is also tied to the device names. As a result the change was later reverted.
Instead, here we attempt to make sure the AXP313/AXP323 regulator cell does not conflict by explicitly giving it an ID number. This was previously done for the AXP809+AXP806 pair used with the A80 SoC.
--- drivers/mfd/axp20x.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/mfd/axp20x.c +2 -1
@@ -1034,7 +1034,8 @@ static const struct mfd_cell axp152_cells[] = { };static struct mfd_cell axp313a_cells[] = { -MFD_CELL_NAME ("axp20x-regulator" ), +/* AXP323 is sometimes paired with AXP717 as sub-PMIC */ +MFD_CELL_BASIC ("axp20x-regulator" ,NULL ,NULL ,0 ,1 ),MFD_CELL_RES ("axp313a-pek" , axp313a_pek_resources), };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 283/444 phy: rockchip-pcie: Properly disable TEST_WRITE strobe signal
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geraldo Nascimento <[email protected]>
[ Upstream commit 25facbabc3fc33c794ad09d73f73268c0f8cbc7d ]
pcie_conf is used to touch TEST_WRITE strobe signal. This signal should be enabled, a little time waited, and then disabled. Current code clearly was copy-pasted and never disables the strobe signal. Adjust the define. While at it, remove PHY_CFG_RD_MASK which has been unused since 64cdc0360811 ("phy: rockchip-pcie: remove unused phy_rd_cfg function").
--- drivers/phy/rockchip/phy-rockchip-pcie.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/phy/rockchip/phy-rockchip-pcie.c +1 -2
@@ -30,9 +30,8 @@#define PHY_CFG_ADDR_SHIFT 1#define PHY_CFG_DATA_MASK 0xf#define PHY_CFG_ADDR_MASK 0x3f -#define PHY_CFG_RD_MASK 0x3ff#define PHY_CFG_WR_ENABLE 1 -#define PHY_CFG_WR_DISABLE 1 +#define PHY_CFG_WR_DISABLE 0#define PHY_CFG_WR_SHIFT 0#define PHY_CFG_WR_MASK 1#define PHY_CFG_PLL_LOCK 0x10
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 284/444 scsi: libiscsi: Initialize iscsi_conn->dd_data only if memory is allocated
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Showrya M N <[email protected]>
[ Upstream commit 3ea3a256ed81f95ab0f3281a0e234b01a9cae605 ]
In case of an ib_fast_reg_mr allocation failure during iSER setup, the machine hits a panic because iscsi_conn->dd_data is initialized unconditionally, even when no memory is allocated (dd_size == 0). This leads invalid pointer dereference during connection teardown.
Fix by setting iscsi_conn->dd_data only if memory is actually allocated.
Panic trace:
------------
iser: iser_create_fastreg_desc: Failed to allocate ib_fast_reg_mr err=-12
iser: iser_alloc_rx_descriptors: failed allocating rx descriptors / data buffers
BUG: unable to handle page fault for address: fffffffffffffff8 RIP: 0010:swake_up_locked.part.5+0xa/0x40 Call Trace: complete+0x31/0x40 iscsi_iser_conn_stop+0x88/0xb0 [ib_iser] iscsi_stop_conn+0x66/0xc0 [scsi_transport_iscsi] iscsi_if_stop_conn+0x14a/0x150 [scsi_transport_iscsi] iscsi_if_rx+0x1135/0x1834 [scsi_transport_iscsi] ? netlink_lookup+0x12f/0x1b0 ? netlink_deliver_tap+0x2c/0x200 netlink_unicast+0x1ab/0x280 netlink_sendmsg+0x257/0x4f0 ? _copy_from_user+0x29/0x60 sock_sendmsg+0x5f/0x70
--- drivers/scsi/libiscsi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/scsi/libiscsi.c +2 -1
@@ -3184,7 +3184,8 @@ iscsi_conn_setup(struct iscsi_cls_session *cls_session, int dd_size,return NULL ; conn = cls_conn->dd_data; - conn->dd_data = cls_conn->dd_data +sizeof (*conn); +if (dd_size) + conn->dd_data = cls_conn->dd_data +sizeof (*conn); conn->session = session; conn->cls_conn = cls_conn; conn->c_stage =ISCSI_CONN_INITIAL_STAGE ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 285/444 fs/orangefs: use snprintf() instead of sprintf()
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amir Mohammad Jahangirzad <[email protected]>
[ Upstream commit cdfa1304657d6f23be8fd2bb0516380a3c89034e ]
sprintf() is discouraged for use with bounded destination buffers as it does not prevent buffer overflows when the formatted output exceeds the destination buffer size. snprintf() is a safer alternative as it limits the number of bytes written and ensures NUL-termination.
Replace sprintf() with snprintf() for copying the debug string into a temporary buffer, using ORANGEFS_MAX_DEBUG_STRING_LEN as the maximum size to ensure safe formatting and prevent memory corruption in edge cases.
EDIT: After this patch sat on linux-next for a few days, Dan Carpenter saw it and suggested that I use scnprintf instead of snprintf. I made the change and retested.
--- fs/orangefs/orangefs-debugfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/orangefs/orangefs-debugfs.c +1 -1
@@ -354,7 +354,7 @@ static ssize_t orangefs_debug_read(struct file *file, goto out;mutex_lock (&orangefs_debug_lock); - sprintf_ret =sprintf (buf,"%s" , (char *)file->private_data); + sprintf_ret =scnprintf (buf,ORANGEFS_MAX_DEBUG_STRING_LEN ,"%s" , (char *)file->private_data);mutex_unlock (&orangefs_debug_lock); read_ret =simple_read_from_buffer (ubuf, count, ppos, buf, sprintf_ret);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 286/444 watchdog: dw_wdt: Fix default timeout
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Reichel <[email protected]>
[ Upstream commit ac3dbb91e0167d017f44701dd51c1efe30d0c256 ]
The Synopsys Watchdog driver sets the default timeout to 30 seconds, but on some devices this is not a valid timeout. E.g. on RK3588 the actual timeout being used is 44 seconds instead.
Once the watchdog is started the value is updated accordingly, but it would be better to expose a sensible timeout to userspace without the need to first start the watchdog.
--- drivers/watchdog/dw_wdt.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/watchdog/dw_wdt.c +2 -0
@@ -644,6 +644,8 @@ static int dw_wdt_drv_probe(struct platform_device *pdev) }else { wdd->timeout =DW_WDT_DEFAULT_SECONDS ;watchdog_init_timeout (wdd,0 , dev); +/* Limit timeout value to hardware constraints. */ +dw_wdt_set_timeout (wdd, wdd->timeout); }platform_set_drvdata (pdev, dw_wdt);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 287/444 hwmon: (emc2305) Set initial PWM minimum value during probe based on thermal state
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florin Leotescu <[email protected]>
[ Upstream commit 0429415a084a15466e87d504e8c2a502488184a5 ]
Prevent the PWM value from being set to minimum when thermal zone temperature exceeds any trip point during driver probe. Otherwise, the PWM fan speed will remains at minimum speed and not respond to temperature changes.
--- drivers/hwmon/emc2305.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/hwmon/emc2305.c +8 -2
@@ -300,6 +300,12 @@ static int emc2305_set_single_tz(struct device *dev, int idx)dev_err (dev,"Failed to register cooling device %s\n" , emc2305_fan_name[idx]);return PTR_ERR (data->cdev_data[cdev_idx].cdev); } + +if (data->cdev_data[cdev_idx].cur_state >0 ) +/* Update pwm when temperature is above trips */ + pwm =EMC2305_PWM_STATE2DUTY (data->cdev_data[cdev_idx].cur_state, + data->max_state,EMC2305_FAN_MAX ); +/* Set minimal PWM speed. */ if (data->pwm_separate) { ret =emc2305_set_pwm (dev, pwm, cdev_idx);
@@ -313,10 +319,10 @@ static int emc2305_set_single_tz(struct device *dev, int idx) } } data->cdev_data[cdev_idx].cur_state = -EMC2305_PWM_DUTY2STATE (data->pwm_min[cdev_idx], data->max_state, +EMC2305_PWM_DUTY2STATE (pwm, data->max_state,EMC2305_FAN_MAX ); data->cdev_data[cdev_idx].last_hwmon_state = -EMC2305_PWM_DUTY2STATE (data->pwm_min[cdev_idx], data->max_state, +EMC2305_PWM_DUTY2STATE (pwm, data->max_state,EMC2305_FAN_MAX );return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 288/444 clk: qcom: ipq5018: keep XO clock always on
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: George Moussalem <[email protected]>
[ Upstream commit 693a723291d0634eaea24cff2f9d807f3223f204 ]
The XO clock must not be disabled to avoid the kernel trying to disable the it. As such, keep the XO clock always on by flagging it as critical.
--- drivers/clk/qcom/gcc-ipq5018.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/gcc-ipq5018.c +1 -1
@@ -1371,7 +1371,7 @@ static struct clk_branch gcc_xo_clk = { &gcc_xo_clk_src.clkr.hw, }, .num_parents = 1, - .flags = CLK_SET_RATE_PARENT, + .flags = CLK_SET_RATE_PARENT | CLK_IS_CRITICAL, .ops = &clk_branch2_ops, }, },
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 289/444 MIPS: vpe-mt: add missing prototypes for vpe_{alloc,start,stop,free}
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shiji Yang <[email protected]>
[ Upstream commit 844615dd0f2d95c018ec66b943e08af22b62aff3 ]
These functions are exported but their prototypes are not defined. This patch adds the missing function prototypes to fix the following compilation warnings:
arch/mips/kernel/vpe-mt.c:180:7: error: no previous prototype for 'vpe_alloc' [-Werror=missing-prototypes]
180 | void *vpe_alloc(void)
| ^~~~~~~~~
arch/mips/kernel/vpe-mt.c:198:5: error: no previous prototype for 'vpe_start' [-Werror=missing-prototypes]
198 | int vpe_start(void *vpe, unsigned long start)
| ^~~~~~~~~
arch/mips/kernel/vpe-mt.c:208:5: error: no previous prototype for 'vpe_stop' [-Werror=missing-prototypes]
208 | int vpe_stop(void *vpe)
| ^~~~~~~~
arch/mips/kernel/vpe-mt.c:229:5: error: no previous prototype for 'vpe_free' [-Werror=missing-prototypes]
229 | int vpe_free(void *vpe)
| ^~~~~~~~--- arch/mips/include/asm/vpe.h | 8 ++++++++ 1 file changed, 8 insertions(+)
arch/mips/include/asm/vpe.h +8 -0
@@ -119,4 +119,12 @@ void cleanup_tc(struct tc *tc);int __init vpe_module_init (void ); void __exit vpe_module_exit(void); + +#ifdef CONFIG_MIPS_VPE_LOADER_MT +void *vpe_alloc (void ); +int vpe_start (void *vpe,unsigned long start); +int vpe_stop (void *vpe); +int vpe_free (void *vpe); +#endif /* CONFIG_MIPS_VPE_LOADER_MT */ +#endif /* _ASM_VPE_H */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 290/444 watchdog: iTCO_wdt: Report error if timeout configuration fails
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ziyan Fu <[email protected]>
[ Upstream commit 40efc43eb7ffb5a4e2f998c13b8cfb555e671b92 ]
The driver probes with the invalid timeout value when 'iTCO_wdt_set_timeout()' fails, as its return value is not checked. In this case, when executing "wdctl", we may get:
Device: /dev/watchdog0 Timeout: 30 seconds Timeleft: 613 seconds
The timeout value is the value of "heartbeat" or "WATCHDOG_TIMEOUT", and the timeleft value is calculated from the register value we actually read (0xffff) by masking with 0x3ff and converting ticks to seconds (* 6 / 10).
Add error handling to return the failure code if 'iTCO_wdt_set_timeout()' fails, ensuring the driver probe fails and prevents invalid operation.
--- drivers/watchdog/iTCO_wdt.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/watchdog/iTCO_wdt.c +5 -1
@@ -601,7 +601,11 @@ static int iTCO_wdt_probe(struct platform_device *pdev)/* Check that the heartbeat value is within it's range; if not reset to the default */ if (iTCO_wdt_set_timeout (&p->wddev, heartbeat)) { -iTCO_wdt_set_timeout (&p->wddev,WATCHDOG_TIMEOUT ); + ret =iTCO_wdt_set_timeout (&p->wddev,WATCHDOG_TIMEOUT ); +if (ret !=0 ) { +dev_err (dev,"Failed to set watchdog timeout (%d)\n" ,WATCHDOG_TIMEOUT ); +return ret; + }dev_info (dev,"timeout value out of range, using %d\n" ,WATCHDOG_TIMEOUT ); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 291/444 scsi: bfa: Double-free fix
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: jackysliu <[email protected]>
[ Upstream commit add4c4850363d7c1b72e8fce9ccb21fdd2cf5dc9 ]
When the bfad_im_probe() function fails during initialization, the memory pointed to by bfad->im is freed without setting bfad->im to NULL.
Subsequently, during driver uninstallation, when the state machine enters the bfad_sm_stopping state and calls the bfad_im_probe_undo() function, it attempts to free the memory pointed to by bfad->im again, thereby triggering a double-free vulnerability.
Set bfad->im to NULL if probing fails.
--- drivers/scsi/bfa/bfad_im.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/bfa/bfad_im.c +1 -0
@@ -706,6 +706,7 @@ bfad_im_probe(struct bfad_s *bfad)if (bfad_thread_workq (bfad) !=BFA_STATUS_OK ) {kfree (im); + bfad->im =NULL ;return BFA_STATUS_FAILED ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 292/444 jfs: truncate good inode pages when hard link is 0
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lizhi Xu <[email protected]>
[ Upstream commit 2d91b3765cd05016335cd5df5e5c6a29708ec058 ]
The fileset value of the inode copy from the disk by the reproducer is AGGR_RESERVED_I. When executing evict, its hard link number is 0, so its inode pages are not truncated. This causes the bugon to be triggered when executing clear_inode() because nrpages is greater than 0.
--- fs/jfs/inode.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/jfs/inode.c +1 -1
@@ -145,9 +145,9 @@ void jfs_evict_inode(struct inode *inode)if (!inode->i_nlink && !is_bad_inode (inode)) {dquot_initialize (inode); +truncate_inode_pages_final (&inode->i_data);if (JFS_IP (inode)->fileset ==FILESYSTEM_I ) {struct inode *ipimap =JFS_SBI (inode->i_sb)->ipimap; -truncate_inode_pages_final (&inode->i_data);if (test_cflag (COMMIT_Freewmap, inode))jfs_free_zero_link (inode);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 293/444 jfs: Regular file corruption check
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Edward Adam Davis <[email protected]>
[ Upstream commit 2d04df8116426b6c7b9f8b9b371250f666a2a2fb ]
The reproducer builds a corrupted file on disk with a negative i_size value. Add a check when opening this file to avoid subsequent operation failures.
--- fs/jfs/file.c | 3 +++ 1 file changed, 3 insertions(+)
fs/jfs/file.c +3 -0
@@ -44,6 +44,9 @@ static int jfs_open(struct inode *inode, struct file *file) {int rc; +if (S_ISREG (inode->i_mode) && inode->i_size <0 ) +return -EIO ; +if ((rc =dquot_file_open (inode, file)))return rc;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 294/444 jfs: upper bound check of tree index in dbAllocAG
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnaud Lecomte <[email protected]>
[ Upstream commit c214006856ff52a8ff17ed8da52d50601d54f9ce ]
When computing the tree index in dbAllocAG, we never check if we are out of bounds realative to the size of the stree.
This could happen in a scenario where the filesystem metadata are corrupted.
--- fs/jfs/jfs_dmap.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/jfs/jfs_dmap.c +6 -0
@@ -1389,6 +1389,12 @@ dbAllocAG(struct bmap * bmp, int agno, s64 nblocks, int l2nb, s64 * results) (1 << (L2LPERCTL - (bmp->db_agheight <<1 ))) / bmp->db_agwidth; ti = bmp->db_agstart + bmp->db_agwidth * (agno & (agperlev -1 )); +if (ti <0 || ti >=le32_to_cpu (dcp->nleafs)) { +jfs_error (bmp->db_ipbmap->i_sb,"Corrupt dmapctl page\n" ); +release_metapage (mp); +return -EIO ; + } +/* dmap control page trees fan-out by 4 and a single allocation * group may be described by 1 or 2 subtrees within the ag level * dmap control page, depending upon the ag size. examine the ag's
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 295/444 media: hi556: Fix reset GPIO timings
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Hans de Goede <[email protected]>
[ Upstream commit 99f2211a9d89fe34b3fa847fd7a4475171406cd0 ]
probe() requests the reset GPIO to be set to high when getting it. Immeditately after this hi556_resume() is called and sets the GPIO low.
If the GPIO was low before requesting it this will result in the GPIO only very briefly spiking high and the sensor not being properly reset. The same problem also happens on back to back runtime suspend + resume.
Fix this by adding a sleep of 2 ms in hi556_resume() before setting the GPIO low (if there is a reset GPIO).
The final sleep is kept unconditional, because if there is e.g. no reset GPIO but a controllable clock then the sensor also needs some time after enabling the clock.
--- drivers/media/i2c/hi556.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/media/i2c/hi556.c +6 -1
@@ -1321,7 +1321,12 @@ static int hi556_resume(struct device *dev)return ret; } -gpiod_set_value_cansleep (hi556->reset_gpio,0 ); +if (hi556->reset_gpio) { +/* Assert reset for at least 2ms on back to back off-on */ +usleep_range (2000 ,2200 ); +gpiod_set_value_cansleep (hi556->reset_gpio,0 ); + } +usleep_range (5000 ,5500 );return 0 ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 296/444 RDMA/bnxt_re: Fix size of uverbs_copy_to() in BNXT_RE_METHOD_GET_TOGGLE_MEM
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kalesh AP <[email protected]>
[ Upstream commit 09d231ab569ca97478445ccc1ad44ab026de39b1 ]
Since both "length" and "offset" are of type u32, there is no functional issue here.
--- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/bnxt_re/ib_verbs.c +1 -1
@@ -4642,7 +4642,7 @@ static int UVERBS_HANDLER(BNXT_RE_METHOD_GET_TOGGLE_MEM)(struct uverbs_attr_bundreturn err; err =uverbs_copy_to (attrs,BNXT_RE_TOGGLE_MEM_MMAP_OFFSET , - &offset,sizeof (length)); + &offset,sizeof (offset));if (err)return err;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 297/444 crypto: jitter - fix intermediary handling
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Markus Theil <[email protected]>
[ Upstream commit 735b72568c73875269a6b73ab9543a70f6ac8a9f ]
The intermediary value was included in the wrong hash state. While there, adapt to user-space by setting the timestamp to 0 if stuck and inserting the values nevertheless.
--- crypto/jitterentropy-kcapi.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
crypto/jitterentropy-kcapi.c +5 -4
@@ -144,7 +144,7 @@ int jent_hash_time(void *hash_state, __u64 time, u8 *addtl,* Inject the data from the previous loop into the pool. This data is * not considered to contain any entropy, but it stirs the pool a bit. */ - ret =crypto_shash_update (desc, intermediary,sizeof (intermediary)); + ret =crypto_shash_update (hash_state_desc, intermediary,sizeof (intermediary));if (ret) goto err;
@@ -157,11 +157,12 @@ int jent_hash_time(void *hash_state, __u64 time, u8 *addtl,* conditioning operation to have an identical amount of input data * according to section 3.1.5. */ -if (!stuck) { - ret =crypto_shash_update (hash_state_desc, (u8 *)&time, -sizeof (__u64)); +if (stuck) { + time =0 ; } + ret =crypto_shash_update (hash_state_desc, (u8 *)&time,sizeof (__u64)); + err:shash_desc_zero (desc);memzero_explicit (intermediary,sizeof (intermediary));
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 298/444 MIPS: Dont crash in stack_top() for tasks without ABI or vDSO
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Weißschuh <[email protected]>
[ Upstream commit e9f4a6b3421e936c3ee9d74710243897d74dbaa2 ]
Not all tasks have an ABI associated or vDSO mapped,
for example kthreads never do.
If such a task ever ends up calling stack_top(), it will derefence the NULL ABI pointer and crash.
This can for example happen when using kunit:
mips_stack_top+0x28/0xc0
arch_pick_mmap_layout+0x190/0x220
kunit_vm_mmap_init+0xf8/0x138
__kunit_add_resource+0x40/0xa8
kunit_vm_mmap+0x88/0xd8
usercopy_test_init+0xb8/0x240
kunit_try_run_case+0x5c/0x1a8
kunit_generic_run_threadfn_adapter+0x28/0x50
kthread+0x118/0x240
ret_from_kernel_thread+0x14/0x1cOnly dereference the ABI point if it is set.
The GIC page is also included as it is specific to the vDSO. Also move the randomization adjustment into the same conditional.
--- arch/mips/kernel/process.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
arch/mips/kernel/process.c +9 -7
@@ -690,18 +690,20 @@ unsigned long mips_stack_top(void) }/* Space for the VDSO, data page & GIC user page */ - top -=PAGE_ALIGN (current->thread.abi->vdso->size); - top -=PAGE_SIZE ; - top -=mips_gic_present () ?PAGE_SIZE :0 ; +if (current->thread.abi) { + top -=PAGE_ALIGN (current->thread.abi->vdso->size); + top -=PAGE_SIZE ; + top -=mips_gic_present () ?PAGE_SIZE :0 ; + +/* Space to randomize the VDSO base */ +if (current->flags &PF_RANDOMIZE ) + top -=VDSO_RANDOMIZE_SIZE ; + }/* Space for cache colour alignment */ if (cpu_has_dc_aliases) top -= shm_align_mask +1 ; -/* Space to randomize the VDSO base */ -if (current->flags &PF_RANDOMIZE ) - top -=VDSO_RANDOMIZE_SIZE ; -return top; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 299/444 MIPS: lantiq: falcon: sysctrl: fix request memory check logic
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shiji Yang <[email protected]>
[ Upstream commit 9c9a7ff9882fc6ba7d2f4050697e8bb80383e8dc ]
request_mem_region() will return NULL instead of error code when the memory request fails. Therefore, we should check if the return value is non-zero instead of less than zero. In this way, this patch also fixes the build warnings:
arch/mips/lantiq/falcon/sysctrl.c:214:50: error: ordered comparison of pointer with integer zero [-Werror=extra]
214 | res_status.name) < 0) ||
| ^arch/mips/lantiq/falcon/sysctrl.c:216:47: error: ordered comparison of pointer with integer zero [-Werror=extra]
216 | res_ebu.name) < 0) ||
| ^arch/mips/lantiq/falcon/sysctrl.c:219:50: error: ordered comparison of pointer with integer zero [-Werror=extra]
219 | res_sys[0].name) < 0) ||
| ^arch/mips/lantiq/falcon/sysctrl.c:222:50: error: ordered comparison of pointer with integer zero [-Werror=extra]
222 | res_sys[1].name) < 0) ||
| ^arch/mips/lantiq/falcon/sysctrl.c:225:50: error: ordered comparison of pointer with integer zero [-Werror=extra]
225 | res_sys[2].name) < 0))
|
--- arch/mips/lantiq/falcon/sysctrl.c | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-)
arch/mips/lantiq/falcon/sysctrl.c +10 -13
@@ -214,19 +214,16 @@ void __init ltq_soc_init(void)of_node_put (np_syseth);of_node_put (np_sysgpe); -if ((request_mem_region (res_status.start,resource_size (&res_status), - res_status.name) <0 ) || - (request_mem_region (res_ebu.start,resource_size (&res_ebu), - res_ebu.name) <0 ) || - (request_mem_region (res_sys[0 ].start, -resource_size (&res_sys[0 ]), - res_sys[0 ].name) <0 ) || - (request_mem_region (res_sys[1 ].start, -resource_size (&res_sys[1 ]), - res_sys[1 ].name) <0 ) || - (request_mem_region (res_sys[2 ].start, -resource_size (&res_sys[2 ]), - res_sys[2 ].name) <0 )) +if ((!request_mem_region (res_status.start,resource_size (&res_status), + res_status.name)) || + (!request_mem_region (res_ebu.start,resource_size (&res_ebu), + res_ebu.name)) || + (!request_mem_region (res_sys[0 ].start,resource_size (&res_sys[0 ]), + res_sys[0 ].name)) || + (!request_mem_region (res_sys[1 ].start,resource_size (&res_sys[1 ]), + res_sys[1 ].name)) || + (!request_mem_region (res_sys[2 ].start,resource_size (&res_sys[2 ]), + res_sys[2 ].name)))pr_err ("Failed to request core resources" ); status_membase = ioremap(res_status.start,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 300/444 clk: thead: Mark essential bus clocks as CLK_IGNORE_UNUSED
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michal Wilczynski <[email protected]>
[ Upstream commit 0370395d45ca6dd53bb931978f0e91ac8dd6f1c5 ]
Probing peripherals in the AON and PERI domains, such as the PVT thermal sensor and the PWM controller, can lead to boot hangs or unresponsive devices on the LPi4A board. The root cause is that their parent bus clocks ('CLK_CPU2AON_X2H' and the 'CLK_PERISYS_APB' clocks) are automatically gated by the kernel's power-saving mechanisms when the bus is perceived as idle.
Alternative solutions were investigated, including modeling the parent bus in the Device Tree with 'simple-pm-bus' or refactoring the clock driver's parentage. The 'simple-pm-bus' approach is not viable due to the lack of defined bus address ranges in the hardware manual and its creation of improper dependencies on the 'pm_runtime' API for consumer drivers.
Therefore, applying the'`CLK_IGNORE_UNUSED' flag directly to the essential bus clocks is the most direct and targeted fix. This prevents the kernel from auto-gating these buses and ensures peripherals remain accessible.
This change fixes the boot hang associated with the PVT sensor and resolves the functional issues with the PWM controller.
--- drivers/clk/thead/clk-th1520-ap.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/clk/thead/clk-th1520-ap.c +3 -2
@@ -799,11 +799,12 @@ static CCU_GATE(CLK_AON2CPU_A2X, aon2cpu_a2x_clk, "aon2cpu-a2x", axi4_cpusys2_ac 0x134, BIT(8), 0); static CCU_GATE(CLK_X2X_CPUSYS, x2x_cpusys_clk, "x2x-cpusys", axi4_cpusys2_aclk_pd, 0x134, BIT(7), 0); -static CCU_GATE(CLK_CPU2AON_X2H, cpu2aon_x2h_clk, "cpu2aon-x2h", axi_aclk_pd, 0x138, BIT(8), 0); +static CCU_GATE(CLK_CPU2AON_X2H, cpu2aon_x2h_clk, "cpu2aon-x2h", axi_aclk_pd, + 0x138, BIT(8), CLK_IGNORE_UNUSED); static CCU_GATE(CLK_CPU2PERI_X2H, cpu2peri_x2h_clk, "cpu2peri-x2h", axi4_cpusys2_aclk_pd, 0x140, BIT(9), CLK_IGNORE_UNUSED); static CCU_GATE(CLK_PERISYS_APB1_HCLK, perisys_apb1_hclk, "perisys-apb1-hclk", perisys_ahb_hclk_pd, - 0x150, BIT(9), 0); + 0x150, BIT(9), CLK_IGNORE_UNUSED); static CCU_GATE(CLK_PERISYS_APB2_HCLK, perisys_apb2_hclk, "perisys-apb2-hclk", perisys_ahb_hclk_pd, 0x150, BIT(10), CLK_IGNORE_UNUSED); static CCU_GATE(CLK_PERISYS_APB3_HCLK, perisys_apb3_hclk, "perisys-apb3-hclk", perisys_ahb_hclk_pd,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 301/444 media: ipu-bridge: Add _HID for OV5670
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniel Scally <[email protected]>
[ Upstream commit 484f8bec3ddb453321ef0b8621c25de6ce3d0302 ]
The OV5670 is found on Dell 7212 tablets paired with an IPU3 ISP and needs to be connected by the ipu-bridge. Add it to the list of supported devices.
--- drivers/media/pci/intel/ipu-bridge.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/pci/intel/ipu-bridge.c +2 -0
@@ -59,6 +59,8 @@ static const struct ipu_sensor_config ipu_supported_sensors[] = {IPU_SENSOR_CONFIG ("INT33BE" ,1 ,419200000 ),/* Omnivision OV2740 */ IPU_SENSOR_CONFIG ("INT3474" ,1 ,180000000 ), +/* Omnivision OV5670 */ +IPU_SENSOR_CONFIG ("INT3479" ,1 ,422400000 ),/* Omnivision OV8865 */ IPU_SENSOR_CONFIG("INT347A", 1, 360000000),/* Omnivision OV7251 */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 302/444 media: v4l2-common: Reduce warnings about missing V4L2_CID_LINK_FREQ control
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Niklas Söderlund <[email protected]>
[ Upstream commit 5a0abb8909b9dcf347fce1d201ac6686ac33fd64 ]
When operating a pipeline with a missing V4L2_CID_LINK_FREQ control this two line warning is printed each time the pipeline is started. Reduce this excessive logging by only warning once for the missing control.
--- drivers/media/v4l2-core/v4l2-common.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/media/v4l2-core/v4l2-common.c +4 -4
@@ -494,10 +494,10 @@ s64 v4l2_get_link_freq(struct v4l2_ctrl_handler *handler, unsigned int mul, freq =div_u64 (v4l2_ctrl_g_ctrl_int64 (ctrl) * mul, div); -pr_warn ("%s: Link frequency estimated using pixel rate: result might be inaccurate\n" , - __func__); -pr_warn ("%s: Consider implementing support for V4L2_CID_LINK_FREQ in the transmitter driver\n" , - __func__); +pr_warn_once ("%s: Link frequency estimated using pixel rate: result might be inaccurate\n" , + __func__); +pr_warn_once ("%s: Consider implementing support for V4L2_CID_LINK_FREQ in the transmitter driver\n" , + __func__); }return freq >0 ? freq : -EINVAL ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 303/444 leds: leds-lp50xx: Handle reg to get correct multi_index
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Adolfsson <[email protected]>
[ Upstream commit 2e84a5e5374232e6f356ce5c079a5658d7e4af2c ]
mc_subled used for multi_index needs well defined array indexes, to guarantee the desired result, use reg for that.
If devicetree child nodes is processed in random or reverse order you may end up with multi_index "blue green red" instead of the expected "red green blue".
If user space apps uses multi_index to deduce how to control the leds they would most likely be broken without this patch if devicetree processing is reversed (which it appears to be).
arch/arm/boot/dts/aspeed/aspeed-bmc-facebook-fuji.dts has reg set but I don't see how it can have worked without this change.
If reg is not set, an error is returned,
If reg is out of range, an error is returned.
reg within led child nodes starts with 0, to map to the iout in each bank.
--- drivers/leds/leds-lp50xx.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/leds/leds-lp50xx.c +10 -1
@@ -481,6 +481,7 @@ static int lp50xx_probe_dt(struct lp50xx *priv) }fwnode_for_each_child_node (child, led_node) { +int multi_index; ret =fwnode_property_read_u32 (led_node,"color" , &color_id);if (ret) {
@@ -488,8 +489,16 @@ static int lp50xx_probe_dt(struct lp50xx *priv)dev_err (priv->dev,"Cannot read color\n" ); goto child_out; } + ret =fwnode_property_read_u32 (led_node,"reg" , &multi_index); +if (ret !=0 ) { +dev_err (priv->dev,"reg must be set\n" ); +return -EINVAL ; + }else if (multi_index >=LP50XX_LEDS_PER_MODULE ) { +dev_err (priv->dev,"reg %i out of range\n" , multi_index); +return -EINVAL ; + } - mc_led_info[num_colors].color_index = color_id; + mc_led_info[multi_index].color_index = color_id; num_colors++; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 304/444 dmaengine: stm32-dma: configure next sg only if there are more than 2 sgs
In reply to Greg Kroah-Hartman6.12-stable review patch. If anyone has any objections, please let me know.
------------------
From: Amelie Delaunay <[email protected]>
[ Upstream commit e19bdbaa31082b43dab1d936e20efcebc30aa73d ]
DMA operates in Double Buffer Mode (DBM) when the transfer is cyclic and there are at least two periods.
When DBM is enabled, the DMA toggles between two memory targets (SxM0AR and SxM1AR), indicated by the SxSCR.CT bit (Current Target).
There is no need to update the next memory address if two periods are configured, as SxM0AR and SxM1AR are already properly set up before the transfer begins in the stm32_dma_start_transfer() function. This avoids unnecessary updates to SxM0AR/SxM1AR, thereby preventing potential Transfer Errors. Specifically, when the channel is enabled, SxM0AR and SxM1AR can only be written if SxSCR.CT=1 and SxSCR.CT=0, respectively. Otherwise, a Transfer Error interrupt is triggered, and the stream is automatically disabled.
--- drivers/dma/stm32/stm32-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/stm32/stm32-dma.c +1 -1
@@ -744,7 +744,7 @@ static void stm32_dma_handle_chan_done(struct stm32_dma_chan *chan, u32 scr)/* cyclic while CIRC/DBM disable => post resume reconfiguration needed */ if (!(scr & (STM32_DMA_SCR_CIRC |STM32_DMA_SCR_DBM )))stm32_dma_post_resume_reconfigure (chan); -else if (scr &STM32_DMA_SCR_DBM ) +else if (scr &STM32_DMA_SCR_DBM && chan->desc->num_sgs >2 )stm32_dma_configure_next_sg (chan); }else { chan->busy = false;
Signature · 1 line
2.39.5