From: Sasha Levin Date: Tue, 30 Mar 2021 21:59:19 +0000 (-0400) Subject: Fixes for 5.11 X-Git-Tag: v4.4.265~74 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bdf47790c6f8283aba19a1527bf6df1fc2d9035e;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.11 Signed-off-by: Sasha Levin --- diff --git a/queue-5.11/asoc-cs42l42-always-wait-at-least-3ms-after-reset.patch b/queue-5.11/asoc-cs42l42-always-wait-at-least-3ms-after-reset.patch new file mode 100644 index 00000000000..de465f825cf --- /dev/null +++ b/queue-5.11/asoc-cs42l42-always-wait-at-least-3ms-after-reset.patch @@ -0,0 +1,57 @@ +From 6e68f5c9bd23f061a1db47c19c8c0d54d7587702 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Mar 2021 17:34:32 +0000 +Subject: ASoC: cs42l42: Always wait at least 3ms after reset + +From: Lucas Tanure + +[ Upstream commit 19325cfea04446bc79b36bffd4978af15f46a00e ] + +This delay is part of the power-up sequence defined in the datasheet. +A runtime_resume is a power-up so must also include the delay. + +Signed-off-by: Lucas Tanure +Link: https://lore.kernel.org/r/20210305173442.195740-6-tanureal@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cs42l42.c | 3 ++- + sound/soc/codecs/cs42l42.h | 1 + + 2 files changed, 3 insertions(+), 1 deletion(-) + +diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c +index d5078ce79fad..4d82d24c7828 100644 +--- a/sound/soc/codecs/cs42l42.c ++++ b/sound/soc/codecs/cs42l42.c +@@ -1794,7 +1794,7 @@ static int cs42l42_i2c_probe(struct i2c_client *i2c_client, + dev_dbg(&i2c_client->dev, "Found reset GPIO\n"); + gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); + } +- mdelay(3); ++ usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2); + + /* Request IRQ */ + ret = devm_request_threaded_irq(&i2c_client->dev, +@@ -1919,6 +1919,7 @@ static int cs42l42_runtime_resume(struct device *dev) + } + + gpiod_set_value_cansleep(cs42l42->reset_gpio, 1); ++ usleep_range(CS42L42_BOOT_TIME_US, CS42L42_BOOT_TIME_US * 2); + + regcache_cache_only(cs42l42->regmap, false); + regcache_sync(cs42l42->regmap); +diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h +index 9b017b76828a..866d7c873e3c 100644 +--- a/sound/soc/codecs/cs42l42.h ++++ b/sound/soc/codecs/cs42l42.h +@@ -740,6 +740,7 @@ + #define CS42L42_FRAC2_VAL(val) (((val) & 0xff0000) >> 16) + + #define CS42L42_NUM_SUPPLIES 5 ++#define CS42L42_BOOT_TIME_US 3000 + + static const char *const cs42l42_supply_names[CS42L42_NUM_SUPPLIES] = { + "VA", +-- +2.30.1 + diff --git a/queue-5.11/asoc-cs42l42-fix-bitclock-polarity-inversion.patch b/queue-5.11/asoc-cs42l42-fix-bitclock-polarity-inversion.patch new file mode 100644 index 00000000000..5d6657a18bd --- /dev/null +++ b/queue-5.11/asoc-cs42l42-fix-bitclock-polarity-inversion.patch @@ -0,0 +1,87 @@ +From 8e231d5772b264fa30264af73ec19bbc91b0a98b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Mar 2021 17:34:28 +0000 +Subject: ASoC: cs42l42: Fix Bitclock polarity inversion + +From: Lucas Tanure + +[ Upstream commit e793c965519b8b7f2fea51a48398405e2a501729 ] + +The driver was setting bit clock polarity opposite to intended polarity. +Also simplify the code by grouping ADC and DAC clock configurations into +a single field. + +Signed-off-by: Lucas Tanure +Link: https://lore.kernel.org/r/20210305173442.195740-2-tanureal@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cs42l42.c | 20 ++++++++------------ + sound/soc/codecs/cs42l42.h | 11 ++++++----- + 2 files changed, 14 insertions(+), 17 deletions(-) + +diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c +index 210fcbedf241..df0d5fec0287 100644 +--- a/sound/soc/codecs/cs42l42.c ++++ b/sound/soc/codecs/cs42l42.c +@@ -797,27 +797,23 @@ static int cs42l42_set_dai_fmt(struct snd_soc_dai *codec_dai, unsigned int fmt) + /* Bitclock/frame inversion */ + switch (fmt & SND_SOC_DAIFMT_INV_MASK) { + case SND_SOC_DAIFMT_NB_NF: ++ asp_cfg_val |= CS42L42_ASP_SCPOL_NOR << CS42L42_ASP_SCPOL_SHIFT; + break; + case SND_SOC_DAIFMT_NB_IF: +- asp_cfg_val |= CS42L42_ASP_POL_INV << +- CS42L42_ASP_LCPOL_IN_SHIFT; ++ asp_cfg_val |= CS42L42_ASP_SCPOL_NOR << CS42L42_ASP_SCPOL_SHIFT; ++ asp_cfg_val |= CS42L42_ASP_LCPOL_INV << CS42L42_ASP_LCPOL_SHIFT; + break; + case SND_SOC_DAIFMT_IB_NF: +- asp_cfg_val |= CS42L42_ASP_POL_INV << +- CS42L42_ASP_SCPOL_IN_DAC_SHIFT; + break; + case SND_SOC_DAIFMT_IB_IF: +- asp_cfg_val |= CS42L42_ASP_POL_INV << +- CS42L42_ASP_LCPOL_IN_SHIFT; +- asp_cfg_val |= CS42L42_ASP_POL_INV << +- CS42L42_ASP_SCPOL_IN_DAC_SHIFT; ++ asp_cfg_val |= CS42L42_ASP_LCPOL_INV << CS42L42_ASP_LCPOL_SHIFT; + break; + } + +- snd_soc_component_update_bits(component, CS42L42_ASP_CLK_CFG, +- CS42L42_ASP_MODE_MASK | +- CS42L42_ASP_SCPOL_IN_DAC_MASK | +- CS42L42_ASP_LCPOL_IN_MASK, asp_cfg_val); ++ snd_soc_component_update_bits(component, CS42L42_ASP_CLK_CFG, CS42L42_ASP_MODE_MASK | ++ CS42L42_ASP_SCPOL_MASK | ++ CS42L42_ASP_LCPOL_MASK, ++ asp_cfg_val); + + return 0; + } +diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h +index 9e3cc528dcff..1f0d67c95a9a 100644 +--- a/sound/soc/codecs/cs42l42.h ++++ b/sound/soc/codecs/cs42l42.h +@@ -258,11 +258,12 @@ + #define CS42L42_ASP_SLAVE_MODE 0x00 + #define CS42L42_ASP_MODE_SHIFT 4 + #define CS42L42_ASP_MODE_MASK (1 << CS42L42_ASP_MODE_SHIFT) +-#define CS42L42_ASP_SCPOL_IN_DAC_SHIFT 2 +-#define CS42L42_ASP_SCPOL_IN_DAC_MASK (1 << CS42L42_ASP_SCPOL_IN_DAC_SHIFT) +-#define CS42L42_ASP_LCPOL_IN_SHIFT 0 +-#define CS42L42_ASP_LCPOL_IN_MASK (1 << CS42L42_ASP_LCPOL_IN_SHIFT) +-#define CS42L42_ASP_POL_INV 1 ++#define CS42L42_ASP_SCPOL_SHIFT 2 ++#define CS42L42_ASP_SCPOL_MASK (3 << CS42L42_ASP_SCPOL_SHIFT) ++#define CS42L42_ASP_SCPOL_NOR 3 ++#define CS42L42_ASP_LCPOL_SHIFT 0 ++#define CS42L42_ASP_LCPOL_MASK (3 << CS42L42_ASP_LCPOL_SHIFT) ++#define CS42L42_ASP_LCPOL_INV 3 + + #define CS42L42_ASP_FRM_CFG (CS42L42_PAGE_12 + 0x08) + #define CS42L42_ASP_STP_SHIFT 4 +-- +2.30.1 + diff --git a/queue-5.11/asoc-cs42l42-fix-channel-width-support.patch b/queue-5.11/asoc-cs42l42-fix-channel-width-support.patch new file mode 100644 index 00000000000..531eab4e964 --- /dev/null +++ b/queue-5.11/asoc-cs42l42-fix-channel-width-support.patch @@ -0,0 +1,112 @@ +From 296b970aa8f1c93e7336d7beab53204f93475c92 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Mar 2021 17:34:29 +0000 +Subject: ASoC: cs42l42: Fix channel width support + +From: Lucas Tanure + +[ Upstream commit 2bdc4f5c6838f7c3feb4fe68e4edbeea158ec0a2 ] + +Remove the hard coded 32 bits width and replace with the correct width +calculated by params_width. + +Signed-off-by: Lucas Tanure +Link: https://lore.kernel.org/r/20210305173442.195740-3-tanureal@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cs42l42.c | 47 ++++++++++++++++++-------------------- + sound/soc/codecs/cs42l42.h | 1 - + 2 files changed, 22 insertions(+), 26 deletions(-) + +diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c +index df0d5fec0287..4f9ad9547929 100644 +--- a/sound/soc/codecs/cs42l42.c ++++ b/sound/soc/codecs/cs42l42.c +@@ -691,24 +691,6 @@ static int cs42l42_pll_config(struct snd_soc_component *component) + CS42L42_CLK_OASRC_SEL_MASK, + CS42L42_CLK_OASRC_SEL_12 << + CS42L42_CLK_OASRC_SEL_SHIFT); +- /* channel 1 on low LRCLK, 32 bit */ +- snd_soc_component_update_bits(component, +- CS42L42_ASP_RX_DAI0_CH1_AP_RES, +- CS42L42_ASP_RX_CH_AP_MASK | +- CS42L42_ASP_RX_CH_RES_MASK, +- (CS42L42_ASP_RX_CH_AP_LOW << +- CS42L42_ASP_RX_CH_AP_SHIFT) | +- (CS42L42_ASP_RX_CH_RES_32 << +- CS42L42_ASP_RX_CH_RES_SHIFT)); +- /* Channel 2 on high LRCLK, 32 bit */ +- snd_soc_component_update_bits(component, +- CS42L42_ASP_RX_DAI0_CH2_AP_RES, +- CS42L42_ASP_RX_CH_AP_MASK | +- CS42L42_ASP_RX_CH_RES_MASK, +- (CS42L42_ASP_RX_CH_AP_HI << +- CS42L42_ASP_RX_CH_AP_SHIFT) | +- (CS42L42_ASP_RX_CH_RES_32 << +- CS42L42_ASP_RX_CH_RES_SHIFT)); + if (pll_ratio_table[i].mclk_src_sel == 0) { + /* Pass the clock straight through */ + snd_soc_component_update_bits(component, +@@ -824,14 +806,29 @@ static int cs42l42_pcm_hw_params(struct snd_pcm_substream *substream, + { + struct snd_soc_component *component = dai->component; + struct cs42l42_private *cs42l42 = snd_soc_component_get_drvdata(component); +- int retval; ++ unsigned int width = (params_width(params) / 8) - 1; ++ unsigned int val = 0; + + cs42l42->srate = params_rate(params); +- cs42l42->swidth = params_width(params); + +- retval = cs42l42_pll_config(component); ++ switch(substream->stream) { ++ case SNDRV_PCM_STREAM_PLAYBACK: ++ val |= width << CS42L42_ASP_RX_CH_RES_SHIFT; ++ /* channel 1 on low LRCLK */ ++ snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH1_AP_RES, ++ CS42L42_ASP_RX_CH_AP_MASK | ++ CS42L42_ASP_RX_CH_RES_MASK, val); ++ /* Channel 2 on high LRCLK */ ++ val |= CS42L42_ASP_RX_CH_AP_HI << CS42L42_ASP_RX_CH_AP_SHIFT; ++ snd_soc_component_update_bits(component, CS42L42_ASP_RX_DAI0_CH2_AP_RES, ++ CS42L42_ASP_RX_CH_AP_MASK | ++ CS42L42_ASP_RX_CH_RES_MASK, val); ++ break; ++ default: ++ break; ++ } + +- return retval; ++ return cs42l42_pll_config(component); + } + + static int cs42l42_set_sysclk(struct snd_soc_dai *dai, +@@ -896,9 +893,9 @@ static int cs42l42_mute(struct snd_soc_dai *dai, int mute, int direction) + return 0; + } + +-#define CS42L42_FORMATS (SNDRV_PCM_FMTBIT_S16_LE | SNDRV_PCM_FMTBIT_S18_3LE | \ +- SNDRV_PCM_FMTBIT_S20_3LE | SNDRV_PCM_FMTBIT_S24_LE | \ +- SNDRV_PCM_FMTBIT_S32_LE) ++#define CS42L42_FORMATS (SNDRV_PCM_FMTBIT_S16_LE |\ ++ SNDRV_PCM_FMTBIT_S24_LE |\ ++ SNDRV_PCM_FMTBIT_S32_LE ) + + + static const struct snd_soc_dai_ops cs42l42_ops = { +diff --git a/sound/soc/codecs/cs42l42.h b/sound/soc/codecs/cs42l42.h +index 1f0d67c95a9a..9b017b76828a 100644 +--- a/sound/soc/codecs/cs42l42.h ++++ b/sound/soc/codecs/cs42l42.h +@@ -757,7 +757,6 @@ struct cs42l42_private { + struct completion pdn_done; + u32 sclk; + u32 srate; +- u32 swidth; + u8 plug_state; + u8 hs_type; + u8 ts_inv; +-- +2.30.1 + diff --git a/queue-5.11/asoc-cs42l42-fix-mixer-volume-control.patch b/queue-5.11/asoc-cs42l42-fix-mixer-volume-control.patch new file mode 100644 index 00000000000..1cea9278a6b --- /dev/null +++ b/queue-5.11/asoc-cs42l42-fix-mixer-volume-control.patch @@ -0,0 +1,44 @@ +From 1adaf1102b30de5f1abece81c127d073d10a4a9d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Mar 2021 17:34:30 +0000 +Subject: ASoC: cs42l42: Fix mixer volume control + +From: Lucas Tanure + +[ Upstream commit 72d904763ae6a8576e7ad034f9da4f0e3c44bf24 ] + +The minimum value is 0x3f (-63dB), which also is mute + +Signed-off-by: Lucas Tanure +Link: https://lore.kernel.org/r/20210305173442.195740-4-tanureal@opensource.cirrus.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/cs42l42.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/codecs/cs42l42.c b/sound/soc/codecs/cs42l42.c +index 4f9ad9547929..d5078ce79fad 100644 +--- a/sound/soc/codecs/cs42l42.c ++++ b/sound/soc/codecs/cs42l42.c +@@ -401,7 +401,7 @@ static const struct regmap_config cs42l42_regmap = { + }; + + static DECLARE_TLV_DB_SCALE(adc_tlv, -9600, 100, false); +-static DECLARE_TLV_DB_SCALE(mixer_tlv, -6200, 100, false); ++static DECLARE_TLV_DB_SCALE(mixer_tlv, -6300, 100, true); + + static const char * const cs42l42_hpf_freq_text[] = { + "1.86Hz", "120Hz", "235Hz", "466Hz" +@@ -458,7 +458,7 @@ static const struct snd_kcontrol_new cs42l42_snd_controls[] = { + CS42L42_DAC_HPF_EN_SHIFT, true, false), + SOC_DOUBLE_R_TLV("Mixer Volume", CS42L42_MIXER_CHA_VOL, + CS42L42_MIXER_CHB_VOL, CS42L42_MIXER_CH_VOL_SHIFT, +- 0x3e, 1, mixer_tlv) ++ 0x3f, 1, mixer_tlv) + }; + + static int cs42l42_hpdrv_evt(struct snd_soc_dapm_widget *w, +-- +2.30.1 + diff --git a/queue-5.11/asoc-es8316-simplify-adc_pga_gain_tlv-table.patch b/queue-5.11/asoc-es8316-simplify-adc_pga_gain_tlv-table.patch new file mode 100644 index 00000000000..4d166d6b07a --- /dev/null +++ b/queue-5.11/asoc-es8316-simplify-adc_pga_gain_tlv-table.patch @@ -0,0 +1,48 @@ +From f62f3f862849c02fdc51888a66d4041aa8e1bbe3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 28 Feb 2021 17:04:41 +0100 +Subject: ASoC: es8316: Simplify adc_pga_gain_tlv table + +From: Hans de Goede + +[ Upstream commit bb18c678754ce1514100fb4c0bf6113b5af36c48 ] + +Most steps in this table are steps of 3dB (300 centi-dB), so we can +simplify the table. + +This not only reduces the amount of space it takes inside the kernel, +this also makes alsa-lib's mixer code actually accept the table, where +as before this change alsa-lib saw the "ADC PGA Gain" control as a +control without a dB scale. + +Signed-off-by: Hans de Goede +Link: https://lore.kernel.org/r/20210228160441.241110-1-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/es8316.c | 9 ++------- + 1 file changed, 2 insertions(+), 7 deletions(-) + +diff --git a/sound/soc/codecs/es8316.c b/sound/soc/codecs/es8316.c +index f9ec5cf82599..ec2f11ff8a84 100644 +--- a/sound/soc/codecs/es8316.c ++++ b/sound/soc/codecs/es8316.c +@@ -63,13 +63,8 @@ static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(adc_pga_gain_tlv, + 1, 1, TLV_DB_SCALE_ITEM(0, 0, 0), + 2, 2, TLV_DB_SCALE_ITEM(250, 0, 0), + 3, 3, TLV_DB_SCALE_ITEM(450, 0, 0), +- 4, 4, TLV_DB_SCALE_ITEM(700, 0, 0), +- 5, 5, TLV_DB_SCALE_ITEM(1000, 0, 0), +- 6, 6, TLV_DB_SCALE_ITEM(1300, 0, 0), +- 7, 7, TLV_DB_SCALE_ITEM(1600, 0, 0), +- 8, 8, TLV_DB_SCALE_ITEM(1800, 0, 0), +- 9, 9, TLV_DB_SCALE_ITEM(2100, 0, 0), +- 10, 10, TLV_DB_SCALE_ITEM(2400, 0, 0), ++ 4, 7, TLV_DB_SCALE_ITEM(700, 300, 0), ++ 8, 10, TLV_DB_SCALE_ITEM(1800, 300, 0), + ); + + static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpout_vol_tlv, +-- +2.30.1 + diff --git a/queue-5.11/asoc-mediatek-mt8192-fix-tdm-out-data-is-valid-on-ri.patch b/queue-5.11/asoc-mediatek-mt8192-fix-tdm-out-data-is-valid-on-ri.patch new file mode 100644 index 00000000000..00fbc51822f --- /dev/null +++ b/queue-5.11/asoc-mediatek-mt8192-fix-tdm-out-data-is-valid-on-ri.patch @@ -0,0 +1,64 @@ +From 1428a8315b8afe45d05fc9837512b63f2f60ba33 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Mar 2021 10:26:45 +0800 +Subject: ASoC: mediatek: mt8192: fix tdm out data is valid on rising edge + +From: Jiaxin Yu + +[ Upstream commit 8d06b9633a66f41fed520f6eebd163189518ba79 ] + +This patch correct tdm out bck inverse register to AUDIO_TOP_CON3[3]. + +Signed-off-by: Jiaxin Yu +Link: https://lore.kernel.org/r/1615516005-781-1-git-send-email-jiaxin.yu@mediatek.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/mediatek/mt8192/mt8192-dai-tdm.c | 4 +++- + sound/soc/mediatek/mt8192/mt8192-reg.h | 8 +++++--- + 2 files changed, 8 insertions(+), 4 deletions(-) + +diff --git a/sound/soc/mediatek/mt8192/mt8192-dai-tdm.c b/sound/soc/mediatek/mt8192/mt8192-dai-tdm.c +index 8383536b7ae0..504293de2c0d 100644 +--- a/sound/soc/mediatek/mt8192/mt8192-dai-tdm.c ++++ b/sound/soc/mediatek/mt8192/mt8192-dai-tdm.c +@@ -555,7 +555,9 @@ static int mtk_dai_tdm_hw_params(struct snd_pcm_substream *substream, + + /* set tdm */ + if (tdm_priv->bck_invert) +- tdm_con |= 1 << BCK_INVERSE_SFT; ++ regmap_update_bits(afe->regmap, AUDIO_TOP_CON3, ++ BCK_INVERSE_MASK_SFT, ++ 0x1 << BCK_INVERSE_SFT); + + if (tdm_priv->lck_invert) + tdm_con |= 1 << LRCK_INVERSE_SFT; +diff --git a/sound/soc/mediatek/mt8192/mt8192-reg.h b/sound/soc/mediatek/mt8192/mt8192-reg.h +index 562f25c79c34..b9fb80d4afec 100644 +--- a/sound/soc/mediatek/mt8192/mt8192-reg.h ++++ b/sound/soc/mediatek/mt8192/mt8192-reg.h +@@ -21,6 +21,11 @@ enum { + /***************************************************************************** + * R E G I S T E R D E F I N I T I O N + *****************************************************************************/ ++/* AUDIO_TOP_CON3 */ ++#define BCK_INVERSE_SFT 3 ++#define BCK_INVERSE_MASK 0x1 ++#define BCK_INVERSE_MASK_SFT (0x1 << 3) ++ + /* AFE_DAC_CON0 */ + #define VUL12_ON_SFT 31 + #define VUL12_ON_MASK 0x1 +@@ -2079,9 +2084,6 @@ enum { + #define TDM_EN_SFT 0 + #define TDM_EN_MASK 0x1 + #define TDM_EN_MASK_SFT (0x1 << 0) +-#define BCK_INVERSE_SFT 1 +-#define BCK_INVERSE_MASK 0x1 +-#define BCK_INVERSE_MASK_SFT (0x1 << 1) + #define LRCK_INVERSE_SFT 2 + #define LRCK_INVERSE_MASK 0x1 + #define LRCK_INVERSE_MASK_SFT (0x1 << 2) +-- +2.30.1 + diff --git a/queue-5.11/asoc-rt1015-fix-i2c-communication-error.patch b/queue-5.11/asoc-rt1015-fix-i2c-communication-error.patch new file mode 100644 index 00000000000..8e0ec2f81b6 --- /dev/null +++ b/queue-5.11/asoc-rt1015-fix-i2c-communication-error.patch @@ -0,0 +1,34 @@ +From fb1414e3342079bc4e7994504aebf3631abde683 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 22 Feb 2021 17:00:56 +0800 +Subject: ASoC: rt1015: fix i2c communication error + +From: Jack Yu + +[ Upstream commit 9e0bdaa9fcb8c64efc1487a7fba07722e7bc515e ] + +Remove 0x100 cache re-sync to solve i2c communication error. + +Signed-off-by: Jack Yu +Link: https://lore.kernel.org/r/20210222090057.29532-1-jack.yu@realtek.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/rt1015.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/sound/soc/codecs/rt1015.c b/sound/soc/codecs/rt1015.c +index 32e6bcf763d1..4607039a16e7 100644 +--- a/sound/soc/codecs/rt1015.c ++++ b/sound/soc/codecs/rt1015.c +@@ -209,6 +209,7 @@ static bool rt1015_volatile_register(struct device *dev, unsigned int reg) + case RT1015_VENDOR_ID: + case RT1015_DEVICE_ID: + case RT1015_PRO_ALT: ++ case RT1015_MAN_I2C: + case RT1015_DAC3: + case RT1015_VBAT_TEST_OUT1: + case RT1015_VBAT_TEST_OUT2: +-- +2.30.1 + diff --git a/queue-5.11/asoc-rt5640-fix-dac-and-adc-vol-tlv-values-being-off.patch b/queue-5.11/asoc-rt5640-fix-dac-and-adc-vol-tlv-values-being-off.patch new file mode 100644 index 00000000000..9b35e1c7346 --- /dev/null +++ b/queue-5.11/asoc-rt5640-fix-dac-and-adc-vol-tlv-values-being-off.patch @@ -0,0 +1,54 @@ +From 592dc7be14beb8ef5b77710b030b134cb7460f99 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Feb 2021 15:38:13 +0100 +Subject: ASoC: rt5640: Fix dac- and adc- vol-tlv values being off by a factor + of 10 + +From: Hans de Goede + +[ Upstream commit cfa26ed1f9f885c2fd8f53ca492989d1e16d0199 ] + +The adc_vol_tlv volume-control has a range from -17.625 dB to +30 dB, +not -176.25 dB to + 300 dB. This wrong scale is esp. a problem in userspace +apps which translate the dB scale to a linear scale. With the logarithmic +dB scale being of by a factor of 10 we loose all precision in the lower +area of the range when apps translate things to a linear scale. + +E.g. the 0 dB default, which corresponds with a value of 47 of the +0 - 127 range for the control, would be shown as 0/100 in alsa-mixer. + +Since the centi-dB values used in the TLV struct cannot represent the +0.375 dB step size used by these controls, change the TLV definition +for them to specify a min and max value instead of min + stepsize. + +Note this mirrors commit 3f31f7d9b540 ("ASoC: rt5670: Fix dac- and adc- +vol-tlv values being off by a factor of 10") which made the exact same +change to the rt5670 codec driver. + +Signed-off-by: Hans de Goede +Link: https://lore.kernel.org/r/20210226143817.84287-2-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/rt5640.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/codecs/rt5640.c b/sound/soc/codecs/rt5640.c +index 1414ad15d01c..a5674c227b3a 100644 +--- a/sound/soc/codecs/rt5640.c ++++ b/sound/soc/codecs/rt5640.c +@@ -339,9 +339,9 @@ static bool rt5640_readable_register(struct device *dev, unsigned int reg) + } + + static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); +-static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); ++static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0); + static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); +-static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); ++static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000); + static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); + + /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ +-- +2.30.1 + diff --git a/queue-5.11/asoc-rt5651-fix-dac-and-adc-vol-tlv-values-being-off.patch b/queue-5.11/asoc-rt5651-fix-dac-and-adc-vol-tlv-values-being-off.patch new file mode 100644 index 00000000000..4418575b05e --- /dev/null +++ b/queue-5.11/asoc-rt5651-fix-dac-and-adc-vol-tlv-values-being-off.patch @@ -0,0 +1,54 @@ +From 503e5af8a03aff42a04d19cb9222c6378fd3ccfa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 26 Feb 2021 15:38:14 +0100 +Subject: ASoC: rt5651: Fix dac- and adc- vol-tlv values being off by a factor + of 10 + +From: Hans de Goede + +[ Upstream commit eee51df776bd6cac10a76b2779a9fdee3f622b2b ] + +The adc_vol_tlv volume-control has a range from -17.625 dB to +30 dB, +not -176.25 dB to + 300 dB. This wrong scale is esp. a problem in userspace +apps which translate the dB scale to a linear scale. With the logarithmic +dB scale being of by a factor of 10 we loose all precision in the lower +area of the range when apps translate things to a linear scale. + +E.g. the 0 dB default, which corresponds with a value of 47 of the +0 - 127 range for the control, would be shown as 0/100 in alsa-mixer. + +Since the centi-dB values used in the TLV struct cannot represent the +0.375 dB step size used by these controls, change the TLV definition +for them to specify a min and max value instead of min + stepsize. + +Note this mirrors commit 3f31f7d9b540 ("ASoC: rt5670: Fix dac- and adc- +vol-tlv values being off by a factor of 10") which made the exact same +change to the rt5670 codec driver. + +Signed-off-by: Hans de Goede +Link: https://lore.kernel.org/r/20210226143817.84287-3-hdegoede@redhat.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/rt5651.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/sound/soc/codecs/rt5651.c b/sound/soc/codecs/rt5651.c +index d198e191fb0c..e59fdc81dbd4 100644 +--- a/sound/soc/codecs/rt5651.c ++++ b/sound/soc/codecs/rt5651.c +@@ -285,9 +285,9 @@ static bool rt5651_readable_register(struct device *dev, unsigned int reg) + } + + static const DECLARE_TLV_DB_SCALE(out_vol_tlv, -4650, 150, 0); +-static const DECLARE_TLV_DB_SCALE(dac_vol_tlv, -65625, 375, 0); ++static const DECLARE_TLV_DB_MINMAX(dac_vol_tlv, -6562, 0); + static const DECLARE_TLV_DB_SCALE(in_vol_tlv, -3450, 150, 0); +-static const DECLARE_TLV_DB_SCALE(adc_vol_tlv, -17625, 375, 0); ++static const DECLARE_TLV_DB_MINMAX(adc_vol_tlv, -1762, 3000); + static const DECLARE_TLV_DB_SCALE(adc_bst_tlv, 0, 1200, 0); + + /* {0, +20, +24, +30, +35, +40, +44, +50, +52} dB */ +-- +2.30.1 + diff --git a/queue-5.11/asoc-rt5659-update-mclk-rate-in-set_sysclk.patch b/queue-5.11/asoc-rt5659-update-mclk-rate-in-set_sysclk.patch new file mode 100644 index 00000000000..4f5ea0eafda --- /dev/null +++ b/queue-5.11/asoc-rt5659-update-mclk-rate-in-set_sysclk.patch @@ -0,0 +1,49 @@ +From e1ba9aac566e004c6cb4cee21eb6a9a8b34a8df5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Mar 2021 23:01:32 +0530 +Subject: ASoC: rt5659: Update MCLK rate in set_sysclk() + +From: Sameer Pujar + +[ Upstream commit dbf54a9534350d6aebbb34f5c1c606b81a4f35dd ] + +Simple-card/audio-graph-card drivers do not handle MCLK clock when it +is specified in the codec device node. The expectation here is that, +the codec should actually own up the MCLK clock and do necessary setup +in the driver. + +Suggested-by: Mark Brown +Suggested-by: Michael Walle +Signed-off-by: Sameer Pujar +Link: https://lore.kernel.org/r/1615829492-8972-3-git-send-email-spujar@nvidia.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/rt5659.c | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/sound/soc/codecs/rt5659.c b/sound/soc/codecs/rt5659.c +index 41e5917b16a5..91a4ef7f620c 100644 +--- a/sound/soc/codecs/rt5659.c ++++ b/sound/soc/codecs/rt5659.c +@@ -3426,12 +3426,17 @@ static int rt5659_set_component_sysclk(struct snd_soc_component *component, int + { + struct rt5659_priv *rt5659 = snd_soc_component_get_drvdata(component); + unsigned int reg_val = 0; ++ int ret; + + if (freq == rt5659->sysclk && clk_id == rt5659->sysclk_src) + return 0; + + switch (clk_id) { + case RT5659_SCLK_S_MCLK: ++ ret = clk_set_rate(rt5659->mclk, freq); ++ if (ret) ++ return ret; ++ + reg_val |= RT5659_SCLK_SRC_MCLK; + break; + case RT5659_SCLK_S_PLL1: +-- +2.30.1 + diff --git a/queue-5.11/asoc-rt711-add-snd_soc_component-remove-callback.patch b/queue-5.11/asoc-rt711-add-snd_soc_component-remove-callback.patch new file mode 100644 index 00000000000..3d85f90ac91 --- /dev/null +++ b/queue-5.11/asoc-rt711-add-snd_soc_component-remove-callback.patch @@ -0,0 +1,55 @@ +From 5deef700f906d6bfc52c8061e702ba4540703c9b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Mar 2021 08:52:54 +0800 +Subject: ASoC: rt711: add snd_soc_component remove callback + +From: Bard Liao + +[ Upstream commit 899b12542b0897f92de9ba30944937c39ebb246d ] + +We do some IO operations in the snd_soc_component_set_jack callback +function and snd_soc_component_set_jack() will be called when soc +component is removed. However, we should not access SoundWire registers +when the bus is suspended. +So set regcache_cache_only(regmap, true) to avoid accessing in the +soc component removal process. + +Signed-off-by: Bard Liao +Reviewed-by: Kai Vehmanen +Reviewed-by: Rander Wang +Link: https://lore.kernel.org/r/20210316005254.29699-1-yung-chuan.liao@linux.intel.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/rt711.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/sound/soc/codecs/rt711.c b/sound/soc/codecs/rt711.c +index 85f744184a60..047f4e677d78 100644 +--- a/sound/soc/codecs/rt711.c ++++ b/sound/soc/codecs/rt711.c +@@ -895,6 +895,13 @@ static int rt711_probe(struct snd_soc_component *component) + return 0; + } + ++static void rt711_remove(struct snd_soc_component *component) ++{ ++ struct rt711_priv *rt711 = snd_soc_component_get_drvdata(component); ++ ++ regcache_cache_only(rt711->regmap, true); ++} ++ + static const struct snd_soc_component_driver soc_codec_dev_rt711 = { + .probe = rt711_probe, + .set_bias_level = rt711_set_bias_level, +@@ -905,6 +912,7 @@ static const struct snd_soc_component_driver soc_codec_dev_rt711 = { + .dapm_routes = rt711_audio_map, + .num_dapm_routes = ARRAY_SIZE(rt711_audio_map), + .set_jack = rt711_set_jack_detect, ++ .remove = rt711_remove, + }; + + static int rt711_set_sdw_stream(struct snd_soc_dai *dai, void *sdw_stream, +-- +2.30.1 + diff --git a/queue-5.11/asoc-sgtl5000-set-dap_avc_ctrl-register-to-correct-d.patch b/queue-5.11/asoc-sgtl5000-set-dap_avc_ctrl-register-to-correct-d.patch new file mode 100644 index 00000000000..0817ec3b758 --- /dev/null +++ b/queue-5.11/asoc-sgtl5000-set-dap_avc_ctrl-register-to-correct-d.patch @@ -0,0 +1,72 @@ +From a875e0bcc99f5f723ec43560cd90d2a22c805220 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Feb 2021 13:33:08 -0500 +Subject: ASoC: sgtl5000: set DAP_AVC_CTRL register to correct default value on + probe + +From: Benjamin Rood + +[ Upstream commit f86f58e3594fb0ab1993d833d3b9a2496f3c928c ] + +According to the SGTL5000 datasheet [1], the DAP_AVC_CTRL register has +the following bit field definitions: + +| BITS | FIELD | RW | RESET | DEFINITION | +| 15 | RSVD | RO | 0x0 | Reserved | +| 14 | RSVD | RW | 0x1 | Reserved | +| 13:12 | MAX_GAIN | RW | 0x1 | Max Gain of AVC in expander mode | +| 11:10 | RSVD | RO | 0x0 | Reserved | +| 9:8 | LBI_RESP | RW | 0x1 | Integrator Response | +| 7:6 | RSVD | RO | 0x0 | Reserved | +| 5 | HARD_LMT_EN | RW | 0x0 | Enable hard limiter mode | +| 4:1 | RSVD | RO | 0x0 | Reserved | +| 0 | EN | RW | 0x0 | Enable/Disable AVC | + +The original default value written to the DAP_AVC_CTRL register during +sgtl5000_i2c_probe() was 0x0510. This would incorrectly write values to +bits 4 and 10, which are defined as RESERVED. It would also not set +bits 12 and 14 to their correct RESET values of 0x1, and instead set +them to 0x0. While the DAP_AVC module is effectively disabled because +the EN bit is 0, this default value is still writing invalid values to +registers that are marked as read-only and RESERVED as well as not +setting bits 12 and 14 to their correct default values as defined by the +datasheet. + +The correct value that should be written to the DAP_AVC_CTRL register is +0x5100, which configures the register bits to the default values defined +by the datasheet, and prevents any writes to bits defined as +'read-only'. Generally speaking, it is best practice to NOT attempt to +write values to registers/bits defined as RESERVED, as it generally +produces unwanted/undefined behavior, or errors. + +Also, all credit for this patch should go to my colleague Dan MacDonald + for finding this error in the first +place. + +[1] https://www.nxp.com/docs/en/data-sheet/SGTL5000.pdf + +Signed-off-by: Benjamin Rood +Reviewed-by: Fabio Estevam +Link: https://lore.kernel.org/r/20210219183308.GA2117@ubuntu-dev +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/codecs/sgtl5000.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/sound/soc/codecs/sgtl5000.c b/sound/soc/codecs/sgtl5000.c +index 4d6ff8114622..4c0e87e22b97 100644 +--- a/sound/soc/codecs/sgtl5000.c ++++ b/sound/soc/codecs/sgtl5000.c +@@ -71,7 +71,7 @@ static const struct reg_default sgtl5000_reg_defaults[] = { + { SGTL5000_DAP_EQ_BASS_BAND4, 0x002f }, + { SGTL5000_DAP_MAIN_CHAN, 0x8000 }, + { SGTL5000_DAP_MIX_CHAN, 0x0000 }, +- { SGTL5000_DAP_AVC_CTRL, 0x0510 }, ++ { SGTL5000_DAP_AVC_CTRL, 0x5100 }, + { SGTL5000_DAP_AVC_THRESHOLD, 0x1473 }, + { SGTL5000_DAP_AVC_ATTACK, 0x0028 }, + { SGTL5000_DAP_AVC_DECAY, 0x0050 }, +-- +2.30.1 + diff --git a/queue-5.11/asoc-soc-core-prevent-warning-if-no-dmi-table-is-pre.patch b/queue-5.11/asoc-soc-core-prevent-warning-if-no-dmi-table-is-pre.patch new file mode 100644 index 00000000000..2a6722d2764 --- /dev/null +++ b/queue-5.11/asoc-soc-core-prevent-warning-if-no-dmi-table-is-pre.patch @@ -0,0 +1,54 @@ +From 766f4211e4e84742aa1836517f001c3b5ec5c8c0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Mar 2021 11:55:26 +0000 +Subject: ASoC: soc-core: Prevent warning if no DMI table is present + +From: Jon Hunter + +[ Upstream commit 7de14d581dbed57c2b3c6afffa2c3fdc6955a3cd ] + +Many systems do not use ACPI and hence do not provide a DMI table. On +non-ACPI systems a warning, such as the following, is printed on boot. + + WARNING KERN tegra-audio-graph-card sound: ASoC: no DMI vendor name! + +The variable 'dmi_available' is not exported and so currently cannot be +used by kernel modules without adding an accessor. However, it is +possible to use the function is_acpi_device_node() to determine if the +sound card is an ACPI device and hence indicate if we expect a DMI table +to be present. Therefore, call is_acpi_device_node() to see if we are +using ACPI and only parse the DMI table if we are booting with ACPI. + +Signed-off-by: Jon Hunter +Link: https://lore.kernel.org/r/20210303115526.419458-1-jonathanh@nvidia.com +Signed-off-by: Mark Brown +Signed-off-by: Sasha Levin +--- + sound/soc/soc-core.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/sound/soc/soc-core.c b/sound/soc/soc-core.c +index f6d4e99b590c..0cffc9527e28 100644 +--- a/sound/soc/soc-core.c ++++ b/sound/soc/soc-core.c +@@ -31,6 +31,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -1573,6 +1574,9 @@ int snd_soc_set_dmi_name(struct snd_soc_card *card, const char *flavour) + if (card->long_name) + return 0; /* long name already set by driver or from DMI */ + ++ if (!is_acpi_device_node(card->dev->fwnode)) ++ return 0; ++ + /* make up dmi long name as: vendor-product-version-board */ + vendor = dmi_get_system_info(DMI_BOARD_VENDOR); + if (!vendor || !is_dmi_valid(vendor)) { +-- +2.30.1 + diff --git a/queue-5.11/ext4-do-not-iput-inode-under-running-transaction-in-.patch b/queue-5.11/ext4-do-not-iput-inode-under-running-transaction-in-.patch new file mode 100644 index 00000000000..fb552e0f3bc --- /dev/null +++ b/queue-5.11/ext4-do-not-iput-inode-under-running-transaction-in-.patch @@ -0,0 +1,90 @@ +From fe5f19d9db80cf910984380890c56119993dfa59 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Mar 2021 21:17:03 +0800 +Subject: ext4: do not iput inode under running transaction in ext4_rename() + +From: zhangyi (F) + +[ Upstream commit 5dccdc5a1916d4266edd251f20bbbb113a5c495f ] + +In ext4_rename(), when RENAME_WHITEOUT failed to add new entry into +directory, it ends up dropping new created whiteout inode under the +running transaction. After commit <9b88f9fb0d2> ("ext4: Do not iput inode +under running transaction"), we follow the assumptions that evict() does +not get called from a transaction context but in ext4_rename() it breaks +this suggestion. Although it's not a real problem, better to obey it, so +this patch add inode to orphan list and stop transaction before final +iput(). + +Signed-off-by: zhangyi (F) +Link: https://lore.kernel.org/r/20210303131703.330415-2-yi.zhang@huawei.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/namei.c | 18 +++++++++--------- + 1 file changed, 9 insertions(+), 9 deletions(-) + +diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c +index 078f26f4b56e..9cc9e6c1d582 100644 +--- a/fs/ext4/namei.c ++++ b/fs/ext4/namei.c +@@ -3785,14 +3785,14 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, + */ + retval = -ENOENT; + if (!old.bh || le32_to_cpu(old.de->inode) != old.inode->i_ino) +- goto end_rename; ++ goto release_bh; + + new.bh = ext4_find_entry(new.dir, &new.dentry->d_name, + &new.de, &new.inlined); + if (IS_ERR(new.bh)) { + retval = PTR_ERR(new.bh); + new.bh = NULL; +- goto end_rename; ++ goto release_bh; + } + if (new.bh) { + if (!new.inode) { +@@ -3809,15 +3809,13 @@ static int ext4_rename(struct inode *old_dir, struct dentry *old_dentry, + handle = ext4_journal_start(old.dir, EXT4_HT_DIR, credits); + if (IS_ERR(handle)) { + retval = PTR_ERR(handle); +- handle = NULL; +- goto end_rename; ++ goto release_bh; + } + } else { + whiteout = ext4_whiteout_for_rename(&old, credits, &handle); + if (IS_ERR(whiteout)) { + retval = PTR_ERR(whiteout); +- whiteout = NULL; +- goto end_rename; ++ goto release_bh; + } + } + +@@ -3954,16 +3952,18 @@ end_rename: + ext4_resetent(handle, &old, + old.inode->i_ino, old_file_type); + drop_nlink(whiteout); ++ ext4_orphan_add(handle, whiteout); + } + unlock_new_inode(whiteout); ++ ext4_journal_stop(handle); + iput(whiteout); +- ++ } else { ++ ext4_journal_stop(handle); + } ++release_bh: + brelse(old.dir_bh); + brelse(old.bh); + brelse(new.bh); +- if (handle) +- ext4_journal_stop(handle); + return retval; + } + +-- +2.30.1 + diff --git a/queue-5.11/ext4-fix-bh-ref-count-on-error-paths.patch b/queue-5.11/ext4-fix-bh-ref-count-on-error-paths.patch new file mode 100644 index 00000000000..bf38db86e00 --- /dev/null +++ b/queue-5.11/ext4-fix-bh-ref-count-on-error-paths.patch @@ -0,0 +1,43 @@ +From 7a26b582b78506e105ac86fa028466d2c22ebe8a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Mar 2021 17:42:31 +0800 +Subject: ext4: fix bh ref count on error paths + +From: Zhaolong Zhang + +[ Upstream commit c915fb80eaa6194fa9bd0a4487705cd5b0dda2f1 ] + +__ext4_journalled_writepage should drop bhs' ref count on error paths + +Signed-off-by: Zhaolong Zhang +Link: https://lore.kernel.org/r/1614678151-70481-1-git-send-email-zhangzl2013@126.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/inode.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/fs/ext4/inode.c b/fs/ext4/inode.c +index ed498538a749..3b9f7bf4045b 100644 +--- a/fs/ext4/inode.c ++++ b/fs/ext4/inode.c +@@ -1937,13 +1937,13 @@ static int __ext4_journalled_writepage(struct page *page, + if (!ret) + ret = err; + +- if (!ext4_has_inline_data(inode)) +- ext4_walk_page_buffers(NULL, page_bufs, 0, len, +- NULL, bput_one); + ext4_set_inode_state(inode, EXT4_STATE_JDATA); + out: + unlock_page(page); + out_no_pagelock: ++ if (!inline_data && page_bufs) ++ ext4_walk_page_buffers(NULL, page_bufs, 0, len, ++ NULL, bput_one); + brelse(inode_bh); + return ret; + } +-- +2.30.1 + diff --git a/queue-5.11/ext4-shrink-race-window-in-ext4_should_retry_alloc.patch b/queue-5.11/ext4-shrink-race-window-in-ext4_should_retry_alloc.patch new file mode 100644 index 00000000000..f0003d4694a --- /dev/null +++ b/queue-5.11/ext4-shrink-race-window-in-ext4_should_retry_alloc.patch @@ -0,0 +1,199 @@ +From 22ca66a81077259d731dcc17c01eeded2cfe07a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Feb 2021 10:11:32 -0500 +Subject: ext4: shrink race window in ext4_should_retry_alloc() + +From: Eric Whitney + +[ Upstream commit efc61345274d6c7a46a0570efbc916fcbe3e927b ] + +When generic/371 is run on kvm-xfstests using 5.10 and 5.11 kernels, it +fails at significant rates on the two test scenarios that disable +delayed allocation (ext3conv and data_journal) and force actual block +allocation for the fallocate and pwrite functions in the test. The +failure rate on 5.10 for both ext3conv and data_journal on one test +system typically runs about 85%. On 5.11, the failure rate on ext3conv +sometimes drops to as low as 1% while the rate on data_journal +increases to nearly 100%. + +The observed failures are largely due to ext4_should_retry_alloc() +cutting off block allocation retries when s_mb_free_pending (used to +indicate that a transaction in progress will free blocks) is 0. +However, free space is usually available when this occurs during runs +of generic/371. It appears that a thread attempting to allocate +blocks is just missing transaction commits in other threads that +increase the free cluster count and reset s_mb_free_pending while +the allocating thread isn't running. Explicitly testing for free space +availability avoids this race. + +The current code uses a post-increment operator in the conditional +expression that determines whether the retry limit has been exceeded. +This means that the conditional expression uses the value of the +retry counter before it's increased, resulting in an extra retry cycle. +The current code actually retries twice before hitting its retry limit +rather than once. + +Increasing the retry limit to 3 from the current actual maximum retry +count of 2 in combination with the change described above reduces the +observed failure rate to less that 0.1% on both ext3conv and +data_journal with what should be limited impact on users sensitive to +the overhead caused by retries. + +A per filesystem percpu counter exported via sysfs is added to allow +users or developers to track the number of times the retry limit is +exceeded without resorting to debugging methods. This should provide +some insight into worst case retry behavior. + +Signed-off-by: Eric Whitney +Link: https://lore.kernel.org/r/20210218151132.19678-1-enwlinux@gmail.com +Signed-off-by: Theodore Ts'o +Signed-off-by: Sasha Levin +--- + fs/ext4/balloc.c | 38 ++++++++++++++++++++++++++------------ + fs/ext4/ext4.h | 1 + + fs/ext4/super.c | 5 +++++ + fs/ext4/sysfs.c | 7 +++++++ + 4 files changed, 39 insertions(+), 12 deletions(-) + +diff --git a/fs/ext4/balloc.c b/fs/ext4/balloc.c +index f45f9feebe59..74a5172c2d83 100644 +--- a/fs/ext4/balloc.c ++++ b/fs/ext4/balloc.c +@@ -626,27 +626,41 @@ int ext4_claim_free_clusters(struct ext4_sb_info *sbi, + + /** + * ext4_should_retry_alloc() - check if a block allocation should be retried +- * @sb: super block +- * @retries: number of attemps has been made ++ * @sb: superblock ++ * @retries: number of retry attempts made so far + * +- * ext4_should_retry_alloc() is called when ENOSPC is returned, and if +- * it is profitable to retry the operation, this function will wait +- * for the current or committing transaction to complete, and then +- * return TRUE. We will only retry once. ++ * ext4_should_retry_alloc() is called when ENOSPC is returned while ++ * attempting to allocate blocks. If there's an indication that a pending ++ * journal transaction might free some space and allow another attempt to ++ * succeed, this function will wait for the current or committing transaction ++ * to complete and then return TRUE. + */ + int ext4_should_retry_alloc(struct super_block *sb, int *retries) + { +- if (!ext4_has_free_clusters(EXT4_SB(sb), 1, 0) || +- (*retries)++ > 1 || +- !EXT4_SB(sb)->s_journal) ++ struct ext4_sb_info *sbi = EXT4_SB(sb); ++ ++ if (!sbi->s_journal) + return 0; + +- smp_mb(); +- if (EXT4_SB(sb)->s_mb_free_pending == 0) ++ if (++(*retries) > 3) { ++ percpu_counter_inc(&sbi->s_sra_exceeded_retry_limit); + return 0; ++ } + ++ /* ++ * if there's no indication that blocks are about to be freed it's ++ * possible we just missed a transaction commit that did so ++ */ ++ smp_mb(); ++ if (sbi->s_mb_free_pending == 0) ++ return ext4_has_free_clusters(sbi, 1, 0); ++ ++ /* ++ * it's possible we've just missed a transaction commit here, ++ * so ignore the returned status ++ */ + jbd_debug(1, "%s: retrying operation after ENOSPC\n", sb->s_id); +- jbd2_journal_force_commit_nested(EXT4_SB(sb)->s_journal); ++ (void) jbd2_journal_force_commit_nested(sbi->s_journal); + return 1; + } + +diff --git a/fs/ext4/ext4.h b/fs/ext4/ext4.h +index e5c81593d972..9ad539ee4196 100644 +--- a/fs/ext4/ext4.h ++++ b/fs/ext4/ext4.h +@@ -1484,6 +1484,7 @@ struct ext4_sb_info { + struct percpu_counter s_freeinodes_counter; + struct percpu_counter s_dirs_counter; + struct percpu_counter s_dirtyclusters_counter; ++ struct percpu_counter s_sra_exceeded_retry_limit; + struct blockgroup_lock *s_blockgroup_lock; + struct proc_dir_entry *s_proc; + struct kobject s_kobj; +diff --git a/fs/ext4/super.c b/fs/ext4/super.c +index a1353b0825ea..c8cc8175b376 100644 +--- a/fs/ext4/super.c ++++ b/fs/ext4/super.c +@@ -1210,6 +1210,7 @@ static void ext4_put_super(struct super_block *sb) + percpu_counter_destroy(&sbi->s_freeinodes_counter); + percpu_counter_destroy(&sbi->s_dirs_counter); + percpu_counter_destroy(&sbi->s_dirtyclusters_counter); ++ percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit); + percpu_free_rwsem(&sbi->s_writepages_rwsem); + #ifdef CONFIG_QUOTA + for (i = 0; i < EXT4_MAXQUOTAS; i++) +@@ -5011,6 +5012,9 @@ no_journal: + if (!err) + err = percpu_counter_init(&sbi->s_dirtyclusters_counter, 0, + GFP_KERNEL); ++ if (!err) ++ err = percpu_counter_init(&sbi->s_sra_exceeded_retry_limit, 0, ++ GFP_KERNEL); + if (!err) + err = percpu_init_rwsem(&sbi->s_writepages_rwsem); + +@@ -5124,6 +5128,7 @@ failed_mount6: + percpu_counter_destroy(&sbi->s_freeinodes_counter); + percpu_counter_destroy(&sbi->s_dirs_counter); + percpu_counter_destroy(&sbi->s_dirtyclusters_counter); ++ percpu_counter_destroy(&sbi->s_sra_exceeded_retry_limit); + percpu_free_rwsem(&sbi->s_writepages_rwsem); + failed_mount5: + ext4_ext_release(sb); +diff --git a/fs/ext4/sysfs.c b/fs/ext4/sysfs.c +index 075aa3a19ff5..a3d08276d441 100644 +--- a/fs/ext4/sysfs.c ++++ b/fs/ext4/sysfs.c +@@ -24,6 +24,7 @@ typedef enum { + attr_session_write_kbytes, + attr_lifetime_write_kbytes, + attr_reserved_clusters, ++ attr_sra_exceeded_retry_limit, + attr_inode_readahead, + attr_trigger_test_error, + attr_first_error_time, +@@ -202,6 +203,7 @@ EXT4_ATTR_FUNC(delayed_allocation_blocks, 0444); + EXT4_ATTR_FUNC(session_write_kbytes, 0444); + EXT4_ATTR_FUNC(lifetime_write_kbytes, 0444); + EXT4_ATTR_FUNC(reserved_clusters, 0644); ++EXT4_ATTR_FUNC(sra_exceeded_retry_limit, 0444); + + EXT4_ATTR_OFFSET(inode_readahead_blks, 0644, inode_readahead, + ext4_sb_info, s_inode_readahead_blks); +@@ -251,6 +253,7 @@ static struct attribute *ext4_attrs[] = { + ATTR_LIST(session_write_kbytes), + ATTR_LIST(lifetime_write_kbytes), + ATTR_LIST(reserved_clusters), ++ ATTR_LIST(sra_exceeded_retry_limit), + ATTR_LIST(inode_readahead_blks), + ATTR_LIST(inode_goal), + ATTR_LIST(mb_stats), +@@ -374,6 +377,10 @@ static ssize_t ext4_attr_show(struct kobject *kobj, + return snprintf(buf, PAGE_SIZE, "%llu\n", + (unsigned long long) + atomic64_read(&sbi->s_resv_clusters)); ++ case attr_sra_exceeded_retry_limit: ++ return snprintf(buf, PAGE_SIZE, "%llu\n", ++ (unsigned long long) ++ percpu_counter_sum(&sbi->s_sra_exceeded_retry_limit)); + case attr_inode_readahead: + case attr_pointer_ui: + if (!ptr) +-- +2.30.1 + diff --git a/queue-5.11/fs-nfsd-fix-kconfig-dependency-warning-for-nfsd_v4.patch b/queue-5.11/fs-nfsd-fix-kconfig-dependency-warning-for-nfsd_v4.patch new file mode 100644 index 00000000000..147ce60f591 --- /dev/null +++ b/queue-5.11/fs-nfsd-fix-kconfig-dependency-warning-for-nfsd_v4.patch @@ -0,0 +1,48 @@ +From 348150b1b608d03896ff437eecf6fc3cf2f49c89 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 19 Feb 2021 16:56:10 -0500 +Subject: fs: nfsd: fix kconfig dependency warning for NFSD_V4 + +From: Julian Braha + +[ Upstream commit 7005227369079963d25fb2d5d736d0feb2c44cf6 ] + +When NFSD_V4 is enabled and CRYPTO is disabled, +Kbuild gives the following warning: + +WARNING: unmet direct dependencies detected for CRYPTO_SHA256 + Depends on [n]: CRYPTO [=n] + Selected by [y]: + - NFSD_V4 [=y] && NETWORK_FILESYSTEMS [=y] && NFSD [=y] && PROC_FS [=y] + +WARNING: unmet direct dependencies detected for CRYPTO_MD5 + Depends on [n]: CRYPTO [=n] + Selected by [y]: + - NFSD_V4 [=y] && NETWORK_FILESYSTEMS [=y] && NFSD [=y] && PROC_FS [=y] + +This is because NFSD_V4 selects CRYPTO_MD5 and CRYPTO_SHA256, +without depending on or selecting CRYPTO, despite those config options +being subordinate to CRYPTO. + +Signed-off-by: Julian Braha +Signed-off-by: Chuck Lever +Signed-off-by: Sasha Levin +--- + fs/nfsd/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/nfsd/Kconfig b/fs/nfsd/Kconfig +index dbbc583d6273..248f1459c039 100644 +--- a/fs/nfsd/Kconfig ++++ b/fs/nfsd/Kconfig +@@ -73,6 +73,7 @@ config NFSD_V4 + select NFSD_V3 + select FS_POSIX_ACL + select SUNRPC_GSS ++ select CRYPTO + select CRYPTO_MD5 + select CRYPTO_SHA256 + select GRACE_PERIOD +-- +2.30.1 + diff --git a/queue-5.11/io_uring-call-req_set_fail_links-on-short-send-msg-r.patch b/queue-5.11/io_uring-call-req_set_fail_links-on-short-send-msg-r.patch new file mode 100644 index 00000000000..080d5d6147a --- /dev/null +++ b/queue-5.11/io_uring-call-req_set_fail_links-on-short-send-msg-r.patch @@ -0,0 +1,175 @@ +From 6ce80d2840c224f3a8f5ae820e749c1cff772e91 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 20 Mar 2021 20:33:36 +0100 +Subject: io_uring: call req_set_fail_links() on short send[msg]()/recv[msg]() + with MSG_WAITALL + +From: Stefan Metzmacher + +[ Upstream commit 0031275d119efe16711cd93519b595e6f9b4b330 ] + +Without that it's not safe to use them in a linked combination with +others. + +Now combinations like IORING_OP_SENDMSG followed by IORING_OP_SPLICE +should be possible. + +We already handle short reads and writes for the following opcodes: + +- IORING_OP_READV +- IORING_OP_READ_FIXED +- IORING_OP_READ +- IORING_OP_WRITEV +- IORING_OP_WRITE_FIXED +- IORING_OP_WRITE +- IORING_OP_SPLICE +- IORING_OP_TEE + +Now we have it for these as well: + +- IORING_OP_SENDMSG +- IORING_OP_SEND +- IORING_OP_RECVMSG +- IORING_OP_RECV + +For IORING_OP_RECVMSG we also check for the MSG_TRUNC and MSG_CTRUNC +flags in order to call req_set_fail_links(). + +There might be applications arround depending on the behavior +that even short send[msg]()/recv[msg]() retuns continue an +IOSQE_IO_LINK chain. + +It's very unlikely that such applications pass in MSG_WAITALL, +which is only defined in 'man 2 recvmsg', but not in 'man 2 sendmsg'. + +It's expected that the low level sock_sendmsg() call just ignores +MSG_WAITALL, as MSG_ZEROCOPY is also ignored without explicitly set +SO_ZEROCOPY. + +We also expect the caller to know about the implicit truncation to +MAX_RW_COUNT, which we don't detect. + +cc: netdev@vger.kernel.org +Link: https://lore.kernel.org/r/c4e1a4cc0d905314f4d5dc567e65a7b09621aab3.1615908477.git.metze@samba.org +Signed-off-by: Stefan Metzmacher +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 24 ++++++++++++++++++++---- + 1 file changed, 20 insertions(+), 4 deletions(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 26b4af9831da..2b0b9c3dda33 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -4628,6 +4628,7 @@ static int io_sendmsg(struct io_kiocb *req, bool force_nonblock, + struct io_async_msghdr iomsg, *kmsg; + struct socket *sock; + unsigned flags; ++ int min_ret = 0; + int ret; + + sock = sock_from_file(req->file); +@@ -4654,6 +4655,9 @@ static int io_sendmsg(struct io_kiocb *req, bool force_nonblock, + else if (force_nonblock) + flags |= MSG_DONTWAIT; + ++ if (flags & MSG_WAITALL) ++ min_ret = iov_iter_count(&kmsg->msg.msg_iter); ++ + ret = __sys_sendmsg_sock(sock, &kmsg->msg, flags); + if (force_nonblock && ret == -EAGAIN) + return io_setup_async_msg(req, kmsg); +@@ -4663,7 +4667,7 @@ static int io_sendmsg(struct io_kiocb *req, bool force_nonblock, + if (kmsg->iov != kmsg->fast_iov) + kfree(kmsg->iov); + req->flags &= ~REQ_F_NEED_CLEANUP; +- if (ret < 0) ++ if (ret < min_ret) + req_set_fail_links(req); + __io_req_complete(req, ret, 0, cs); + return 0; +@@ -4677,6 +4681,7 @@ static int io_send(struct io_kiocb *req, bool force_nonblock, + struct iovec iov; + struct socket *sock; + unsigned flags; ++ int min_ret = 0; + int ret; + + sock = sock_from_file(req->file); +@@ -4698,6 +4703,9 @@ static int io_send(struct io_kiocb *req, bool force_nonblock, + else if (force_nonblock) + flags |= MSG_DONTWAIT; + ++ if (flags & MSG_WAITALL) ++ min_ret = iov_iter_count(&msg.msg_iter); ++ + msg.msg_flags = flags; + ret = sock_sendmsg(sock, &msg); + if (force_nonblock && ret == -EAGAIN) +@@ -4705,7 +4713,7 @@ static int io_send(struct io_kiocb *req, bool force_nonblock, + if (ret == -ERESTARTSYS) + ret = -EINTR; + +- if (ret < 0) ++ if (ret < min_ret) + req_set_fail_links(req); + __io_req_complete(req, ret, 0, cs); + return 0; +@@ -4857,6 +4865,7 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock, + struct socket *sock; + struct io_buffer *kbuf; + unsigned flags; ++ int min_ret = 0; + int ret, cflags = 0; + + sock = sock_from_file(req->file); +@@ -4892,6 +4901,9 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock, + else if (force_nonblock) + flags |= MSG_DONTWAIT; + ++ if (flags & MSG_WAITALL) ++ min_ret = iov_iter_count(&kmsg->msg.msg_iter); ++ + ret = __sys_recvmsg_sock(sock, &kmsg->msg, req->sr_msg.umsg, + kmsg->uaddr, flags); + if (force_nonblock && ret == -EAGAIN) +@@ -4904,7 +4916,7 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock, + if (kmsg->iov != kmsg->fast_iov) + kfree(kmsg->iov); + req->flags &= ~REQ_F_NEED_CLEANUP; +- if (ret < 0) ++ if (ret < min_ret || ((flags & MSG_WAITALL) && (kmsg->msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)))) + req_set_fail_links(req); + __io_req_complete(req, ret, cflags, cs); + return 0; +@@ -4920,6 +4932,7 @@ static int io_recv(struct io_kiocb *req, bool force_nonblock, + struct socket *sock; + struct iovec iov; + unsigned flags; ++ int min_ret = 0; + int ret, cflags = 0; + + sock = sock_from_file(req->file); +@@ -4950,6 +4963,9 @@ static int io_recv(struct io_kiocb *req, bool force_nonblock, + else if (force_nonblock) + flags |= MSG_DONTWAIT; + ++ if (flags & MSG_WAITALL) ++ min_ret = iov_iter_count(&msg.msg_iter); ++ + ret = sock_recvmsg(sock, &msg, flags); + if (force_nonblock && ret == -EAGAIN) + return -EAGAIN; +@@ -4958,7 +4974,7 @@ static int io_recv(struct io_kiocb *req, bool force_nonblock, + out_free: + if (req->flags & REQ_F_BUFFER_SELECTED) + cflags = io_put_recv_kbuf(req); +- if (ret < 0) ++ if (ret < min_ret || ((flags & MSG_WAITALL) && (msg.msg_flags & (MSG_TRUNC | MSG_CTRUNC)))) + req_set_fail_links(req); + __io_req_complete(req, ret, cflags, cs); + return 0; +-- +2.30.1 + diff --git a/queue-5.11/io_uring-fix-flags-races-by-linked-timeouts.patch b/queue-5.11/io_uring-fix-flags-races-by-linked-timeouts.patch new file mode 100644 index 00000000000..6d54388a551 --- /dev/null +++ b/queue-5.11/io_uring-fix-flags-races-by-linked-timeouts.patch @@ -0,0 +1,38 @@ +From c6a23a8f5e7862b6cac212a8a76c23c48e4dbadf Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 14 Mar 2021 20:57:08 +0000 +Subject: io_uring: fix ->flags races by linked timeouts + +From: Pavel Begunkov + +[ Upstream commit efe814a471e0e58f28f1efaf430c8784a4f36626 ] + +It's racy to modify req->flags from a not owning context, e.g. linked +timeout calling req_set_fail_links() for the master request might race +with that request setting/clearing flags while being executed +concurrently. Just remove req_set_fail_links(prev) from +io_link_timeout_fn(), io_async_find_and_cancel() and functions down the +line take care of setting the fail bit. + +Signed-off-by: Pavel Begunkov +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 1 - + 1 file changed, 1 deletion(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 5c4378694d54..381f82ebd282 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -6496,7 +6496,6 @@ static enum hrtimer_restart io_link_timeout_fn(struct hrtimer *timer) + spin_unlock_irqrestore(&ctx->completion_lock, flags); + + if (prev) { +- req_set_fail_links(prev); + io_async_find_and_cancel(ctx, req, prev->user_data, -ETIME); + io_put_req_deferred(prev, 1); + } else { +-- +2.30.1 + diff --git a/queue-5.11/io_uring-halt-sqo-submission-on-ctx-exit.patch b/queue-5.11/io_uring-halt-sqo-submission-on-ctx-exit.patch new file mode 100644 index 00000000000..ca59f1cae9e --- /dev/null +++ b/queue-5.11/io_uring-halt-sqo-submission-on-ctx-exit.patch @@ -0,0 +1,45 @@ +From c0735508dda524c876fc9f4bcaecde38e848de52 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 14 Mar 2021 20:57:11 +0000 +Subject: io_uring: halt SQO submission on ctx exit + +From: Pavel Begunkov + +[ Upstream commit f6d54255f4235448d4bbe442362d4caa62da97d5 ] + +io_sq_thread_finish() is called in io_ring_ctx_free(), so SQPOLL task is +potentially running submitting new requests. It's not a disaster because +of using a "try" variant of percpu_ref_get, but is far from nice. + +Remove ctx from the sqd ctx list earlier, before cancellation loop, so +SQPOLL can't find it and so won't submit new requests. + +Signed-off-by: Pavel Begunkov +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index 381f82ebd282..aaf9b5d49c17 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -8800,6 +8800,14 @@ static void io_ring_ctx_wait_and_kill(struct io_ring_ctx *ctx) + __io_cqring_overflow_flush(ctx, true, NULL, NULL); + mutex_unlock(&ctx->uring_lock); + ++ /* prevent SQPOLL from submitting new requests */ ++ if (ctx->sq_data) { ++ io_sq_thread_park(ctx->sq_data); ++ list_del_init(&ctx->sqd_list); ++ io_sqd_update_thread_idle(ctx->sq_data); ++ io_sq_thread_unpark(ctx->sq_data); ++ } ++ + io_kill_timeouts(ctx, NULL, NULL); + io_poll_remove_all(ctx, NULL, NULL); + +-- +2.30.1 + diff --git a/queue-5.11/io_uring-imply-msg_nosignal-for-send-msg-recv-msg-ca.patch b/queue-5.11/io_uring-imply-msg_nosignal-for-send-msg-recv-msg-ca.patch new file mode 100644 index 00000000000..f009ef169b9 --- /dev/null +++ b/queue-5.11/io_uring-imply-msg_nosignal-for-send-msg-recv-msg-ca.patch @@ -0,0 +1,62 @@ +From 8184aab9282ff5b59fbdab120badba48399a4658 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Mar 2021 16:33:27 +0100 +Subject: io_uring: imply MSG_NOSIGNAL for send[msg]()/recv[msg]() calls + +From: Stefan Metzmacher + +[ Upstream commit 76cd979f4f38a27df22efb5773a0d567181a9392 ] + +We never want to generate any SIGPIPE, -EPIPE only is much better. + +Signed-off-by: Stefan Metzmacher +Link: https://lore.kernel.org/r/38961085c3ec49fd21550c7788f214d1ff02d2d4.1615908477.git.metze@samba.org +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + fs/io_uring.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/fs/io_uring.c b/fs/io_uring.c +index aaf9b5d49c17..26b4af9831da 100644 +--- a/fs/io_uring.c ++++ b/fs/io_uring.c +@@ -4648,7 +4648,7 @@ static int io_sendmsg(struct io_kiocb *req, bool force_nonblock, + kmsg = &iomsg; + } + +- flags = req->sr_msg.msg_flags; ++ flags = req->sr_msg.msg_flags | MSG_NOSIGNAL; + if (flags & MSG_DONTWAIT) + req->flags |= REQ_F_NOWAIT; + else if (force_nonblock) +@@ -4692,7 +4692,7 @@ static int io_send(struct io_kiocb *req, bool force_nonblock, + msg.msg_controllen = 0; + msg.msg_namelen = 0; + +- flags = req->sr_msg.msg_flags; ++ flags = req->sr_msg.msg_flags | MSG_NOSIGNAL; + if (flags & MSG_DONTWAIT) + req->flags |= REQ_F_NOWAIT; + else if (force_nonblock) +@@ -4886,7 +4886,7 @@ static int io_recvmsg(struct io_kiocb *req, bool force_nonblock, + 1, req->sr_msg.len); + } + +- flags = req->sr_msg.msg_flags; ++ flags = req->sr_msg.msg_flags | MSG_NOSIGNAL; + if (flags & MSG_DONTWAIT) + req->flags |= REQ_F_NOWAIT; + else if (force_nonblock) +@@ -4944,7 +4944,7 @@ static int io_recv(struct io_kiocb *req, bool force_nonblock, + msg.msg_iocb = NULL; + msg.msg_flags = 0; + +- flags = req->sr_msg.msg_flags; ++ flags = req->sr_msg.msg_flags | MSG_NOSIGNAL; + if (flags & MSG_DONTWAIT) + req->flags |= REQ_F_NOWAIT; + else if (force_nonblock) +-- +2.30.1 + diff --git a/queue-5.11/iomap-fix-negative-assignment-to-unsigned-sis-pages-.patch b/queue-5.11/iomap-fix-negative-assignment-to-unsigned-sis-pages-.patch new file mode 100644 index 00000000000..5a387993d01 --- /dev/null +++ b/queue-5.11/iomap-fix-negative-assignment-to-unsigned-sis-pages-.patch @@ -0,0 +1,91 @@ +From cb12188513c6258a7eed94be1e9a3c6a69586934 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Mar 2021 09:29:11 -0800 +Subject: iomap: Fix negative assignment to unsigned sis->pages in + iomap_swapfile_activate + +From: Ritesh Harjani + +[ Upstream commit 5808fecc572391867fcd929662b29c12e6d08d81 ] + +In case if isi.nr_pages is 0, we are making sis->pages (which is +unsigned int) a huge value in iomap_swapfile_activate() by assigning -1. +This could cause a kernel crash in kernel v4.18 (with below signature). +Or could lead to unknown issues on latest kernel if the fake big swap gets +used. + +Fix this issue by returning -EINVAL in case of nr_pages is 0, since it +is anyway a invalid swapfile. Looks like this issue will be hit when +we have pagesize < blocksize type of configuration. + +I was able to hit the issue in case of a tiny swap file with below +test script. +https://raw.githubusercontent.com/riteshharjani/LinuxStudy/master/scripts/swap-issue.sh + +kernel crash analysis on v4.18 +============================== +On v4.18 kernel, it causes a kernel panic, since sis->pages becomes +a huge value and isi.nr_extents is 0. When 0 is returned it is +considered as a swapfile over NFS and SWP_FILE is set (sis->flags |= SWP_FILE). +Then when swapoff was getting called it was calling a_ops->swap_deactivate() +if (sis->flags & SWP_FILE) is true. Since a_ops->swap_deactivate() is +NULL in case of XFS, it causes below panic. + +Panic signature on v4.18 kernel: +======================================= +root@qemu:/home/qemu# [ 8291.723351] XFS (loop2): Unmounting Filesystem +[ 8292.123104] XFS (loop2): Mounting V5 Filesystem +[ 8292.132451] XFS (loop2): Ending clean mount +[ 8292.263362] Adding 4294967232k swap on /mnt1/test/swapfile. Priority:-2 extents:1 across:274877906880k +[ 8292.277834] Unable to handle kernel paging request for instruction fetch +[ 8292.278677] Faulting instruction address: 0x00000000 +cpu 0x19: Vector: 400 (Instruction Access) at [c0000009dd5b7ad0] + pc: 0000000000000000 + lr: c0000000003eb9dc: destroy_swap_extents+0xfc/0x120 + sp: c0000009dd5b7d50 + msr: 8000000040009033 + current = 0xc0000009b6710080 + paca = 0xc00000003ffcb280 irqmask: 0x03 irq_happened: 0x01 + pid = 5604, comm = swapoff +Linux version 4.18.0 (riteshh@xxxxxxx) (gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04)) #57 SMP Wed Mar 3 01:33:04 CST 2021 +enter ? for help +[link register ] c0000000003eb9dc destroy_swap_extents+0xfc/0x120 +[c0000009dd5b7d50] c0000000025a7058 proc_poll_event+0x0/0x4 (unreliable) +[c0000009dd5b7da0] c0000000003f0498 sys_swapoff+0x3f8/0x910 +[c0000009dd5b7e30] c00000000000bbe4 system_call+0x5c/0x70 +Exception: c01 (System Call) at 00007ffff7d208d8 + +Signed-off-by: Ritesh Harjani +[djwong: rework the comment to provide more details] +Reviewed-by: Darrick J. Wong +Signed-off-by: Darrick J. Wong +Reviewed-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + fs/iomap/swapfile.c | 10 ++++++++++ + 1 file changed, 10 insertions(+) + +diff --git a/fs/iomap/swapfile.c b/fs/iomap/swapfile.c +index a648dbf6991e..a5e478de1417 100644 +--- a/fs/iomap/swapfile.c ++++ b/fs/iomap/swapfile.c +@@ -170,6 +170,16 @@ int iomap_swapfile_activate(struct swap_info_struct *sis, + return ret; + } + ++ /* ++ * If this swapfile doesn't contain even a single page-aligned ++ * contiguous range of blocks, reject this useless swapfile to ++ * prevent confusion later on. ++ */ ++ if (isi.nr_pages == 0) { ++ pr_warn("swapon: Cannot find a single usable page in file.\n"); ++ return -EINVAL; ++ } ++ + *pagespan = 1 + isi.highest_ppage - isi.lowest_ppage; + sis->max = isi.nr_pages; + sis->pages = isi.nr_pages - 1; +-- +2.30.1 + diff --git a/queue-5.11/kernel-freezer-should-treat-pf_io_worker-like-pf_kth.patch b/queue-5.11/kernel-freezer-should-treat-pf_io_worker-like-pf_kth.patch new file mode 100644 index 00000000000..0e27fe9d740 --- /dev/null +++ b/queue-5.11/kernel-freezer-should-treat-pf_io_worker-like-pf_kth.patch @@ -0,0 +1,37 @@ +From e3c3ddacc1f554b88b0496432f9600036de06c31 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Mar 2021 20:20:42 -0700 +Subject: kernel: freezer should treat PF_IO_WORKER like PF_KTHREAD for + freezing + +From: Jens Axboe + +[ Upstream commit 15b2219facadec583c24523eed40fa45865f859f ] + +Don't send fake signals to PF_IO_WORKER threads, they don't accept +signals. Just treat them like kthreads in this regard, all they need +is a wakeup as no forced kernel/user transition is needed. + +Suggested-by: Linus Torvalds +Signed-off-by: Jens Axboe +Signed-off-by: Sasha Levin +--- + kernel/freezer.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/kernel/freezer.c b/kernel/freezer.c +index dc520f01f99d..1a2d57d1327c 100644 +--- a/kernel/freezer.c ++++ b/kernel/freezer.c +@@ -134,7 +134,7 @@ bool freeze_task(struct task_struct *p) + return false; + } + +- if (!(p->flags & PF_KTHREAD)) ++ if (!(p->flags & (PF_KTHREAD | PF_IO_WORKER))) + fake_signal_wake_up(p); + else + wake_up_state(p, TASK_INTERRUPTIBLE); +-- +2.30.1 + diff --git a/queue-5.11/locking-ww_mutex-fix-acquire-release-imbalance-in-ww.patch b/queue-5.11/locking-ww_mutex-fix-acquire-release-imbalance-in-ww.patch new file mode 100644 index 00000000000..f3d7bf64932 --- /dev/null +++ b/queue-5.11/locking-ww_mutex-fix-acquire-release-imbalance-in-ww.patch @@ -0,0 +1,47 @@ +From 559f49e1bd0cc7c5d17c9a927a10607e43121619 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Mar 2021 11:31:17 -0400 +Subject: locking/ww_mutex: Fix acquire/release imbalance in + ww_acquire_init()/ww_acquire_fini() + +From: Waiman Long + +[ Upstream commit bee645788e07eea63055d261d2884ea45c2ba857 ] + +In ww_acquire_init(), mutex_acquire() is gated by CONFIG_DEBUG_LOCK_ALLOC. +The dep_map in the ww_acquire_ctx structure is also gated by the +same config. However mutex_release() in ww_acquire_fini() is gated by +CONFIG_DEBUG_MUTEXES. It is possible to set CONFIG_DEBUG_MUTEXES without +setting CONFIG_DEBUG_LOCK_ALLOC though it is an unlikely configuration. +That may cause a compilation error as dep_map isn't defined in this +case. Fix this potential problem by enclosing mutex_release() inside +CONFIG_DEBUG_LOCK_ALLOC. + +Signed-off-by: Waiman Long +Signed-off-by: Ingo Molnar +Link: https://lore.kernel.org/r/20210316153119.13802-3-longman@redhat.com +Signed-off-by: Sasha Levin +--- + include/linux/ww_mutex.h | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/include/linux/ww_mutex.h b/include/linux/ww_mutex.h +index 850424e5d030..6ecf2a0220db 100644 +--- a/include/linux/ww_mutex.h ++++ b/include/linux/ww_mutex.h +@@ -173,9 +173,10 @@ static inline void ww_acquire_done(struct ww_acquire_ctx *ctx) + */ + static inline void ww_acquire_fini(struct ww_acquire_ctx *ctx) + { +-#ifdef CONFIG_DEBUG_MUTEXES ++#ifdef CONFIG_DEBUG_LOCK_ALLOC + mutex_release(&ctx->dep_map, _THIS_IP_); +- ++#endif ++#ifdef CONFIG_DEBUG_MUTEXES + DEBUG_LOCKS_WARN_ON(ctx->acquired); + if (!IS_ENABLED(CONFIG_PROVE_LOCKING)) + /* +-- +2.30.1 + diff --git a/queue-5.11/locking-ww_mutex-simplify-use_ww_ctx-ww_ctx-handling.patch b/queue-5.11/locking-ww_mutex-simplify-use_ww_ctx-ww_ctx-handling.patch new file mode 100644 index 00000000000..6ccb9388a79 --- /dev/null +++ b/queue-5.11/locking-ww_mutex-simplify-use_ww_ctx-ww_ctx-handling.patch @@ -0,0 +1,138 @@ +From 86411e6afe04b3726f5c873a1c9f9dea73cbf8a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Mar 2021 11:31:16 -0400 +Subject: locking/ww_mutex: Simplify use_ww_ctx & ww_ctx handling + +From: Waiman Long + +[ Upstream commit 5de2055d31ea88fd9ae9709ac95c372a505a60fa ] + +The use_ww_ctx flag is passed to mutex_optimistic_spin(), but the +function doesn't use it. The frequent use of the (use_ww_ctx && ww_ctx) +combination is repetitive. + +In fact, ww_ctx should not be used at all if !use_ww_ctx. Simplify +ww_mutex code by dropping use_ww_ctx from mutex_optimistic_spin() an +clear ww_ctx if !use_ww_ctx. In this way, we can replace (use_ww_ctx && +ww_ctx) by just (ww_ctx). + +Signed-off-by: Waiman Long +Signed-off-by: Ingo Molnar +Acked-by: Davidlohr Bueso +Link: https://lore.kernel.org/r/20210316153119.13802-2-longman@redhat.com +Signed-off-by: Sasha Levin +--- + kernel/locking/mutex.c | 25 ++++++++++++++----------- + 1 file changed, 14 insertions(+), 11 deletions(-) + +diff --git a/kernel/locking/mutex.c b/kernel/locking/mutex.c +index 5352ce50a97e..2c25b830203c 100644 +--- a/kernel/locking/mutex.c ++++ b/kernel/locking/mutex.c +@@ -636,7 +636,7 @@ static inline int mutex_can_spin_on_owner(struct mutex *lock) + */ + static __always_inline bool + mutex_optimistic_spin(struct mutex *lock, struct ww_acquire_ctx *ww_ctx, +- const bool use_ww_ctx, struct mutex_waiter *waiter) ++ struct mutex_waiter *waiter) + { + if (!waiter) { + /* +@@ -712,7 +712,7 @@ fail: + #else + static __always_inline bool + mutex_optimistic_spin(struct mutex *lock, struct ww_acquire_ctx *ww_ctx, +- const bool use_ww_ctx, struct mutex_waiter *waiter) ++ struct mutex_waiter *waiter) + { + return false; + } +@@ -932,6 +932,9 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + struct ww_mutex *ww; + int ret; + ++ if (!use_ww_ctx) ++ ww_ctx = NULL; ++ + might_sleep(); + + #ifdef CONFIG_DEBUG_MUTEXES +@@ -939,7 +942,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + #endif + + ww = container_of(lock, struct ww_mutex, base); +- if (use_ww_ctx && ww_ctx) { ++ if (ww_ctx) { + if (unlikely(ww_ctx == READ_ONCE(ww->ctx))) + return -EALREADY; + +@@ -956,10 +959,10 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + mutex_acquire_nest(&lock->dep_map, subclass, 0, nest_lock, ip); + + if (__mutex_trylock(lock) || +- mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx, NULL)) { ++ mutex_optimistic_spin(lock, ww_ctx, NULL)) { + /* got the lock, yay! */ + lock_acquired(&lock->dep_map, ip); +- if (use_ww_ctx && ww_ctx) ++ if (ww_ctx) + ww_mutex_set_context_fastpath(ww, ww_ctx); + preempt_enable(); + return 0; +@@ -970,7 +973,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + * After waiting to acquire the wait_lock, try again. + */ + if (__mutex_trylock(lock)) { +- if (use_ww_ctx && ww_ctx) ++ if (ww_ctx) + __ww_mutex_check_waiters(lock, ww_ctx); + + goto skip_wait; +@@ -1023,7 +1026,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + goto err; + } + +- if (use_ww_ctx && ww_ctx) { ++ if (ww_ctx) { + ret = __ww_mutex_check_kill(lock, &waiter, ww_ctx); + if (ret) + goto err; +@@ -1036,7 +1039,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + * ww_mutex needs to always recheck its position since its waiter + * list is not FIFO ordered. + */ +- if ((use_ww_ctx && ww_ctx) || !first) { ++ if (ww_ctx || !first) { + first = __mutex_waiter_is_first(lock, &waiter); + if (first) + __mutex_set_flag(lock, MUTEX_FLAG_HANDOFF); +@@ -1049,7 +1052,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + * or we must see its unlock and acquire. + */ + if (__mutex_trylock(lock) || +- (first && mutex_optimistic_spin(lock, ww_ctx, use_ww_ctx, &waiter))) ++ (first && mutex_optimistic_spin(lock, ww_ctx, &waiter))) + break; + + spin_lock(&lock->wait_lock); +@@ -1058,7 +1061,7 @@ __mutex_lock_common(struct mutex *lock, long state, unsigned int subclass, + acquired: + __set_current_state(TASK_RUNNING); + +- if (use_ww_ctx && ww_ctx) { ++ if (ww_ctx) { + /* + * Wound-Wait; we stole the lock (!first_waiter), check the + * waiters as anyone might want to wound us. +@@ -1078,7 +1081,7 @@ skip_wait: + /* got the lock - cleanup and rejoice! */ + lock_acquired(&lock->dep_map, ip); + +- if (use_ww_ctx && ww_ctx) ++ if (ww_ctx) + ww_mutex_lock_acquired(ww, ww_ctx); + + spin_unlock(&lock->wait_lock); +-- +2.30.1 + diff --git a/queue-5.11/nfsd-fix-error-handling-in-nfsv4.0-callbacks.patch b/queue-5.11/nfsd-fix-error-handling-in-nfsv4.0-callbacks.patch new file mode 100644 index 00000000000..e436aa6100d --- /dev/null +++ b/queue-5.11/nfsd-fix-error-handling-in-nfsv4.0-callbacks.patch @@ -0,0 +1,38 @@ +From ec503a679622f19b7d478974eace15f363b5b7d4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Mar 2021 10:55:00 -0500 +Subject: NFSD: fix error handling in NFSv4.0 callbacks + +From: Olga Kornievskaia + +[ Upstream commit b4250dd868d1b42c0a65de11ef3afbee67ba5d2f ] + +When the server tries to do a callback and a client fails it due to +authentication problems, we need the server to set callback down +flag in RENEW so that client can recover. + +Suggested-by: Bruce Fields +Signed-off-by: Olga Kornievskaia +Signed-off-by: Chuck Lever +Tested-by: Benjamin Coddington +Link: https://lore.kernel.org/linux-nfs/FB84E90A-1A03-48B3-8BF7-D9D10AC2C9FE@oracle.com/T/#t +Signed-off-by: Sasha Levin +--- + fs/nfsd/nfs4callback.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/fs/nfsd/nfs4callback.c b/fs/nfsd/nfs4callback.c +index 052be5bf9ef5..7325592b456e 100644 +--- a/fs/nfsd/nfs4callback.c ++++ b/fs/nfsd/nfs4callback.c +@@ -1189,6 +1189,7 @@ static void nfsd4_cb_done(struct rpc_task *task, void *calldata) + switch (task->tk_status) { + case -EIO: + case -ETIMEDOUT: ++ case -EACCES: + nfsd4_mark_cb_down(clp, task->tk_status); + } + break; +-- +2.30.1 + diff --git a/queue-5.11/nouveau-skip-unvailable-ttm-page-entries.patch b/queue-5.11/nouveau-skip-unvailable-ttm-page-entries.patch new file mode 100644 index 00000000000..c6ed3f87bd6 --- /dev/null +++ b/queue-5.11/nouveau-skip-unvailable-ttm-page-entries.patch @@ -0,0 +1,88 @@ +From 886fe29b63204a487ce24f47344df9728a493d41 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Mar 2021 23:21:59 +0100 +Subject: nouveau: Skip unvailable ttm page entries + +From: Tobias Klausmann + +[ Upstream commit e94c55b8e0a0bbe9a026250cf31e2fa45957d776 ] + +Starting with commit f295c8cfec833c2707ff1512da10d65386dde7af +("drm/nouveau: fix dma syncing warning with debugging on.") +the following oops occures: + + BUG: kernel NULL pointer dereference, address: 0000000000000000 + #PF: supervisor read access in kernel mode + #PF: error_code(0x0000) - not-present page + PGD 0 P4D 0 + Oops: 0000 [#1] PREEMPT SMP PTI + CPU: 6 PID: 1013 Comm: Xorg.bin Tainted: G E 5.11.0-desktop-rc0+ #2 + Hardware name: Acer Aspire VN7-593G/Pluto_KLS, BIOS V1.11 08/01/2018 + RIP: 0010:nouveau_bo_sync_for_device+0x40/0xb0 [nouveau] + Call Trace: + nouveau_bo_validate+0x5d/0x80 [nouveau] + nouveau_gem_ioctl_pushbuf+0x662/0x1120 [nouveau] + ? nouveau_gem_ioctl_new+0xf0/0xf0 [nouveau] + drm_ioctl_kernel+0xa6/0xf0 [drm] + drm_ioctl+0x1f4/0x3a0 [drm] + ? nouveau_gem_ioctl_new+0xf0/0xf0 [nouveau] + nouveau_drm_ioctl+0x50/0xa0 [nouveau] + __x64_sys_ioctl+0x7e/0xb0 + do_syscall_64+0x33/0x80 + entry_SYSCALL_64_after_hwframe+0x44/0xae + ---[ end trace ccfb1e7f4064374f ]--- + RIP: 0010:nouveau_bo_sync_for_device+0x40/0xb0 [nouveau] + +The underlying problem is not introduced by the commit, yet it uncovered the +underlying issue. The cited commit relies on valid pages. This is not given for +due to some bugs. For now, just warn and work around the issue by just ignoring +the bad ttm objects. +Below is some debug info gathered while debugging this issue: + +nouveau 0000:01:00.0: DRM: ttm_dma->num_pages: 2048 +nouveau 0000:01:00.0: DRM: ttm_dma->pages is NULL +nouveau 0000:01:00.0: DRM: ttm_dma: 00000000e96058e7 +nouveau 0000:01:00.0: DRM: ttm_dma->page_flags: +nouveau 0000:01:00.0: DRM: ttm_dma: Populated: 1 +nouveau 0000:01:00.0: DRM: ttm_dma: No Retry: 0 +nouveau 0000:01:00.0: DRM: ttm_dma: SG: 256 +nouveau 0000:01:00.0: DRM: ttm_dma: Zero Alloc: 0 +nouveau 0000:01:00.0: DRM: ttm_dma: Swapped: 0 + +Signed-off-by: Tobias Klausmann +Signed-off-by: Dave Airlie +Link: https://patchwork.freedesktop.org/patch/msgid/20210313222159.3346-1-tobias.klausmann@freenet.de +Signed-off-by: Sasha Levin +--- + drivers/gpu/drm/nouveau/nouveau_bo.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c b/drivers/gpu/drm/nouveau/nouveau_bo.c +index f1c9a22083be..e05565f284dc 100644 +--- a/drivers/gpu/drm/nouveau/nouveau_bo.c ++++ b/drivers/gpu/drm/nouveau/nouveau_bo.c +@@ -551,6 +551,10 @@ nouveau_bo_sync_for_device(struct nouveau_bo *nvbo) + + if (!ttm_dma) + return; ++ if (!ttm_dma->pages) { ++ NV_DEBUG(drm, "ttm_dma 0x%p: pages NULL\n", ttm_dma); ++ return; ++ } + + /* Don't waste time looping if the object is coherent */ + if (nvbo->force_coherent) +@@ -583,6 +587,10 @@ nouveau_bo_sync_for_cpu(struct nouveau_bo *nvbo) + + if (!ttm_dma) + return; ++ if (!ttm_dma->pages) { ++ NV_DEBUG(drm, "ttm_dma 0x%p: pages NULL\n", ttm_dma); ++ return; ++ } + + /* Don't waste time looping if the object is coherent */ + if (nvbo->force_coherent) +-- +2.30.1 + diff --git a/queue-5.11/nvmet-tcp-fix-kmap-leak-when-data-digest-in-use.patch b/queue-5.11/nvmet-tcp-fix-kmap-leak-when-data-digest-in-use.patch new file mode 100644 index 00000000000..58b666af311 --- /dev/null +++ b/queue-5.11/nvmet-tcp-fix-kmap-leak-when-data-digest-in-use.patch @@ -0,0 +1,40 @@ +From 893a34c1a923cadc9a5e2fcce871e86fe4653531 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Mar 2021 17:44:25 +0200 +Subject: nvmet-tcp: fix kmap leak when data digest in use + +From: Elad Grupi + +[ Upstream commit bac04454ef9fada009f0572576837548b190bf94 ] + +When data digest is enabled we should unmap pdu iovec before handling +the data digest pdu. + +Signed-off-by: Elad Grupi +Reviewed-by: Sagi Grimberg +Signed-off-by: Christoph Hellwig +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/tcp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c +index 8b0485ada315..d658c6e8263a 100644 +--- a/drivers/nvme/target/tcp.c ++++ b/drivers/nvme/target/tcp.c +@@ -1098,11 +1098,11 @@ static int nvmet_tcp_try_recv_data(struct nvmet_tcp_queue *queue) + cmd->rbytes_done += ret; + } + ++ nvmet_tcp_unmap_pdu_iovec(cmd); + if (queue->data_digest) { + nvmet_tcp_prep_recv_ddgst(cmd); + return 0; + } +- nvmet_tcp_unmap_pdu_iovec(cmd); + + if (!(cmd->flags & NVMET_TCP_F_INIT_FAILED) && + cmd->rbytes_done == cmd->req.transfer_len) { +-- +2.30.1 + diff --git a/queue-5.11/revert-pm-acpi-reboot-use-s5-for-reboot.patch b/queue-5.11/revert-pm-acpi-reboot-use-s5-for-reboot.patch new file mode 100644 index 00000000000..c0d5b655424 --- /dev/null +++ b/queue-5.11/revert-pm-acpi-reboot-use-s5-for-reboot.patch @@ -0,0 +1,39 @@ +From d2b599f1f6f9e955a0db6d92e0d7d653483bc8df Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 16 Mar 2021 22:17:48 -0400 +Subject: Revert "PM: ACPI: reboot: Use S5 for reboot" + +From: Josef Bacik + +[ Upstream commit 9d3fcb28f9b9750b474811a2964ce022df56336e ] + +This reverts commit d60cd06331a3566d3305b3c7b566e79edf4e2095. + +This patch causes a panic when rebooting my Dell Poweredge r440. I do +not have the full panic log as it's lost at that stage of the reboot and +I do not have a serial console. Reverting this patch makes my system +able to reboot again. + +Signed-off-by: Josef Bacik +Signed-off-by: Rafael J. Wysocki +Signed-off-by: Sasha Levin +--- + kernel/reboot.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/kernel/reboot.c b/kernel/reboot.c +index eb1b15850761..a6ad5eb2fa73 100644 +--- a/kernel/reboot.c ++++ b/kernel/reboot.c +@@ -244,8 +244,6 @@ void migrate_to_reboot_cpu(void) + void kernel_restart(char *cmd) + { + kernel_restart_prepare(cmd); +- if (pm_power_off_prepare) +- pm_power_off_prepare(); + migrate_to_reboot_cpu(); + syscore_shutdown(); + if (!cmd) +-- +2.30.1 + diff --git a/queue-5.11/rpc-fix-null-dereference-on-kmalloc-failure.patch b/queue-5.11/rpc-fix-null-dereference-on-kmalloc-failure.patch new file mode 100644 index 00000000000..a39ccb88755 --- /dev/null +++ b/queue-5.11/rpc-fix-null-dereference-on-kmalloc-failure.patch @@ -0,0 +1,64 @@ +From 84e5b4384a804eefbaba0951fcde3b8fcca694e3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 2 Mar 2021 10:48:38 -0500 +Subject: rpc: fix NULL dereference on kmalloc failure + +From: J. Bruce Fields + +[ Upstream commit 0ddc942394013f08992fc379ca04cffacbbe3dae ] + +I think this is unlikely but possible: + +svc_authenticate sets rq_authop and calls svcauth_gss_accept. The +kmalloc(sizeof(*svcdata), GFP_KERNEL) fails, leaving rq_auth_data NULL, +and returning SVC_DENIED. + +This causes svc_process_common to go to err_bad_auth, and eventually +call svc_authorise. That calls ->release == svcauth_gss_release, which +tries to dereference rq_auth_data. + +Signed-off-by: J. Bruce Fields +Link: https://lore.kernel.org/linux-nfs/3F1B347F-B809-478F-A1E9-0BE98E22B0F0@oracle.com/T/#t +Signed-off-by: Chuck Lever +Signed-off-by: Sasha Levin +--- + net/sunrpc/auth_gss/svcauth_gss.c | 11 +++++++---- + 1 file changed, 7 insertions(+), 4 deletions(-) + +diff --git a/net/sunrpc/auth_gss/svcauth_gss.c b/net/sunrpc/auth_gss/svcauth_gss.c +index bd4678db9d76..6dff64374bfe 100644 +--- a/net/sunrpc/auth_gss/svcauth_gss.c ++++ b/net/sunrpc/auth_gss/svcauth_gss.c +@@ -1825,11 +1825,14 @@ static int + svcauth_gss_release(struct svc_rqst *rqstp) + { + struct gss_svc_data *gsd = (struct gss_svc_data *)rqstp->rq_auth_data; +- struct rpc_gss_wire_cred *gc = &gsd->clcred; ++ struct rpc_gss_wire_cred *gc; + struct xdr_buf *resbuf = &rqstp->rq_res; + int stat = -EINVAL; + struct sunrpc_net *sn = net_generic(SVC_NET(rqstp), sunrpc_net_id); + ++ if (!gsd) ++ goto out; ++ gc = &gsd->clcred; + if (gc->gc_proc != RPC_GSS_PROC_DATA) + goto out; + /* Release can be called twice, but we only wrap once. */ +@@ -1870,10 +1873,10 @@ out_err: + if (rqstp->rq_cred.cr_group_info) + put_group_info(rqstp->rq_cred.cr_group_info); + rqstp->rq_cred.cr_group_info = NULL; +- if (gsd->rsci) ++ if (gsd && gsd->rsci) { + cache_put(&gsd->rsci->h, sn->rsc_cache); +- gsd->rsci = NULL; +- ++ gsd->rsci = NULL; ++ } + return stat; + } + +-- +2.30.1 + diff --git a/queue-5.11/scsi-qla2xxx-fix-broken-endif-placement.patch b/queue-5.11/scsi-qla2xxx-fix-broken-endif-placement.patch new file mode 100644 index 00000000000..c7d61512e60 --- /dev/null +++ b/queue-5.11/scsi-qla2xxx-fix-broken-endif-placement.patch @@ -0,0 +1,44 @@ +From 4e1cd2488e2756c031ac2acea622f28bba377ef3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 14 Mar 2021 18:32:46 +0300 +Subject: scsi: qla2xxx: Fix broken #endif placement + +From: Alexey Dobriyan + +[ Upstream commit 5999b9e5b1f8a2f5417b755130919b3ac96f5550 ] + +Only half of the file is under include guard because terminating #endif +is placed too early. + +Link: https://lore.kernel.org/r/YE4snvoW1SuwcXAn@localhost.localdomain +Reviewed-by: Himanshu Madhani +Signed-off-by: Alexey Dobriyan +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/qla2xxx/qla_target.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h +index 10e5e6c8087d..01620f3eab39 100644 +--- a/drivers/scsi/qla2xxx/qla_target.h ++++ b/drivers/scsi/qla2xxx/qla_target.h +@@ -116,7 +116,6 @@ + (min(1270, ((ql) > 0) ? (QLA_TGT_DATASEGS_PER_CMD_24XX + \ + QLA_TGT_DATASEGS_PER_CONT_24XX*((ql) - 1)) : 0)) + #endif +-#endif + + #define GET_TARGET_ID(ha, iocb) ((HAS_EXTENDED_IDS(ha)) \ + ? le16_to_cpu((iocb)->u.isp2x.target.extended) \ +@@ -244,6 +243,7 @@ struct ctio_to_2xxx { + #ifndef CTIO_RET_TYPE + #define CTIO_RET_TYPE 0x17 /* CTIO return entry */ + #define ATIO_TYPE7 0x06 /* Accept target I/O entry for 24xx */ ++#endif + + struct fcp_hdr { + uint8_t r_ctl; +-- +2.30.1 + diff --git a/queue-5.11/scsi-st-fix-a-use-after-free-in-st_open.patch b/queue-5.11/scsi-st-fix-a-use-after-free-in-st_open.patch new file mode 100644 index 00000000000..a33ec386b2a --- /dev/null +++ b/queue-5.11/scsi-st-fix-a-use-after-free-in-st_open.patch @@ -0,0 +1,42 @@ +From 80e30a92908f0de9537c7feaab187bdf3ea28bf2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Mar 2021 22:46:36 -0800 +Subject: scsi: st: Fix a use after free in st_open() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Lv Yunlong + +[ Upstream commit c8c165dea4c8f5ad67b1240861e4f6c5395fa4ac ] + +In st_open(), if STp->in_use is true, STp will be freed by +scsi_tape_put(). However, STp is still used by DEBC_printk() after. It is +better to DEBC_printk() before scsi_tape_put(). + +Link: https://lore.kernel.org/r/20210311064636.10522-1-lyl2019@mail.ustc.edu.cn +Acked-by: Kai Mäkisara +Signed-off-by: Lv Yunlong +Signed-off-by: Martin K. Petersen +Signed-off-by: Sasha Levin +--- + drivers/scsi/st.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/scsi/st.c b/drivers/scsi/st.c +index 43f7624508a9..8b10fa4e381a 100644 +--- a/drivers/scsi/st.c ++++ b/drivers/scsi/st.c +@@ -1269,8 +1269,8 @@ static int st_open(struct inode *inode, struct file *filp) + spin_lock(&st_use_lock); + if (STp->in_use) { + spin_unlock(&st_use_lock); +- scsi_tape_put(STp); + DEBC_printk(STp, "Device already in use.\n"); ++ scsi_tape_put(STp); + return (-EBUSY); + } + +-- +2.30.1 + diff --git a/queue-5.11/series b/queue-5.11/series index f3e7230e37c..cda809e84d3 100644 --- a/queue-5.11/series +++ b/queue-5.11/series @@ -1 +1,39 @@ arm64-mm-correct-the-inside-linear-map-range-during-.patch +virtiofs-fail-dax-mount-if-device-does-not-support-i.patch +ext4-shrink-race-window-in-ext4_should_retry_alloc.patch +ext4-fix-bh-ref-count-on-error-paths.patch +fs-nfsd-fix-kconfig-dependency-warning-for-nfsd_v4.patch +rpc-fix-null-dereference-on-kmalloc-failure.patch +iomap-fix-negative-assignment-to-unsigned-sis-pages-.patch +asoc-rt1015-fix-i2c-communication-error.patch +asoc-rt5640-fix-dac-and-adc-vol-tlv-values-being-off.patch +asoc-rt5651-fix-dac-and-adc-vol-tlv-values-being-off.patch +asoc-sgtl5000-set-dap_avc_ctrl-register-to-correct-d.patch +asoc-es8316-simplify-adc_pga_gain_tlv-table.patch +asoc-soc-core-prevent-warning-if-no-dmi-table-is-pre.patch +asoc-cs42l42-fix-bitclock-polarity-inversion.patch +asoc-cs42l42-fix-channel-width-support.patch +asoc-cs42l42-fix-mixer-volume-control.patch +asoc-cs42l42-always-wait-at-least-3ms-after-reset.patch +nfsd-fix-error-handling-in-nfsv4.0-callbacks.patch +asoc-mediatek-mt8192-fix-tdm-out-data-is-valid-on-ri.patch +kernel-freezer-should-treat-pf_io_worker-like-pf_kth.patch +vhost-fix-vhost_vq_reset.patch +io_uring-fix-flags-races-by-linked-timeouts.patch +io_uring-halt-sqo-submission-on-ctx-exit.patch +scsi-st-fix-a-use-after-free-in-st_open.patch +scsi-qla2xxx-fix-broken-endif-placement.patch +staging-comedi-cb_pcidas-fix-request_irq-warn.patch +staging-comedi-cb_pcidas64-fix-request_irq-warn.patch +asoc-rt5659-update-mclk-rate-in-set_sysclk.patch +asoc-rt711-add-snd_soc_component-remove-callback.patch +thermal-core-add-null-pointer-check-before-using-coo.patch +locking-ww_mutex-simplify-use_ww_ctx-ww_ctx-handling.patch +locking-ww_mutex-fix-acquire-release-imbalance-in-ww.patch +nvmet-tcp-fix-kmap-leak-when-data-digest-in-use.patch +io_uring-imply-msg_nosignal-for-send-msg-recv-msg-ca.patch +revert-pm-acpi-reboot-use-s5-for-reboot.patch +nouveau-skip-unvailable-ttm-page-entries.patch +static_call-align-static_call_is_init-patching-condi.patch +ext4-do-not-iput-inode-under-running-transaction-in-.patch +io_uring-call-req_set_fail_links-on-short-send-msg-r.patch diff --git a/queue-5.11/staging-comedi-cb_pcidas-fix-request_irq-warn.patch b/queue-5.11/staging-comedi-cb_pcidas-fix-request_irq-warn.patch new file mode 100644 index 00000000000..00da79daed7 --- /dev/null +++ b/queue-5.11/staging-comedi-cb_pcidas-fix-request_irq-warn.patch @@ -0,0 +1,49 @@ +From 4098013e3edf193926e9111295c40bd2645aa495 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Mar 2021 15:59:14 -0400 +Subject: staging: comedi: cb_pcidas: fix request_irq() warn + +From: Tong Zhang + +[ Upstream commit 2e5848a3d86f03024ae096478bdb892ab3d79131 ] + +request_irq() wont accept a name which contains slash so we need to +repalce it with something else -- otherwise it will trigger a warning +and the entry in /proc/irq/ will not be created +since the .name might be used by userspace and we don't want to break +userspace, so we are changing the parameters passed to request_irq() + +[ 1.630764] name 'pci-das1602/16' +[ 1.630950] WARNING: CPU: 0 PID: 181 at fs/proc/generic.c:180 __xlate_proc_name+0x93/0xb0 +[ 1.634009] RIP: 0010:__xlate_proc_name+0x93/0xb0 +[ 1.639441] Call Trace: +[ 1.639976] proc_mkdir+0x18/0x20 +[ 1.641946] request_threaded_irq+0xfe/0x160 +[ 1.642186] cb_pcidas_auto_attach+0xf4/0x610 [cb_pcidas] + +Suggested-by: Ian Abbott +Reviewed-by: Ian Abbott +Signed-off-by: Tong Zhang +Link: https://lore.kernel.org/r/20210315195914.4801-1-ztong0001@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/comedi/drivers/cb_pcidas.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/comedi/drivers/cb_pcidas.c b/drivers/staging/comedi/drivers/cb_pcidas.c +index d740c4782775..2f20bd56ec6c 100644 +--- a/drivers/staging/comedi/drivers/cb_pcidas.c ++++ b/drivers/staging/comedi/drivers/cb_pcidas.c +@@ -1281,7 +1281,7 @@ static int cb_pcidas_auto_attach(struct comedi_device *dev, + devpriv->amcc + AMCC_OP_REG_INTCSR); + + ret = request_irq(pcidev->irq, cb_pcidas_interrupt, IRQF_SHARED, +- dev->board_name, dev); ++ "cb_pcidas", dev); + if (ret) { + dev_dbg(dev->class_dev, "unable to allocate irq %d\n", + pcidev->irq); +-- +2.30.1 + diff --git a/queue-5.11/staging-comedi-cb_pcidas64-fix-request_irq-warn.patch b/queue-5.11/staging-comedi-cb_pcidas64-fix-request_irq-warn.patch new file mode 100644 index 00000000000..f3b88b137d4 --- /dev/null +++ b/queue-5.11/staging-comedi-cb_pcidas64-fix-request_irq-warn.patch @@ -0,0 +1,49 @@ +From 45727d90d429eafccb295a1f12ab3518d36f7675 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Mar 2021 15:58:12 -0400 +Subject: staging: comedi: cb_pcidas64: fix request_irq() warn + +From: Tong Zhang + +[ Upstream commit d2d106fe3badfc3bf0dd3899d1c3f210c7203eab ] + +request_irq() wont accept a name which contains slash so we need to +repalce it with something else -- otherwise it will trigger a warning +and the entry in /proc/irq/ will not be created +since the .name might be used by userspace and we don't want to break +userspace, so we are changing the parameters passed to request_irq() + +[ 1.565966] name 'pci-das6402/16' +[ 1.566149] WARNING: CPU: 0 PID: 184 at fs/proc/generic.c:180 __xlate_proc_name+0x93/0xb0 +[ 1.568923] RIP: 0010:__xlate_proc_name+0x93/0xb0 +[ 1.574200] Call Trace: +[ 1.574722] proc_mkdir+0x18/0x20 +[ 1.576629] request_threaded_irq+0xfe/0x160 +[ 1.576859] auto_attach+0x60a/0xc40 [cb_pcidas64] + +Suggested-by: Ian Abbott +Reviewed-by: Ian Abbott +Signed-off-by: Tong Zhang +Link: https://lore.kernel.org/r/20210315195814.4692-1-ztong0001@gmail.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/staging/comedi/drivers/cb_pcidas64.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/staging/comedi/drivers/cb_pcidas64.c b/drivers/staging/comedi/drivers/cb_pcidas64.c +index fa987bb0e7cd..6d3ba399a7f0 100644 +--- a/drivers/staging/comedi/drivers/cb_pcidas64.c ++++ b/drivers/staging/comedi/drivers/cb_pcidas64.c +@@ -4035,7 +4035,7 @@ static int auto_attach(struct comedi_device *dev, + init_stc_registers(dev); + + retval = request_irq(pcidev->irq, handle_interrupt, IRQF_SHARED, +- dev->board_name, dev); ++ "cb_pcidas64", dev); + if (retval) { + dev_dbg(dev->class_dev, "unable to allocate irq %u\n", + pcidev->irq); +-- +2.30.1 + diff --git a/queue-5.11/static_call-align-static_call_is_init-patching-condi.patch b/queue-5.11/static_call-align-static_call_is_init-patching-condi.patch new file mode 100644 index 00000000000..8c25dd321e7 --- /dev/null +++ b/queue-5.11/static_call-align-static_call_is_init-patching-condi.patch @@ -0,0 +1,69 @@ +From 9908f4147f3e693b0e3a0e4a3070094ea7837ad1 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 18 Mar 2021 11:29:56 +0100 +Subject: static_call: Align static_call_is_init() patching condition + +From: Peter Zijlstra + +[ Upstream commit 698bacefe993ad2922c9d3b1380591ad489355e9 ] + +The intent is to avoid writing init code after init (because the text +might have been freed). The code is needlessly different between +jump_label and static_call and not obviously correct. + +The existing code relies on the fact that the module loader clears the +init layout, such that within_module_init() always fails, while +jump_label relies on the module state which is more obvious and +matches the kernel logic. + +Signed-off-by: Peter Zijlstra (Intel) +Acked-by: Jarkko Sakkinen +Tested-by: Sumit Garg +Link: https://lkml.kernel.org/r/20210318113610.636651340@infradead.org +Signed-off-by: Sasha Levin +--- + kernel/static_call.c | 14 ++++---------- + 1 file changed, 4 insertions(+), 10 deletions(-) + +diff --git a/kernel/static_call.c b/kernel/static_call.c +index 49efbdc5b480..f59089a12231 100644 +--- a/kernel/static_call.c ++++ b/kernel/static_call.c +@@ -149,6 +149,7 @@ void __static_call_update(struct static_call_key *key, void *tramp, void *func) + }; + + for (site_mod = &first; site_mod; site_mod = site_mod->next) { ++ bool init = system_state < SYSTEM_RUNNING; + struct module *mod = site_mod->mod; + + if (!site_mod->sites) { +@@ -168,6 +169,7 @@ void __static_call_update(struct static_call_key *key, void *tramp, void *func) + if (mod) { + stop = mod->static_call_sites + + mod->num_static_call_sites; ++ init = mod->state == MODULE_STATE_COMING; + } + #endif + +@@ -175,16 +177,8 @@ void __static_call_update(struct static_call_key *key, void *tramp, void *func) + site < stop && static_call_key(site) == key; site++) { + void *site_addr = static_call_addr(site); + +- if (static_call_is_init(site)) { +- /* +- * Don't write to call sites which were in +- * initmem and have since been freed. +- */ +- if (!mod && system_state >= SYSTEM_RUNNING) +- continue; +- if (mod && !within_module_init((unsigned long)site_addr, mod)) +- continue; +- } ++ if (!init && static_call_is_init(site)) ++ continue; + + if (!kernel_text_address((unsigned long)site_addr)) { + /* +-- +2.30.1 + diff --git a/queue-5.11/thermal-core-add-null-pointer-check-before-using-coo.patch b/queue-5.11/thermal-core-add-null-pointer-check-before-using-coo.patch new file mode 100644 index 00000000000..35cb1546d52 --- /dev/null +++ b/queue-5.11/thermal-core-add-null-pointer-check-before-using-coo.patch @@ -0,0 +1,61 @@ +From ba60eee09e47c62ce7b7da7f9ec20af6640971a9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 8 Dec 2020 00:23:01 +0530 +Subject: thermal/core: Add NULL pointer check before using cooling device + stats + +From: Manaf Meethalavalappu Pallikunhi + +[ Upstream commit 2046a24ae121cd107929655a6aaf3b8c5beea01f ] + +There is a possible chance that some cooling device stats buffer +allocation fails due to very high cooling device max state value. +Later cooling device update sysfs can try to access stats data +for the same cooling device. It will lead to NULL pointer +dereference issue. + +Add a NULL pointer check before accessing thermal cooling device +stats data. It fixes the following bug + +[ 26.812833] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000004 +[ 27.122960] Call trace: +[ 27.122963] do_raw_spin_lock+0x18/0xe8 +[ 27.122966] _raw_spin_lock+0x24/0x30 +[ 27.128157] thermal_cooling_device_stats_update+0x24/0x98 +[ 27.128162] cur_state_store+0x88/0xb8 +[ 27.128166] dev_attr_store+0x40/0x58 +[ 27.128169] sysfs_kf_write+0x50/0x68 +[ 27.133358] kernfs_fop_write+0x12c/0x1c8 +[ 27.133362] __vfs_write+0x54/0x160 +[ 27.152297] vfs_write+0xcc/0x188 +[ 27.157132] ksys_write+0x78/0x108 +[ 27.162050] ksys_write+0xf8/0x108 +[ 27.166968] __arm_smccc_hvc+0x158/0x4b0 +[ 27.166973] __arm_smccc_hvc+0x9c/0x4b0 +[ 27.186005] el0_svc+0x8/0xc + +Signed-off-by: Manaf Meethalavalappu Pallikunhi +Signed-off-by: Daniel Lezcano +Link: https://lore.kernel.org/r/1607367181-24589-1-git-send-email-manafm@codeaurora.org +Signed-off-by: Sasha Levin +--- + drivers/thermal/thermal_sysfs.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/thermal/thermal_sysfs.c b/drivers/thermal/thermal_sysfs.c +index 0866e949339b..9b73532464e5 100644 +--- a/drivers/thermal/thermal_sysfs.c ++++ b/drivers/thermal/thermal_sysfs.c +@@ -754,6 +754,9 @@ void thermal_cooling_device_stats_update(struct thermal_cooling_device *cdev, + { + struct cooling_dev_stats *stats = cdev->stats; + ++ if (!stats) ++ return; ++ + spin_lock(&stats->lock); + + if (stats->state == new_state) +-- +2.30.1 + diff --git a/queue-5.11/vhost-fix-vhost_vq_reset.patch b/queue-5.11/vhost-fix-vhost_vq_reset.patch new file mode 100644 index 00000000000..e4d76b870f4 --- /dev/null +++ b/queue-5.11/vhost-fix-vhost_vq_reset.patch @@ -0,0 +1,49 @@ +From ff45579ac52622440c8f05d2804d343deacf31a2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 12 Mar 2021 15:09:13 +0100 +Subject: vhost: Fix vhost_vq_reset() + +From: Laurent Vivier + +[ Upstream commit beb691e69f4dec7bfe8b81b509848acfd1f0dbf9 ] + +vhost_reset_is_le() is vhost_init_is_le(), and in the case of +cross-endian legacy, vhost_init_is_le() depends on vq->user_be. + +vq->user_be is set by vhost_disable_cross_endian(). + +But in vhost_vq_reset(), we have: + + vhost_reset_is_le(vq); + vhost_disable_cross_endian(vq); + +And so user_be is used before being set. + +To fix that, reverse the lines order as there is no other dependency +between them. + +Signed-off-by: Laurent Vivier +Link: https://lore.kernel.org/r/20210312140913.788592-1-lvivier@redhat.com +Signed-off-by: Michael S. Tsirkin +Signed-off-by: Sasha Levin +--- + drivers/vhost/vhost.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c +index a262e12c6dc2..5ccb0705beae 100644 +--- a/drivers/vhost/vhost.c ++++ b/drivers/vhost/vhost.c +@@ -332,8 +332,8 @@ static void vhost_vq_reset(struct vhost_dev *dev, + vq->error_ctx = NULL; + vq->kick = NULL; + vq->log_ctx = NULL; +- vhost_reset_is_le(vq); + vhost_disable_cross_endian(vq); ++ vhost_reset_is_le(vq); + vq->busyloop_timeout = 0; + vq->umem = NULL; + vq->iotlb = NULL; +-- +2.30.1 + diff --git a/queue-5.11/virtiofs-fail-dax-mount-if-device-does-not-support-i.patch b/queue-5.11/virtiofs-fail-dax-mount-if-device-does-not-support-i.patch new file mode 100644 index 00000000000..4d8c71c942d --- /dev/null +++ b/queue-5.11/virtiofs-fail-dax-mount-if-device-does-not-support-i.patch @@ -0,0 +1,51 @@ +From a8ec9a2d41c9bd42bb974a57f01c199f2f7be174 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 9 Feb 2021 17:47:54 -0500 +Subject: virtiofs: Fail dax mount if device does not support it + +From: Vivek Goyal + +[ Upstream commit 3f9b9efd82a84f27e95d0414f852caf1fa839e83 ] + +Right now "mount -t virtiofs -o dax myfs /mnt/virtiofs" succeeds even +if filesystem deivce does not have a cache window and hence DAX can't +be supported. + +This gives a false sense to user that they are using DAX with virtiofs +but fact of the matter is that they are not. + +Fix this by returning error if dax can't be supported and user has asked +for it. + +Signed-off-by: Vivek Goyal +Reviewed-by: Stefan Hajnoczi +Signed-off-by: Miklos Szeredi +Signed-off-by: Sasha Levin +--- + fs/fuse/virtio_fs.c | 9 ++++++++- + 1 file changed, 8 insertions(+), 1 deletion(-) + +diff --git a/fs/fuse/virtio_fs.c b/fs/fuse/virtio_fs.c +index 8868ac31a3c0..4ee6f734ba83 100644 +--- a/fs/fuse/virtio_fs.c ++++ b/fs/fuse/virtio_fs.c +@@ -1324,8 +1324,15 @@ static int virtio_fs_fill_super(struct super_block *sb, struct fs_context *fsc) + + /* virtiofs allocates and installs its own fuse devices */ + ctx->fudptr = NULL; +- if (ctx->dax) ++ if (ctx->dax) { ++ if (!fs->dax_dev) { ++ err = -EINVAL; ++ pr_err("virtio-fs: dax can't be enabled as filesystem" ++ " device does not support it.\n"); ++ goto err_free_fuse_devs; ++ } + ctx->dax_dev = fs->dax_dev; ++ } + err = fuse_fill_super_common(sb, ctx); + if (err < 0) + goto err_free_fuse_devs; +-- +2.30.1 +