6.6.103-rc1 review
Subsystems (5)
Greg Kroah-Hartman
maintainerPATCH 123/587 ASoC: hdac_hdmi: Rate limit logging on connection and disconnection
In reply to Greg Kroah-Hartman6.6-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
@@ -1230,7 +1230,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 ; }
@@ -1238,7 +1239,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 ; }
@@ -1297,8 +1299,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 124/587 ALSA: intel8x0: Fix incorrect codec index usage in mixer for ICH4
In reply to Greg Kroah-Hartman6.6-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
@@ -2252,7 +2252,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 125/587 ASoC: core: Check for rtd == NULL in snd_soc_remove_pcm_runtime()
In reply to Greg Kroah-Hartman6.6-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
@@ -1025,6 +1025,9 @@ static int soc_dai_link_sanity_check(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 126/587 usb: typec: intel_pmc_mux: Defer probe if SCU IPC isnt present
In reply to Greg Kroah-Hartman6.6-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
@@ -730,7 +730,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 127/587 usb: core: usb_submit_urb: downgrade type check
In reply to Greg Kroah-Hartman6.6-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 128/587 pm: cpupower: Fix the snapshot-order of tsc,mperf, clock in mperf_stop()
In reply to Greg Kroah-Hartman6.6-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 129/587 imx8m-blk-ctrl: set ISI panic write hurry level
In reply to Greg Kroah-Hartman6.6-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
@@ -664,6 +664,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) {
@@ -693,6 +698,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 130/587 soc: qcom: mdt_loader: Actually use the e_phoff
In reply to Greg Kroah-Hartman6.6-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
@@ -85,7 +85,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];
@@ -137,7 +137,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 );
@@ -217,7 +217,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];
@@ -272,7 +272,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++) {/*
@@ -314,7 +314,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 131/587 platform/x86: thinkpad_acpi: Handle KCOV __init vs inline mismatches
In reply to Greg Kroah-Hartman6.6-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
@@ -537,12 +537,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 132/587 platform/chrome: cros_ec_typec: Defer probe on missing EC parent
In reply to Greg Kroah-Hartman6.6-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
@@ -1179,8 +1179,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 133/587 ALSA: hda/ca0132: Fix buffer overflow in add_tuning_control
In reply to Greg Kroah-Hartman6.6-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
@@ -4411,7 +4411,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 134/587 ALSA: pcm: Rewrite recalculate_boundary() to avoid costly loop
In reply to Greg Kroah-Hartman6.6-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"
@@ -3125,13 +3126,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 135/587 ALSA: usb-audio: Avoid precedence issues in mixer_quirks macros
In reply to Greg Kroah-Hartman6.6-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
@@ -2150,15 +2150,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
@@ -2167,9 +2167,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 136/587 iio: adc: ad7768-1: Ensure SYNC_IN pulse minimum timing requirement
In reply to Greg Kroah-Hartman6.6-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 137/587 ASoC: codecs: rt5640: Retry DEVICE_ID verification
In reply to Greg Kroah-Hartman6.6-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
@@ -3016,6 +3016,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 138/587 ASoC: qcom: use drvdata instead of component to keep id
In reply to Greg Kroah-Hartman6.6-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
@@ -201,7 +201,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 ;
@@ -1189,13 +1188,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);
@@ -1206,14 +1206,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); }
@@ -1223,7 +1228,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 139/587 powerpc/thp: tracing: Hide hugepage events under CONFIG_PPC_BOOK3S_64
In reply to Greg Kroah-Hartman6.6-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 140/587 Bluetooth: hci_sock: Reset cookie to zero in hci_sock_free_cookie()
In reply to Greg Kroah-Hartman6.6-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 141/587 xen/netfront: Fix TX response spurious interrupts
In reply to Greg Kroah-Hartman6.6-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 142/587 net: usb: cdc-ncm: check for filtering capability
In reply to Greg Kroah-Hartman6.6-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 */
@@ -1898,6 +1902,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
@@ -1908,7 +1920,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 */
@@ -1922,7 +1934,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_WWAN */
@@ -1936,7 +1948,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 */
@@ -1950,7 +1962,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 143/587 wifi: ath12k: Correct tid cleanup when tid setup fails
In reply to Greg Kroah-Hartman6.6-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
@@ -91,7 +91,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 144/587 ktest.pl: Prevent recursion of default variable options
In reply to Greg Kroah-Hartman6.6-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
@@ -1358,7 +1358,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 145/587 wifi: cfg80211: reject HTC bit for management frames
In reply to Greg Kroah-Hartman6.6-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
@@ -739,7 +739,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 146/587 s390/time: Use monotonic clock in get_cycles()
In reply to Greg Kroah-Hartman6.6-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 147/587 be2net: Use correct byte order and format string for TCP seq and ack_seq
In reply to Greg Kroah-Hartman6.6-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 148/587 wifi: rtw89: Lower the timeout in rtw89_fw_read_c2h_reg() for USB
In reply to Greg Kroah-Hartman6.6-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
@@ -3427,13 +3427,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
@@ -69,6 +69,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 149/587 et131x: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.6-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 150/587 net: ag71xx: Add missing check after DMA map
In reply to Greg Kroah-Hartman6.6-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
@@ -1234,6 +1234,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; }
@@ -1532,6 +1537,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 151/587 net/mlx5e: Properly access RCU protected qdisc_sleeping variable
In reply to Greg Kroah-Hartman6.6-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
@@ -362,7 +362,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 152/587 arm64: Mark kernel as tainted on SAE and SError panic
In reply to Greg Kroah-Hartman6.6-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
@@ -953,6 +953,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
@@ -753,6 +753,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 153/587 rcu: Protect ->defer_qs_iw_pending from data race
In reply to Greg Kroah-Hartman6.6-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
@@ -612,10 +612,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 154/587 net: mctp: Prevent duplicate binds
In reply to Greg Kroah-Hartman6.6-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;
@@ -549,15 +548,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 155/587 wifi: cfg80211: Fix interface type validation
In reply to Greg Kroah-Hartman6.6-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
@@ -559,7 +559,7 @@ ieee80211_get_sband_iftype_data(const struct ieee80211_supported_band *sband, {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 156/587 net: ipv4: fix incorrect MTU in broadcast routes
In reply to Greg Kroah-Hartman6.6-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
@@ -2560,7 +2560,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 157/587 net: thunderx: Fix format-truncation warning in bgx_acpi_match_id()
In reply to Greg Kroah-Hartman6.6-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
@@ -1427,9 +1427,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 158/587 net: phy: micrel: Add ksz9131_resume()
In reply to Greg Kroah-Hartman6.6-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
@@ -4722,6 +4722,14 @@ static int lan8841_suspend(struct phy_device *phydev)return genphy_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 ,
@@ -4968,7 +4976,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 159/587 perf/cxlpmu: Remove unintended newline from IRQ name format string
In reply to Greg Kroah-Hartman6.6-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
@@ -881,7 +881,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 160/587 wifi: iwlwifi: mvm: set gtk id also in older FWs
In reply to Greg Kroah-Hartman6.6-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
@@ -2143,6 +2143,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));
@@ -2369,6 +2370,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 161/587 um: Re-evaluate thread flags repeatedly
In reply to Greg Kroah-Hartman6.6-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
@@ -98,14 +98,18 @@ void *__switch_to(struct task_struct *from, struct task_struct *to)void 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 162/587 wifi: iwlwifi: mvm: fix scan request validation
In reply to Greg Kroah-Hartman6.6-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
@@ -828,7 +828,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 163/587 s390/stp: Remove udelay from stp_sync_clock()
In reply to Greg Kroah-Hartman6.6-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 164/587 sched/fair: Bump sd->max_newidle_lb_cost when newidle balance fails
In reply to Greg Kroah-Hartman6.6-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
@@ -11697,8 +11697,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 )) {/*
@@ -12384,10 +12390,17 @@ static int newidle_balance(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 165/587 wifi: mac80211: dont complete management TX on SAE commit
In reply to Greg Kroah-Hartman6.6-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
@@ -4111,6 +4111,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
@@ -3662,6 +3662,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;sdata_assert_lock (sdata);
@@ -3705,6 +3706,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; }
@@ -3747,6 +3750,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" );
@@ -3755,7 +3761,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 166/587 (powerpc/512) Fix possible `dma_unmap_single()` on uninitialized pointer
In reply to Greg Kroah-Hartman6.6-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 167/587 ipv6: mcast: Check inet6_dev->dead under idev->mc_lock in __ipv6_dev_mc_inc().
In reply to Greg Kroah-Hartman6.6-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
@@ -2193,13 +2193,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);
@@ -3834,7 +3833,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
@@ -906,23 +906,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 168/587 wifi: mac80211: fix rx link assignment for non-MLO stations
In reply to Greg Kroah-Hartman6.6-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
@@ -4221,10 +4221,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 169/587 drm/msm: use trylock for debugfs
In reply to Greg Kroah-Hartman6.6-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
@@ -928,7 +928,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
@@ -183,6 +183,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 170/587 wifi: rtw89: Fix rtw89_mac_power_switch() for USB
In reply to Greg Kroah-Hartman6.6-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
@@ -1301,6 +1301,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
@@ -1310,6 +1327,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
@@ -172,6 +172,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 171/587 wifi: rtw89: Disable deep power saving for USB/SDIO
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bitterblue Smith <[email protected]>
[ Upstream commit a3b871a0f7c083c2a632a31da8bc3de554ae8550 ]
Disable deep power saving for USB and SDIO because rtw89_mac_send_rpwm() is called in atomic context and accessing hardware registers results in "scheduling while atomic" errors.
--- drivers/net/wireless/realtek/rtw89/core.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/realtek/rtw89/core.c +3 -0
@@ -1996,6 +1996,9 @@ static enum rtw89_ps_mode rtw89_update_ps_mode(struct rtw89_dev *rtwdev) {const struct rtw89_chip_info *chip = rtwdev->chip; +if (rtwdev->hci.type !=RTW89_HCI_TYPE_PCIE ) +return RTW89_PS_MODE_NONE ; +if (rtw89_disable_ps_mode || !chip->ps_mode_supported ||RTW89_CHK_FW_FEATURE (NO_DEEP_PS , &rtwdev->fw))return RTW89_PS_MODE_NONE ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 172/587 wifi: mt76: mt7915: mcu: re-init MCU before loading FW patch
In reply to Greg Kroah-Hartman6.6-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
@@ -2060,16 +2060,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 173/587 kselftest/arm64: Specify SVE data when testing VL set in sve-ptrace
In reply to Greg Kroah-Hartman6.6-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 174/587 net: thunderbolt: Enable end-to-end flow control also in transmit
In reply to Greg Kroah-Hartman6.6-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 175/587 net: thunderbolt: Fix the parameter passing of tb_xdomain_enable_paths()/tb_xdomain_disable_paths()
In reply to Greg Kroah-Hartman6.6-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 176/587 xfrm: Duplicate SPI Handling
In reply to Greg Kroah-Hartman6.6-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
@@ -1466,6 +1466,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);
@@ -2259,10 +2279,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 ) {
@@ -2276,38 +2294,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 177/587 net: atlantic: add set_power to fw_ops for atl2 to fix wol
In reply to Greg Kroah-Hartman6.6-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 178/587 net: fec: allow disable coalescing
In reply to Greg Kroah-Hartman6.6-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
@@ -3069,27 +3069,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 179/587 drm/amd/display: Separate set_gsl from set_gsl_source_select
In reply to Greg Kroah-Hartman6.6-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/dcn20/dcn20_hwseq.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +4 -5
@@ -163,14 +163,13 @@ static 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 180/587 wifi: ath12k: Add memset and update default rate value in wmi tx completion
In reply to Greg Kroah-Hartman6.6-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
@@ -4965,6 +4965,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 181/587 wifi: iwlwifi: dvm: fix potential overflow in rs_fill_link_cmd()
In reply to Greg Kroah-Hartman6.6-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
@@ -2904,7 +2904,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 182/587 wifi: iwlwifi: fw: Fix possible memory leak in iwl_fw_dbg_collect
In reply to Greg Kroah-Hartman6.6-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
@@ -2816,6 +2816,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 ;
@@ -2846,7 +2847,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 183/587 drm/amd/display: Fix failed to blank crtc!
In reply to Greg Kroah-Hartman6.6-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/dcn20/dcn20_hwseq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dcn20/dcn20_hwseq.c +1 -1
@@ -781,7 +781,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 184/587 wifi: mac80211: update radar_required in channel context after channel switch
In reply to Greg Kroah-Hartman6.6-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
@@ -1313,6 +1313,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 185/587 wifi: rtlwifi: fix possible skb memory leak in `_rtl_pci_rx_interrupt()`.
In reply to Greg Kroah-Hartman6.6-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
@@ -803,13 +803,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 186/587 wifi: ath12k: Enable REO queue lookup table feature on QCN9274 hw2.0
In reply to Greg Kroah-Hartman6.6-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
@@ -1002,7 +1002,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, .hal_desc_sz = sizeof(struct hal_rx_desc_qcn9274),
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 187/587 wifi: ath12k: Decrement TID on RX peer frag setup error handling
In reply to Greg Kroah-Hartman6.6-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
@@ -74,6 +74,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 188/587 powerpc: floppy: Add missing checks after DMA map
In reply to Greg Kroah-Hartman6.6-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 189/587 netmem: fix skb_frag_address_safe with unreadable skbs
In reply to Greg Kroah-Hartman6.6-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
@@ -3556,7 +3556,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 190/587 wifi: iwlegacy: Check rate_idx range after addition
In reply to Greg Kroah-Hartman6.6-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 191/587 neighbour: add support for NUD_PERMANENT proxy entries
In reply to Greg Kroah-Hartman6.6-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))
@@ -845,7 +846,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;
@@ -853,12 +855,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; } }
@@ -2033,6 +2038,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 192/587 dpaa_eth: dont use fixed_phy_change_carrier
In reply to Greg Kroah-Hartman6.6-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>
@@ -3141,7 +3140,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 193/587 drm/amd: Allow printing VanGogh OD SCLK levels without setting dpm to manual
In reply to Greg Kroah-Hartman6.6-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
@@ -686,7 +686,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;
@@ -702,31 +701,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 194/587 net: vlan: Make is_vlan_dev() a stub when VLAN is not configured
In reply to Greg Kroah-Hartman6.6-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 195/587 net: vlan: Replace BUG() with WARN_ON_ONCE() in vlan_dev_* stubs
In reply to Greg Kroah-Hartman6.6-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 196/587 gve: Return error for unknown admin queue command
In reply to Greg Kroah-Hartman6.6-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
@@ -431,6 +431,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 197/587 net: dsa: b53: fix b53_imp_vlan_setup for BCM5325
In reply to Greg Kroah-Hartman6.6-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
@@ -507,6 +507,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 198/587 net: dsa: b53: prevent GMII_PORT_OVERRIDE_CTRL access on BCM5325
In reply to Greg Kroah-Hartman6.6-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
@@ -1167,6 +1167,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 ;
@@ -1191,6 +1193,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 ;
@@ -1221,10 +1225,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
@@ -92,6 +92,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 199/587 net: dsa: b53: prevent DIS_LEARNING access on BCM5325
In reply to Greg Kroah-Hartman6.6-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
@@ -561,6 +561,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);
@@ -2062,7 +2065,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 200/587 net: dsa: b53: prevent SWITCH_CTRL access on BCM5325
In reply to Greg Kroah-Hartman6.6-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
@@ -339,11 +339,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 201/587 bpftool: Fix JSON writer resource leak in version command
In reply to Greg Kroah-Hartman6.6-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 202/587 ptp: Use ratelimite for freerun error message
In reply to Greg Kroah-Hartman6.6-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
@@ -79,7 +79,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 203/587 wifi: rtlwifi: fix possible skb memory leak in _rtl_pci_init_one_rxdesc()
In reply to Greg Kroah-Hartman6.6-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
@@ -573,8 +573,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 204/587 ionic: clean dbpage in de-init
In reply to Greg Kroah-Hartman6.6-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
@@ -3394,10 +3394,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);
@@ -3423,6 +3419,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 205/587 net: ncsi: Fix buffer overflow in fetching version id
In reply to Greg Kroah-Hartman6.6-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 206/587 drm: renesas: rz-du: mipi_dsi: Add min check for VCLK range
In reply to Greg Kroah-Hartman6.6-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/rcar-du/rzg2l_mipi_dsi.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/renesas/rcar-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 207/587 drm/ttm: Should to return the evict error
In reply to Greg Kroah-Hartman6.6-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
@@ -437,6 +437,9 @@ int ttm_resource_manager_evict_all(struct ttm_device *bdev, }spin_unlock (&bdev->lru_lock); +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 208/587 uapi: in6: restore visibility of most IPv6 socket options
In reply to Greg Kroah-Hartman6.6-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 209/587 bpf: Make reg_not_null() true for CONST_PTR_TO_MAP
In reply to Greg Kroah-Hartman6.6-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
@@ -460,7 +460,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 bool type_is_ptr_alloc_obj (u32 type)
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 210/587 selftests/bpf: Fix a user_ringbuf failure with arm64 64KB page size
In reply to Greg Kroah-Hartman6.6-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 211/587 drm/amd/display: Avoid trying AUX transactions on disconnected ports
In reply to Greg Kroah-Hartman6.6-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
@@ -137,7 +137,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 212/587 drm/ttm: Respect the shrinker core free target
In reply to Greg Kroah-Hartman6.6-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
@@ -615,7 +615,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) {
@@ -623,9 +622,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 213/587 rcu: Fix rcu_read_unlock() deadloop due to IRQ work
In reply to Greg Kroah-Hartman6.6-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
@@ -175,6 +175,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 : */
@@ -192,7 +203,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
@@ -474,13 +474,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 ;
@@ -617,7 +620,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); }
@@ -664,17 +683,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 214/587 net: dsa: b53: fix IP_MULTICAST_CTRL on BCM5325
In reply to Greg Kroah-Hartman6.6-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
@@ -344,14 +344,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
@@ -104,6 +104,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 215/587 vsock/virtio: Resize receive buffers so that each SKB fits in a 4K page
In reply to Greg Kroah-Hartman6.6-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
@@ -110,7 +110,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
@@ -221,7 +221,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 216/587 vhost: fail early when __vhost_add_used() fails
In reply to Greg Kroah-Hartman6.6-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
@@ -2770,6 +2770,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 217/587 drm/amd/display: Only finalize atomic_obj if it was initialized
In reply to Greg Kroah-Hartman6.6-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
@@ -4620,7 +4620,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 218/587 drm/amd/display: Avoid configuring PSR granularity if PSR-SU not supported
In reply to Greg Kroah-Hartman6.6-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
@@ -124,8 +124,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 219/587 watchdog: sbsa: Adjust keepalive timeout to avoid MediaTek WS0 race condition
In reply to Greg Kroah-Hartman6.6-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 220/587 cifs: Fix calling CIFSFindFirst() for root path without msearch
In reply to Greg Kroah-Hartman6.6-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
@@ -3984,6 +3984,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);
@@ -3995,6 +4001,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 221/587 fbdev: fix potential buffer overflow in do_register_framebuffer()
In reply to Greg Kroah-Hartman6.6-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
@@ -943,6 +943,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 222/587 crypto: hisilicon/hpre - fix dma unmap sequence
In reply to Greg Kroah-Hartman6.6-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
@@ -1482,11 +1482,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);
@@ -1796,9 +1798,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 223/587 ext4: do not BUG when INLINE_DATA_FL lacks system.data xattr
In reply to Greg Kroah-Hartman6.6-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 );
@@ -1966,7 +1974,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 224/587 clk: tegra: periph: Fix error handling and resolve unsigned compare warning
In reply to Greg Kroah-Hartman6.6-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 225/587 mfd: axp20x: Set explicit ID for AXP313 regulator
In reply to Greg Kroah-Hartman6.6-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
@@ -936,7 +936,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 226/587 phy: rockchip-pcie: Properly disable TEST_WRITE strobe signal
In reply to Greg Kroah-Hartman6.6-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
@@ -31,9 +31,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 227/587 scsi: libiscsi: Initialize iscsi_conn->dd_data only if memory is allocated
In reply to Greg Kroah-Hartman6.6-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 228/587 fs/orangefs: use snprintf() instead of sprintf()
In reply to Greg Kroah-Hartman6.6-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 229/587 watchdog: dw_wdt: Fix default timeout
In reply to Greg Kroah-Hartman6.6-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 230/587 hwmon: (emc2305) Set initial PWM minimum value during probe based on thermal state
In reply to Greg Kroah-Hartman6.6-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
@@ -303,6 +303,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);
@@ -316,10 +322,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 231/587 clk: qcom: ipq5018: keep XO clock always on
In reply to Greg Kroah-Hartman6.6-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
@@ -1370,7 +1370,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 232/587 MIPS: vpe-mt: add missing prototypes for vpe_{alloc,start,stop,free}
In reply to Greg Kroah-Hartman6.6-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 233/587 watchdog: iTCO_wdt: Report error if timeout configuration fails
In reply to Greg Kroah-Hartman6.6-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 234/587 scsi: bfa: Double-free fix
In reply to Greg Kroah-Hartman6.6-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 235/587 jfs: truncate good inode pages when hard link is 0
In reply to Greg Kroah-Hartman6.6-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 236/587 jfs: Regular file corruption check
In reply to Greg Kroah-Hartman6.6-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 237/587 jfs: upper bound check of tree index in dbAllocAG
In reply to Greg Kroah-Hartman6.6-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 238/587 crypto: jitter - fix intermediary handling
In reply to Greg Kroah-Hartman6.6-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
@@ -134,7 +134,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;
@@ -147,11 +147,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 239/587 MIPS: Dont crash in stack_top() for tasks without ABI or vDSO
In reply to Greg Kroah-Hartman6.6-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 240/587 MIPS: lantiq: falcon: sysctrl: fix request memory check logic
In reply to Greg Kroah-Hartman6.6-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 241/587 media: v4l2-common: Reduce warnings about missing V4L2_CID_LINK_FREQ control
In reply to Greg Kroah-Hartman6.6-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
@@ -487,10 +487,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 242/587 leds: leds-lp50xx: Handle reg to get correct multi_index
In reply to Greg Kroah-Hartman6.6-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
@@ -486,6 +486,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) {
@@ -493,8 +494,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 243/587 dmaengine: stm32-dma: configure next sg only if there are more than 2 sgs
In reply to Greg Kroah-Hartman6.6-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-dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/stm32-dma.c +1 -1
@@ -745,7 +745,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
Greg Kroah-Hartman
maintainerPATCH 244/587 RDMA: hfi1: fix possible divide-by-zero in find_hw_thread_mask()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yury Norov [NVIDIA] <[email protected]>
[ Upstream commit 59f7d2138591ef8f0e4e4ab5f1ab674e8181ad3a ]
The function divides number of online CPUs by num_core_siblings, and later checks the divider by zero. This implies a possibility to get and divide-by-zero runtime error. Fix it by moving the check prior to division. This also helps to save one indentation level.
--- drivers/infiniband/hw/hfi1/affinity.c | 44 +++++++++++++++------------ 1 file changed, 24 insertions(+), 20 deletions(-)
drivers/infiniband/hw/hfi1/affinity.c +24 -20
@@ -964,31 +964,35 @@ static void find_hw_thread_mask(uint hw_thread_no, cpumask_var_t hw_thread_mask, struct hfi1_affinity_node_list *affinity) {int possible, curr_cpu, i; -uint num_cores_per_socket = node_affinity.num_online_cpus / +uint num_cores_per_socket; + +cpumask_copy (hw_thread_mask, &affinity->proc.mask); + +if (affinity->num_core_siblings ==0 ) +return ; + + num_cores_per_socket = node_affinity.num_online_cpus / affinity->num_core_siblings / node_affinity.num_online_nodes; -cpumask_copy (hw_thread_mask, &affinity->proc.mask); -if (affinity->num_core_siblings >0 ) { -/* Removing other siblings not needed for now */ - possible =cpumask_weight (hw_thread_mask); - curr_cpu =cpumask_first (hw_thread_mask); -for (i =0 ; - i < num_cores_per_socket * node_affinity.num_online_nodes; - i++) - curr_cpu =cpumask_next (curr_cpu, hw_thread_mask); - -for (; i < possible; i++) { -cpumask_clear_cpu (curr_cpu, hw_thread_mask); - curr_cpu =cpumask_next (curr_cpu, hw_thread_mask); - } +/* Removing other siblings not needed for now */ + possible =cpumask_weight (hw_thread_mask); + curr_cpu =cpumask_first (hw_thread_mask); +for (i =0 ; + i < num_cores_per_socket * node_affinity.num_online_nodes; + i++) + curr_cpu =cpumask_next (curr_cpu, hw_thread_mask); -/* Identifying correct HW threads within physical cores */ -cpumask_shift_left (hw_thread_mask, hw_thread_mask, - num_cores_per_socket * - node_affinity.num_online_nodes * - hw_thread_no); +for (; i < possible; i++) { +cpumask_clear_cpu (curr_cpu, hw_thread_mask); + curr_cpu =cpumask_next (curr_cpu, hw_thread_mask); } + +/* Identifying correct HW threads within physical cores */ +cpumask_shift_left (hw_thread_mask, hw_thread_mask, + num_cores_per_socket * + node_affinity.num_online_nodes * + hw_thread_no); }int hfi1_get_proc_affinity (int node)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 245/587 RDMA/core: reduce stack using in nldev_stat_get_doit()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
[ Upstream commit 43163f4c30f94d2103c948a247cdf2cda5068ca7 ]
In the s390 defconfig, gcc-10 and earlier end up inlining three functions into nldev_stat_get_doit(), and each of them uses some 600 bytes of stack.
The result is a function with an overly large stack frame and a warning:
drivers/infiniband/core/nldev.c:2466:1: error: the frame size of 1720 bytes is larger than 1280 bytes [-Werror=frame-larger-than=]
Mark the three functions noinline_for_stack to prevent this, ensuring that only one copy of the nlattr array is on the stack of each function.
--- drivers/infiniband/core/nldev.c | 22 ++++++++++++---------- 1 file changed, 12 insertions(+), 10 deletions(-)
drivers/infiniband/core/nldev.c +12 -10
@@ -1412,10 +1412,11 @@ static const struct nldev_fill_res_entry fill_entries[RDMA_RESTRACK_MAX] = { }; -static int res_get_common_doit (struct sk_buff *skb,struct nlmsghdr *nlh, -struct netlink_ext_ack *extack, -enum rdma_restrack_type res_type, -res_fill_func_t fill_func) +static noinline_for_stack int +res_get_common_doit (struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack, +enum rdma_restrack_type res_type, +res_fill_func_t fill_func) {const struct nldev_fill_res_entry *fe = &fill_entries[res_type];struct nlattr *tb[RDMA_NLDEV_ATTR_MAX ];
@@ -2153,10 +2154,10 @@ static int nldev_stat_del_doit(struct sk_buff *skb, struct nlmsghdr *nlh,return ret; } -static int stat_get_doit_default_counter (struct sk_buff *skb, -struct nlmsghdr *nlh, -struct netlink_ext_ack *extack, -struct nlattr *tb[]) +static noinline_for_stack int +stat_get_doit_default_counter (struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack, +struct nlattr *tb[]) {struct rdma_hw_stats *stats;struct nlattr *table_attr;
@@ -2246,8 +2247,9 @@ static int stat_get_doit_default_counter(struct sk_buff *skb,return ret; } -static int stat_get_doit_qp (struct sk_buff *skb,struct nlmsghdr *nlh, -struct netlink_ext_ack *extack,struct nlattr *tb[]) +static noinline_for_stack int +stat_get_doit_qp (struct sk_buff *skb,struct nlmsghdr *nlh, +struct netlink_ext_ack *extack,struct nlattr *tb[]) {static enum rdma_nl_counter_mode mode;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 246/587 scsi: lpfc: Check for hdwq null ptr when cleaning up lpfc_vport structure
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Justin Tee <[email protected]>
[ Upstream commit 6698796282e828733cde3329c887b4ae9e5545e9 ]
If a call to lpfc_sli4_read_rev() from lpfc_sli4_hba_setup() fails, the resultant cleanup routine lpfc_sli4_vport_delete_fcp_xri_aborted() may occur before sli4_hba.hdwqs are allocated. This may result in a null pointer dereference when attempting to take the abts_io_buf_list_lock for the first hardware queue. Fix by adding a null ptr check on phba->sli4_hba.hdwq and early return because this situation means there must have been an error during port initialization.
--- drivers/scsi/lpfc/lpfc_scsi.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/scsi/lpfc/lpfc_scsi.c +4 -0
@@ -390,6 +390,10 @@ lpfc_sli4_vport_delete_fcp_xri_aborted(struct lpfc_vport *vport)if (!(vport->cfg_enable_fc4_type &LPFC_ENABLE_FCP ))return ; +/* may be called before queues established if hba_setup fails */ +if (!phba->sli4_hba.hdwq) +return ; +spin_lock_irqsave (&phba->hbalock, iflag);for (idx =0 ; idx < phba->cfg_hdw_queue; idx++) { qp = &phba->sli4_hba.hdwq[idx];
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 247/587 power: supply: qcom_battmgr: Add lithium-polymer entry
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Abel Vesa <[email protected]>
[ Upstream commit 202ac22b8e2e015e6c196fd8113f3d2a62dd1afc ]
On some Dell XPS 13 (9345) variants, the battery used is lithium-polymer based. Currently, this is reported as unknown technology due to the entry missing.
[ 4083.135325] Unknown battery technology 'LIP'
Add another check for lithium-polymer in the technology parsing callback and return that instead of unknown.
--- drivers/power/supply/qcom_battmgr.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/power/supply/qcom_battmgr.c +2 -0
@@ -977,6 +977,8 @@ static unsigned int qcom_battmgr_sc8280xp_parse_technology(const char *chemistry {if (!strncmp (chemistry,"LIO" ,BATTMGR_CHEMISTRY_LEN ))return POWER_SUPPLY_TECHNOLOGY_LION ; +if (!strncmp (chemistry,"LIP" ,BATTMGR_CHEMISTRY_LEN )) +return POWER_SUPPLY_TECHNOLOGY_LIPO ;pr_err ("Unknown battery technology '%s'\n" , chemistry);return POWER_SUPPLY_TECHNOLOGY_UNKNOWN ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 248/587 scsi: mpt3sas: Correctly handle ATA device errors
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Le Moal <[email protected]>
[ Upstream commit 15592a11d5a5c8411ac8494ec49736b658f6fbff ]
With the ATA error model, an NCQ command failure always triggers an abort (termination) of all NCQ commands queued on the device. In such case, the SAT or the host must handle the failed command according to the command sense data and immediately retry all other NCQ commands that were aborted due to the failed NCQ command.
For SAS HBAs controlled by the mpt3sas driver, NCQ command aborts are not handled by the HBA SAT and sent back to the host, with an ioc log information equal to 0x31080000 (IOC_LOGINFO_PREFIX_PL with the PL code PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR). The function _scsih_io_done() always forces a retry of commands terminated with the status MPI2_IOCSTATUS_SCSI_IOC_TERMINATED using the SCSI result DID_SOFT_ERROR, regardless of the log_info for the command. This correctly forces the retry of collateral NCQ abort commands, but with the retry counter for the command being incremented. If a command to an ATA device is subject to too many retries due to other NCQ commands failing (e.g. read commands trying to access unreadable sectors), the collateral NCQ abort commands may be terminated with an error as they run out of retries. This violates the SAT specification and causes hard-to-debug command errors.
Solve this issue by modifying the handling of the MPI2_IOCSTATUS_SCSI_IOC_TERMINATED status to check if a command is for an ATA device and if the command loginfo indicates an NCQ collateral abort. If that is the case, force the command retry using the SCSI result DID_IMM_RETRY to avoid incrementing the command retry count.
--- drivers/scsi/mpt3sas/mpt3sas_scsih.c | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
drivers/scsi/mpt3sas/mpt3sas_scsih.c +19 -0
@@ -196,6 +196,14 @@ struct sense_info {#define MPT3SAS_PORT_ENABLE_COMPLETE (0xFFFD)#define MPT3SAS_ABRT_TASK_SET (0xFFFE)#define MPT3SAS_REMOVE_UNRESPONDING_DEVICES (0xFFFF) + +/* +* SAS Log info code for a NCQ collateral abort after an NCQ error: +* IOC_LOGINFO_PREFIX_PL | PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR +* See: drivers/message/fusion/lsi/mpi_log_sas.h +*/ +#define IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR 0x31080000 +/** * struct fw_event_work - firmware event struct * @list: link list framework
@@ -5824,6 +5832,17 @@ _scsih_io_done(struct MPT3SAS_ADAPTER *ioc, u16 smid, u8 msix_index, u32 reply) scmd->result =DID_TRANSPORT_DISRUPTED <<16 ; goto out; } +if (log_info ==IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR ) { +/* +* This is a ATA NCQ command aborted due to another NCQ +* command failure. We must retry this command +* immediately but without incrementing its retry +* counter. +*/ +WARN_ON_ONCE (xfer_cnt !=0 ); + scmd->result =DID_IMM_RETRY <<16 ; +break ; + }if (log_info ==0x31110630 ) {if (scmd->retries >2 ) { scmd->result =DID_NO_CONNECT <<16 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 249/587 scsi: mpi3mr: Correctly handle ATA device errors
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Damien Le Moal <[email protected]>
[ Upstream commit 04caad5a7ba86e830d04750417a15bad8ac2613c ]
With the ATA error model, an NCQ command failure always triggers an abort (termination) of all NCQ commands queued on the device. In such case, the SAT or the host must handle the failed command according to the command sense data and immediately retry all other NCQ commands that were aborted due to the failed NCQ command.
For SAS HBAs controlled by the mpi3mr driver, NCQ command aborts are not handled by the HBA SAT and sent back to the host, with an ioc log information equal to 0x31080000 (IOC_LOGINFO_PREFIX_PL with the PL code PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR). The function mpi3mr_process_op_reply_desc() always forces a retry of commands terminated with the status MPI3_IOCSTATUS_SCSI_IOC_TERMINATED using the SCSI result DID_SOFT_ERROR, regardless of the ioc_loginfo for the command. This correctly forces the retry of collateral NCQ abort commands, but with the retry counter for the command being incremented. If a command to an ATA device is subject to too many retries due to other NCQ commands failing (e.g. read commands trying to access unreadable sectors), the collateral NCQ abort commands may be terminated with an error as they run out of retries. This violates the SAT specification and causes hard-to-debug command errors.
Solve this issue by modifying the handling of the MPI3_IOCSTATUS_SCSI_IOC_TERMINATED status to check if a command is for an ATA device and if the command ioc_loginfo indicates an NCQ collateral abort. If that is the case, force the command retry using the SCSI result DID_IMM_RETRY to avoid incrementing the command retry count.
--- drivers/scsi/mpi3mr/mpi3mr_os.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
drivers/scsi/mpi3mr/mpi3mr_os.c +19 -1
@@ -49,6 +49,13 @@ static void mpi3mr_send_event_ack(struct mpi3mr_ioc *mrioc, u8 event,#define MPI3_EVENT_WAIT_FOR_DEVICES_TO_REFRESH (0xFFFE) +/* +* SAS Log info code for a NCQ collateral abort after an NCQ error: +* IOC_LOGINFO_PREFIX_PL | PL_LOGINFO_CODE_SATA_NCQ_FAIL_ALL_CMDS_AFTR_ERR +* See: drivers/message/fusion/lsi/mpi_log_sas.h +*/ +#define IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR 0x31080000 +/** * mpi3mr_host_tag_for_scmd - Get host tag for a scmd * @mrioc: Adapter instance reference
@@ -3270,7 +3277,18 @@ void mpi3mr_process_op_reply_desc(struct mpi3mr_ioc *mrioc, scmd->result =DID_NO_CONNECT <<16 ;break ;case MPI3_IOCSTATUS_SCSI_IOC_TERMINATED : - scmd->result =DID_SOFT_ERROR <<16 ; +if (ioc_loginfo ==IOC_LOGINFO_SATA_NCQ_FAIL_AFTER_ERR ) { +/* +* This is a ATA NCQ command aborted due to another NCQ +* command failure. We must retry this command +* immediately but without incrementing its retry +* counter. +*/ +WARN_ON_ONCE (xfer_count !=0 ); + scmd->result =DID_IMM_RETRY <<16 ; + }else { + scmd->result =DID_SOFT_ERROR <<16 ; + }break ;case MPI3_IOCSTATUS_SCSI_TASK_TERMINATED :case MPI3_IOCSTATUS_SCSI_EXT_TERMINATED :
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 250/587 pinctrl: stm32: Manage irq affinity settings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cheick Traore <[email protected]>
[ Upstream commit 4c5cc2f65386e22166ce006efe515c667aa075e4 ]
Trying to set the affinity of the interrupts associated to stm32 pinctrl results in a write error.
Fill struct irq_chip::irq_set_affinity to use the default helper function.
--- drivers/pinctrl/stm32/pinctrl-stm32.c | 1 + 1 file changed, 1 insertion(+)
drivers/pinctrl/stm32/pinctrl-stm32.c +1 -0
@@ -418,6 +418,7 @@ static struct irq_chip stm32_gpio_irq_chip = { .irq_set_wake = irq_chip_set_wake_parent, .irq_request_resources = stm32_gpio_irq_request_resources, .irq_release_resources = stm32_gpio_irq_release_resources, + .irq_set_affinity = IS_ENABLED(CONFIG_SMP) ? irq_chip_set_affinity_parent : NULL, }; static int stm32_gpio_domain_translate(struct irq_domain *d,
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 251/587 media: tc358743: Check I2C succeeded during probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 303d81635e1d9c949b370215cc94526ed81f2e3d ]
The probe for the TC358743 reads the CHIPID register from the device and compares it to the expected value of 0. If the I2C request fails then that also returns 0, so the driver loads thinking that the device is there.
Generally I2C communications are reliable so there is limited need to check the return value on every transfer, therefore only amend the one read during probe to check for I2C errors.
--- drivers/media/i2c/tc358743.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-)
drivers/media/i2c/tc358743.c +23 -4
@@ -110,7 +110,7 @@ static inline struct tc358743_state *to_state(struct v4l2_subdev *sd)/* --------------- I2C --------------- */ -static void i2c_rd (struct v4l2_subdev *sd,u16 reg,u8 *values,u32 n) +static int i2c_rd (struct v4l2_subdev *sd,u16 reg,u8 *values,u32 n) {struct tc358743_state *state =to_state (sd);struct i2c_client *client = state->i2c_client;
@@ -136,6 +136,7 @@ static void i2c_rd(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n)v4l2_err (sd,"%s: reading register 0x%x from 0x%x failed: %d\n" , __func__, reg, client->addr, err); } +return err !=ARRAY_SIZE (msgs); }static void i2c_wr (struct v4l2_subdev *sd,u16 reg,u8 *values,u32 n)
@@ -192,15 +193,24 @@ static void i2c_wr(struct v4l2_subdev *sd, u16 reg, u8 *values, u32 n) } } -static noinline u32 i2c_rdreg(struct v4l2_subdev *sd, u16 reg, u32 n) +static noinline u32 i2c_rdreg_err(struct v4l2_subdev *sd, u16 reg, u32 n, +int *err) { +int error;__le32 val =0 ; -i2c_rd (sd, reg, (u8 __force *)&val, n); + error =i2c_rd (sd, reg, (u8 __force *)&val, n); +if (err) + *err = error;return le32_to_cpu (val); } +static inline u32 i2c_rdreg (struct v4l2_subdev *sd,u16 reg,u32 n) +{ +return i2c_rdreg_err (sd, reg, n,NULL ); +} + static noinline void i2c_wrreg(struct v4l2_subdev *sd, u16 reg, u32 val, u32 n) {__le32 raw =cpu_to_le32 (val);
@@ -229,6 +239,13 @@ static u16 i2c_rd16(struct v4l2_subdev *sd, u16 reg)return i2c_rdreg (sd, reg,2 ); } +static int i2c_rd16_err (struct v4l2_subdev *sd,u16 reg,u16 *value) +{ +int err; + *value =i2c_rdreg_err (sd, reg,2 , &err); +return err; +} +static void i2c_wr16 (struct v4l2_subdev *sd,u16 reg,u16 val) {i2c_wrreg (sd, reg, val,2 );
@@ -2021,6 +2038,7 @@ static int tc358743_probe(struct i2c_client *client)struct tc358743_platform_data *pdata = client->dev.platform_data;struct v4l2_subdev *sd;u16 irq_mask =MASK_HDMI_MSK |MASK_CSI_MSK ; +u16 chipid;int err;if (!i2c_check_functionality (client->adapter,I2C_FUNC_SMBUS_BYTE_DATA ))
@@ -2052,7 +2070,8 @@ static int tc358743_probe(struct i2c_client *client) sd->flags |=V4L2_SUBDEV_FL_HAS_DEVNODE |V4L2_SUBDEV_FL_HAS_EVENTS ;/* i2c access */ -if ((i2c_rd16 (sd,CHIPID ) &MASK_CHIPID ) !=0 ) { +if (i2c_rd16_err (sd,CHIPID , &chipid) || + (chipid &MASK_CHIPID ) !=0 ) {v4l2_info (sd,"not a TC358743 on address 0x%x\n" , client->addr <<1 );return -ENODEV ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 252/587 media: tc358743: Return an appropriate colorspace from tc358743_set_fmt
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 377cc006a364dfdab2f3f221cfad63a9265200b8 ]
When calling tc358743_set_fmt, the code was calling tc358743_get_fmt to choose a valid format. However that sets the colorspace based on information read back from the chip, not the colour format requested.
The result was that if you called try or set format for UYVY when the current format was RGB3 then you would get told SRGB, and try RGB3 when current was UYVY and you would get told SMPTE170M.
The value programmed in the VI_REP register for the colorspace is always set by this driver, therefore there is no need to read back the value, and never set to REC709.
Return the colorspace based on the format set/tried instead.
--- drivers/media/i2c/tc358743.c | 44 ++++++++++++++---------------------- 1 file changed, 17 insertions(+), 27 deletions(-)
drivers/media/i2c/tc358743.c +17 -27
@@ -1668,12 +1668,23 @@ static int tc358743_enum_mbus_code(struct v4l2_subdev *sd,return 0 ; } +static u32 tc358743_g_colorspace (u32 code) +{ +switch (code) { +case MEDIA_BUS_FMT_RGB888_1X24 : +return V4L2_COLORSPACE_SRGB ; +case MEDIA_BUS_FMT_UYVY8_1X16 : +return V4L2_COLORSPACE_SMPTE170M ; +default : +return 0 ; + } +} +static int tc358743_get_fmt (struct v4l2_subdev *sd,struct v4l2_subdev_state *sd_state,struct v4l2_subdev_format *format) {struct tc358743_state *state =to_state (sd); -u8 vi_rep =i2c_rd8 (sd,VI_REP );if (format->pad !=0 )return -EINVAL ;
@@ -1683,23 +1694,7 @@ static int tc358743_get_fmt(struct v4l2_subdev *sd, format->format.height = state->timings.bt.height; format->format.field =V4L2_FIELD_NONE ; -switch (vi_rep &MASK_VOUT_COLOR_SEL ) { -case MASK_VOUT_COLOR_RGB_FULL : -case MASK_VOUT_COLOR_RGB_LIMITED : - format->format.colorspace =V4L2_COLORSPACE_SRGB ; -break ; -case MASK_VOUT_COLOR_601_YCBCR_LIMITED : -case MASK_VOUT_COLOR_601_YCBCR_FULL : - format->format.colorspace =V4L2_COLORSPACE_SMPTE170M ; -break ; -case MASK_VOUT_COLOR_709_YCBCR_FULL : -case MASK_VOUT_COLOR_709_YCBCR_LIMITED : - format->format.colorspace =V4L2_COLORSPACE_REC709 ; -break ; -default : - format->format.colorspace =0 ; -break ; - } + format->format.colorspace =tc358743_g_colorspace (format->format.code);return 0 ; }
@@ -1713,19 +1708,14 @@ static int tc358743_set_fmt(struct v4l2_subdev *sd,u32 code = format->format.code;/* is overwritten by get_fmt */ int ret =tc358743_get_fmt (sd, sd_state, format); - format->format.code = code; +if (code ==MEDIA_BUS_FMT_RGB888_1X24 || + code ==MEDIA_BUS_FMT_UYVY8_1X16 ) + format->format.code = code; + format->format.colorspace =tc358743_g_colorspace (format->format.code);if (ret)return ret; -switch (code) { -case MEDIA_BUS_FMT_RGB888_1X24 : -case MEDIA_BUS_FMT_UYVY8_1X16 : -break ; -default : -return -EINVAL ; - } -if (format->which ==V4L2_SUBDEV_FORMAT_TRY )return 0 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 253/587 media: tc358743: Increase FIFO trigger level to 374
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dave Stevenson <[email protected]>
[ Upstream commit 86addd25314a1e77dbdcfddfeed0bab2f27da0e2 ]
The existing fixed value of 16 worked for UYVY 720P60 over 2 lanes at 594MHz, or UYVY 1080P60 over 4 lanes. (RGB888 1080P60 needs 6 lanes at 594MHz).
It doesn't allow for lower resolutions to work as the FIFO underflows.
374 is required for 1080P24 or 1080P30 UYVY over 2 lanes @ 972Mbit/s, but >374 means that the FIFO underflows on 1080P50 UYVY over 2 lanes @ 972Mbit/s.
Whilst it would be nice to compute it, the required information isn't published by Toshiba.
--- drivers/media/i2c/tc358743.c | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-)
drivers/media/i2c/tc358743.c +13 -2
@@ -1939,8 +1939,19 @@ static int tc358743_probe_of(struct tc358743_state *state) state->pdata.refclk_hz =clk_get_rate (refclk); state->pdata.ddc5v_delay =DDC5V_DELAY_100_MS ; state->pdata.enable_hdcp = false; -/* A FIFO level of 16 should be enough for 2-lane 720p60 at 594 MHz. */ - state->pdata.fifo_level =16 ; +/* +* Ideally the FIFO trigger level should be set based on the input and +* output data rates, but the calculations required are buried in +* Toshiba's register settings spreadsheet. +* A value of 16 works with a 594Mbps data rate for 720p60 (using 2 +* lanes) and 1080p60 (using 4 lanes), but fails when the data rate +* is increased, or a lower pixel clock is used that result in CSI +* reading out faster than the data is arriving. +* +* A value of 374 works with both those modes at 594Mbps, and with most +* modes on 972Mbps. +*/ + state->pdata.fifo_level =374 ;/* * The PLL input clock is obtained by dividing refclk by pll_prd. * It must be between 6 MHz and 40 MHz, lower frequency is better.
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 254/587 media: usb: hdpvr: disable zero-length read messages
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
[ Upstream commit b5ae5a79825ba8037b0be3ef677a24de8c063abf ]
This driver passes the length of an i2c_msg directly to usb_control_msg(). If the message is now a read and of length 0, it violates the USB protocol and a warning will be printed. Enable the I2C_AQ_NO_ZERO_LEN_READ quirk for this adapter thus forbidding 0-length read messages altogether.
--- drivers/media/usb/hdpvr/hdpvr-i2c.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/media/usb/hdpvr/hdpvr-i2c.c +6 -0
@@ -165,10 +165,16 @@ static const struct i2c_algorithm hdpvr_algo = { .functionality = hdpvr_functionality, }; +/* prevent invalid 0-length usb_control_msg */ +static const struct i2c_adapter_quirks hdpvr_quirks = { + .flags =I2C_AQ_NO_ZERO_LEN_READ , +}; +static const struct i2c_adapter hdpvr_i2c_adapter_template = { .name ="Hauppauge HD PVR I2C" , .owner =THIS_MODULE , .algo = &hdpvr_algo, + .quirks = &hdpvr_quirks, };static int hdpvr_activate_ir (struct hdpvr_device *dev)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 255/587 media: dvb-frontends: dib7090p: fix null-ptr-deref in dib7090p_rw_on_apb()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Guo <[email protected]>
[ Upstream commit ce5cac69b2edac3e3246fee03e8f4c2a1075238b ]
In dib7090p_rw_on_apb, msg is controlled by user. When msg[0].buf is null and msg[0].len is zero, former checks on msg[0].buf would be passed. If accessing msg[0].buf[2] without sanity check, null pointer deref would happen. We add check on msg[0].len to prevent crash. Similar issue occurs when access msg[1].buf[0] and msg[1].buf[1].
Similar commit: commit 0ed554fd769a ("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()")
--- drivers/media/dvb-frontends/dib7000p.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/dvb-frontends/dib7000p.c +4 -0
@@ -2261,8 +2261,12 @@ static int dib7090p_rw_on_apb(struct i2c_adapter *i2c_adap,u16 word;if (num ==1 ) {/* write */ +if (msg[0 ].len <3 ) +return -EOPNOTSUPP ;dib7000p_write_word (state, apb_address, ((msg[0 ].buf[1 ] <<8 ) | (msg[0 ].buf[2 ]))); }else { +if (msg[1 ].len <2 ) +return -EOPNOTSUPP ; word =dib7000p_read_word (state, apb_address); msg[1 ].buf[0 ] = (word >>8 ) &0xff ; msg[1 ].buf[1 ] = (word) &0xff ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 256/587 media: dvb-frontends: w7090p: fix null-ptr-deref in w7090p_tuner_write_serpar and w7090p_tuner_read_serpar
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alex Guo <[email protected]>
[ Upstream commit ed0234c8458b3149f15e496b48a1c9874dd24a1b ]
In w7090p_tuner_write_serpar, msg is controlled by user. When msg[0].buf is null and msg[0].len is zero, former checks on msg[0].buf would be passed. If accessing msg[0].buf[2] without sanity check, null pointer deref would happen. We add check on msg[0].len to prevent crash.
Similar commit: commit 0ed554fd769a ("media: dvb-usb: az6027: fix null-ptr-deref in az6027_i2c_xfer()")
--- drivers/media/dvb-frontends/dib7000p.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/dvb-frontends/dib7000p.c +4 -0
@@ -2198,6 +2198,8 @@ static int w7090p_tuner_write_serpar(struct i2c_adapter *i2c_adap, struct i2c_msstruct dib7000p_state *state =i2c_get_adapdata (i2c_adap);u8 n_overflow =1 ;u16 i =1000 ; +if (msg[0 ].len <3 ) +return -EOPNOTSUPP ;u16 serpar_num = msg[0 ].buf[0 ];while (n_overflow ==1 && i) {
@@ -2217,6 +2219,8 @@ static int w7090p_tuner_read_serpar(struct i2c_adapter *i2c_adap, struct i2c_msgstruct dib7000p_state *state =i2c_get_adapdata (i2c_adap);u8 n_overflow =1 , n_empty =1 ;u16 i =1000 ; +if (msg[0 ].len <1 || msg[1 ].len <2 ) +return -EOPNOTSUPP ;u16 serpar_num = msg[0 ].buf[0 ];u16 read_word;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 257/587 media: uvcvideo: Fix bandwidth issue for Alcor camera
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: chenchangcheng <[email protected]>
[ Upstream commit 9764401bf6f8a20eb11c2e78470f20fee91a9ea7 ]
Some broken device return wrong dwMaxPayloadTransferSize fields as follows:
[ 218.632537] uvcvideo: Device requested 2752512 B/frame bandwidth. [ 218.632598] uvcvideo: No fast enough alt setting for requested bandwidth.
When dwMaxPayloadTransferSize is greater than maxpsize, it will prevent the camera from starting. So use the bandwidth of maxpsize.
--- drivers/media/usb/uvc/uvc_video.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/media/usb/uvc/uvc_video.c +9 -0
@@ -258,6 +258,15 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream, ctrl->dwMaxPayloadTransferSize = bandwidth; } + +if (stream->intf->num_altsetting >1 && + ctrl->dwMaxPayloadTransferSize > stream->maxpsize) { +dev_warn_ratelimited (&stream->intf->dev, +"UVC non compliance: the max payload transmission size (%u) exceeds the size of the ep max packet (%u). Using the max size.\n" , + ctrl->dwMaxPayloadTransferSize, + stream->maxpsize); + ctrl->dwMaxPayloadTransferSize = stream->maxpsize; + } }static size_t uvc_video_ctrl_size (struct uvc_streaming *stream)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 258/587 crypto: octeontx2 - add timeout for load_fvc completion poll
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bharat Bhushan <[email protected]>
[ Upstream commit 2157e50f65d2030f07ea27ef7ac4cfba772e98ac ]
Adds timeout to exit from possible infinite loop, which polls on CPT instruction(load_fvc) completion.
--- .../crypto/marvell/octeontx2/otx2_cptpf_ucode.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-)
drivers/crypto/marvell/octeontx2/otx2_cptpf_ucode.c +14 -2
@@ -1485,6 +1485,7 @@ int otx2_cpt_discover_eng_capabilities(struct otx2_cptpf_dev *cptpf)dma_addr_t rptr_baddr;struct pci_dev *pdev;u32 len, compl_rlen; +int timeout =10000 ;int ret, etype;void *rptr;
@@ -1547,16 +1548,27 @@ int otx2_cpt_discover_eng_capabilities(struct otx2_cptpf_dev *cptpf) etype);otx2_cpt_fill_inst (&inst, &iq_cmd, rptr_baddr); lfs->ops->send_cmd (&inst,1 , &cptpf->lfs.lf[0 ]); + timeout =10000 ;while (lfs->ops->cpt_get_compcode (result) == -OTX2_CPT_COMPLETION_CODE_INIT ) +OTX2_CPT_COMPLETION_CODE_INIT ) {cpu_relax (); +udelay (1 ); + timeout--; +if (!timeout) { + ret = -ENODEV ; + cptpf->is_eng_caps_discovered = false; +dev_warn (&pdev->dev,"Timeout on CPT load_fvc completion poll\n" ); + goto error_no_response; + } + } cptpf->eng_caps[etype].u =be64_to_cpup (rptr); } -dma_unmap_single (&pdev->dev, rptr_baddr, len,DMA_BIDIRECTIONAL ); cptpf->is_eng_caps_discovered = true; +error_no_response: +dma_unmap_single (&pdev->dev, rptr_baddr, len,DMA_BIDIRECTIONAL ); free_result:kfree (result); lf_cleanup:
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 259/587 soundwire: amd: serialize amd manager resume sequence during pm_prepare
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vijendar Mukunda <[email protected]>
[ Upstream commit 03837341790039d6f1cbf7a1ae7dfa2cb77ef0a4 ]
During pm_prepare callback, pm_request_resume() delays SoundWire manager D0 entry sequence. Synchronize runtime resume sequence for amd_manager instance prior to invoking child devices resume sequence for both the amd power modes(ClockStop Mode and Power off mode).
Change the power_mode_mask check and use pm_runtime_resume() in amd_pm_prepare() callback.
--- drivers/soundwire/amd_manager.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/soundwire/amd_manager.c +3 -3
@@ -1104,10 +1104,10 @@ static int __maybe_unused amd_pm_prepare(struct device *dev)* device is not in runtime suspend state, observed that device alerts are missing * without pm_prepare on AMD platforms in clockstop mode0. */ -if (amd_manager->power_mode_mask &AMD_SDW_CLK_STOP_MODE ) { - ret =pm_request_resume (dev); +if (amd_manager->power_mode_mask) { + ret =pm_runtime_resume (dev);if (ret <0 ) { -dev_err (bus->dev,"pm_request_resume failed: %d\n" , ret); +dev_err (bus->dev,"pm_runtime_resume failed: %d\n" , ret);return 0 ; } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 260/587 soundwire: Move handle_nested_irq outside of sdw_dev_lock
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Charles Keepax <[email protected]>
[ Upstream commit ccb7bb13c00bcc3178d270da052635c56148bc16 ]
The sdw_dev_lock protects the SoundWire driver callbacks against the probed flag, which is used to skip the callbacks if the driver gets removed. For more information see commit bd29c00edd0a ("soundwire: revisit driver bind/unbind and callbacks").
However, this lock is a frequent source of mutex inversions. Many audio operations eventually hit the hardware resulting in a SoundWire callback, this means that typically the driver has the locking order ALSA/ASoC locks -> sdw_dev_lock. Conversely, the IRQ comes in directly from the SoundWire hardware, but then will often want to access ALSA/ASoC, such as updating something in DAPM or an ALSA control. This gives the other lock order sdw_dev_lock -> ALSA/ASoC locks.
When the IRQ handling was initially added to SoundWire this was through a callback mechanism. As such it required being covered by the lock because the callbacks are part of the sdw_driver structure and are thus present regardless of if the driver is currently probed.
Since then a newer mechanism using the IRQ framework has been added, which is currently covered by the same lock but this isn't actually required. Handlers for the IRQ framework are registered in probe and should by released during remove, thus the IRQ framework will have already unbound the IRQ before the slave driver is removed. Avoid the aforementioned mutex inversion by moving the handle_nested_irq call outside of the sdw_dev_lock.
--- drivers/soundwire/bus.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/soundwire/bus.c +3 -3
@@ -1730,15 +1730,15 @@ static int sdw_handle_slave_alerts(struct sdw_slave *slave)/* Update the Slave driver */ if (slave_notify) { +if (slave->prop.use_domain_irq && slave->irq) +handle_nested_irq (slave->irq); +mutex_lock (&slave->sdw_dev_lock);if (slave->probed) {struct device *dev = &slave->dev;struct sdw_driver *drv =drv_to_sdw_driver (dev->driver); -if (slave->prop.use_domain_irq && slave->irq) -handle_nested_irq (slave->irq); -if (drv->ops && drv->ops->interrupt_callback) { slave_intr.sdca_cascade = sdca_cascade; slave_intr.control_port = clear;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 261/587 md: dm-zoned-target: Initialize return variable r to avoid uninitialized use
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Purva Yeshi <[email protected]>
[ Upstream commit 487767bff572d46f7c37ad846c4078f6d6c9cc55 ]
Fix Smatch-detected error:drivers/md/dm-zoned-target.c:1073 dmz_iterate_devices()
error: uninitialized symbol 'r'.
Smatch detects a possible use of the uninitialized variable 'r' in dmz_iterate_devices() because if dmz->nr_ddevs is zero, the loop is skipped and 'r' is returned without being set, leading to undefined behavior.
Initialize 'r' to 0 before the loop. This ensures that if there are no devices to iterate over, the function still returns a defined value.
--- drivers/md/dm-zoned-target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-zoned-target.c +1 -1
@@ -1062,7 +1062,7 @@ static int dmz_iterate_devices(struct dm_target *ti,struct dmz_target *dmz = ti->private;unsigned int zone_nr_sectors =dmz_zone_nr_sectors (dmz->metadata);sector_t capacity; -int i, r; +int i, r =0 ;for (i =0 ; i < dmz->nr_ddevs; i++) { capacity = dmz->dev[i].capacity & ~(zone_nr_sectors -1 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 262/587 module: Prevent silent truncation of module name in delete_module(2)
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Pavlu <[email protected]>
[ Upstream commit a6323bd4e611567913e23df5b58f2d4e4da06789 ]
Passing a module name longer than MODULE_NAME_LEN to the delete_module syscall results in its silent truncation. This really isn't much of a problem in practice, but it could theoretically lead to the removal of an incorrect module. It is more sensible to return ENAMETOOLONG or ENOENT in such a case.
Update the syscall to return ENOENT, as documented in the delete_module(2) man page to mean "No module by that name exists." This is appropriate because a module with a name longer than MODULE_NAME_LEN cannot be loaded in the first place.
--- kernel/module/main.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
kernel/module/main.c +6 -4
@@ -701,14 +701,16 @@ SYSCALL_DEFINE2(delete_module, const char __user *, name_user,struct module *mod;char name[MODULE_NAME_LEN ];char buf[MODULE_FLAGS_BUF_SIZE ]; -int ret, forced =0 ; +int ret, len, forced =0 ;if (!capable (CAP_SYS_MODULE ) || modules_disabled)return -EPERM ; -if (strncpy_from_user (name, name_user,MODULE_NAME_LEN -1 ) <0 ) -return -EFAULT ; - name[MODULE_NAME_LEN -1 ] ='\0' ; + len =strncpy_from_user (name, name_user,MODULE_NAME_LEN ); +if (len ==0 || len ==MODULE_NAME_LEN ) +return -ENOENT ; +if (len <0 ) +return len;audit_log_kern_module (name);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 263/587 i3c: add missing include to internal header
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
[ Upstream commit 3b661ca549b9e5bb11d0bc97ada6110aac3282d2 ]
LKP found a random config which failed to build because IO accessors were not defined:
In file included from drivers/i3c/master.c:21:
drivers/i3c/internals.h: In function 'i3c_writel_fifo':
Quoted 1 line
Quoted 1 line
drivers/i3c/internals.h:35:9: error: implicit declaration of function 'writesl' [-Werror=implicit-function-declaration]
Add the proper header to where the IO accessors are used.
--- drivers/i3c/internals.h | 1 + 1 file changed, 1 insertion(+)
drivers/i3c/internals.h +1 -0
@@ -9,6 +9,7 @@#define I3C_INTERNALS_H #include <linux/i3c/master.h> +#include <linux/io.h> extern struct bus_type i3c_bus_type;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 264/587 rtc: ds1307: handle oscillator stop flag (OSF) for ds1341
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meagan Lloyd <[email protected]>
[ Upstream commit 523923cfd5d622b8f4ba893fdaf29fa6adeb8c3e ]
In using CONFIG_RTC_HCTOSYS, rtc_hctosys() will sync the RTC time to the kernel time as long as rtc_read_time() succeeds. In some power loss situations, our supercapacitor-backed DS1342 RTC comes up with either an unpredictable future time or the default 01/01/00 from the datasheet. The oscillator stop flag (OSF) is set in these scenarios due to the power loss and can be used to determine the validity of the RTC data.
This change expands the oscillator stop flag (OSF) handling that has already been implemented for some chips to the ds1341 chip (DS1341 and DS1342 share a datasheet). This handling manages the validity of the RTC data in .read_time and .set_time based on the OSF.
--- drivers/rtc/rtc-ds1307.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/rtc/rtc-ds1307.c +11 -0
@@ -274,6 +274,13 @@ static int ds1307_get_time(struct device *dev, struct rtc_time *t)if (tmp &DS1340_BIT_OSF )return -EINVAL ;break ; +case ds_1341: + ret =regmap_read (ds1307->regmap,DS1337_REG_STATUS , &tmp); +if (ret) +return ret; +if (tmp &DS1337_BIT_OSF ) +return -EINVAL ; +break ;case ds_1388: ret =regmap_read (ds1307->regmap,DS1388_REG_FLAG , &tmp);if (ret)
@@ -372,6 +379,10 @@ static int ds1307_set_time(struct device *dev, struct rtc_time *t)regmap_update_bits (ds1307->regmap,DS1340_REG_FLAG ,DS1340_BIT_OSF ,0 );break ; +case ds_1341: +regmap_update_bits (ds1307->regmap,DS1337_REG_STATUS , +DS1337_BIT_OSF ,0 ); +break ;case ds_1388:regmap_update_bits (ds1307->regmap,DS1388_REG_FLAG ,DS1388_BIT_OSF ,0 );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 265/587 apparmor: shift ouid when mediating hard links in userns
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gabriel Totev <[email protected]>
[ Upstream commit c5bf96d20fd787e4909b755de4705d52f3458836 ]
When using AppArmor profiles inside an unprivileged container, the link operation observes an unshifted ouid. (tested with LXD and Incus)
For example, root inside container and uid 1000000 outside, with owner /root/link l, profile entry for ln:
/root$ touch chain && ln chain link
==> dmesg
apparmor="DENIED" operation="link" class="file" namespace="root//lxd-feet_<var-snap-lxd-common-lxd>" profile="linkit" name="/root/link" pid=1655 comm="ln" requested_mask="l" denied_mask="l" fsuid=1000000 ouid=0 [<== should be 1000000] target="/root/chain"
Fix by mapping inode uid of old_dentry in aa_path_link() rather than using it directly, similarly to how it's mapped in __file_path_perm() later in the file.
--- security/apparmor/file.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
security/apparmor/file.c +4 -2
@@ -436,9 +436,11 @@ int aa_path_link(const struct cred *subj_cred, {struct path link = { .mnt = new_dir->mnt, .dentry = new_dentry };struct path target = { .mnt = new_dir->mnt, .dentry = old_dentry }; +struct inode *inode =d_backing_inode (old_dentry); +vfsuid_t vfsuid =i_uid_into_vfsuid (mnt_idmap (target.mnt), inode);struct path_cond cond = { -d_backing_inode (old_dentry)->i_uid, -d_backing_inode (old_dentry)->i_mode + .uid =vfsuid_into_kuid (vfsuid), + .mode = inode->i_mode, };char *buffer =NULL , *buffer2 =NULL ;struct aa_profile *profile;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 266/587 i3c: dont fail if GETHDRCAP is unsupported
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wolfram Sang <[email protected]>
[ Upstream commit 447270cdb41b1c8c3621bb14b93a6749f942556e ]
'I3C_BCR_HDR_CAP' is still spec v1.0 and has been renamed to 'advanced capabilities' in v1.1 onwards. The ST pressure sensor LPS22DF does not have HDR, but has the 'advanced cap' bit set. The core still wants to get additional information using the CCC 'GETHDRCAP' (or GETCAPS in v1.1 onwards). Not all controllers support this CCC and will notify the upper layers about it. For instantiating the device, we can ignore this unsupported CCC as standard communication will work. Without this patch, the device will not be instantiated at all.
--- drivers/i3c/master.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/i3c/master.c +1 -1
@@ -1398,7 +1398,7 @@ static int i3c_master_retrieve_dev_info(struct i3c_dev_desc *dev)if (dev->info.bcr &I3C_BCR_HDR_CAP ) { ret =i3c_master_gethdrcap_locked (master, &dev->info); -if (ret) +if (ret && ret != -ENOTSUPP )return ret; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 267/587 i3c: master: Initialize ret in i3c_i2c_notifier_call()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jorge Marques <[email protected]>
[ Upstream commit 290ce8b2d0745e45a3155268184523a8c75996f1 ]
Set ret to -EINVAL if i3c_i2c_notifier_call() receives an invalid action, resolving uninitialized warning.
--- drivers/i3c/master.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/i3c/master.c +2 -0
@@ -2430,6 +2430,8 @@ static int i3c_i2c_notifier_call(struct notifier_block *nb, unsigned long actioncase BUS_NOTIFY_DEL_DEVICE : ret =i3c_master_i2c_detach (adap, client);break ; +default : + ret = -EINVAL ; }i3c_bus_maintenance_unlock (&master->bus);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 268/587 dm-mpath: dont print the "loaded" message if registering fails
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
[ Upstream commit 6e11952a6abc4641dc8ae63f01b318b31b44e8db ]
If dm_register_path_selector, don't print the "version X loaded" message.
--- drivers/md/dm-ps-historical-service-time.c | 4 +++- drivers/md/dm-ps-queue-length.c | 4 +++- drivers/md/dm-ps-round-robin.c | 4 +++- drivers/md/dm-ps-service-time.c | 4 +++- 4 files changed, 12 insertions(+), 4 deletions(-)
drivers/md/dm-ps-historical-service-time.c +3 -1
@@ -541,8 +541,10 @@ static int __init dm_hst_init(void) {int r =dm_register_path_selector (&hst_ps); -if (r <0 ) +if (r <0 ) {DMERR ("register failed %d" , r); +return r; + }DMINFO ("version " HST_VERSION " loaded" );
drivers/md/dm-ps-queue-length.c +3 -1
@@ -260,8 +260,10 @@ static int __init dm_ql_init(void) {int r =dm_register_path_selector (&ql_ps); -if (r <0 ) +if (r <0 ) {DMERR ("register failed %d" , r); +return r; + }DMINFO ("version " QL_VERSION " loaded" );
drivers/md/dm-ps-round-robin.c +3 -1
@@ -220,8 +220,10 @@ static int __init dm_rr_init(void) {int r =dm_register_path_selector (&rr_ps); -if (r <0 ) +if (r <0 ) {DMERR ("register failed %d" , r); +return r; + }DMINFO ("version " RR_VERSION " loaded" );
drivers/md/dm-ps-service-time.c +3 -1
@@ -341,8 +341,10 @@ static int __init dm_st_init(void) {int r =dm_register_path_selector (&st_ps); -if (r <0 ) +if (r <0 ) {DMERR ("register failed %d" , r); +return r; + }DMINFO ("version " ST_VERSION " loaded" );
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 269/587 dm-table: fix checking for rq stackable devices
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Benjamin Marzinski <[email protected]>
[ Upstream commit 8ca719b81987be690f197e82fdb030580c0a07f3 ]
Due to the semantics of iterate_devices(), the current code allows a request-based dm table as long as it includes one request-stackable device. It is supposed to only allow tables where there are no non-request-stackable devices.
--- drivers/md/dm-table.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/md/dm-table.c +5 -5
@@ -862,17 +862,17 @@ static bool dm_table_supports_dax(struct dm_table *t,return true; } -static int device_is_rq_stackable (struct dm_target *ti,struct dm_dev *dev, -sector_t start,sector_t len,void *data) +static int device_is_not_rq_stackable (struct dm_target *ti,struct dm_dev *dev, +sector_t start,sector_t len,void *data) {struct block_device *bdev = dev->bdev;struct request_queue *q =bdev_get_queue (bdev);/* request-based cannot stack on partitions! */ if (bdev_is_partition (bdev)) -return false; +return true; -return queue_is_mq (q); +return !queue_is_mq (q); }static int dm_table_determine_type (struct dm_table *t)
@@ -968,7 +968,7 @@ static int dm_table_determine_type(struct dm_table *t)/* Non-request-stackable devices can't be used for request-based dm */ if (!ti->type->iterate_devices || - !ti->type->iterate_devices (ti, device_is_rq_stackable,NULL )) { + ti->type->iterate_devices (ti, device_is_not_rq_stackable,NULL )) {DMERR ("table load rejected: including non-request-stackable devices" );return -EINVAL ; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 270/587 apparmor: use the condition in AA_BUG_FMT even with debug disabled
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mateusz Guzik <[email protected]>
[ Upstream commit 67e370aa7f968f6a4f3573ed61a77b36d1b26475 ]
This follows the established practice and fixes a build failure for me:security/apparmor/file.c: In function ‘__file_sock_perm’:security/apparmor/file.c:544:24: error: unused variable ‘sock’ [-Werror=unused-variable]
544 | struct socket *sock = (struct socket *) file->private_data;
| ^~~~
--- security/apparmor/include/lib.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
security/apparmor/include/lib.h +5 -1
@@ -46,7 +46,11 @@ #define AA_BUG_FMT(X, fmt, args...) \ WARN((X), "AppArmor WARN %s: (" #X "): " fmt, __func__, ##args)#else -#define AA_BUG_FMT(X, fmt, args...) no_printk(fmt, ##args) +#define AA_BUG_FMT(X, fmt, args...) \ + do { \ + BUILD_BUG_ON_INVALID(X); \ + no_printk(fmt, ##args); \ + } while (0)#endif #define AA_ERROR(fmt, args...) \
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 271/587 i2c: Force DLL0945 touchpad i2c freq to 100khz
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: fangzhong.zhou <[email protected]>
[ Upstream commit 0b7c9528facdb5a73ad78fea86d2e95a6c48dbc4 ]
This patch fixes an issue where the touchpad cursor movement becomes slow on the Dell Precision 5560. Force the touchpad freq to 100khz as a workaround.
Tested on Dell Precision 5560 with 6.14 to 6.14.6. Cursor movement is now smooth and responsive.
--- drivers/i2c/i2c-core-acpi.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/i2c-core-acpi.c +1 -0
@@ -370,6 +370,7 @@ static const struct acpi_device_id i2c_acpi_force_100khz_device_ids[] = {* the device works without issues on Windows at what is expected to be * a 400KHz frequency. The root cause of the issue is not known. */ + { "DLL0945", 0 }, { "ELAN06FA", 0 }, {} };
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 272/587 exfat: add cluster chain loop check for dir
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yuezhang Mo <[email protected]>
[ Upstream commit 99f9a97dce39ad413c39b92c90393bbd6778f3fd ]
An infinite loop may occur if the following conditions occur due to file system corruption.
(1) Condition for exfat_count_dir_entries() to loop infinitely.
- The cluster chain includes a loop.
- There is no UNUSED entry in the cluster chain.
(2) Condition for exfat_create_upcase_table() to loop infinitely.
- The cluster chain of the root directory includes a loop.
- There are no UNUSED entry and up-case table entry in the cluster chain of the root directory.
(3) Condition for exfat_load_bitmap() to loop infinitely.
- The cluster chain of the root directory includes a loop.
- There are no UNUSED entry and bitmap entry in the cluster chain of the root directory.
(4) Condition for exfat_find_dir_entry() to loop infinitely.
- The cluster chain includes a loop.
- The unused directory entries were exhausted by some operation.
(5) Condition for exfat_check_dir_empty() to loop infinitely.
- The cluster chain includes a loop.
- The unused directory entries were exhausted by some operation.
- All files and sub-directories under the directory are deleted.
This commit adds checks to break the above infinite loop.
--- fs/exfat/dir.c | 12 ++++++++++++ fs/exfat/fatent.c | 10 ++++++++++ fs/exfat/namei.c | 5 +++++ fs/exfat/super.c | 32 +++++++++++++++++++++----------- 4 files changed, 48 insertions(+), 11 deletions(-)
fs/exfat/dir.c +12 -0
@@ -994,6 +994,7 @@ int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei,struct exfat_hint_femp candi_empty;struct exfat_sb_info *sbi =EXFAT_SB (sb);int num_entries =exfat_calc_num_entries (p_uniname); +unsigned int clu_count =0 ;if (num_entries <0 )return num_entries;
@@ -1131,6 +1132,10 @@ int exfat_find_dir_entry(struct super_block *sb, struct exfat_inode_info *ei, }else {if (exfat_get_next_cluster (sb, &clu.dir))return -EIO ; + +/* break if the cluster chain includes a loop */ +if (unlikely (++clu_count >EXFAT_DATA_CLUSTER_COUNT (sbi))) + goto not_found; } }
@@ -1214,6 +1219,7 @@ int exfat_count_dir_entries(struct super_block *sb, struct exfat_chain *p_dir)int i, count =0 ;int dentries_per_clu;unsigned int entry_type; +unsigned int clu_count =0 ;struct exfat_chain clu;struct exfat_dentry *ep;struct exfat_sb_info *sbi =EXFAT_SB (sb);
@@ -1246,6 +1252,12 @@ int exfat_count_dir_entries(struct super_block *sb, struct exfat_chain *p_dir) }else {if (exfat_get_next_cluster (sb, &(clu.dir)))return -EIO ; + +if (unlikely (++clu_count > sbi->used_clusters)) { +exfat_fs_error (sb,"FAT or bitmap is corrupted" ); +return -EIO ; + } + } }
fs/exfat/fatent.c +10 -0
@@ -461,5 +461,15 @@ int exfat_count_num_clusters(struct super_block *sb, } *ret_count = count; + +/* +* since exfat_count_used_clusters() is not called, sbi->used_clusters +* cannot be used here. +*/ +if (unlikely (i == sbi->num_clusters && clu !=EXFAT_EOF_CLUSTER )) { +exfat_fs_error (sb,"The cluster chain has a loop" ); +return -EIO ; + } +return 0 ; }
fs/exfat/namei.c +5 -0
@@ -893,6 +893,7 @@ static int exfat_check_dir_empty(struct super_block *sb, {int i, dentries_per_clu;unsigned int type; +unsigned int clu_count =0 ;struct exfat_chain clu;struct exfat_dentry *ep;struct exfat_sb_info *sbi =EXFAT_SB (sb);
@@ -929,6 +930,10 @@ static int exfat_check_dir_empty(struct super_block *sb, }else {if (exfat_get_next_cluster (sb, &(clu.dir)))return -EIO ; + +/* break if the cluster chain includes a loop */ +if (unlikely (++clu_count >EXFAT_DATA_CLUSTER_COUNT (sbi))) +break ; } }
fs/exfat/super.c +21 -11
@@ -327,13 +327,12 @@ static void exfat_hash_init(struct super_block *sb)INIT_HLIST_HEAD (&sbi->inode_hashtable[i]); } -static int exfat_read_root (struct inode *inode) +static int exfat_read_root (struct inode *inode,struct exfat_chain *root_clu) {struct super_block *sb = inode->i_sb;struct exfat_sb_info *sbi =EXFAT_SB (sb);struct exfat_inode_info *ei =EXFAT_I (inode); -struct exfat_chain cdir; -int num_subdirs, num_clu =0 ; +int num_subdirs;exfat_chain_set (&ei->dir, sbi->root_dir,0 ,ALLOC_FAT_CHAIN ); ei->entry =-1 ;
@@ -346,12 +345,9 @@ static int exfat_read_root(struct inode *inode) ei->hint_stat.clu = sbi->root_dir; ei->hint_femp.eidx =EXFAT_HINT_NONE ; -exfat_chain_set (&cdir, sbi->root_dir,0 ,ALLOC_FAT_CHAIN ); -if (exfat_count_num_clusters (sb, &cdir, &num_clu)) -return -EIO ; -i_size_write (inode, num_clu << sbi->cluster_size_bits); +i_size_write (inode,EXFAT_CLU_TO_B (root_clu->size, sbi)); - num_subdirs =exfat_count_dir_entries (sb, &cdir); + num_subdirs =exfat_count_dir_entries (sb, root_clu);if (num_subdirs <0 )return -EIO ;set_nlink (inode, num_subdirs +EXFAT_MIN_SUBDIR );
@@ -567,7 +563,8 @@ static int exfat_verify_boot_region(struct super_block *sb) }/* mount the file system volume */ -static int __exfat_fill_super (struct super_block *sb) +static int __exfat_fill_super (struct super_block *sb, +struct exfat_chain *root_clu) {int ret;struct exfat_sb_info *sbi =EXFAT_SB (sb);
@@ -584,6 +581,18 @@ static int __exfat_fill_super(struct super_block *sb) goto free_bh; } +/* +* Call exfat_count_num_cluster() before searching for up-case and +* bitmap directory entries to avoid infinite loop if they are missing +* and the cluster chain includes a loop. +*/ +exfat_chain_set (root_clu, sbi->root_dir,0 ,ALLOC_FAT_CHAIN ); + ret =exfat_count_num_clusters (sb, root_clu, &root_clu->size); +if (ret) { +exfat_err (sb,"failed to count the number of clusters in root" ); + goto free_bh; + } + ret =exfat_create_upcase_table (sb);if (ret) {exfat_err (sb,"failed to load upcase table" );
@@ -618,6 +627,7 @@ static int exfat_fill_super(struct super_block *sb, struct fs_context *fc)struct exfat_sb_info *sbi = sb->s_fs_info;struct exfat_mount_options *opts = &sbi->options;struct inode *root_inode; +struct exfat_chain root_clu;int err;if (opts->allow_utime == (unsigned short )-1 )
@@ -636,7 +646,7 @@ static int exfat_fill_super(struct super_block *sb, struct fs_context *fc) sb->s_time_min =EXFAT_MIN_TIMESTAMP_SECS ; sb->s_time_max =EXFAT_MAX_TIMESTAMP_SECS ; - err =__exfat_fill_super (sb); + err =__exfat_fill_super (sb, &root_clu);if (err) {exfat_err (sb,"failed to recognize exfat type" ); goto check_nls_io;
@@ -671,7 +681,7 @@ static int exfat_fill_super(struct super_block *sb, struct fs_context *fc) root_inode->i_ino =EXFAT_ROOT_INO ;inode_set_iversion (root_inode,1 ); - err =exfat_read_root (root_inode); + err =exfat_read_root (root_inode, &root_clu);if (err) {exfat_err (sb,"failed to initialize root inode" ); goto put_inode;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 273/587 f2fs: check the generic conditions first
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jaegeuk Kim <[email protected]>
[ Upstream commit e23ab8028de0d92df5921a570f5212c0370db3b5 ]
Let's return errors caught by the generic checks. This fixes generic/494 where it expects to see EBUSY by setattr_prepare instead of EINVAL by f2fs for active swapfile.
--- fs/f2fs/file.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
fs/f2fs/file.c +12 -12
@@ -991,6 +991,18 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,if (unlikely (f2fs_cp_error (F2FS_I_SB (inode))))return -EIO ; + err =setattr_prepare (idmap, dentry, attr); +if (err) +return err; + + err =fscrypt_prepare_setattr (dentry, attr); +if (err) +return err; + + err =fsverity_prepare_setattr (dentry, attr); +if (err) +return err; +if (unlikely (IS_IMMUTABLE (inode)))return -EPERM ;
@@ -1008,18 +1020,6 @@ int f2fs_setattr(struct mnt_idmap *idmap, struct dentry *dentry,return -EINVAL ; } - err =setattr_prepare (idmap, dentry, attr); -if (err) -return err; - - err =fscrypt_prepare_setattr (dentry, attr); -if (err) -return err; - - err =fsverity_prepare_setattr (dentry, attr); -if (err) -return err; -if (is_quota_modification (idmap, inode, attr)) { err =f2fs_dquot_initialize (inode);if (err)
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 274/587 kconfig: lxdialog: replace strcpy() with strncpy() in inputbox.c
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suchit Karunakaran <[email protected]>
[ Upstream commit 5ac726653a1029a2eccba93bbe59e01fc9725828 ]
strcpy() performs no bounds checking and can lead to buffer overflows if the input string exceeds the destination buffer size. This patch replaces it with strncpy(), and null terminates the input string.
--- scripts/kconfig/lxdialog/inputbox.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
scripts/kconfig/lxdialog/inputbox.c +4 -2
@@ -39,8 +39,10 @@ int dialog_inputbox(const char *title, const char *prompt, int height, int widthif (!init) instr[0 ] ='\0' ; -else -strcpy (instr, init); +else { +strncpy (instr, init,sizeof (dialog_input_result) -1 ); + instr[sizeof (dialog_input_result) -1 ] ='\0' ; + } do_resize:if (getmaxy (stdscr) <= (height -INPUTBOX_HEIGTH_MIN ))
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 275/587 vfio/type1: conditional rescheduling while pinning
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keith Busch <[email protected]>
[ Upstream commit b1779e4f209c7ff7e32f3c79d69bca4e3a3a68b6 ]
A large DMA mapping request can loop through dma address pinning for many pages. In cases where THP can not be used, the repeated vmf_insert_pfn can be costly, so let the task reschedule as need to prevent CPU stalls. Failure to do so has potential harmful side effects, like increased memory pressure as unrelated rcu tasks are unable to make their reclaim callbacks and result in OOM conditions.
rcu: INFO: rcu_sched self-detected stall on CPU rcu: 36-....: (20999 ticks this GP) idle=b01c/1/0x4000000000000000 softirq=35839/35839 fqs=3538 rcu: hardirqs softirqs csw/system rcu: number: 0 107 0 rcu: cputime: 50 0 10446 ==> 10556(ms) rcu: (t=21075 jiffies g=377761 q=204059 ncpus=384) ... <TASK> ? asm_sysvec_apic_timer_interrupt+0x16/0x20 ? walk_system_ram_range+0x63/0x120 ? walk_system_ram_range+0x46/0x120 ? pgprot_writethrough+0x20/0x20 lookup_memtype+0x67/0xf0 track_pfn_insert+0x20/0x40 vmf_insert_pfn_prot+0x88/0x140 vfio_pci_mmap_huge_fault+0xf9/0x1b0 [vfio_pci_core] __do_fault+0x28/0x1b0 handle_mm_fault+0xef1/0x2560 fixup_user_fault+0xf5/0x270 vaddr_get_pfns+0x169/0x2f0 [vfio_iommu_type1] vfio_pin_pages_remote+0x162/0x8e0 [vfio_iommu_type1] vfio_iommu_type1_ioctl+0x1121/0x1810 [vfio_iommu_type1] ? futex_wake+0x1c1/0x260 x64_sys_call+0x234/0x17a0 do_syscall_64+0x63/0x130 ? exc_page_fault+0x63/0x130 entry_SYSCALL_64_after_hwframe+0x4b/0x53
--- drivers/vfio/vfio_iommu_type1.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/vfio/vfio_iommu_type1.c +7 -0
@@ -635,6 +635,13 @@ static long vfio_pin_pages_remote(struct vfio_dma *dma, unsigned long vaddr,while (npage) {if (!batch->size) { +/* +* Large mappings may take a while to repeatedly refill +* the batch, so conditionally relinquish the CPU when +* needed to avoid stalls. +*/ +cond_resched (); +/* Empty batch, so refill it. */ long req_pages =min_t (long, npage, batch->capacity);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 276/587 kconfig: nconf: Ensure null termination where strncpy is used
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Shankari Anand <[email protected]>
[ Upstream commit f468992936894c9ce3b1659cf38c230d33b77a16 ]
strncpy() does not guarantee null-termination if the source string is longer than the destination buffer.
Ensure the buffer is explicitly null-terminated to prevent potential string overflows or undefined behavior.
--- scripts/kconfig/nconf.c | 2 ++ scripts/kconfig/nconf.gui.c | 1 + 2 files changed, 3 insertions(+)
scripts/kconfig/nconf.c +2 -0
@@ -591,6 +591,8 @@ static void item_add_str(const char *fmt, ...) tmp_str, sizeof(k_menu_items[index].str)); + k_menu_items[index].str[sizeof (k_menu_items[index].str) -1 ] ='\0' ; +free_item (curses_menu_items[index]); curses_menu_items[index] = new_item( k_menu_items[index].str,
scripts/kconfig/nconf.gui.c +1 -0
@@ -349,6 +349,7 @@ int dialog_inputbox(WINDOW *main_window, x = (columns-win_cols)/2 ;strncpy (result, init, *result_len); + result[*result_len -1 ] ='\0' ;/* create the windows */ win =newwin (win_lines, win_cols, y, x);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 277/587 scsi: Fix sas_user_scan() to handle wildcard and multi-channel scans
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ranjan Kumar <[email protected]>
[ Upstream commit 37c4e72b0651e7697eb338cd1fb09feef472cc1a ]
sas_user_scan() did not fully process wildcard channel scans (SCAN_WILD_CARD) when a transport-specific user_scan() callback was present. Only channel 0 would be scanned via user_scan(), while the remaining channels were skipped, potentially missing devices.
user_scan() invokes updated sas_user_scan() for channel 0, and if successful, iteratively scans remaining channels (1 to shost->max_channel) via scsi_scan_host_selected(). This ensures complete wildcard scanning without affecting transport-specific scanning behavior.
--- drivers/scsi/scsi_scan.c | 2 +- drivers/scsi/scsi_transport_sas.c | 60 ++++++++++++++++++++++++------- 2 files changed, 49 insertions(+), 13 deletions(-)
drivers/scsi/scsi_scan.c +1 -1
@@ -1851,7 +1851,7 @@ int scsi_scan_host_selected(struct Scsi_Host *shost, unsigned int channel,return 0 ; } - +EXPORT_SYMBOL (scsi_scan_host_selected);static void scsi_sysfs_add_devices (struct Scsi_Host *shost) {struct scsi_device *sdev;
drivers/scsi/scsi_transport_sas.c +48 -12
86 lines not on this page · raw message
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 278/587 scsi: target: core: Generate correct identifiers for PR OUT transport IDs
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Maurizio Lombardi <[email protected]>
[ Upstream commit 6e0f6aa44b68335df404a2df955055f416b5f2aa ]
Fix target_parse_pr_out_transport_id() to return a string representing the transport ID in a human-readable format (e.g., naa.xxxxxxxx...) for various SCSI protocol types (SAS, FCP, SRP, SBP).
Previously, the function returned a pointer to the raw binary buffer, which was incorrectly compared against human-readable strings, causing comparisons to fail. Now, the function writes a properly formatted string into a buffer provided by the caller. The output format depends on the transport protocol:
* SAS: 64-bit identifier, "naa." prefix.
* FCP: 64-bit identifier, colon separated values.
* SBP: 64-bit identifier, no prefix.
* SRP: 128-bit identifier, "0x" prefix.
* iSCSI: IQN string.
--- drivers/target/target_core_fabric_lib.c | 63 +++++++++++++++++++------ drivers/target/target_core_internal.h | 4 +- drivers/target/target_core_pr.c | 18 +++---- 3 files changed, 60 insertions(+), 25 deletions(-)
drivers/target/target_core_fabric_lib.c +48 -15
@@ -257,11 +257,41 @@ static int iscsi_get_pr_transport_id_len(return len; } -static char *iscsi_parse_pr_out_transport_id ( +static void sas_parse_pr_out_transport_id (char *buf,char *i_str) +{ +char hex[17 ] = {}; + +bin2hex (hex, buf +4 ,8 ); +snprintf (i_str,TRANSPORT_IQN_LEN ,"naa.%s" , hex); +} + +static void srp_parse_pr_out_transport_id (char *buf,char *i_str) +{ +char hex[33 ] = {}; + +bin2hex (hex, buf +8 ,16 ); +snprintf (i_str,TRANSPORT_IQN_LEN ,"0x%s" , hex); +} + +static void fcp_parse_pr_out_transport_id (char *buf,char *i_str) +{ +snprintf (i_str,TRANSPORT_IQN_LEN ,"%8phC" , buf +8 ); +} + +static void sbp_parse_pr_out_transport_id (char *buf,char *i_str) +{ +char hex[17 ] = {}; + +bin2hex (hex, buf +8 ,8 ); +snprintf (i_str,TRANSPORT_IQN_LEN ,"%s" , hex); +} + +static bool iscsi_parse_pr_out_transport_id (struct se_portal_group *se_tpg,char *buf,u32 *out_tid_len, -char **port_nexus_ptr) +char **port_nexus_ptr, +char *i_str) {char *p;int i;
@@ -282,7 +312,7 @@ static char *iscsi_parse_pr_out_transport_id(if ((format_code !=0x00 ) && (format_code !=0x40 )) {pr_err ("Illegal format code: 0x%02x for iSCSI" " Initiator Transport ID\n" , format_code); -return NULL ; +return false; }/* * If the caller wants the TransportID Length, we set that value for the
@@ -306,7 +336,7 @@ static char *iscsi_parse_pr_out_transport_id(pr_err ("Unable to locate \",i,0x\" separator" " for Initiator port identifier: %s\n" , &buf[4 ]); -return NULL ; +return false; } *p ='\0' ;/* Terminate iSCSI Name */ p +=5 ;/* Skip over ",i,0x" separator */
@@ -339,7 +369,8 @@ static char *iscsi_parse_pr_out_transport_id( }else *port_nexus_ptr =NULL ; -return &buf[4 ]; +strscpy (i_str, &buf[4 ],TRANSPORT_IQN_LEN ); +return true; } int target_get_pr_transport_id_len(struct se_node_acl *nacl,
@@ -387,33 +418,35 @@ int target_get_pr_transport_id(struct se_node_acl *nacl, } } -const char *target_parse_pr_out_transport_id (struct se_portal_group *tpg, -char *buf,u32 *out_tid_len,char **port_nexus_ptr) +bool target_parse_pr_out_transport_id (struct se_portal_group *tpg, +char *buf,u32 *out_tid_len,char **port_nexus_ptr,char *i_str) { -u32 offset; -switch (tpg->proto_id) {case SCSI_PROTOCOL_SAS :/* * Assume the FORMAT CODE 00b from spc4r17, 7.5.4.7 TransportID * for initiator ports using SCSI over SAS Serial SCSI Protocol. */ - offset =4 ; +sas_parse_pr_out_transport_id (buf, i_str);break ; -case SCSI_PROTOCOL_SBP :case SCSI_PROTOCOL_SRP : +srp_parse_pr_out_transport_id (buf, i_str); +break ;case SCSI_PROTOCOL_FCP : - offset =8 ; +fcp_parse_pr_out_transport_id (buf, i_str); +break ; +case SCSI_PROTOCOL_SBP : +sbp_parse_pr_out_transport_id (buf, i_str);break ;case SCSI_PROTOCOL_ISCSI :return iscsi_parse_pr_out_transport_id (tpg, buf, out_tid_len, - port_nexus_ptr); + port_nexus_ptr, i_str);default :pr_err ("Unknown proto_id: 0x%02x\n" , tpg->proto_id); -return NULL ; +return false; } *port_nexus_ptr =NULL ; *out_tid_len =24 ; -return buf + offset; +return true; }
drivers/target/target_core_internal.h +2 -2
@@ -103,8 +103,8 @@ int target_get_pr_transport_id_len(struct se_node_acl *nacl,int target_get_pr_transport_id (struct se_node_acl *nacl,struct t10_pr_registration *pr_reg,int *format_code,unsigned char *buf); -const char *target_parse_pr_out_transport_id (struct se_portal_group *tpg, -char *buf,u32 *out_tid_len,char **port_nexus_ptr); +bool target_parse_pr_out_transport_id (struct se_portal_group *tpg, +char *buf,u32 *out_tid_len,char **port_nexus_ptr,char *i_str);/* target_core_hba.c */ struct se_hba *core_alloc_hba (const char *,u32 ,u32 );
drivers/target/target_core_pr.c +10 -8
@@ -1477,11 +1477,12 @@ core_scsi3_decode_spec_i_port(LIST_HEAD (tid_dest_list);struct pr_transport_id_holder *tidh_new, *tidh, *tidh_tmp;unsigned char *buf, *ptr, proto_ident; -const unsigned char *i_str =NULL ; +unsigned char i_str[TRANSPORT_IQN_LEN ];char *iport_ptr =NULL , i_buf[PR_REG_ISID_ID_LEN ];sense_reason_t ret;u32 tpdl, tid_len =0 ;u32 dest_rtpi =0 ; +bool tid_found;/* * Allocate a struct pr_transport_id_holder and setup the
@@ -1570,9 +1571,9 @@ core_scsi3_decode_spec_i_port( dest_rtpi = tmp_lun->lun_tpg->tpg_rtpi; iport_ptr =NULL ; - i_str =target_parse_pr_out_transport_id (tmp_tpg, - ptr, &tid_len, &iport_ptr); -if (!i_str) + tid_found =target_parse_pr_out_transport_id (tmp_tpg, + ptr, &tid_len, &iport_ptr, i_str); +if (!tid_found)continue ;/* * Determine if this SCSI device server requires that
@@ -3152,13 +3153,14 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key,struct t10_pr_registration *pr_reg, *pr_res_holder, *dest_pr_reg;struct t10_reservation *pr_tmpl = &dev->t10_pr;unsigned char *buf; -const unsigned char *initiator_str; +unsigned char initiator_str[TRANSPORT_IQN_LEN ];char *iport_ptr =NULL , i_buf[PR_REG_ISID_ID_LEN ] = { };u32 tid_len, tmp_tid_len;int new_reg =0 , type, scope, matching_iname;sense_reason_t ret;unsigned short rtpi;unsigned char proto_ident; +bool tid_found;if (!se_sess || !se_lun) {pr_err ("SPC-3 PR: se_sess || struct se_lun is NULL!\n" );
@@ -3277,9 +3279,9 @@ core_scsi3_emulate_pro_register_and_move(struct se_cmd *cmd, u64 res_key, ret =TCM_INVALID_PARAMETER_LIST ; goto out; } - initiator_str =target_parse_pr_out_transport_id (dest_se_tpg, - &buf[24 ], &tmp_tid_len, &iport_ptr); -if (!initiator_str) { + tid_found =target_parse_pr_out_transport_id (dest_se_tpg, + &buf[24 ], &tmp_tid_len, &iport_ptr, initiator_str); +if (!tid_found) {pr_err ("SPC-3 PR REGISTER_AND_MOVE: Unable to locate" " initiator_str from Transport ID\n" ); ret =TCM_INVALID_PARAMETER_LIST ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 279/587 scsi: aacraid: Stop using PCI_IRQ_AFFINITY
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Garry <[email protected]>
[ Upstream commit dafeaf2c03e71255438ffe5a341d94d180e6c88e ]
When PCI_IRQ_AFFINITY is set for calling pci_alloc_irq_vectors(), it means interrupts are spread around the available CPUs. It also means that the interrupts become managed, which means that an interrupt is shutdown when all the CPUs in the interrupt affinity mask go offline.
Using managed interrupts in this way means that we should ensure that completions should not occur on HW queues where the associated interrupt is shutdown. This is typically achieved by ensuring only CPUs which are online can generate IO completion traffic to the HW queue which they are mapped to (so that they can also serve completion interrupts for that HW queue).
The problem in the driver is that a CPU can generate completions to a HW queue whose interrupt may be shutdown, as the CPUs in the HW queue interrupt affinity mask may be offline. This can cause IOs to never complete and hang the system. The driver maintains its own CPU <-> HW queue mapping for submissions, see aac_fib_vector_assign(), but this does not reflect the CPU <-> HW queue interrupt affinity mapping.
Commit 9dc704dcc09e ("scsi: aacraid: Reply queue mapping to CPUs based on IRQ affinity") tried to remedy this issue may mapping CPUs properly to HW queue interrupts. However this was later reverted in commit c5becf57dd56 ("Revert "scsi: aacraid: Reply queue mapping to CPUs based on IRQ affinity") - it seems that there were other reports of hangs. I guess that this was due to some implementation issue in the original commit or maybe a HW issue.
Fix the very original hang by just not using managed interrupts by not setting PCI_IRQ_AFFINITY. In this way, all CPUs will be in each HW queue affinity mask, so should not create completion problems if any CPUs go offline.
--- drivers/scsi/aacraid/comminit.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/scsi/aacraid/comminit.c +1 -2
@@ -481,8 +481,7 @@ void aac_define_int_mode(struct aac_dev *dev) pci_find_capability(dev->pdev, PCI_CAP_ID_MSIX)) { min_msix =2 ; i =pci_alloc_irq_vectors (dev->pdev, - min_msix, msi_count, -PCI_IRQ_MSIX |PCI_IRQ_AFFINITY ); + min_msix, msi_count,PCI_IRQ_MSIX );if (i >0 ) { dev->msi_enabled =1 ; msi_count = i;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 280/587 vfio/mlx5: fix possible overflow in tracking max message size
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Artem Sadovnikov <[email protected]>
[ Upstream commit b3060198483bac43ec113c62ae3837076f61f5de ]
MLX cap pg_track_log_max_msg_size consists of 5 bits, value of which is used as power of 2 for max_msg_size. This can lead to multiplication overflow between max_msg_size (u32) and integer constant, and afterwards incorrect value is being written to rq_size.
Fix this issue by extending integer constant to u64 type.
Found by Linux Verification Center (linuxtesting.org) with SVACE.
--- drivers/vfio/pci/mlx5/cmd.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/vfio/pci/mlx5/cmd.c +2 -2
@@ -1389,8 +1389,8 @@ int mlx5vf_start_page_tracker(struct vfio_device *vdev, log_max_msg_size =MLX5_CAP_ADV_VIRTUALIZATION (mdev, pg_track_log_max_msg_size); max_msg_size = (1ULL << log_max_msg_size);/* The RQ must hold at least 4 WQEs/messages for successful QP creation */ -if (rq_size <4 * max_msg_size) - rq_size =4 * max_msg_size; +if (rq_size <4ULL * max_msg_size) + rq_size =4ULL * max_msg_size;memset (tracker,0 ,sizeof (*tracker)); tracker->uar =mlx5_get_uars_page (mdev);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 281/587 ipmi: Use dev_warn_ratelimited() for incorrect message warnings
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Breno Leitao <[email protected]>
[ Upstream commit ec50ec378e3fd83bde9b3d622ceac3509a60b6b5 ]
During BMC firmware upgrades on live systems, the ipmi_msghandler generates excessive "BMC returned incorrect response" warnings while the BMC is temporarily offline. This can flood system logs in large deployments.
Replace dev_warn() with dev_warn_ratelimited() to throttle these warnings and prevent log spam during BMC maintenance operations.
Message-ID: <[email protected]>
--- drivers/char/ipmi/ipmi_msghandler.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/char/ipmi/ipmi_msghandler.c +4 -4
@@ -4618,10 +4618,10 @@ static int handle_one_recv_msg(struct ipmi_smi *intf,* The NetFN and Command in the response is not even * marginally correct. */ -dev_warn (intf->si_dev, -"BMC returned incorrect response, expected netfn %x cmd %x, got netfn %x cmd %x\n" , - (msg->data[0 ] >>2 ) |1 , msg->data[1 ], - msg->rsp[0 ] >>2 , msg->rsp[1 ]); +dev_warn_ratelimited (intf->si_dev, +"BMC returned incorrect response, expected netfn %x cmd %x, got netfn %x cmd %x\n" , + (msg->data[0 ] >>2 ) |1 , msg->data[1 ], + msg->rsp[0 ] >>2 , msg->rsp[1 ]); goto return_unspecified; }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 282/587 kconfig: gconf: avoid hardcoding model2 in on_treeview2_cursor_changed()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit cae9cdbcd9af044810bcceeb43a87accca47c71d ]
The on_treeview2_cursor_changed() handler is connected to both the left and right tree views, but it hardcodes model2 (the GtkTreeModel of the right tree view). This is incorrect. Get the associated model from the view.
--- scripts/kconfig/gconf.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
scripts/kconfig/gconf.c +3 -2
@@ -974,13 +974,14 @@ on_treeview2_key_press_event(GtkWidget * widget,void on_treeview2_cursor_changed (GtkTreeView * treeview,gpointer user_data) { +GtkTreeModel *model =gtk_tree_view_get_model (treeview);GtkTreeSelection *selection;GtkTreeIter iter;struct menu *menu; selection =gtk_tree_view_get_selection (treeview); -if (gtk_tree_selection_get_selected (selection, &model2, &iter)) { -gtk_tree_model_get (model2, &iter,COL_MENU , &menu,-1 ); +if (gtk_tree_selection_get_selected (selection, &model, &iter)) { +gtk_tree_model_get (model, &iter,COL_MENU , &menu,-1 );text_insert_help (menu); } }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 283/587 kconfig: gconf: fix potential memory leak in renderer_edited()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Masahiro Yamada <[email protected]>
[ Upstream commit f72ed4c6a375e52a3f4b75615e4a89d29d8acea7 ]
If gtk_tree_model_get_iter() fails, gtk_tree_path_free() is not called.
--- scripts/kconfig/gconf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
scripts/kconfig/gconf.c +2 -1
@@ -780,7 +780,7 @@ static void renderer_edited(GtkCellRendererText * cell,struct symbol *sym;if (!gtk_tree_model_get_iter (model2, &iter, path)) -return ; + goto free;gtk_tree_model_get (model2, &iter,COL_MENU , &menu,-1 ); sym = menu->sym;
@@ -792,6 +792,7 @@ static void renderer_edited(GtkCellRendererText * cell,update_tree (&rootmenu,NULL ); +free:gtk_tree_path_free (path); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 284/587 kconfig: lxdialog: fix space to (de)select options
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yann E. MORIN <[email protected]>
[ Upstream commit 694174f94ebeeb5ec5cc0e9de9b40c82057e1d95 ]
In case a menu has comment without letters/numbers (eg. characters matching the regexp '^[^[:alpha:][:digit:]]+$', for example - or *), hitting space will cycle through those comments, rather than selecting/deselecting the currently-highlighted option.
This is the behaviour of hitting any letter/digit: jump to the next option which prompt starts with that letter. The only letters that do not behave as such are 'y' 'm' and 'n'. Prompts that start with one of those three letters are instead matched on the first letter that is not 'y', 'm' or 'n'.
Fix that by treating 'space' as we treat y/m/n, ie. as an action key, not as shortcut to jump to prompt.
--- scripts/kconfig/lxdialog/menubox.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/kconfig/lxdialog/menubox.c +1 -1
@@ -264,7 +264,7 @@ int dialog_menu(const char *title, const char *prompt,if (key <256 &&isalpha (key)) key =tolower (key); -if (strchr ("ynmh" , key)) +if (strchr ("ynmh " , key)) i = max_choice;else {for (i = choice +1 ; i < max_choice; i++) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 285/587 ipmi: Fix strcpy source and destination the same
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Corey Minyard <[email protected]>
[ Upstream commit 8ffcb7560b4a15faf821df95e3ab532b2b020f8c ]
The source and destination of some strcpy operations was the same. Split out the part of the operations that needed to be done for those particular calls so the unnecessary copy wasn't done.
--- drivers/char/ipmi/ipmi_watchdog.c | 59 ++++++++++++++++++++++--------- 1 file changed, 42 insertions(+), 17 deletions(-)
drivers/char/ipmi/ipmi_watchdog.c +42 -17
@@ -1190,14 +1190,8 @@ static struct ipmi_smi_watcher smi_watcher = { .smi_gone = ipmi_smi_gone }; -static int action_op (const char *inval,char *outval) +static int action_op_set_val (const char *inval) { -if (outval) -strcpy (outval, action); - -if (!inval) -return 0 ; -if (strcmp (inval,"reset" ) ==0 ) action_val =WDOG_TIMEOUT_RESET ;else if (strcmp (inval,"none" ) ==0 )
@@ -1208,18 +1202,26 @@ static int action_op(const char *inval, char *outval) action_val =WDOG_TIMEOUT_POWER_DOWN ; else return -EINVAL; -strcpy (action, inval);return 0 ; } -static int preaction_op (const char *inval,char *outval) +static int action_op (const char *inval,char *outval) { +int rv; +if (outval) -strcpy (outval, preaction); +strcpy (outval, action);if (!inval)return 0 ; + rv =action_op_set_val (inval); +if (!rv) +strcpy (action, inval); +return rv; +} +static int preaction_op_set_val (const char *inval) +{if (strcmp (inval,"pre_none" ) ==0 ) preaction_val =WDOG_PRETIMEOUT_NONE ;else if (strcmp (inval,"pre_smi" ) ==0 )
@@ -1232,18 +1234,26 @@ static int preaction_op(const char *inval, char *outval) preaction_val =WDOG_PRETIMEOUT_MSG_INT ; else return -EINVAL; -strcpy (preaction, inval);return 0 ; } -static int preop_op (const char *inval,char *outval) +static int preaction_op (const char *inval,char *outval) { +int rv; +if (outval) -strcpy (outval, preop); +strcpy (outval, preaction);if (!inval)return 0 ; + rv =preaction_op_set_val (inval); +if (!rv) +strcpy (preaction, inval); +return 0 ; +} +static int preop_op_set_val (const char *inval) +{if (strcmp (inval,"preop_none" ) ==0 ) preop_val =WDOG_PREOP_NONE ;else if (strcmp (inval,"preop_panic" ) ==0 )
@@ -1252,7 +1262,22 @@ static int preop_op(const char *inval, char *outval) preop_val =WDOG_PREOP_GIVE_DATA ; else return -EINVAL; -strcpy (preop, inval); +return 0 ; +} + +static int preop_op (const char *inval,char *outval) +{ +int rv; + +if (outval) +strcpy (outval, preop); + +if (!inval) +return 0 ; + + rv =preop_op_set_val (inval); +if (!rv) +strcpy (preop, inval);return 0 ; }
@@ -1289,18 +1314,18 @@ static int __init ipmi_wdog_init(void) {int rv; -if (action_op (action,NULL )) { +if (action_op_set_val (action)) {action_op ("reset" ,NULL );pr_info ("Unknown action '%s', defaulting to reset\n" , action); } -if (preaction_op (preaction,NULL )) { +if (preaction_op_set_val (preaction)) {preaction_op ("pre_none" ,NULL );pr_info ("Unknown preaction '%s', defaulting to none\n" , preaction); } -if (preop_op (preop,NULL )) { +if (preop_op_set_val (preop)) {preop_op ("preop_none" ,NULL );pr_info ("Unknown preop '%s', defaulting to none\n" , preop); }
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 286/587 net: phy: smsc: add proper reset flags for LAN8710A
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Buday Csaba <[email protected]>
[ Upstream commit 57ec5a8735dc5dccd1ee68afdb1114956a3fce0d ]
According to the LAN8710A datasheet (Rev. B, section 3.8.5.1), a hardware reset is required after power-on, and the reference clock (REF_CLK) must be established before asserting reset.
--- drivers/net/phy/smsc.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/phy/smsc.c +1 -0
@@ -786,6 +786,7 @@ static struct phy_driver smsc_phy_driver[] = {/* PHY_BASIC_FEATURES */ + .flags = PHY_RST_AFTER_CLK_EN, .probe = smsc_phy_probe,/* basic functions */
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 287/587 ASoC: Intel: avs: Fix uninitialized pointer error in probe()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Cezary Rojewski <[email protected]>
[ Upstream commit 11f74f48c14c1f4fe16541900ea5944c42e30ccf ]
If pcim_request_all_regions() fails, error path operates on uninitialized 'bus' pointer. Found out by Coverity static analyzer.
--- sound/soc/intel/avs/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/intel/avs/core.c +2 -1
@@ -415,6 +415,8 @@ static int avs_pci_probe(struct pci_dev *pci, const struct pci_device_id *id) adev =devm_kzalloc (dev,sizeof (*adev),GFP_KERNEL );if (!adev)return -ENOMEM ; + bus = &adev->base.core; + ret =avs_bus_init (adev, pci, id);if (ret <0 ) {dev_err (dev,"failed to init avs bus: %d\n" , ret);
@@ -425,7 +427,6 @@ static int avs_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)if (ret <0 )return ret; - bus = &adev->base.core; bus->addr =pci_resource_start (pci,0 ); bus->remap_addr =pci_ioremap_bar (pci,0 );if (!bus->remap_addr) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 288/587 block: avoid possible overflow for chunk_sectors check in blk_stack_limits()
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: John Garry <[email protected]>
[ Upstream commit 448dfecc7ff807822ecd47a5c052acedca7d09e8 ]
In blk_stack_limits(), we check that the t->chunk_sectors value is a multiple of the t->physical_block_size value.
However, by finding the chunk_sectors value in bytes, we may overflow the unsigned int which holds chunk_sectors, so change the check to be based on sectors.
--- block/blk-settings.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
block/blk-settings.c +1 -1
@@ -634,7 +634,7 @@ int blk_stack_limits(struct queue_limits *t, struct queue_limits *b, }/* chunk_sectors a multiple of the physical block size? */ -if ((t->chunk_sectors <<9 ) & (t->physical_block_size -1 )) { +if (t->chunk_sectors % (t->physical_block_size >>SECTOR_SHIFT )) { t->chunk_sectors =0 ; t->misaligned =1 ; ret =-1 ;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 289/587 pNFS: Fix stripe mapping in block/scsi layout
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Bashirov <[email protected]>
[ Upstream commit 81438498a285759f31e843ac4800f82a5ce6521f ]
Because of integer division, we need to carefully calculate the disk offset. Consider the example below for a stripe of 6 volumes, a chunk size of 4096, and an offset of 70000.
chunk = div_u64(offset, dev->chunk_size) = 70000 / 4096 = 17 offset = chunk * dev->chunk_size = 17 * 4096 = 69632 disk_offset_wrong = div_u64(offset, dev->nr_children) = 69632 / 6 = 11605 disk_chunk = div_u64(chunk, dev->nr_children) = 17 / 6 = 2 disk_offset = disk_chunk * dev->chunk_size = 2 * 4096 = 8192
--- fs/nfs/blocklayout/dev.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
fs/nfs/blocklayout/dev.c +3 -2
@@ -199,10 +199,11 @@ static bool bl_map_stripe(struct pnfs_block_dev *dev, u64 offset,struct pnfs_block_dev *child;u64 chunk;u32 chunk_idx; +u64 disk_chunk;u64 disk_offset; chunk =div_u64 (offset, dev->chunk_size); -div_u64_rem (chunk, dev->nr_children, &chunk_idx); + disk_chunk =div_u64_rem (chunk, dev->nr_children, &chunk_idx);if (chunk_idx >= dev->nr_children) { dprintk("%s: invalid chunk idx %d (%lld/%lld)\n",
@@ -215,7 +216,7 @@ static bool bl_map_stripe(struct pnfs_block_dev *dev, u64 offset, offset = chunk * dev->chunk_size;/* disk offset of the stripe */ - disk_offset =div_u64 (offset, dev->nr_children); + disk_offset = disk_chunk * dev->chunk_size; child = &dev->children[chunk_idx]; child->map (child, disk_offset, map);
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 290/587 pNFS: Fix disk addr range check in block/scsi layout
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Bashirov <[email protected]>
[ Upstream commit 7db6e66663681abda54f81d5916db3a3b8b1a13d ]
At the end of the isect translation, disc_addr represents the physical disk offset. Thus, end calculated from disk_addr is also a physical disk offset. Therefore, range checking should be done using map->disk_offset, not map->start.
--- fs/nfs/blocklayout/blocklayout.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
fs/nfs/blocklayout/blocklayout.c +2 -2
@@ -149,8 +149,8 @@ do_add_page_to_bio(struct bio *bio, int npg, enum req_op op, sector_t isect,/* limit length to what the device mapping allows */ end = disk_addr + *len; -if (end >= map->start + map->len) - *len = map->start + map->len - disk_addr; +if (end >= map->disk_offset + map->len) + *len = map->disk_offset + map->len - disk_addr; retry:if (!bio) {
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 291/587 pNFS: Handle RPC size limit for layoutcommits
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Bashirov <[email protected]>
[ Upstream commit d897d81671bc4615c80f4f3bd5e6b218f59df50c ]
When there are too many block extents for a layoutcommit, they may not all fit into the maximum-sized RPC. This patch allows the generic pnfs code to properly handle -ENOSPC returned by the block/scsi layout driver and trigger additional layoutcommits if necessary.
--- fs/nfs/pnfs.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
fs/nfs/pnfs.c +8 -3
@@ -3216,6 +3216,7 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)struct nfs_inode *nfsi =NFS_I (inode);loff_t end_pos;int status; +bool mark_as_dirty = false;if (!pnfs_layoutcommit_outstanding (inode))return 0 ;
@@ -3267,19 +3268,23 @@ pnfs_layoutcommit_inode(struct inode *inode, bool sync)if (ld->prepare_layoutcommit) { status = ld->prepare_layoutcommit (&data->args);if (status) { -put_cred (data->cred); +if (status != -ENOSPC ) +put_cred (data->cred);spin_lock (&inode->i_lock);set_bit (NFS_INO_LAYOUTCOMMIT , &nfsi->flags);if (end_pos > nfsi->layout->plh_lwb) nfsi->layout->plh_lwb = end_pos; - goto out_unlock; +if (status != -ENOSPC ) + goto out_unlock; +spin_unlock (&inode->i_lock); + mark_as_dirty = true; } } status =nfs4_proc_layoutcommit (data, sync); out: -if (status) +if (status || mark_as_dirty)mark_inode_dirty_sync (inode);dprintk ("<-- %s status %d\n" , __func__, status);return status;
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 292/587 pNFS: Fix uninited ptr deref in block/scsi layout
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sergey Bashirov <[email protected]>
[ Upstream commit 9768797c219326699778fba9cd3b607b2f1e7950 ]
The error occurs on the third attempt to encode extents. When function ext_tree_prepare_commit() reallocates a larger buffer to retry encoding extents, the "layoutupdate_pages" page array is initialized only after the retry loop. But ext_tree_free_commitdata() is called on every iteration and tries to put pages in the array, thus dereferencing uninitialized pointers.
An additional problem is that there is no limit on the maximum possible buffer_size. When there are too many extents, the client may create a layoutcommit that is larger than the maximum possible RPC size accepted by the server.
During testing, we observed two typical scenarios. First, one memory page for extents is enough when we work with small files, append data to the end of the file, or preallocate extents before writing. But when we fill a new large file without preallocating, the number of extents can be huge, and counting the number of written extents in ext_tree_encode_commit() does not help much. Since this number increases even more between unlocking and locking of ext_tree, the reallocated buffer may not be large enough again and again.
--- fs/nfs/blocklayout/extent_tree.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-)
fs/nfs/blocklayout/extent_tree.c +15 -5
@@ -552,6 +552,15 @@ static int ext_tree_encode_commit(struct pnfs_block_layout *bl, __be32 *p,return ret; } +/** +* ext_tree_prepare_commit - encode extents that need to be committed +* @arg: layout commit data +* +* Return values: +* %0: Success, all required extents are encoded +* %-ENOSPC: Some extents are encoded, but not all, due to RPC size limit +* %-ENOMEM: Out of memory, extents not encoded +*/ int ext_tree_prepare_commit (struct nfs4_layoutcommit_args *arg) {
@@ -568,12 +577,12 @@ ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg) start_p =page_address (arg->layoutupdate_page); arg->layoutupdate_pages = &arg->layoutupdate_page; -retry: - ret =ext_tree_encode_commit (bl, start_p +1 , buffer_size, &count, &arg->lastbytewritten); + ret =ext_tree_encode_commit (bl, start_p +1 , buffer_size, + &count, &arg->lastbytewritten);if (unlikely (ret)) {ext_tree_free_commitdata (arg, buffer_size); - buffer_size =ext_tree_layoutupdate_size (bl, count); + buffer_size =NFS_SERVER (arg->inode)->wsize; count =0 ; arg->layoutupdate_pages =
@@ -588,7 +597,8 @@ ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg)return -ENOMEM ; } - goto retry; + ret =ext_tree_encode_commit (bl, start_p +1 , buffer_size, + &count, &arg->lastbytewritten); } *start_p =cpu_to_be32 (count);
@@ -608,7 +618,7 @@ ext_tree_prepare_commit(struct nfs4_layoutcommit_args *arg) }dprintk ("%s found %zu ranges\n" , __func__, count); -return 0 ; +return ret; }void
Signature · 1 line
2.39.5
Greg Kroah-Hartman
maintainerPATCH 293/587 rtc: ds1307: remove clear of oscillator stop flag (OSF) in probe
In reply to Greg Kroah-Hartman6.6-stable review patch. If anyone has any objections, please let me know.
------------------
From: Meagan Lloyd <[email protected]>
[ Upstream commit 48458654659c9c2e149c211d86637f1592470da5 ]
In using CONFIG_RTC_HCTOSYS, rtc_hctosys() will sync the RTC time to the kernel time as long as rtc_read_time() succeeds. In some power loss situations, our supercapacitor-backed DS1342 RTC comes up with either an unpredictable future time or the default 01/01/00 from the datasheet. The oscillator stop flag (OSF) is set in these scenarios due to the power loss and can be used to determine the validity of the RTC data.
Some chip types in the ds1307 driver already have OSF handling to determine whether .read_time provides valid RTC data or returns -EINVAL.
This change removes the clear of the OSF in .probe as the OSF needs to be preserved to expand the OSF handling to the ds1341 chip type (note that DS1341 and DS1342 share a datasheet).
--- drivers/rtc/rtc-ds1307.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/rtc/rtc-ds1307.c +1 -3
@@ -1819,10 +1819,8 @@ static int ds1307_probe(struct i2c_client *client)regmap_write (ds1307->regmap,DS1337_REG_CONTROL , regs[0 ]); -/* oscillator fault? clear flag, and warn */ +/* oscillator fault? warn */ if (regs[1 ] &DS1337_BIT_OSF ) { -regmap_write (ds1307->regmap,DS1337_REG_STATUS , - regs[1 ] & ~DS1337_BIT_OSF );dev_warn (ds1307->dev,"SET TIME!\n" ); }break ;
Signature · 1 line
2.39.5