5.4.73-rc1 review
Subsystems (2)
Greg Kroah-Hartman
maintainerPATCH 168/408 ASoC: fsl_sai: Instantiate snd_soc_dai_driver
In reply to Greg Kroah-HartmanFrom: Shengjiu Wang <[email protected]>
[ Upstream commit 22a16145af824f91014d07f8664114859900b9e6 ]
Instantiate snd_soc_dai_driver for independent symmetric control. Otherwise the symmetric setting may be overwritten by other instance.
--- sound/soc/fsl/fsl_sai.c | 19 +++++++++++-------- sound/soc/fsl/fsl_sai.h | 1 + 2 files changed, 12 insertions(+), 8 deletions(-)
sound/soc/fsl/fsl_sai.c +11 -8
@@ -694,7 +694,7 @@ static int fsl_sai_dai_probe(struct snd_soc_dai *cpu_dai)return 0 ; } -static struct snd_soc_dai_driver fsl_sai_dai = { +static struct snd_soc_dai_driver fsl_sai_dai_template = { .probe = fsl_sai_dai_probe, .playback = { .stream_name ="CPU-Playback" ,
@@ -965,12 +965,15 @@ static int fsl_sai_probe(struct platform_device *pdev)return ret; } +memcpy (&sai->cpu_dai_drv, &fsl_sai_dai_template, +sizeof (fsl_sai_dai_template)); +/* Sync Tx with Rx as default by following old DT binding */ sai->synchronous[RX ] = true; sai->synchronous[TX ] = false; - fsl_sai_dai.symmetric_rates =1 ; - fsl_sai_dai.symmetric_channels =1 ; - fsl_sai_dai.symmetric_samplebits =1 ; + sai->cpu_dai_drv.symmetric_rates =1 ; + sai->cpu_dai_drv.symmetric_channels =1 ; + sai->cpu_dai_drv.symmetric_samplebits =1 ;if (of_find_property (np,"fsl,sai-synchronous-rx" ,NULL ) &&of_find_property (np,"fsl,sai-asynchronous" ,NULL )) {
@@ -987,9 +990,9 @@ static int fsl_sai_probe(struct platform_device *pdev)/* Discard all settings for asynchronous mode */ sai->synchronous[RX ] = false; sai->synchronous[TX ] = false; - fsl_sai_dai.symmetric_rates =0 ; - fsl_sai_dai.symmetric_channels =0 ; - fsl_sai_dai.symmetric_samplebits =0 ; + sai->cpu_dai_drv.symmetric_rates =0 ; + sai->cpu_dai_drv.symmetric_channels =0 ; + sai->cpu_dai_drv.symmetric_samplebits =0 ; } if (of_find_property(np, "fsl,sai-mclk-direction-output", NULL) &&
@@ -1018,7 +1021,7 @@ static int fsl_sai_probe(struct platform_device *pdev)pm_runtime_enable (&pdev->dev); ret =devm_snd_soc_register_component (&pdev->dev, &fsl_component, - &fsl_sai_dai,1 ); + &sai->cpu_dai_drv,1 );if (ret) goto err_pm_disable;
sound/soc/fsl/fsl_sai.h +1 -0
@@ -180,6 +180,7 @@ struct fsl_sai {unsigned int bclk_ratio;const struct fsl_sai_soc_data *soc_data; +struct snd_soc_dai_driver cpu_dai_drv;struct snd_dmaengine_dai_dma_data dma_params_rx;struct snd_dmaengine_dai_dma_data dma_params_tx; };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 169/408 HID: hid-input: fix stylus battery reporting
In reply to Greg Kroah-HartmanFrom: Dmitry Torokhov <[email protected]>
[ Upstream commit 505f394fa239cecb76d916aa858f87ed7ea7fde4 ]
With commit 4f3882177240 hid-input started clearing of "ignored" usages to avoid using garbage that might have been left in them. However "battery strength" usages should not be ignored, as we do want to use them.
--- drivers/hid/hid-input.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hid/hid-input.c +2 -2
@@ -797,7 +797,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase 0x3b :/* Battery Strength */ hidinput_setup_battery (device,HID_INPUT_REPORT , field); usage->type =EV_PWR ; - goto ignore; +return ;case 0x3c :/* Invert */ map_key_clear (BTN_TOOL_RUBBER );
@@ -1059,7 +1059,7 @@ static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_fielcase HID_DC_BATTERYSTRENGTH :hidinput_setup_battery (device,HID_INPUT_REPORT , field); usage->type =EV_PWR ; - goto ignore; +return ; } goto unknown;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 170/408 nvmem: core: fix possibly memleak when use nvmem_cell_info_to_nvmem_cell()
In reply to Greg Kroah-HartmanFrom: Vadym Kochan <[email protected]>
[ Upstream commit fc9eec4d643597cf4cb2fef17d48110e677610da ]
Fix missing 'kfree_const(cell->name)' when call to nvmem_cell_info_to_nvmem_cell() in several places:
* after nvmem_cell_info_to_nvmem_cell() failed during nvmem_add_cells()
* during nvmem_device_cell_{read,write} when cell->name is kstrdup'ed() without calling kfree_const() at the end, but really there is no reason to do that 'dup, because the cell instance is allocated on the stack for some short period to be read/write without exposing it to the caller.
So the new nvmem_cell_info_to_nvmem_cell_nodup() helper is introduced which is used to convert cell_info -> cell without name duplication as a lighweight version of nvmem_cell_info_to_nvmem_cell().
--- drivers/nvmem/core.c | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-)
drivers/nvmem/core.c +24 -9
@@ -130,16 +130,14 @@ static void nvmem_cell_add(struct nvmem_cell *cell)blocking_notifier_call_chain (&nvmem_notifier,NVMEM_CELL_ADD , cell); } -static int nvmem_cell_info_to_nvmem_cell (struct nvmem_device *nvmem, -const struct nvmem_cell_info *info, -struct nvmem_cell *cell) +static int nvmem_cell_info_to_nvmem_cell_nodup (struct nvmem_device *nvmem, +const struct nvmem_cell_info *info, +struct nvmem_cell *cell) { cell->nvmem = nvmem; cell->offset = info->offset; cell->bytes = info->bytes; - cell->name =kstrdup_const (info->name,GFP_KERNEL ); -if (!cell->name) -return -ENOMEM ; + cell->name = info->name; cell->bit_offset = info->bit_offset; cell->nbits = info->nbits;
@@ -151,13 +149,30 @@ static int nvmem_cell_info_to_nvmem_cell(struct nvmem_device *nvmem,if (!IS_ALIGNED (cell->offset, nvmem->stride)) {dev_err (&nvmem->dev,"cell %s unaligned to nvmem stride %d\n" , - cell->name, nvmem->stride); + cell->name ?:"<unknown>" , nvmem->stride);return -EINVAL ; }return 0 ; } +static int nvmem_cell_info_to_nvmem_cell (struct nvmem_device *nvmem, +const struct nvmem_cell_info *info, +struct nvmem_cell *cell) +{ +int err; + + err =nvmem_cell_info_to_nvmem_cell_nodup (nvmem, info, cell); +if (err) +return err; + + cell->name =kstrdup_const (info->name,GFP_KERNEL ); +if (!cell->name) +return -ENOMEM ; + +return 0 ; +} +/** * nvmem_add_cells() - Add cell information to an nvmem device *
@@ -1174,7 +1189,7 @@ ssize_t nvmem_device_cell_read(struct nvmem_device *nvmem,if (!nvmem)return -EINVAL ; - rc =nvmem_cell_info_to_nvmem_cell (nvmem, info, &cell); + rc =nvmem_cell_info_to_nvmem_cell_nodup (nvmem, info, &cell);if (rc)return rc;
@@ -1204,7 +1219,7 @@ int nvmem_device_cell_write(struct nvmem_device *nvmem,if (!nvmem)return -EINVAL ; - rc =nvmem_cell_info_to_nvmem_cell (nvmem, info, &cell); + rc =nvmem_cell_info_to_nvmem_cell_nodup (nvmem, info, &cell);if (rc)return rc;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 171/408 nl80211: fix OBSS PD min and max offset validation
In reply to Greg Kroah-HartmanFrom: Rajkumar Manoharan <[email protected]>
[ Upstream commit 6c8b6e4a5f745ec49286ac0a3f1d591a34818f82 ]
The SRG min and max offset won't present when SRG Information Present of SR control field of Spatial Reuse Parameter Set element set to 0. Per spec. IEEE802.11ax D7.0, SRG OBSS PD Min Offset ≤ SRG OBSS PD Max Offset. Hence fix the constrain check to allow same values in both offset and also call appropriate nla_get function to read the values.
--- net/wireless/nl80211.c | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-)
net/wireless/nl80211.c +8 -10
@@ -4496,16 +4496,14 @@ static int nl80211_parse_he_obss_pd(struct nlattr *attrs,if (err)return err; -if (!tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET ] || - !tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET ]) -return -EINVAL ; - - he_obss_pd->min_offset = -nla_get_u32 (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET ]); - he_obss_pd->max_offset = -nla_get_u32 (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET ]); - -if (he_obss_pd->min_offset >= he_obss_pd->max_offset) +if (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET ]) + he_obss_pd->min_offset = +nla_get_u8 (tb[NL80211_HE_OBSS_PD_ATTR_MIN_OFFSET ]); +if (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET ]) + he_obss_pd->max_offset = +nla_get_u8 (tb[NL80211_HE_OBSS_PD_ATTR_MAX_OFFSET ]); + +if (he_obss_pd->min_offset > he_obss_pd->max_offset)return -EINVAL ; he_obss_pd->enable = true;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 172/408 coresight: etm: perf: Fix warning caused by etm_setup_aux failure
In reply to Greg Kroah-HartmanFrom: Tingwei Zhang <[email protected]>
[ Upstream commit 716f5652a13122364a65e694386b9b26f5e98c51 ]
When coresight_build_path() fails on all the cpus, etm_setup_aux calls etm_free_aux() to free allocated event_data. WARN_ON(cpumask_empty(mask) will be triggered since cpu mask is empty. Check event_data->snk_config is not NULL first to avoid this warning.
--- drivers/hwtracing/coresight/coresight-etm-perf.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm-perf.c +2 -2
@@ -126,10 +126,10 @@ static void free_sink_buffer(struct etm_event_data *event_data)cpumask_t *mask = &event_data->mask;struct coresight_device *sink; -if (WARN_ON (cpumask_empty (mask))) +if (!event_data->snk_config)return ; -if (!event_data->snk_config) +if (WARN_ON (cpumask_empty (mask)))return ; cpu =cpumask_first (mask);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 173/408 ibmvnic: set up 200GBPS speed
In reply to Greg Kroah-HartmanFrom: Lijun Pan <[email protected]>
[ Upstream commit b9cd795b0e4860f482bf3741d12e1c8f3ec1cfc9 ]
Set up the speed according to crq->query_phys_parms.rsp.speed. Fix IBMVNIC_10GBPS typo.
--- drivers/net/ethernet/ibm/ibmvnic.c | 5 ++++- drivers/net/ethernet/ibm/ibmvnic.h | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-)
drivers/net/ethernet/ibm/ibmvnic.c +4 -1
@@ -4477,7 +4477,7 @@ static int handle_query_phys_parms_rsp(union ibmvnic_crq *crq,case IBMVNIC_1GBPS : adapter->speed =SPEED_1000 ;break ; -case IBMVNIC_10GBP : +case IBMVNIC_10GBPS : adapter->speed =SPEED_10000 ;break ;case IBMVNIC_25GBPS :
@@ -4492,6 +4492,9 @@ static int handle_query_phys_parms_rsp(union ibmvnic_crq *crq,case IBMVNIC_100GBPS : adapter->speed =SPEED_100000 ;break ; +case IBMVNIC_200GBPS : + adapter->speed =SPEED_200000 ; +break ;default :if (netif_carrier_ok (netdev))netdev_warn (netdev,"Unknown speed 0x%08x\n" , rspeed);
drivers/net/ethernet/ibm/ibmvnic.h +1 -1
@@ -373,7 +373,7 @@ struct ibmvnic_phys_parms {#define IBMVNIC_10MBPS 0x40000000#define IBMVNIC_100MBPS 0x20000000#define IBMVNIC_1GBPS 0x10000000 -#define IBMVNIC_10GBP 0x08000000 +#define IBMVNIC_10GBPS 0x08000000#define IBMVNIC_40GBPS 0x04000000#define IBMVNIC_100GBPS 0x02000000#define IBMVNIC_25GBPS 0x01000000
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 174/408 qtnfmac: fix resource leaks on unsupported iftype error return path
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 63f6982075d890d7563e2469643f05a37d193f01 ]
Currently if an unsupported iftype is detected the error return path does not free the cmd_skb leading to a resource leak. Fix this by free'ing cmd_skb.
Addresses-Coverity: ("Resource leak")
--- drivers/net/wireless/quantenna/qtnfmac/commands.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/quantenna/qtnfmac/commands.c +2 -0
@@ -834,6 +834,7 @@ int qtnf_cmd_send_del_intf(struct qtnf_vif *vif)default :pr_warn ("VIF%u.%u: unsupported iftype %d\n" , vif->mac->macid, vif->vifid, vif->wdev.iftype); +dev_kfree_skb (cmd_skb); ret = -EINVAL ; goto out; }
@@ -1996,6 +1997,7 @@ int qtnf_cmd_send_change_sta(struct qtnf_vif *vif, const u8 *mac,break ;default :pr_err ("unsupported iftype %d\n" , vif->wdev.iftype); +dev_kfree_skb (cmd_skb); ret = -EINVAL ; goto out; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 175/408 iio: adc: stm32-adc: fix runtime autosuspend delay when slow polling
In reply to Greg Kroah-HartmanFrom: Fabrice Gasnier <[email protected]>
[ Upstream commit c537d3457542a398caa1fe58e0976c5f83cf7281 ]
When the ADC is runtime suspended and starting a conversion, the stm32-adc driver calls pm_runtime_get_sync() that gets cascaded to the parent (e.g. runtime resume of stm32-adc-core driver). This also kicks the autosuspend delay (e.g. 2s) of the parent.
Once the ADC is active, calling pm_runtime_get_sync() again (upon a new capture) won't kick the autosuspend delay for the parent (stm32-adc-core driver) as already active.
Currently, this makes the stm32-adc-core driver go in suspend state every 2s when doing slow polling. As an example, doing a capture, e.g. cat in_voltageY_raw at a 0.2s rate, the auto suspend delay for the parent isn't refreshed. Once it expires, the parent immediately falls into runtime suspended state, in between two captures, as soon as the child driver falls into runtime suspend state:
- e.g. after 2s, + child calls pm_runtime_put_autosuspend() + 100ms autosuspend delay of the child.
- stm32-adc-core switches off regulators, clocks and so on.
- They get switched on back again 100ms later in this example (at 2.2s).
So, use runtime_idle() callback in stm32-adc-core driver to call pm_runtime_mark_last_busy() for the parent driver (stm32-adc-core), to avoid this.
--- drivers/iio/adc/stm32-adc-core.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/iio/adc/stm32-adc-core.c +8 -1
@@ -780,6 +780,13 @@ static int stm32_adc_core_runtime_resume(struct device *dev) {return stm32_adc_core_hw_start (dev); } + +static int stm32_adc_core_runtime_idle (struct device *dev) +{ +pm_runtime_mark_last_busy (dev); + +return 0 ; +}#endif static const struct dev_pm_ops stm32_adc_core_pm_ops = {
@@ -787,7 +794,7 @@ static const struct dev_pm_ops stm32_adc_core_pm_ops = { pm_runtime_force_resume) SET_RUNTIME_PM_OPS(stm32_adc_core_runtime_suspend, stm32_adc_core_runtime_resume, - NULL) + stm32_adc_core_runtime_idle) }; static const struct stm32_adc_priv_cfg stm32f4_adc_priv_cfg = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 176/408 net: enic: Cure the enic api locking trainwreck
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit a53b59ece86c86d16d12ccdaa1ad0c78250a9d96 ]
enic_dev_wait() has a BUG_ON(in_interrupt()).
Chasing the callers of enic_dev_wait() revealed the gems of enic_reset() and enic_tx_hang_reset() which are both invoked through work queues in order to be able to call rtnl_lock(). So far so good.
After locking rtnl both functions acquire enic::enic_api_lock which serializes against the (ab)use from infiniband. This is where the trainwreck starts.
enic::enic_api_lock is a spin_lock() which implicitly disables preemption, but both functions invoke a ton of functions under that lock which can sleep. The BUG_ON(in_interrupt()) does not trigger in that case because it can't detect the preempt disabled condition.
This clearly has never been tested with any of the mandatory debug options for 7+ years, which would have caught that for sure.
Cure it by adding a enic_api_busy member to struct enic, which is modified and evaluated with enic::enic_api_lock held.
If enic_api_devcmd_proxy_by_index() observes enic::enic_api_busy as true, it drops enic::enic_api_lock and busy waits for enic::enic_api_busy to become false.
It would be smarter to wait for a completion of that busy period, but enic_api_devcmd_proxy_by_index() is called with other spin locks held which obviously can't sleep.
Remove the BUG_ON(in_interrupt()) check as well because it's incomplete and with proper debugging enabled the problem would have been caught from the debug checks in schedule_timeout().
--- drivers/net/ethernet/cisco/enic/enic.h | 1 + drivers/net/ethernet/cisco/enic/enic_api.c | 6 +++++ drivers/net/ethernet/cisco/enic/enic_main.c | 27 ++++++++++++++++----- 3 files changed, 28 insertions(+), 6 deletions(-)
drivers/net/ethernet/cisco/enic/enic.h +1 -0
@@ -171,6 +171,7 @@ struct enic {u16 num_vfs;#endif spinlock_t enic_api_lock; +bool enic_api_busy;struct enic_port_profile *pp;/* work queue cache line section */
drivers/net/ethernet/cisco/enic/enic_api.c +6 -0
@@ -34,6 +34,12 @@ int enic_api_devcmd_proxy_by_index(struct net_device *netdev, int vf,struct vnic_dev *vdev = enic->vdev;spin_lock (&enic->enic_api_lock); +while (enic->enic_api_busy) { +spin_unlock (&enic->enic_api_lock); +cpu_relax (); +spin_lock (&enic->enic_api_lock); + } +spin_lock_bh (&enic->devcmd_lock);vnic_dev_cmd_proxy_by_index_start (vdev, vf);
drivers/net/ethernet/cisco/enic/enic_main.c +21 -6
@@ -2142,8 +2142,6 @@ static int enic_dev_wait(struct vnic_dev *vdev,int done;int err; -BUG_ON (in_interrupt ()); - err =start (vdev, arg);if (err)return err;
@@ -2331,6 +2329,13 @@ static int enic_set_rss_nic_cfg(struct enic *enic) rss_hash_bits, rss_base_cpu, rss_enable); } +static void enic_set_api_busy (struct enic *enic,bool busy) +{ +spin_lock (&enic->enic_api_lock); + enic->enic_api_busy = busy; +spin_unlock (&enic->enic_api_lock); +} +static void enic_reset (struct work_struct *work) { struct enic *enic = container_of(work, struct enic, reset);
@@ -2340,7 +2345,9 @@ static void enic_reset(struct work_struct *work)rtnl_lock (); -spin_lock (&enic->enic_api_lock); +/* Stop any activity from infiniband */ +enic_set_api_busy (enic, true); +enic_stop (enic->netdev);enic_dev_soft_reset (enic);enic_reset_addr_lists (enic);
@@ -2348,7 +2355,10 @@ static void enic_reset(struct work_struct *work)enic_set_rss_nic_cfg (enic);enic_dev_set_ig_vlan_rewrite_mode (enic);enic_open (enic->netdev); -spin_unlock (&enic->enic_api_lock); + +/* Allow infiniband to fiddle with the device again */ +enic_set_api_busy (enic, false); +call_netdevice_notifiers (NETDEV_REBOOT , enic->netdev);rtnl_unlock ();
@@ -2360,7 +2370,9 @@ static void enic_tx_hang_reset(struct work_struct *work)rtnl_lock (); -spin_lock (&enic->enic_api_lock); +/* Stop any activity from infiniband */ +enic_set_api_busy (enic, true); +enic_dev_hang_notify (enic);enic_stop (enic->netdev);enic_dev_hang_reset (enic);
@@ -2369,7 +2381,10 @@ static void enic_tx_hang_reset(struct work_struct *work)enic_set_rss_nic_cfg (enic);enic_dev_set_ig_vlan_rewrite_mode (enic);enic_open (enic->netdev); -spin_unlock (&enic->enic_api_lock); + +/* Allow infiniband to fiddle with the device again */ +enic_set_api_busy (enic, false); +call_netdevice_notifiers (NETDEV_REBOOT , enic->netdev);rtnl_unlock ();
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 177/408 mfd: sm501: Fix leaks in probe()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 8ce24f8967df2836b4557a23e74dc4bb098249f1 ]
This code should clean up if sm501_init_dev() fails.
--- drivers/mfd/sm501.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/mfd/sm501.c +7 -1
@@ -1424,8 +1424,14 @@ static int sm501_plat_probe(struct platform_device *dev) goto err_claim; } -return sm501_init_dev (sm); + ret =sm501_init_dev (sm); +if (ret) + goto err_unmap; + +return 0 ; + err_unmap: +iounmap (sm->regs); err_claim:release_resource (sm->regs_claim);kfree (sm->regs_claim);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 178/408 iwlwifi: mvm: split a print to avoid a WARNING in ROC
In reply to Greg Kroah-HartmanFrom: Emmanuel Grumbach <[email protected]>
[ Upstream commit 903b3f9badf1d54f77b468b96706dab679b45b14 ]
A print in the remain on channel code was too long and caused a WARNING, split it.
--- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +6 -3
@@ -3650,9 +3650,12 @@ static int iwl_mvm_send_aux_roc_cmd(struct iwl_mvm *mvm, tail->apply_time_max_delay =cpu_to_le32 (delay);IWL_DEBUG_TE (mvm, -"ROC: Requesting to remain on channel %u for %ums (requested = %ums, max_delay = %ums, dtim_interval = %ums)\n" , - channel->hw_value, req_dur, duration, delay, - dtim_interval); +"ROC: Requesting to remain on channel %u for %ums\n" , + channel->hw_value, req_dur); +IWL_DEBUG_TE (mvm, +"\t(requested = %ums, max_delay = %ums, dtim_interval = %ums)\n" , + duration, delay, dtim_interval); +/* Set the node address */ memcpy (tail->node_addr, vif->addr,ETH_ALEN );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 179/408 usb: gadget: f_ncm: fix ncm_bitrate for SuperSpeed and above.
In reply to Greg Kroah-HartmanFrom: Lorenzo Colitti <[email protected]>
[ Upstream commit 986499b1569af980a819817f17238015b27793f6 ]
Currently, SuperSpeed NCM gadgets report a speed of 851 Mbps in USB_CDC_NOTIFY_SPEED_CHANGE. But the calculation appears to assume 16 packets per microframe, and USB 3 and above no longer use microframes.
Maximum speed is actually much higher. On a direct connection, theoretical throughput is at most 3.86 Gbps for gen1x1 and 9.36 Gbps for gen2x1, and I have seen gadget->host iperf throughput of >2 Gbps for gen1x1 and >4 Gbps for gen2x1.
Unfortunately the ConnectionSpeedChange defined in the CDC spec only uses 32-bit values, so we can't report accurate numbers for 10Gbps and above. So, report 3.75Gbps for SuperSpeed (which is roughly maximum theoretical performance) and 4.25Gbps for SuperSpeed Plus (which is close to the maximum that we can report in a 32-bit unsigned integer).
This results in:
[50879.191272] cdc_ncm 2-2:1.0 enx228b127e050c: renamed from usb0 [50879.234778] cdc_ncm 2-2:1.0 enx228b127e050c: 3750 mbit/s downlink 3750 mbit/s uplink
on SuperSpeed and:
[50798.434527] cdc_ncm 8-2:1.0 enx228b127e050c: renamed from usb0 [50798.524278] cdc_ncm 8-2:1.0 enx228b127e050c: 4250 mbit/s downlink 4250 mbit/s uplink
on SuperSpeed Plus.
--- drivers/usb/gadget/function/f_ncm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/usb/gadget/function/f_ncm.c +4 -2
@@ -85,8 +85,10 @@ static inline struct f_ncm *func_to_ncm(struct usb_function *f)/* peak (theoretical) bulk transfer rate in bits-per-second */ static inline unsigned ncm_bitrate (struct usb_gadget *g) { -if (gadget_is_superspeed (g) && g->speed ==USB_SPEED_SUPER ) -return 13 *1024 *8 *1000 *8 ; +if (gadget_is_superspeed (g) && g->speed >=USB_SPEED_SUPER_PLUS ) +return 4250000000U ; +else if (gadget_is_superspeed (g) && g->speed ==USB_SPEED_SUPER ) +return 3750000000U ;else if (gadget_is_dualspeed (g) && g->speed ==USB_SPEED_HIGH )return 13 *512 *8 *1000 *8 ;else
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 180/408 usb: gadget: u_ether: enable qmult on SuperSpeed Plus as well
In reply to Greg Kroah-HartmanFrom: Lorenzo Colitti <[email protected]>
[ Upstream commit 4eea21dc67b0c6ba15ae41b1defa113a680a858e ]
The u_ether driver has a qmult setting that multiplies the transmit queue length (which by default is 2).
The intent is that it should be enabled at high/super speed, but because the code does not explicitly check for USB_SUPER_PLUS, it is disabled at that speed.
Fix this by ensuring that the queue multiplier is enabled for any wired link at high speed or above. Using >= for USB_SPEED_* constants seems correct because it is what the gadget_is_xxxspeed functions do.
The queue multiplier substantially helps performance at higher speeds. On a direct SuperSpeed Plus link to a Linux laptop, iperf3 single TCP stream:
Before (qmult=1): 1.3 Gbps
After (qmult=5): 3.2 Gbps
--- drivers/usb/gadget/function/u_ether.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/gadget/function/u_ether.c +1 -1
@@ -93,7 +93,7 @@ struct eth_dev {static inline int qlen (struct usb_gadget *gadget,unsigned qmult) {if (gadget_is_dualspeed (gadget) && (gadget->speed ==USB_SPEED_HIGH || - gadget->speed ==USB_SPEED_SUPER )) + gadget->speed >=USB_SPEED_SUPER ))return qmult *DEFAULT_QLEN ;else return DEFAULT_QLEN ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 181/408 nl80211: fix non-split wiphy information
In reply to Greg Kroah-HartmanFrom: Johannes Berg <[email protected]>
[ Upstream commit ab10c22bc3b2024f0c9eafa463899a071eac8d97 ]
When dumping wiphy information, we try to split the data into many submessages, but for old userspace we still support the old mode where this doesn't happen.
However, in this case we were not resetting our state correctly and dumping multiple messages for each wiphy, which would have broken such older userspace.
This was broken pretty much immediately afterwards because it only worked in the original commit where non-split dumps didn't have any more data than split dumps...
--- net/wireless/nl80211.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
net/wireless/nl80211.c +4 -1
@@ -2227,7 +2227,10 @@ static int nl80211_send_wiphy(struct cfg80211_registered_device *rdev,* case we'll continue with more data in the next round, * but break unconditionally so unsplit data stops here. */ - state->split_start++; +if (state->split) + state->split_start++; +else + state->split_start =0 ;break ;case 9 : if (rdev->wiphy.extended_capabilities &&
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 182/408 usb: dwc2: Fix INTR OUT transfers in DDMA mode.
In reply to Greg Kroah-HartmanFrom: Minas Harutyunyan <[email protected]>
[ Upstream commit b2c586eb07efab982419f32b7c3bd96829bc8bcd ]
In DDMA mode if INTR OUT transfers mps not multiple of 4 then single packet corresponds to single descriptor.
Descriptor limit set to mps and desc chain limit set to mps * MAX_DMA_DESC_NUM_GENERIC. On that descriptors complete, to calculate transfer size should be considered correction value for each descriptor.
In start request function, if "continue" is true then dma buffer address should be incremmented by offset for all type of transfers, not only for Control DATA_OUT transfers.
--- drivers/usb/dwc2/gadget.c | 40 ++++++++++++++++++++++++++++++++------- 1 file changed, 33 insertions(+), 7 deletions(-)
drivers/usb/dwc2/gadget.c +33 -7
@@ -712,8 +712,11 @@ static u32 dwc2_hsotg_read_frameno(struct dwc2_hsotg *hsotg)*/ static unsigned int dwc2_gadget_get_chain_limit (struct dwc2_hsotg_ep *hs_ep) { +const struct usb_endpoint_descriptor *ep_desc = hs_ep->ep.desc;int is_isoc = hs_ep->isochronous;unsigned int maxsize; +u32 mps = hs_ep->ep.maxpacket; +int dir_in = hs_ep->dir_in;if (is_isoc) maxsize = (hs_ep->dir_in ? DEV_DMA_ISOC_TX_NBYTES_LIMIT :
@@ -722,6 +725,11 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep)else maxsize =DEV_DMA_NBYTES_LIMIT *MAX_DMA_DESC_NUM_GENERIC ; +/* Interrupt OUT EP with mps not multiple of 4 */ +if (hs_ep->index) +if (usb_endpoint_xfer_int (ep_desc) && !dir_in && (mps %4 )) + maxsize = mps *MAX_DMA_DESC_NUM_GENERIC ; +return maxsize; }
@@ -737,11 +745,14 @@ static unsigned int dwc2_gadget_get_chain_limit(struct dwc2_hsotg_ep *hs_ep)* Isochronous - descriptor rx/tx bytes bitfield limit, * Control In/Bulk/Interrupt - multiple of mps. This will allow to not * have concatenations from various descriptors within one packet. +* Interrupt OUT - if mps not multiple of 4 then a single packet corresponds +* to a single descriptor. * * Selects corresponding mask for RX/TX bytes as well. */ static u32 dwc2_gadget_get_desc_params (struct dwc2_hsotg_ep *hs_ep,u32 *mask) { +const struct usb_endpoint_descriptor *ep_desc = hs_ep->ep.desc;u32 mps = hs_ep->ep.maxpacket;int dir_in = hs_ep->dir_in;u32 desc_size =0 ;
@@ -765,6 +776,13 @@ static u32 dwc2_gadget_get_desc_params(struct dwc2_hsotg_ep *hs_ep, u32 *mask) desc_size -= desc_size % mps; } +/* Interrupt OUT EP with mps not multiple of 4 */ +if (hs_ep->index) +if (usb_endpoint_xfer_int (ep_desc) && !dir_in && (mps %4 )) { + desc_size = mps; + *mask =DEV_DMA_NBYTES_MASK ; + } +return desc_size; }
@@ -1123,13 +1141,7 @@ static void dwc2_hsotg_start_req(struct dwc2_hsotg *hsotg, length += (mps - (length % mps)); } -/* -* If more data to send, adjust DMA for EP0 out data stage. -* ureq->dma stays unchanged, hence increment it by already -* passed passed data count before starting new transaction. -*/ -if (!index && hsotg->ep0_state ==DWC2_EP0_DATA_OUT && - continuing) +if (continuing) offset = ureq->actual;/* Fill DDMA chain entries */
@@ -2319,22 +2331,36 @@ static void dwc2_hsotg_change_ep_iso_parity(struct dwc2_hsotg *hsotg,*/ static unsigned int dwc2_gadget_get_xfersize_ddma (struct dwc2_hsotg_ep *hs_ep) { +const struct usb_endpoint_descriptor *ep_desc = hs_ep->ep.desc;struct dwc2_hsotg *hsotg = hs_ep->parent;unsigned int bytes_rem =0 ; +unsigned int bytes_rem_correction =0 ;struct dwc2_dma_desc *desc = hs_ep->desc_list;int i;u32 status; +u32 mps = hs_ep->ep.maxpacket; +int dir_in = hs_ep->dir_in;if (!desc)return -EINVAL ; +/* Interrupt OUT EP with mps not multiple of 4 */ +if (hs_ep->index) +if (usb_endpoint_xfer_int (ep_desc) && !dir_in && (mps %4 )) + bytes_rem_correction =4 - (mps %4 ); +for (i =0 ; i < hs_ep->desc_count; ++i) { status = desc->status; bytes_rem += status &DEV_DMA_NBYTES_MASK ; + bytes_rem -= bytes_rem_correction;if (status &DEV_DMA_STS_MASK )dev_err (hsotg->dev,"descriptor %d closed with %x\n" , i, status &DEV_DMA_STS_MASK ); + +if (status &DEV_DMA_L ) +break ; + desc++; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 183/408 scsi: target: tcmu: Fix warning: page may be used uninitialized
In reply to Greg Kroah-HartmanFrom: John Donnelly <[email protected]>
[ Upstream commit 61741d8699e1fc764a309ebd20211bb1cb193110 ]
Corrects drivers/target/target_core_user.c:688:6: warning: 'page' may be used uninitialized.
--- drivers/target/target_core_user.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/target/target_core_user.c +1 -1
@@ -669,7 +669,7 @@ static void scatter_data_area(struct tcmu_dev *udev,void *from, *to =NULL ;size_t copy_bytes, to_offset, offset;struct scatterlist *sg; -struct page *page; +struct page *page =NULL ;for_each_sg (data_sg, sg, data_nents, i) {int sg_remaining = sg->length;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 184/408 scsi: be2iscsi: Fix a theoretical leak in beiscsi_create_eqs()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 38b2db564d9ab7797192ef15d7aade30633ceeae ]
The be_fill_queue() function can only fail when "eq_vaddress" is NULL and since it's non-NULL here that means the function call can't fail. But imagine if it could, then in that situation we would want to store the "paddr" so that dma memory can be released.
--- drivers/scsi/be2iscsi/be_main.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/be2iscsi/be_main.c +2 -2
@@ -3020,6 +3020,7 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba, goto create_eq_error; } + mem->dma = paddr; mem->va = eq_vaddress; ret =be_fill_queue (eq, phba->params.num_eq_entries,sizeof (struct be_eq_entry ), eq_vaddress);
@@ -3029,7 +3030,6 @@ static int beiscsi_create_eqs(struct beiscsi_hba *phba, goto create_eq_error; } - mem->dma = paddr; ret =beiscsi_cmd_eq_create (&phba->ctrl, eq,BEISCSI_EQ_DELAY_DEF );if (ret) {
@@ -3086,6 +3086,7 @@ static int beiscsi_create_cqs(struct beiscsi_hba *phba, goto create_cq_error; } + mem->dma = paddr; ret =be_fill_queue (cq, phba->params.num_cq_entries,sizeof (struct sol_cqe ), cq_vaddress);if (ret) {
@@ -3095,7 +3096,6 @@ static int beiscsi_create_cqs(struct beiscsi_hba *phba, goto create_cq_error; } - mem->dma = paddr; ret =beiscsi_cmd_cq_create (&phba->ctrl, cq, eq, false, false,0 );if (ret) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 185/408 ipmi_si: Fix wrong return value in try_smi_init()
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
[ Upstream commit 8fe7990ceda8597e407d06bffc4bdbe835a93ece ]
On an error exit path, a negative error code should be returned instead of a positive return value.
Message-Id: <[email protected]>
--- drivers/char/ipmi/ipmi_si_intf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/char/ipmi/ipmi_si_intf.c +1 -1
@@ -1977,7 +1977,7 @@ static int try_smi_init(struct smi_info *new_smi)/* Do this early so it's available for logs. */ if (!new_smi->io.dev) {pr_err ("IPMI interface added with no device\n" ); - rv =EIO ; + rv = -EIO ; goto out_err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 186/408 platform/x86: mlx-platform: Remove PSU EEPROM configuration
In reply to Greg Kroah-HartmanFrom: Vadim Pasternak <[email protected]>
[ Upstream commit c071afcea6ecf24a3c119f25ce9f71ffd55b5dc2 ]
Remove PSU EEPROM configuration for systems class equipped with Mellanox chip Spectrume-2. Till now all the systems from this class used few types of power units, all equipped with EEPROM device with address space two bytes. Thus, all these devices have been handled by EEPROM driver "24c32".
There is a new requirement is to support power unit replacement by "off the shelf" device, matching electrical required parameters. Such device could be equipped with different EEPROM type, which could be one byte address space addressing or even could be not equipped with EEPROM. In such case "24c32" will not work.
--- drivers/platform/x86/mlx-platform.c | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-)
drivers/platform/x86/mlx-platform.c +2 -13
@@ -243,15 +243,6 @@ static struct i2c_board_info mlxplat_mlxcpld_psu[] = { }, }; -static struct i2c_board_info mlxplat_mlxcpld_ng_psu[] = { - { -I2C_BOARD_INFO ("24c32" ,0x51 ), - }, - { -I2C_BOARD_INFO ("24c32" ,0x50 ), - }, -}; -static struct i2c_board_info mlxplat_mlxcpld_pwr[] = { {I2C_BOARD_INFO ("dps460" ,0x59 ),
@@ -611,15 +602,13 @@ static struct mlxreg_core_data mlxplat_mlxcpld_default_ng_psu_items_data[] = { .label = "psu1", .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, .mask = BIT(0), - .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[0], - .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR, + .hpdev.nr = MLXPLAT_CPLD_NR_NONE, }, { .label = "psu2", .reg = MLXPLAT_CPLD_LPC_REG_PSU_OFFSET, .mask = BIT(1), - .hpdev.brdinfo = &mlxplat_mlxcpld_ng_psu[1], - .hpdev.nr = MLXPLAT_CPLD_PSU_MSNXXXX_NR, + .hpdev.nr = MLXPLAT_CPLD_NR_NONE, }, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 187/408 mwifiex: fix double free
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit 53708f4fd9cfe389beab5c8daa763bcd0e0b4aef ]
clang static analysis reports this problem:
sdio.c:2403:3: warning: Attempt to free released memory
kfree(card->mpa_rx.buf);
^~~~~~~~~~~~~~~~~~~~~~~When mwifiex_init_sdio() fails in its first call to mwifiex_alloc_sdio_mpa_buffer, it falls back to calling it again. If the second alloc of mpa_tx.buf fails, the error handler will try to free the old, previously freed mpa_rx.buf. Reviewing the code, it looks like a second double free would happen with mwifiex_cleanup_sdio().
So set both pointers to NULL when they are freed.
--- drivers/net/wireless/marvell/mwifiex/sdio.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/marvell/mwifiex/sdio.c +2 -0
@@ -1996,6 +1996,8 @@ static int mwifiex_alloc_sdio_mpa_buffers(struct mwifiex_adapter *adapter,kfree (card->mpa_rx.buf); card->mpa_tx.buf_size =0 ; card->mpa_rx.buf_size =0 ; + card->mpa_tx.buf =NULL ; + card->mpa_rx.buf =NULL ; }return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 188/408 ipvs: clear skb->tstamp in forwarding path
In reply to Greg Kroah-HartmanFrom: Julian Anastasov <[email protected]>
[ Upstream commit 7980d2eabde82be86c5be18aa3d07e88ec13c6a1 ]
fq qdisc requires tstamp to be cleared in forwarding path
--- net/netfilter/ipvs/ip_vs_xmit.c | 6 ++++++ 1 file changed, 6 insertions(+)
net/netfilter/ipvs/ip_vs_xmit.c +6 -0
@@ -615,6 +615,8 @@ static inline int ip_vs_tunnel_xmit_prepare(struct sk_buff *skb,if (ret ==NF_ACCEPT ) {nf_reset_ct (skb);skb_forward_csum (skb); +if (skb->dev) + skb->tstamp =0 ; }return ret; }
@@ -655,6 +657,8 @@ static inline int ip_vs_nat_send_or_cont(int pf, struct sk_buff *skb,if (!local) {skb_forward_csum (skb); +if (skb->dev) + skb->tstamp =0 ;NF_HOOK (pf,NF_INET_LOCAL_OUT , cp->ipvs->net,NULL , skb,NULL ,skb_dst (skb)->dev, dst_output); }else
@@ -675,6 +679,8 @@ static inline int ip_vs_send_or_cont(int pf, struct sk_buff *skb,if (!local) {ip_vs_drop_early_demux_sk (skb);skb_forward_csum (skb); +if (skb->dev) + skb->tstamp =0 ;NF_HOOK (pf,NF_INET_LOCAL_OUT , cp->ipvs->net,NULL , skb,NULL ,skb_dst (skb)->dev, dst_output); }else
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 189/408 net: korina: fix kfree of rx/tx descriptor array
In reply to Greg Kroah-HartmanFrom: Valentin Vidic <[email protected]>
[ Upstream commit 3af5f0f5c74ecbaf757ef06c3f80d56751277637 ]
kmalloc returns KSEG0 addresses so convert back from KSEG1 in kfree. Also make sure array is freed when the driver is unloaded from the kernel.
--- drivers/net/ethernet/korina.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/korina.c +2 -1
@@ -1113,7 +1113,7 @@ static int korina_probe(struct platform_device *pdev)return rc; probe_err_register: -kfree (lp->td_ring); +kfree (KSEG0ADDR (lp->td_ring)); probe_err_td_ring:iounmap (lp->tx_dma_regs); probe_err_dma_tx:
@@ -1133,6 +1133,7 @@ static int korina_remove(struct platform_device *pdev)iounmap (lp->eth_regs);iounmap (lp->rx_dma_regs);iounmap (lp->tx_dma_regs); +kfree (KSEG0ADDR (lp->td_ring));unregister_netdev (bif->dev);free_netdev (bif->dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 190/408 netfilter: nf_log: missing vlan offload tag and proto
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit 0d9826bc18ce356e8909919ad681ad65d0a6061e ]
Dump vlan tag and proto for the usual vlan offload case if the NF_LOG_MACDECODE flag is set on. Without this information the logging is misleading as there is no reference to the VLAN header.
[12716.993704] test: IN=veth0 OUT= MACSRC=86:6c:92:ea:d6:73 MACDST=0e:3b:eb:86:73:76 VPROTO=8100 VID=10 MACPROTO=0800 SRC=192.168.10.2 DST=172.217.168.163 LEN=52 TOS=0x00 PREC=0x00 TTL=64 ID=2548 DF PROTO=TCP SPT=55848 DPT=80 WINDOW=501 RES=0x00 ACK FIN URGP=0 [12721.157643] test: IN=veth0 OUT= MACSRC=86:6c:92:ea:d6:73 MACDST=0e:3b:eb:86:73:76 VPROTO=8100 VID=10 MACPROTO=0806 ARP HTYPE=1 PTYPE=0x0800 OPCODE=2 MACSRC=86:6c:92:ea:d6:73 IPSRC=192.168.10.2 MACDST=0e:3b:eb:86:73:76 IPDST=192.168.10.1
--- include/net/netfilter/nf_log.h | 1 + net/ipv4/netfilter/nf_log_arp.c | 19 +++++++++++++++++-- net/ipv4/netfilter/nf_log_ipv4.c | 6 ++++-- net/ipv6/netfilter/nf_log_ipv6.c | 8 +++++--- net/netfilter/nf_log_common.c | 12 ++++++++++++ 5 files changed, 39 insertions(+), 7 deletions(-)
include/net/netfilter/nf_log.h +1 -0
@@ -108,6 +108,7 @@ int nf_log_dump_tcp_header(struct nf_log_buf *m, const struct sk_buff *skb, unsigned int logflags);void nf_log_dump_sk_uid_gid (struct net *net,struct nf_log_buf *m,struct sock *sk); +void nf_log_dump_vlan (struct nf_log_buf *m,const struct sk_buff *skb); void nf_log_dump_packet_common(struct nf_log_buf *m, u_int8_t pf, unsigned int hooknum, const struct sk_buff *skb, const struct net_device *in,
net/ipv4/netfilter/nf_log_arp.c +17 -2
@@ -43,16 +43,31 @@ static void dump_arp_packet(struct nf_log_buf *m,const struct nf_loginfo *info, const struct sk_buff *skb, unsigned int nhoff) { - const struct arphdr *ah; -struct arphdr _arph; const struct arppayload *ap;struct arppayload _arpp; +const struct arphdr *ah; +unsigned int logflags; +struct arphdr _arph; ah =skb_header_pointer (skb,0 ,sizeof (_arph), &_arph);if (ah ==NULL ) {nf_log_buf_add (m,"TRUNCATED" );return ; } + +if (info->type ==NF_LOG_TYPE_LOG ) + logflags = info->u.log.logflags; +else + logflags =NF_LOG_DEFAULT_MASK ; + +if (logflags &NF_LOG_MACDECODE ) { +nf_log_buf_add (m,"MACSRC=%pM MACDST=%pM " , +eth_hdr (skb)->h_source,eth_hdr (skb)->h_dest); +nf_log_dump_vlan (m, skb); +nf_log_buf_add (m,"MACPROTO=%04x " , +ntohs (eth_hdr (skb)->h_proto)); + } +nf_log_buf_add (m,"ARP HTYPE=%d PTYPE=0x%04x OPCODE=%d" ,ntohs (ah->ar_hrd),ntohs (ah->ar_pro),ntohs (ah->ar_op));
net/ipv4/netfilter/nf_log_ipv4.c +4 -2
@@ -284,8 +284,10 @@ static void dump_ipv4_mac_header(struct nf_log_buf *m,switch (dev->type) {case ARPHRD_ETHER : -nf_log_buf_add (m,"MACSRC=%pM MACDST=%pM MACPROTO=%04x " , -eth_hdr (skb)->h_source,eth_hdr (skb)->h_dest, +nf_log_buf_add (m,"MACSRC=%pM MACDST=%pM " , +eth_hdr (skb)->h_source,eth_hdr (skb)->h_dest); +nf_log_dump_vlan (m, skb); +nf_log_buf_add (m,"MACPROTO=%04x " ,ntohs (eth_hdr (skb)->h_proto));return ;default :
net/ipv6/netfilter/nf_log_ipv6.c +5 -3
@@ -297,9 +297,11 @@ static void dump_ipv6_mac_header(struct nf_log_buf *m,switch (dev->type) {case ARPHRD_ETHER : -nf_log_buf_add (m,"MACSRC=%pM MACDST=%pM MACPROTO=%04x " , -eth_hdr (skb)->h_source,eth_hdr (skb)->h_dest, -ntohs (eth_hdr (skb)->h_proto)); +nf_log_buf_add (m,"MACSRC=%pM MACDST=%pM " , +eth_hdr (skb)->h_source,eth_hdr (skb)->h_dest); +nf_log_dump_vlan (m, skb); +nf_log_buf_add (m,"MACPROTO=%04x " , +ntohs (eth_hdr (skb)->h_proto));return ;default :break ;
net/netfilter/nf_log_common.c +12 -0
@@ -171,6 +171,18 @@ nf_log_dump_packet_common(struct nf_log_buf *m, u_int8_t pf, }EXPORT_SYMBOL_GPL (nf_log_dump_packet_common); +void nf_log_dump_vlan (struct nf_log_buf *m,const struct sk_buff *skb) +{ +u16 vid; + +if (!skb_vlan_tag_present (skb)) +return ; + + vid =skb_vlan_tag_get (skb); +nf_log_buf_add (m,"VPROTO=%04x VID=%u " ,ntohs (skb->vlan_proto), vid); +} +EXPORT_SYMBOL_GPL (nf_log_dump_vlan); +/* bridge and netdev logging families share this code. */ void nf_log_l2packet(struct net *net, u_int8_t pf, __be16 protocol,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 191/408 mm/swapfile.c: fix potential memory leak in sys_swapon
In reply to Greg Kroah-HartmanFrom: Miaohe Lin <[email protected]>
[ Upstream commit 822bca52ee7eb279acfba261a423ed7ac47d6f73 ]
If we failed to drain inode, we would forget to free the swap address space allocated by init_swap_address_space() above.
--- mm/swapfile.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
mm/swapfile.c +3 -1
@@ -3284,7 +3284,7 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) error =inode_drain_writes (inode);if (error) { inode->i_flags &= ~S_SWAPFILE ; - goto bad_swap_unlock_inode; + goto free_swap_address_space; }mutex_lock (&swapon_mutex);
@@ -3309,6 +3309,8 @@ SYSCALL_DEFINE2(swapon, const char __user *, specialfile, int, swap_flags) error =0 ; goto out; +free_swap_address_space: +exit_swap_address_space (p->type); bad_swap_unlock_inode:inode_unlock (inode); bad_swap:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 192/408 mm/memcg: fix device private memcg accounting
In reply to Greg Kroah-HartmanFrom: Ralph Campbell <[email protected]>
[ Upstream commit 9a137153fc8798a89d8fce895cd0a06ea5b8e37c ]
The code in mc_handle_swap_pte() checks for non_swap_entry() and returns NULL before checking is_device_private_entry() so device private pages are never handled. Fix this by checking for non_swap_entry() after handling device private swap PTEs.
I assume the memory cgroup accounting would be off somehow when moving a process to another memory cgroup. Currently, the device private page is charged like a normal anonymous page when allocated and is uncharged when the page is freed so I think that path is OK.
xFixes: c733a82874a7 ("mm/memcontrol: support MEMORY_DEVICE_PRIVATE")
--- mm/memcontrol.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
mm/memcontrol.c +4 -1
@@ -5398,7 +5398,7 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,struct page *page =NULL ;swp_entry_t ent =pte_to_swp_entry (ptent); -if (!(mc.flags &MOVE_ANON ) ||non_swap_entry (ent)) +if (!(mc.flags &MOVE_ANON ))return NULL ;/*
@@ -5417,6 +5417,9 @@ static struct page *mc_handle_swap_pte(struct vm_area_struct *vma,return page; } +if (non_swap_entry (ent)) +return NULL ; +/* * Because lookup_swap_cache() updates some statistics counter, * we call find_get_page() with swapper_space directly.
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 193/408 mm, oom_adj: dont loop through tasks in __set_oom_adj when not necessary
In reply to Greg Kroah-HartmanFrom: Suren Baghdasaryan <[email protected]>
[ Upstream commit 67197a4f28d28d0b073ab0427b03cb2ee5382578 ]
Currently __set_oom_adj loops through all processes in the system to keep oom_score_adj and oom_score_adj_min in sync between processes sharing their mm. This is done for any task with more that one mm_users, which includes processes with multiple threads (sharing mm and signals). However for such processes the loop is unnecessary because their signal structure is shared as well.
Android updates oom_score_adj whenever a tasks changes its role (background/foreground/...) or binds to/unbinds from a service, making it more/less important. Such operation can happen frequently. We noticed that updates to oom_score_adj became more expensive and after further investigation found out that the patch mentioned in "Fixes" introduced a regression. Using Pixel 4 with a typical Android workload, write time to oom_score_adj increased from ~3.57us to ~362us. Moreover this regression linearly depends on the number of multi-threaded processes running on the system.
Mark the mm with a new MMF_MULTIPROCESS flag bit when task is created with (CLONE_VM && !CLONE_THREAD && !CLONE_VFORK). Change __set_oom_adj to use MMF_MULTIPROCESS instead of mm_users to decide whether oom_score_adj update should be synchronized between multiple processes. To prevent races between clone() and __set_oom_adj(), when oom_score_adj of the process being cloned might be modified from userspace, we use oom_adj_mutex. Its scope is changed to global.
The combination of (CLONE_VM && !CLONE_THREAD) is rarely used except for the case of vfork(). To prevent performance regressions of vfork(), we skip taking oom_adj_mutex and setting MMF_MULTIPROCESS when CLONE_VFORK is specified. Clearing the MMF_MULTIPROCESS flag (when the last process sharing the mm exits) is left out of this patch to keep it simple and because it is believed that this threading model is rare. Should there ever be a need for optimizing that case as well, it can be done by hooking into the exit path, likely following the mm_update_next_owner pattern.
With the combination of (CLONE_VM && !CLONE_THREAD && !CLONE_VFORK) being quite rare, the regression is gone after the change is applied.
--- fs/proc/base.c | 3 +-- include/linux/oom.h | 1 + include/linux/sched/coredump.h | 1 + kernel/fork.c | 21 +++++++++++++++++++++ mm/oom_kill.c | 2 ++ 5 files changed, 26 insertions(+), 2 deletions(-)
fs/proc/base.c +1 -2
@@ -1036,7 +1036,6 @@ static ssize_t oom_adj_read(struct file *file, char __user *buf, size_t count,static int __set_oom_adj (struct file *file,int oom_adj,bool legacy) { -static DEFINE_MUTEX (oom_adj_mutex);struct mm_struct *mm =NULL ;struct task_struct *task;int err =0 ;
@@ -1076,7 +1075,7 @@ static int __set_oom_adj(struct file *file, int oom_adj, bool legacy)struct task_struct *p =find_lock_task_mm (task);if (p) { -if (atomic_read (&p->mm->mm_users) >1 ) { +if (test_bit (MMF_MULTIPROCESS , &p->mm->flags)) { mm = p->mm;mmgrab (mm); }
include/linux/oom.h +1 -0
@@ -55,6 +55,7 @@ struct oom_control { };extern struct mutex oom_lock; +extern struct mutex oom_adj_mutex;static inline void set_current_oom_origin (void ) {
include/linux/sched/coredump.h +1 -0
@@ -72,6 +72,7 @@ static inline int get_dumpable(struct mm_struct *mm)#define MMF_DISABLE_THP 24/* disable THP for all VMAs */ #define MMF_OOM_VICTIM 25/* mm is the oom victim */ #define MMF_OOM_REAP_QUEUED 26/* mm was queued for oom_reaper */ +#define MMF_MULTIPROCESS 27/* mm is shared between processes */ #define MMF_DISABLE_THP_MASK (1 << MMF_DISABLE_THP)#define MMF_INIT_MASK (MMF_DUMPABLE_MASK | MMF_DUMP_FILTER_MASK |\
kernel/fork.c +21 -0
@@ -1750,6 +1750,25 @@ static __always_inline void delayed_free_task(struct task_struct *tsk)free_task (tsk); } +static void copy_oom_score_adj (u64 clone_flags,struct task_struct *tsk) +{ +/* Skip if kernel thread */ +if (!tsk->mm) +return ; + +/* Skip if spawning a thread or using vfork */ +if ((clone_flags & (CLONE_VM |CLONE_THREAD |CLONE_VFORK )) !=CLONE_VM ) +return ; + +/* We need to synchronize with __set_oom_adj */ +mutex_lock (&oom_adj_mutex); +set_bit (MMF_MULTIPROCESS , &tsk->mm->flags); +/* Update the values in case they were changed after copy_signal */ + tsk->signal->oom_score_adj = current->signal->oom_score_adj; + tsk->signal->oom_score_adj_min = current->signal->oom_score_adj_min; +mutex_unlock (&oom_adj_mutex); +} +/* * This creates a new process as a copy of the old one, * but does not actually start it yet.
@@ -2222,6 +2241,8 @@ static __latent_entropy struct task_struct *copy_process(trace_task_newtask (p, clone_flags);uprobe_copy_process (p, clone_flags); +copy_oom_score_adj (clone_flags, p); +return p; bad_fork_cancel_cgroup:
mm/oom_kill.c +2 -0
@@ -63,6 +63,8 @@ int sysctl_oom_dump_tasks = 1;* and mark_oom_victim */ DEFINE_MUTEX (oom_lock); +/* Serializes oom_score_adj and oom_score_adj_min updates */ +DEFINE_MUTEX (oom_adj_mutex);static inline bool is_memcg_oom (struct oom_control *oc) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 194/408 fs: fix NULL dereference due to data race in prepend_path()
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 09cad07547445bf3a41683e4d3abcd154c123ef5 ]
Fix data race in prepend_path() with re-reading mnt->mnt_ns twice without holding the lock.
is_mounted() does check for NULL, but is_anon_ns(mnt->mnt_ns) might re-read the pointer again which could be NULL already, if in between reads one of kern_unmount()/kern_unmount_array()/umount_tree() sets mnt->mnt_ns to NULL.
This is seen in production with the following stack trace:
BUG: kernel NULL pointer dereference, address: 0000000000000048
...
RIP: 0010:prepend_path.isra.4+0x1ce/0x2e0
Call Trace:
d_path+0xe6/0x150
proc_pid_readlink+0x8f/0x100
vfs_readlink+0xf8/0x110
do_readlinkat+0xfd/0x120
__x64_sys_readlinkat+0x1a/0x20
do_syscall_64+0x42/0x110
entry_SYSCALL_64_after_hwframe+0x44/0xa9--- fs/d_path.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
fs/d_path.c +5 -1
@@ -102,6 +102,8 @@ static int prepend_path(const struct path *path,if (dentry == vfsmnt->mnt_root ||IS_ROOT (dentry)) {struct mount *parent =READ_ONCE (mnt->mnt_parent); +struct mnt_namespace *mnt_ns; +/* Escaped? */ if (dentry != vfsmnt->mnt_root) { bptr = *buffer;
@@ -116,7 +118,9 @@ static int prepend_path(const struct path *path, vfsmnt = &mnt->mnt;continue ; } -if (is_mounted (vfsmnt) && !is_anon_ns (mnt->mnt_ns)) + mnt_ns =READ_ONCE (mnt->mnt_ns); +/* open-coded is_mounted() to use local mnt_ns */ +if (!IS_ERR_OR_NULL (mnt_ns) && !is_anon_ns (mnt_ns)) error =1 ;// absolute root else error =2 ;// detached or not attached yet
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 195/408 selftests/ftrace: Change synthetic event name for inter-event-combined test
In reply to Greg Kroah-HartmanFrom: Tom Zanussi <[email protected]>
[ Upstream commit 96378b2088faea68f1fb05ea6b9a566fc569a44c ]
This test uses waking+wakeup_latency as an event name, which doesn't make sense since it includes an operator. Illegal names are now detected by the synthetic event command parsing, which causes this test to fail. Change the name to 'waking_plus_wakeup_latency' to prevent this.
--- .../inter-event/trigger-inter-event-combined-hist.tc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/ftrace/test.d/trigger/inter-event/trigger-inter-event-combined-hist.tc +4 -4
@@ -34,12 +34,12 @@ echo 'wakeup_latency u64 lat pid_t pid' >> synthetic_events echo 'hist:keys=pid:ts1=common_timestamp.usecs if comm=="ping"' >> events/sched/sched_wakeup/trigger echo 'hist:keys=next_pid:wakeup_lat=common_timestamp.usecs-$ts1:onmatch(sched.sched_wakeup).wakeup_latency($wakeup_lat,next_pid) if next_comm=="ping"' > events/sched/sched_switch/trigger -echo 'waking+wakeup_latency u64 lat; pid_t pid' >> synthetic_events -echo 'hist:keys=pid,lat:sort=pid,lat:ww_lat=$waking_lat+$wakeup_lat:onmatch(synthetic.wakeup_latency).waking+wakeup_latency($ww_lat,pid)' >> events/synthetic/wakeup_latency/trigger -echo 'hist:keys=pid,lat:sort=pid,lat' >> events/synthetic/waking+wakeup_latency/trigger +echo 'waking_plus_wakeup_latency u64 lat; pid_t pid' >> synthetic_events +echo 'hist:keys=pid,lat:sort=pid,lat:ww_lat=$waking_lat+$wakeup_lat:onmatch(synthetic.wakeup_latency).waking_plus_wakeup_latency($ww_lat,pid)' >> events/synthetic/wakeup_latency/trigger +echo 'hist:keys=pid,lat:sort=pid,lat' >> events/synthetic/waking_plus_wakeup_latency/trigger ping $LOCALHOST -c 3 -if ! grep -q "pid:" events/synthetic/waking+wakeup_latency/hist; then +if ! grep -q "pid:" events/synthetic/waking_plus_wakeup_latency/hist; then fail "Failed to create combined histogram" fi
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 196/408 i3c: master add i3c_master_attach_boardinfo to preserve boardinfo
In reply to Greg Kroah-HartmanFrom: Parshuram Thombare <[email protected]>
[ Upstream commit 9da36a7ec42135428e1d41621e3703429bda3b2e ]
Boardinfo was lost if I3C object for devices with boardinfo available are not created or not added to the I3C device list because of some failure e.g. SETDASA failed, retrieve info failed etc This patch adds i3c_master_attach_boardinfo which scan boardinfo list in the master object and 'attach' it to the I3C device object.
--- drivers/i3c/master.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-)
drivers/i3c/master.c +17 -2
@@ -1760,6 +1760,21 @@ static void i3c_master_bus_cleanup(struct i3c_master_controller *master)i3c_master_detach_free_devs (master); } +static void i3c_master_attach_boardinfo (struct i3c_dev_desc *i3cdev) +{ +struct i3c_master_controller *master = i3cdev->common.master; +struct i3c_dev_boardinfo *i3cboardinfo; + +list_for_each_entry (i3cboardinfo, &master->boardinfo.i3c, node) { +if (i3cdev->info.pid != i3cboardinfo->pid) +continue ; + + i3cdev->boardinfo = i3cboardinfo; + i3cdev->info.static_addr = i3cboardinfo->static_addr; +return ; + } +} +static struct i3c_dev_desc *i3c_master_search_i3c_dev_duplicate (struct i3c_dev_desc *refdev) {
@@ -1815,10 +1830,10 @@ int i3c_master_add_i3c_dev_locked(struct i3c_master_controller *master,if (ret) goto err_detach_dev; +i3c_master_attach_boardinfo (newdev); + olddev =i3c_master_search_i3c_dev_duplicate (newdev);if (olddev) { - newdev->boardinfo = olddev->boardinfo; - newdev->info.static_addr = olddev->info.static_addr; newdev->dev = olddev->dev;if (newdev->dev) newdev->dev->desc = newdev;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 197/408 IB/mlx4: Fix starvation in paravirt mux/demux
In reply to Greg Kroah-HartmanFrom: Håkon Bugge <[email protected]>
[ Upstream commit 7fd1507df7cee9c533f38152fcd1dd769fcac6ce ]
The mlx4 driver will proxy MAD packets through the PF driver. A VM or an instantiated VF will send its MAD packets to the PF driver using loop-back. The PF driver will be informed by an interrupt, but defer the handling and polling of CQEs to a worker thread running on an ordered work-queue.
Consider the following scenario: the VMs will in short proximity in time, for example due to a network event, send many MAD packets to the PF driver. Lets say there are K VMs, each sending N packets.
The interrupt from the first VM will start the worker thread, which will poll N CQEs. A common case here is where the PF driver will multiplex the packets received from the VMs out on the wire QP.
But before the wire QP has returned a send CQE and associated interrupt, the other K - 1 VMs have sent their N packets as well.
The PF driver has to multiplex K * N packets out on the wire QP. But the send-queue on the wire QP has a finite capacity.
So, in this scenario, if K * N is larger than the send-queue capacity of the wire QP, we will get MAD packets dropped on the floor with this dynamic debug message:
mlx4_ib_multiplex_mad: failed sending GSI to wire on behalf of slave 2 (-11)
and this despite the fact that the wire send-queue could have capacity, but the PF driver isn't aware, because the wire send CQEs have not yet been polled.
We can also have a similar scenario inbound, with a wire recv-queue larger than the tunnel QP's send-queue. If many remote peers send MAD packets to the very same VM, the tunnel send-queue destined to the VM could allegedly be construed to be full by the PF driver.
This starvation is fixed by introducing separate work queues for the wire QPs vs. the tunnel QPs.
With this fix, using a dual ported HCA, 8 VFs instantiated, we could run cmtime on each of the 18 interfaces towards a similar configured peer, each cmtime instance with 800 QPs (all in all 14400 QPs) without a single CM packet getting lost.
--- drivers/infiniband/hw/mlx4/mad.c | 34 +++++++++++++++++++++++++--- drivers/infiniband/hw/mlx4/mlx4_ib.h | 2 ++ 2 files changed, 33 insertions(+), 3 deletions(-)
drivers/infiniband/hw/mlx4/mad.c +31 -3
@@ -1307,6 +1307,18 @@ static void mlx4_ib_tunnel_comp_handler(struct ib_cq *cq, void *arg)spin_unlock_irqrestore (&dev->sriov.going_down_lock, flags); } +static void mlx4_ib_wire_comp_handler (struct ib_cq *cq,void *arg) +{ +unsigned long flags; +struct mlx4_ib_demux_pv_ctx *ctx = cq->cq_context; +struct mlx4_ib_dev *dev =to_mdev (ctx->ib_dev); + +spin_lock_irqsave (&dev->sriov.going_down_lock, flags); +if (!dev->sriov.is_going_down && ctx->state ==DEMUX_PV_STATE_ACTIVE ) +queue_work (ctx->wi_wq, &ctx->work); +spin_unlock_irqrestore (&dev->sriov.going_down_lock, flags); +} +static int mlx4_ib_post_pv_qp_buf (struct mlx4_ib_demux_pv_ctx *ctx,struct mlx4_ib_demux_pv_qp *tun_qp,int index)
@@ -2009,7 +2021,8 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port, cq_size *=2 ; cq_attr.cqe = cq_size; - ctx->cq =ib_create_cq (ctx->ib_dev, mlx4_ib_tunnel_comp_handler, + ctx->cq =ib_create_cq (ctx->ib_dev, + create_tun ? mlx4_ib_tunnel_comp_handler : mlx4_ib_wire_comp_handler,NULL , ctx, &cq_attr);if (IS_ERR (ctx->cq)) { ret =PTR_ERR (ctx->cq);
@@ -2046,6 +2059,7 @@ static int create_pv_resources(struct ib_device *ibdev, int slave, int port,INIT_WORK (&ctx->work, mlx4_ib_sqp_comp_worker); ctx->wq =to_mdev (ibdev)->sriov.demux[port -1 ].wq; + ctx->wi_wq =to_mdev (ibdev)->sriov.demux[port -1 ].wi_wq; ret =ib_req_notify_cq (ctx->cq,IB_CQ_NEXT_COMP );if (ret) {
@@ -2189,7 +2203,7 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev, goto err_mcg; } -snprintf (name,sizeof name,"mlx4_ibt%d" , port); +snprintf (name,sizeof (name),"mlx4_ibt%d" , port); ctx->wq =alloc_ordered_workqueue (name,WQ_MEM_RECLAIM );if (!ctx->wq) {pr_err ("Failed to create tunnelling WQ for port %d\n" , port);
@@ -2197,7 +2211,15 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev, goto err_wq; } -snprintf (name,sizeof name,"mlx4_ibud%d" , port); +snprintf (name,sizeof (name),"mlx4_ibwi%d" , port); + ctx->wi_wq =alloc_ordered_workqueue (name,WQ_MEM_RECLAIM ); +if (!ctx->wi_wq) { +pr_err ("Failed to create wire WQ for port %d\n" , port); + ret = -ENOMEM ; + goto err_wiwq; + } + +snprintf (name,sizeof (name),"mlx4_ibud%d" , port); ctx->ud_wq =alloc_ordered_workqueue (name,WQ_MEM_RECLAIM );if (!ctx->ud_wq) {pr_err ("Failed to create up/down WQ for port %d\n" , port);
@@ -2208,6 +2230,10 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev,return 0 ; err_udwq: +destroy_workqueue (ctx->wi_wq); + ctx->wi_wq =NULL ; + +err_wiwq:destroy_workqueue (ctx->wq); ctx->wq =NULL ;
@@ -2255,12 +2281,14 @@ static void mlx4_ib_free_demux_ctx(struct mlx4_ib_demux_ctx *ctx) ctx->tun[i]->state =DEMUX_PV_STATE_DOWNING ; }flush_workqueue (ctx->wq); +flush_workqueue (ctx->wi_wq);for (i =0 ; i < dev->dev->caps.sqp_demux; i++) {destroy_pv_resources (dev, i, ctx->port, ctx->tun[i],0 );free_pv_object (dev, i, ctx->port); }kfree (ctx->tun);destroy_workqueue (ctx->ud_wq); +destroy_workqueue (ctx->wi_wq);destroy_workqueue (ctx->wq); } }
drivers/infiniband/hw/mlx4/mlx4_ib.h +2 -0
@@ -459,6 +459,7 @@ struct mlx4_ib_demux_pv_ctx {struct ib_pd *pd;struct work_struct work;struct workqueue_struct *wq; +struct workqueue_struct *wi_wq;struct mlx4_ib_demux_pv_qp qp[2 ]; };
@@ -466,6 +467,7 @@ struct mlx4_ib_demux_ctx {struct ib_device *ib_dev;int port;struct workqueue_struct *wq; +struct workqueue_struct *wi_wq;struct workqueue_struct *ud_wq;spinlock_t ud_lock;atomic64_t subnet_prefix;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 198/408 IB/mlx4: Adjust delayed work when a dup is observed
In reply to Greg Kroah-HartmanFrom: Håkon Bugge <[email protected]>
[ Upstream commit 785167a114855c5aa75efca97000e405c2cc85bf ]
When scheduling delayed work to clean up the cache, if the entry already has been scheduled for deletion, we adjust the delay.
--- drivers/infiniband/hw/mlx4/cm.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/hw/mlx4/cm.c +3 -0
@@ -280,6 +280,9 @@ static void schedule_delayed(struct ib_device *ibdev, struct id_map_entry *id)if (!sriov->is_going_down && !id->scheduled_delete) { id->scheduled_delete =1 ;schedule_delayed_work (&id->timeout,CM_CLEANUP_CACHE_TIMEOUT ); + }else if (id->scheduled_delete) { +/* Adjust timeout if already scheduled */ +mod_delayed_work (system_wq, &id->timeout,CM_CLEANUP_CACHE_TIMEOUT ); }spin_unlock_irqrestore (&sriov->going_down_lock, flags);spin_unlock (&sriov->id_map_lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 199/408 powerpc/pseries: Fix missing of_node_put() in rng_init()
In reply to Greg Kroah-HartmanFrom: Nicholas Mc Guire <[email protected]>
[ Upstream commit 67c3e59443f5fc77be39e2ce0db75fbfa78c7965 ]
The call to of_find_compatible_node() returns a node pointer with refcount incremented thus it must be explicitly decremented here before returning.
--- arch/powerpc/platforms/pseries/rng.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/platforms/pseries/rng.c +1 -0
@@ -36,6 +36,7 @@ static __init int rng_init(void) ppc_md.get_random_seed = pseries_get_random_long; +of_node_put (dn);return 0 ; }machine_subsys_initcall (pseries, rng_init);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 200/408 powerpc/icp-hv: Fix missing of_node_put() in success path
In reply to Greg Kroah-HartmanFrom: Nicholas Mc Guire <[email protected]>
[ Upstream commit d3e669f31ec35856f5e85df9224ede5bdbf1bc7b ]
Both of_find_compatible_node() and of_find_node_by_type() will return a refcounted node on success - thus for the success path the node must be explicitly released with a of_node_put().
--- arch/powerpc/sysdev/xics/icp-hv.c | 1 + 1 file changed, 1 insertion(+)
arch/powerpc/sysdev/xics/icp-hv.c +1 -0
@@ -174,6 +174,7 @@ int icp_hv_init(void) icp_ops = &icp_hv_ops; +of_node_put (np);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 201/408 RDMA/ucma: Fix locking for ctx->events_reported
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 98837c6c3d7285f6eca86480b6f7fac6880e27a8 ]
This value is locked under the file->mut, ensure it is held whenever touching it.
The case in ucma_migrate_id() is a race, while in ucma_free_uctx() it is already not possible for the write side to run, the movement is just for clarity.
--- drivers/infiniband/core/ucma.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/core/ucma.c +3 -1
@@ -581,6 +581,7 @@ static int ucma_free_ctx(struct ucma_context *ctx)list_move_tail (&uevent->list, &list); }list_del (&ctx->list); + events_reported = ctx->events_reported;mutex_unlock (&ctx->file->mut);list_for_each_entry_safe (uevent, tmp, &list, list) {
@@ -590,7 +591,6 @@ static int ucma_free_ctx(struct ucma_context *ctx)kfree (uevent); } - events_reported = ctx->events_reported;mutex_destroy (&ctx->mutex);kfree (ctx);return events_reported;
@@ -1639,7 +1639,9 @@ static ssize_t ucma_migrate_id(struct ucma_file *new_file, cur_file = ctx->file;if (cur_file == new_file) { +mutex_lock (&cur_file->mut); resp.events_reported = ctx->events_reported; +mutex_unlock (&cur_file->mut); goto response; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 202/408 RDMA/ucma: Add missing locking around rdma_leave_multicast()
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 38e03d092699891c3237b5aee9e8029d4ede0956 ]
All entry points to the rdma_cm from a ULP must be single threaded, even this error unwinds. Add the missing locking.
--- drivers/infiniband/core/ucma.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/core/ucma.c +2 -0
@@ -1473,7 +1473,9 @@ static ssize_t ucma_process_join(struct ucma_file *file,return 0 ; err3: +mutex_lock (&ctx->mutex);rdma_leave_multicast (ctx->cm_id, (struct sockaddr *) &mc->addr); +mutex_unlock (&ctx->mutex);ucma_cleanup_mc_events (mc); err2:xa_erase (&multicast_table, mc->id);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 203/408 mtd: lpddr: fix excessive stack usage with clang
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 3e1b6469f8324bee5927b063e2aca30d3e56b907 ]
Building lpddr2_nvm with clang can result in a giant stack usage in one function:
drivers/mtd/lpddr/lpddr2_nvm.c:399:12: error: stack frame size of 1144 bytes in function 'lpddr2_nvm_probe' [-Werror,-Wframe-larger-than=]
The problem is that clang decides to build a copy of the mtd_info structure on the stack and then do a memcpy() into the actual version. It shouldn't really do it that way, but it's not strictly a bug either.
As a workaround, use a static const version of the structure to assign most of the members upfront and then only set the few members that require runtime knowledge at probe time.
--- drivers/mtd/lpddr/lpddr2_nvm.c | 35 ++++++++++++++++++---------------- 1 file changed, 19 insertions(+), 16 deletions(-)
drivers/mtd/lpddr/lpddr2_nvm.c +19 -16
@@ -393,6 +393,17 @@ static int lpddr2_nvm_lock(struct mtd_info *mtd, loff_t start_add,return lpddr2_nvm_do_block_op (mtd, start_add, len,LPDDR2_NVM_LOCK ); } +static const struct mtd_info lpddr2_nvm_mtd_info = { + .type =MTD_RAM , + .writesize =1 , + .flags = (MTD_CAP_NVRAM |MTD_POWERUP_LOCK ), + ._read = lpddr2_nvm_read, + ._write = lpddr2_nvm_write, + ._erase = lpddr2_nvm_erase, + ._unlock = lpddr2_nvm_unlock, + ._lock = lpddr2_nvm_lock, +}; +/* * lpddr2_nvm driver probe method */
@@ -433,6 +444,7 @@ static int lpddr2_nvm_probe(struct platform_device *pdev) .pfow_base = OW_BASE_ADDRESS, .fldrv_priv = pcm_data, }; +if (IS_ERR (map->virt))return PTR_ERR (map->virt);
@@ -444,22 +456,13 @@ static int lpddr2_nvm_probe(struct platform_device *pdev)return PTR_ERR (pcm_data->ctl_regs);/* Populate mtd_info data structure */ - *mtd = (struct mtd_info ) { - .dev = { .parent = &pdev->dev }, - .name = pdev->dev.init_name, - .type =MTD_RAM , - .priv = map, - .size =resource_size (add_range), - .erasesize =ERASE_BLOCKSIZE * pcm_data->bus_width, - .writesize =1 , - .writebufsize =WRITE_BUFFSIZE * pcm_data->bus_width, - .flags = (MTD_CAP_NVRAM |MTD_POWERUP_LOCK ), - ._read = lpddr2_nvm_read, - ._write = lpddr2_nvm_write, - ._erase = lpddr2_nvm_erase, - ._unlock = lpddr2_nvm_unlock, - ._lock = lpddr2_nvm_lock, - }; + *mtd = lpddr2_nvm_mtd_info; + mtd->dev.parent = &pdev->dev; + mtd->name = pdev->dev.init_name; + mtd->priv = map; + mtd->size =resource_size (add_range); + mtd->erasesize =ERASE_BLOCKSIZE * pcm_data->bus_width; + mtd->writebufsize =WRITE_BUFFSIZE * pcm_data->bus_width;/* Verify the presence of the device looking for PFOW string */ if (!lpddr2_nvm_pfow_present (map)) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 204/408 RDMA/hns: Add a check for current state before modifying QP
In reply to Greg Kroah-HartmanFrom: Lang Cheng <[email protected]>
[ Upstream commit e0ef0f68c4c0d85b1eb63f38d5d10324361280e8 ]
It should be considered an illegal operation if the ULP attempts to modify a QP from another state to the current hardware state. Otherwise, the ULP can modify some fields of QPC at any time. For example, for a QP in state of RTS, modify it from RTR to RTS can change the PSN, which is always not as expected.
--- drivers/infiniband/hw/hns/hns_roce_qp.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/hw/hns/hns_roce_qp.c +4 -2
@@ -1181,8 +1181,10 @@ int hns_roce_modify_qp(struct ib_qp *ibqp, struct ib_qp_attr *attr,mutex_lock (&hr_qp->mutex); - cur_state = attr_mask &IB_QP_CUR_STATE ? - attr->cur_qp_state : (enum ib_qp_state )hr_qp->state; +if (attr_mask &IB_QP_CUR_STATE && attr->cur_qp_state != hr_qp->state) + goto out; + + cur_state = hr_qp->state; new_state = attr_mask &IB_QP_STATE ? attr->qp_state : cur_state; if (ibqp->uobject &&
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 205/408 RDMA/umem: Fix signature of stub ib_umem_find_best_pgsz()
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 61690d01db32eb1f94adc9ac2b8bb741d34e4671 ]
The original function returns unsigned long and 0 on failure.
--- include/rdma/ib_umem.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
include/rdma/ib_umem.h +5 -4
@@ -95,10 +95,11 @@ static inline int ib_umem_copy_from(void *dst, struct ib_umem *umem, size_t offs size_t length) {return -EINVAL ; } -static inline int ib_umem_find_best_pgsz (struct ib_umem *umem, -unsigned long pgsz_bitmap, -unsigned long virt) { -return -EINVAL ; +static inline unsigned long ib_umem_find_best_pgsz (struct ib_umem *umem, +unsigned long pgsz_bitmap, +unsigned long virt) +{ +return 0 ; }#endif /* CONFIG_INFINIBAND_USER_MEM */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 206/408 powerpc/pseries: explicitly reschedule during drmem_lmb list traversal
In reply to Greg Kroah-HartmanFrom: Nathan Lynch <[email protected]>
[ Upstream commit 9d6792ffe140240ae54c881cc4183f9acc24b4df ]
The drmem lmb list can have hundreds of thousands of entries, and unfortunately lookups take the form of linear searches. As long as this is the case, traversals have the potential to monopolize the CPU and provoke lockup reports, workqueue stalls, and the like unless they explicitly yield.
Rather than placing cond_resched() calls within various for_each_drmem_lmb() loop blocks in the code, put it in the iteration expression of the loop macro itself so users can't omit it.
Introduce a drmem_lmb_next() iteration helper function which calls cond_resched() at a regular interval during array traversal. Each iteration of the loop in DLPAR code paths can involve around ten RTAS calls which can each take up to 250us, so this ensures the check is performed at worst every few milliseconds.
--- arch/powerpc/include/asm/drmem.h | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/drmem.h +17 -1
@@ -8,6 +8,8 @@ #ifndef _ASM_POWERPC_LMB_H #define _ASM_POWERPC_LMB_H +#include <linux/sched.h> + struct drmem_lmb { u64 base_addr; u32 drc_index;
@@ -26,8 +28,22 @@ struct drmem_lmb_info {extern struct drmem_lmb_info *drmem_info; +static inline struct drmem_lmb *drmem_lmb_next (struct drmem_lmb *lmb, +const struct drmem_lmb *start) +{ +/* +* DLPAR code paths can take several milliseconds per element +* when interacting with firmware. Ensure that we don't +* unfairly monopolize the CPU. +*/ +if (((++lmb - start) %16 ) ==0 ) +cond_resched (); + +return lmb; +} +#define for_each_drmem_lmb_in_range (lmb, start, end) \ - for ((lmb) = (start); (lmb) < (end); (lmb)++) + for ((lmb) = (start); (lmb) < (end); lmb = drmem_lmb_next(lmb, start))#define for_each_drmem_lmb (lmb) \ for_each_drmem_lmb_in_range((lmb), \
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 207/408 pseries/drmem: dont cache node id in drmem_lmb struct
In reply to Greg Kroah-HartmanFrom: Scott Cheloha <[email protected]>
[ Upstream commit e5e179aa3a39c818db8fbc2dce8d2cd24adaf657 ]
At memory hot-remove time we can retrieve an LMB's nid from its corresponding memory_block. There is no need to store the nid in multiple locations.
Note that lmb_to_memblock() uses find_memory_block() to get the corresponding memory_block. As find_memory_block() runs in sub-linear time this approach is negligibly slower than what we do at present.
In exchange for this lookup at hot-remove time we no longer need to call memory_add_physaddr_to_nid() during drmem_init() for each LMB. On powerpc, memory_add_physaddr_to_nid() is a linear search, so this spares us an O(n^2) initialization during boot.
On systems with many LMBs that initialization overhead is palpable and disruptive. For example, on a box with 249854 LMBs we're seeing drmem_init() take upwards of 30 seconds to complete:
[ 53.721639] drmem: initializing drmem v2 [ 80.604346] watchdog: BUG: soft lockup - CPU#65 stuck for 23s! [swapper/0:1] [ 80.604377] Modules linked in: [ 80.604389] CPU: 65 PID: 1 Comm: swapper/0 Not tainted 5.6.0-rc2+ #4 [ 80.604397] NIP: c0000000000a4980 LR: c0000000000a4940 CTR: 0000000000000000 [ 80.604407] REGS: c0002dbff8493830 TRAP: 0901 Not tainted (5.6.0-rc2+) [ 80.604412] MSR: 8000000002009033 <SF,VEC,EE,ME,IR,DR,RI,LE> CR: 44000248 XER: 0000000d [ 80.604431] CFAR: c0000000000a4a38 IRQMASK: 0 [ 80.604431] GPR00: c0000000000a4940 c0002dbff8493ac0 c000000001904400 c0003cfffffede30 [ 80.604431] GPR04: 0000000000000000 c000000000f4095a 000000000000002f 0000000010000000 [ 80.604431] GPR08: c0000bf7ecdb7fb8 c0000bf7ecc2d3c8 0000000000000008 c00c0002fdfb2001 [ 80.604431] GPR12: 0000000000000000 c00000001e8ec200 [ 80.604477] NIP [c0000000000a4980] hot_add_scn_to_nid+0xa0/0x3e0 [ 80.604486] LR [c0000000000a4940] hot_add_scn_to_nid+0x60/0x3e0 [ 80.604492] Call Trace: [ 80.604498] [c0002dbff8493ac0] [c0000000000a4940] hot_add_scn_to_nid+0x60/0x3e0 (unreliable) [ 80.604509] [c0002dbff8493b20] [c000000000087c10] memory_add_physaddr_to_nid+0x20/0x60 [ 80.604521] [c0002dbff8493b40] [c0000000010d4880] drmem_init+0x25c/0x2f0 [ 80.604530] [c0002dbff8493c10] [c000000000010154] do_one_initcall+0x64/0x2c0 [ 80.604540] [c0002dbff8493ce0] [c0000000010c4aa0] kernel_init_freeable+0x2d8/0x3a0 [ 80.604550] [c0002dbff8493db0] [c000000000010824] kernel_init+0x2c/0x148 [ 80.604560] [c0002dbff8493e20] [c00000000000b648] ret_from_kernel_thread+0x5c/0x74 [ 80.604567] Instruction dump: [ 80.604574] 392918e8 e9490000 e90a000a e92a0000 80ea000c 1d080018 3908ffe8 7d094214 [ 80.604586] 7fa94040 419d00dc e9490010 714a0088 <2faa0008> 409e00ac e9490000 7fbe5040 [ 89.047390] drmem: 249854 LMB(s)
With a patched kernel on the same machine we're no longer seeing the soft lockup. drmem_init() now completes in negligible time, even when the LMB count is large.
--- arch/powerpc/include/asm/drmem.h | 21 ---------------- arch/powerpc/mm/drmem.c | 6 +---- .../platforms/pseries/hotplug-memory.c | 24 ++++++++++++------- 3 files changed, 17 insertions(+), 34 deletions(-)
arch/powerpc/include/asm/drmem.h +0 -21
@@ -15,9 +15,6 @@ struct drmem_lmb {u32 drc_index;u32 aa_index;u32 flags; -#ifdef CONFIG_MEMORY_HOTPLUG -int nid; -#endif };struct drmem_lmb_info {
@@ -119,22 +116,4 @@ static inline void invalidate_lmb_associativity_index(struct drmem_lmb *lmb) lmb->aa_index = 0xffffffff; } -#ifdef CONFIG_MEMORY_HOTPLUG -static inline void lmb_set_nid (struct drmem_lmb *lmb) -{ - lmb->nid =memory_add_physaddr_to_nid (lmb->base_addr); -} -static inline void lmb_clear_nid (struct drmem_lmb *lmb) -{ - lmb->nid =-1 ; -} -#else -static inline void lmb_set_nid (struct drmem_lmb *lmb) -{ -} -static inline void lmb_clear_nid (struct drmem_lmb *lmb) -{ -} -#endif -#endif /* _ASM_POWERPC_LMB_H */
arch/powerpc/mm/drmem.c +1 -5
@@ -362,10 +362,8 @@ static void __init init_drmem_v1_lmbs(const __be32 *prop)if (!drmem_info->lmbs)return ; -for_each_drmem_lmb (lmb) { +for_each_drmem_lmb (lmb)read_drconf_v1_cell (lmb, &prop); -lmb_set_nid (lmb); - } }static void __init init_drmem_v2_lmbs (const __be32 *prop)
@@ -410,8 +408,6 @@ static void __init init_drmem_v2_lmbs(const __be32 *prop) lmb->aa_index = dr_cell.aa_index; lmb->flags = dr_cell.flags; - -lmb_set_nid (lmb); } } }
arch/powerpc/platforms/pseries/hotplug-memory.c +16 -8
@@ -376,25 +376,32 @@ static int dlpar_add_lmb(struct drmem_lmb *);static int dlpar_remove_lmb (struct drmem_lmb *lmb) { +struct memory_block *mem_block;unsigned long block_sz;int rc;if (!lmb_is_removable (lmb))return -EINVAL ; + mem_block =lmb_to_memblock (lmb); +if (mem_block ==NULL ) +return -EINVAL ; + rc =dlpar_offline_lmb (lmb); -if (rc) +if (rc) { +put_device (&mem_block->dev);return rc; + } block_sz =pseries_memory_block_size (); -__remove_memory (lmb->nid, lmb->base_addr, block_sz); +__remove_memory (mem_block->nid, lmb->base_addr, block_sz); +put_device (&mem_block->dev);/* Update memory regions for memory remove */ memblock_remove (lmb->base_addr, block_sz);invalidate_lmb_associativity_index (lmb); -lmb_clear_nid (lmb); lmb->flags &= ~DRCONF_MEM_ASSIGNED ;return 0 ;
@@ -651,7 +658,7 @@ static int dlpar_memory_remove_by_ic(u32 lmbs_to_remove, u32 drc_index)static int dlpar_add_lmb (struct drmem_lmb *lmb) {unsigned long block_sz; -int rc; +int nid, rc;if (lmb->flags &DRCONF_MEM_ASSIGNED )return -EINVAL ;
@@ -662,11 +669,13 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb)return rc; } -lmb_set_nid (lmb); block_sz =memory_block_size_bytes (); +/* Find the node id for this address. */ + nid =memory_add_physaddr_to_nid (lmb->base_addr); +/* Add the memory */ - rc =__add_memory (lmb->nid, lmb->base_addr, block_sz); + rc =__add_memory (nid, lmb->base_addr, block_sz);if (rc) {invalidate_lmb_associativity_index (lmb);return rc;
@@ -674,9 +683,8 @@ static int dlpar_add_lmb(struct drmem_lmb *lmb) rc =dlpar_online_lmb (lmb);if (rc) { -__remove_memory (lmb->nid, lmb->base_addr, block_sz); +__remove_memory (nid, lmb->base_addr, block_sz);invalidate_lmb_associativity_index (lmb); -lmb_clear_nid (lmb); }else { lmb->flags |=DRCONF_MEM_ASSIGNED ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 208/408 RDMA/mlx5: Fix potential race between destroy and CQE poll
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit 4b916ed9f9e85f705213ca8d69771d3c1cd6ee5a ]
The SRQ can be destroyed right before mlx5_cmd_get_srq is called. In such case the latter will return NULL instead of expected SRQ.
--- drivers/infiniband/hw/mlx5/cq.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/infiniband/hw/mlx5/cq.c +3 -2
@@ -167,7 +167,7 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe, {enum rdma_link_layer ll =rdma_port_get_link_layer (qp->ibqp.device,1 );struct mlx5_ib_dev *dev =to_mdev (qp->ibqp.device); -struct mlx5_ib_srq *srq; +struct mlx5_ib_srq *srq =NULL ;struct mlx5_ib_wq *wq;u16 wqe_ctr;u8 roce_packet_type;
@@ -179,7 +179,8 @@ static void handle_responder(struct ib_wc *wc, struct mlx5_cqe64 *cqe,if (qp->ibqp.xrcd) { msrq =mlx5_cmd_get_srq (dev,be32_to_cpu (cqe->srqn)); - srq =to_mibsrq (msrq); +if (msrq) + srq =to_mibsrq (msrq); }else { srq =to_msrq (qp->ibqp.srq); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 209/408 mtd: mtdoops: Dont write panic data twice
In reply to Greg Kroah-HartmanFrom: Mark Tomlinson <[email protected]>
[ Upstream commit c1cf1d57d1492235309111ea6a900940213a9166 ]
If calling mtdoops_write, don't also schedule work to be done later.
Although this appears to not be causing an issue, possibly because the scheduled work will never get done, it is confusing.
--- drivers/mtd/mtdoops.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/mtd/mtdoops.c +6 -5
@@ -279,12 +279,13 @@ static void mtdoops_do_dump(struct kmsg_dumper *dumper,kmsg_dump_get_buffer (dumper, true, cxt->oops_buf +MTDOOPS_HEADER_SIZE , record_size -MTDOOPS_HEADER_SIZE ,NULL ); -/* Panics must be written immediately */ -if (reason !=KMSG_DUMP_OOPS ) +if (reason !=KMSG_DUMP_OOPS ) { +/* Panics must be written immediately */ mtdoops_write (cxt,1 ); - -/* For other cases, schedule work to write it "nicely" */ -schedule_work (&cxt->work_write); + }else { +/* For other cases, schedule work to write it "nicely" */ +schedule_work (&cxt->work_write); + } }static void mtdoops_notify_add (struct mtd_info *mtd)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 210/408 ARM: 9007/1: l2c: fix prefetch bits init in L2X0_AUX_CTRL using DT values
In reply to Greg Kroah-HartmanFrom: Guillaume Tucker <[email protected]>
[ Upstream commit 8e007b367a59bcdf484c81f6df9bd5a4cc179ca6 ]
The L310_PREFETCH_CTRL register bits 28 and 29 to enable data and instruction prefetch respectively can also be accessed via the L2X0_AUX_CTRL register. They appear to be actually wired together in hardware between the registers. Changing them in the prefetch register only will get undone when restoring the aux control register later on. For this reason, set these bits in both registers during initialisation according to the devicetree property values.
--- arch/arm/mm/cache-l2x0.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
arch/arm/mm/cache-l2x0.c +12 -4
@@ -1249,20 +1249,28 @@ static void __init l2c310_of_parse(const struct device_node *np, ret =of_property_read_u32 (np,"prefetch-data" , &val);if (ret ==0 ) { -if (val) +if (val) { prefetch |=L310_PREFETCH_CTRL_DATA_PREFETCH ; -else + *aux_val |=L310_PREFETCH_CTRL_DATA_PREFETCH ; + }else { prefetch &= ~L310_PREFETCH_CTRL_DATA_PREFETCH ; + *aux_val &= ~L310_PREFETCH_CTRL_DATA_PREFETCH ; + } + *aux_mask &= ~L310_PREFETCH_CTRL_DATA_PREFETCH ; }else if (ret != -EINVAL ) {pr_err ("L2C-310 OF prefetch-data property value is missing\n" ); } ret =of_property_read_u32 (np,"prefetch-instr" , &val);if (ret ==0 ) { -if (val) +if (val) { prefetch |=L310_PREFETCH_CTRL_INSTR_PREFETCH ; -else + *aux_val |=L310_PREFETCH_CTRL_INSTR_PREFETCH ; + }else { prefetch &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH ; + *aux_val &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH ; + } + *aux_mask &= ~L310_PREFETCH_CTRL_INSTR_PREFETCH ; }else if (ret != -EINVAL ) {pr_err ("L2C-310 OF prefetch-instr property value is missing\n" ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 211/408 arc: plat-hsdk: fix kconfig dependency warning when !RESET_CONTROLLER
In reply to Greg Kroah-HartmanFrom: Necip Fazil Yildiran <[email protected]>
[ Upstream commit 63bcf87cb1c57956e1179f1a78dde625c7e3cba7 ]
When ARC_SOC_HSDK is enabled and RESET_CONTROLLER is disabled, it results in the following Kbuild warning:
WARNING: unmet direct dependencies detected for RESET_HSDK
Depends on [n]: RESET_CONTROLLER [=n] && HAS_IOMEM [=y] && (ARC_SOC_HSDK [=y] || COMPILE_TEST [=n]) Selected by [y]:
- ARC_SOC_HSDK [=y] && ISA_ARCV2 [=y]
The reason is that ARC_SOC_HSDK selects RESET_HSDK without depending on or selecting RESET_CONTROLLER while RESET_HSDK is subordinate to RESET_CONTROLLER.
Honor the kconfig menu hierarchy to remove kconfig dependency warnings.
--- arch/arc/plat-hsdk/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/arc/plat-hsdk/Kconfig +1 -0
@@ -8,5 +8,6 @@ menuconfig ARC_SOC_HSDK select ARC_HAS_ACCL_REGS select ARC_IRQ_NO_AUTOSAVE select CLK_HSDK + select RESET_CONTROLLER select RESET_HSDK select HAVE_PCI
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 212/408 ida: Free allocated bitmap in error path
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit a219b856a2b993da234108307be772448f22b0ce ]
If a bitmap needs to be allocated, and then by the time the thread is scheduled to be run again all the indices which would satisfy the allocation have been allocated then we would leak the allocation. Almost impossible to hit in practice, but a trivial fix. Found by Coverity.
--- lib/idr.c | 1 + tools/testing/radix-tree/idr-test.c | 29 +++++++++++++++++++++++++++++ 2 files changed, 30 insertions(+)
lib/idr.c +1 -0
@@ -470,6 +470,7 @@ int ida_alloc_range(struct ida *ida, unsigned int min, unsigned int max, goto retry; nospc:xas_unlock_irqrestore (&xas, flags); +kfree (alloc);return -ENOSPC ; }EXPORT_SYMBOL (ida_alloc_range);
tools/testing/radix-tree/idr-test.c +29 -0
@@ -523,8 +523,27 @@ static void *ida_random_fn(void *arg)return NULL ; } +static void *ida_leak_fn (void *arg) +{ +struct ida *ida = arg; +time_t s =time (NULL ); +int i, ret; + +rcu_register_thread (); + +do for (i =0 ; i <1000 ; i++) { + ret =ida_alloc_range (ida,128 ,128 ,GFP_KERNEL ); +if (ret >=0 ) +ida_free (ida,128 ); + }while (time (NULL ) < s +2 ); + +rcu_unregister_thread (); +return NULL ; +} +void ida_thread_tests (void ) { +DEFINE_IDA (ida);pthread_t threads[20 ];int i;
@@ -536,6 +555,16 @@ void ida_thread_tests(void)while (i--)pthread_join (threads[i],NULL ); + +for (i =0 ; i <ARRAY_SIZE (threads); i++) +if (pthread_create (&threads[i],NULL , ida_leak_fn, &ida)) { +perror ("creating ida thread" ); +exit (1 ); + } + +while (i--) +pthread_join (threads[i],NULL ); +assert (ida_is_empty (&ida)); }void ida_tests (void )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 213/408 xfs: limit entries returned when counting fsmap records
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit acd1ac3aa22fd58803a12d26b1ab7f70232f8d8d ]
If userspace asked fsmap to count the number of entries, we cannot return more than UINT_MAX entries because fmh_entries is u32. Therefore, stop counting if we hit this limit or else we will waste time to return truncated results.
--- fs/xfs/xfs_fsmap.c | 3 +++ 1 file changed, 3 insertions(+)
fs/xfs/xfs_fsmap.c +3 -0
@@ -255,6 +255,9 @@ xfs_getfsmap_helper(/* Are we just counting mappings? */ if (info->head->fmh_count ==0 ) { +if (info->head->fmh_entries ==UINT_MAX ) +return -ECANCELED ; +if (rec_daddr > info->next_daddr) info->head->fmh_entries++;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 214/408 xfs: fix deadlock and streamline xfs_getfsmap performance
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit 8ffa90e1145c70c7ac47f14b59583b2296d89e72 ]
Refactor xfs_getfsmap to improve its performance: instead of indirectly calling a function that copies one record to userspace at a time, create a shadow buffer in the kernel and copy the whole array once at the end. On the author's computer, this reduces the runtime on his /home by ~20%.
This also eliminates a deadlock when running GETFSMAP against the realtime device. The current code locks the rtbitmap to create fsmappings and copies them into userspace, having not released the rtbitmap lock. If the userspace buffer is an mmap of a sparse file that itself resides on the realtime device, the write page fault will recurse into the fs for allocation, which will deadlock on the rtbitmap lock.
--- fs/xfs/xfs_fsmap.c | 45 +++++++------- fs/xfs/xfs_fsmap.h | 6 +- fs/xfs/xfs_ioctl.c | 144 ++++++++++++++++++++++++++++++--------------- 3 files changed, 124 insertions(+), 71 deletions(-)
fs/xfs/xfs_fsmap.c +25 -20
@@ -26,7 +26,7 @@#include "xfs_rtalloc.h" /* Convert an xfs_fsmap to an fsmap. */ -void +static void xfs_fsmap_from_internal (struct fsmap *dest,struct xfs_fsmap *src)
@@ -154,8 +154,7 @@ xfs_fsmap_owner_from_rmap(/* getfsmap query state */ struct xfs_getfsmap_info {struct xfs_fsmap_head *head; -xfs_fsmap_format_t formatter;/* formatting fn */ -void *format_arg;/* format buffer */ +struct fsmap *fsmap_recs;/* mapping records */ struct xfs_buf *agf_bp;/* AGF, for refcount queries */ xfs_daddr_t next_daddr;/* next daddr we expect */ u64 missing_owner;/* owner of holes */
@@ -223,6 +222,20 @@ xfs_getfsmap_is_shared(return 0 ; } +static inline void +xfs_getfsmap_format ( +struct xfs_mount *mp, +struct xfs_fsmap *xfm, +struct xfs_getfsmap_info *info) +{ +struct fsmap *rec; + +trace_xfs_getfsmap_mapping (mp, xfm); + + rec = &info->fsmap_recs[info->head->fmh_entries++]; +xfs_fsmap_from_internal (rec, xfm); +} +/* * Format a reverse mapping for getfsmap, having translated rm_startblock * into the appropriate daddr units.
@@ -287,10 +300,7 @@ xfs_getfsmap_helper( fmr.fmr_offset =0 ; fmr.fmr_length = rec_daddr - info->next_daddr; fmr.fmr_flags =FMR_OF_SPECIAL_OWNER ; - error = info->formatter (&fmr, info->format_arg); -if (error) -return error; - info->head->fmh_entries++; +xfs_getfsmap_format (mp, &fmr, info); }if (info->last)
@@ -322,11 +332,8 @@ xfs_getfsmap_helper(if (shared) fmr.fmr_flags |=FMR_OF_SHARED ; } - error = info->formatter (&fmr, info->format_arg); -if (error) -return error; - info->head->fmh_entries++; +xfs_getfsmap_format (mp, &fmr, info); out: rec_daddr +=XFS_FSB_TO_BB (mp, rec->rm_blockcount);if (info->next_daddr < rec_daddr)
@@ -794,11 +801,11 @@ xfs_getfsmap_check_keys(#endif /* CONFIG_XFS_RT */ /* -* Get filesystem's extents as described in head, and format for -* output. Calls formatter to fill the user's buffer until all -* extents are mapped, until the passed-in head->fmh_count slots have -* been filled, or until the formatter short-circuits the loop, if it -* is tracking filled-in extents on its own. +* Get filesystem's extents as described in head, and format for output. Fills +* in the supplied records array until there are no more reverse mappings to +* return or head.fmh_entries == head.fmh_count. In the second case, this +* function returns -ECANCELED to indicate that more records would have been +* returned. * * Key to Confusion * ----------------
@@ -818,8 +825,7 @@ intxfs_getfsmap ( struct xfs_mount *mp, struct xfs_fsmap_head *head, - xfs_fsmap_format_t formatter, - void *arg) + struct fsmap *fsmap_recs) { struct xfs_trans *tp = NULL;struct xfs_fsmap dkeys[2 ];/* per-dev keys */
@@ -894,8 +900,7 @@ xfs_getfsmap( info.next_daddr = head->fmh_keys[0 ].fmr_physical + head->fmh_keys[0 ].fmr_length; - info.formatter = formatter; - info.format_arg = arg; + info.fsmap_recs = fsmap_recs; info.head = head;/*
fs/xfs/xfs_fsmap.h +1 -5
@@ -27,13 +27,9 @@ struct xfs_fsmap_head { struct xfs_fsmap fmh_keys[2]; /* low and high keys */ }; -void xfs_fsmap_from_internal (struct fsmap *dest,struct xfs_fsmap *src);void xfs_fsmap_to_internal (struct xfs_fsmap *dest,struct fsmap *src); -/* fsmap to userspace formatter - copy to user & advance pointer */ -typedef int (*xfs_fsmap_format_t )(struct xfs_fsmap *,void *); -int xfs_getfsmap (struct xfs_mount *mp,struct xfs_fsmap_head *head, -xfs_fsmap_format_t formatter,void *arg); +struct fsmap *out_recs);#endif /* __XFS_FSMAP_H__ */
fs/xfs/xfs_ioctl.c +98 -46
175 lines not on this page · raw message
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 215/408 xfs: fix high key handling in the rt allocators query_range function
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit d88850bd5516a77c6f727e8b6cefb64e0cc929c7 ]
Fix some off-by-one errors in xfs_rtalloc_query_range. The highest key in the realtime bitmap is always one less than the number of rt extents, which means that the key clamp at the start of the function is wrong. The 4th argument to xfs_rtfind_forw is the highest rt extent that we want to probe, which means that passing 1 less than the high key is wrong. Finally, drop the rem variable that controls the loop because we can compare the iteration point (rtstart) against the high key directly.
The sordid history of this function is that the original commit (fb3c3) incorrectly passed (high_rec->ar_startblock - 1) as the 'limit' parameter to xfs_rtfind_forw. This was wrong because the "high key" is supposed to be the largest key for which the caller wants result rows, not the key for the first row that could possibly be outside the range that the caller wants to see.
A subsequent attempt (8ad56) to strengthen the parameter checking added incorrect clamping of the parameters to the number of rt blocks in the system (despite the bitmap functions all taking units of rt extents) to avoid querying ranges past the end of rt bitmap file but failed to fix the incorrect _rtfind_forw parameter. The original _rtfind_forw parameter error then survived the conversion of the startblock and blockcount fields to rt extents (a0e5c), and the most recent off-by-one fix (a3a37) thought it was patching a problem when the end of the rt volume is not in use, but none of these fixes actually solved the original problem that the author was confused about the "limit" argument to xfs_rtfind_forw.
Sadly, all four of these patches were written by this author and even his own usage of this function and rt testing were inadequate to get this fixed quickly.
Original-problem: fb3c3de2f65c ("xfs: add a couple of queries to iterate free extents in the rtbitmap")
--- fs/xfs/libxfs/xfs_rtbitmap.c | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-)
fs/xfs/libxfs/xfs_rtbitmap.c +4 -7
@@ -1018,7 +1018,6 @@ xfs_rtalloc_query_range(struct xfs_mount *mp = tp->t_mountp;xfs_rtblock_t rtstart;xfs_rtblock_t rtend; -xfs_rtblock_t rem;int is_free;int error =0 ;
@@ -1027,13 +1026,12 @@ xfs_rtalloc_query_range(if (low_rec->ar_startext >= mp->m_sb.sb_rextents || low_rec->ar_startext == high_rec->ar_startext)return 0 ; -if (high_rec->ar_startext > mp->m_sb.sb_rextents) - high_rec->ar_startext = mp->m_sb.sb_rextents; + high_rec->ar_startext =min (high_rec->ar_startext, + mp->m_sb.sb_rextents -1 );/* Iterate the bitmap, looking for discrepancies. */ rtstart = low_rec->ar_startext; - rem = high_rec->ar_startext - rtstart; -while (rem) { +while (rtstart <= high_rec->ar_startext) {/* Is the first block free? */ error =xfs_rtcheck_range (mp, tp, rtstart,1 ,1 , &rtend, &is_free);
@@ -1042,7 +1040,7 @@ xfs_rtalloc_query_range(/* How long does the extent go for? */ error =xfs_rtfind_forw (mp, tp, rtstart, - high_rec->ar_startext -1 , &rtend); + high_rec->ar_startext, &rtend);if (error)break ;
@@ -1055,7 +1053,6 @@ xfs_rtalloc_query_range(break ; } - rem -= rtend - rtstart +1 ; rtstart = rtend +1 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 216/408 RDMA/umem: Fix ib_umem_find_best_pgsz() for mappings that cross a page boundary
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit a40c20dabdf9045270767c75918feb67f0727c89 ]
It is possible for a single SGL to span an aligned boundary, eg if the SGL is
61440 -> 90112
Then the length is 28672, which currently limits the block size to 32k. With a 32k page size the two covering blocks will be:
32768->65536 and 65536->98304
However, the correct answer is a 128K block size which will span the whole 28672 bytes in a single block.
Instead of limiting based on length figure out which high IOVA bits don't change between the start and end addresses. That is the highest useful page size.
--- drivers/infiniband/core/umem.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/infiniband/core/umem.c +7 -2
@@ -156,8 +156,13 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,return 0 ; va = virt; -/* max page size not to exceed MR length */ - mask =roundup_pow_of_two (umem->length); +/* The best result is the smallest page size that results in the minimum +* number of required pages. Compute the largest page size that could +* work based on VA address bits that don't change. +*/ + mask = pgsz_bitmap & +GENMASK (BITS_PER_LONG -1 , +bits_per ((umem->length -1 + virt) ^ virt));/* offset into first SGL */ pgoff = umem->address & ~PAGE_MASK ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 217/408 RDMA/umem: Prevent small pages from being returned by ib_umem_find_best_pgsz()
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 10c75ccb54e4fe548cb16d7ed426d7d709e6ae76 ]
rdma_for_each_block() makes assumptions about how the SGL is constructed that don't work if the block size is below the page size used to to build the SGL.
The rules for umem SGL construction require that the SG's all be PAGE_SIZE aligned and we don't encode the actual byte offset of the VA range inside the SGL using offset and length. So rdma_for_each_block() has no idea where the actual starting/ending point is to compute the first/last block boundary if the starting address should be within a SGL.
Fixing the SGL construction turns out to be really hard, and will be the subject of other patches. For now block smaller pages.
--- drivers/infiniband/core/umem.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/infiniband/core/umem.c +6 -0
@@ -151,6 +151,12 @@ unsigned long ib_umem_find_best_pgsz(struct ib_umem *umem,dma_addr_t mask;int i; +/* rdma_for_each_block() has a bug if the page size is smaller than the +* page size used to build the umem. For now prevent smaller page sizes +* from being returned. +*/ + pgsz_bitmap &=GENMASK (BITS_PER_LONG -1 ,PAGE_SHIFT ); +/* At minimum, drivers must support PAGE_SIZE or smaller */ if (WARN_ON (!(pgsz_bitmap &GENMASK (PAGE_SHIFT ,0 ))))return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 218/408 RDMA/qedr: Fix qp structure memory leak
In reply to Greg Kroah-HartmanFrom: Michal Kalderon <[email protected]>
[ Upstream commit 098e345a1a8faaad6e4e54d138773466cecc45d4 ]
The qedr_qp structure wasn't freed when the protocol was RoCE. kmemleak output when running basic RoCE scenario.
unreferenced object 0xffff927ad7e22c00 (size 1024):
comm "ib_send_bw", pid 7082, jiffies 4384133693 (age 274.698s) hex dump (first 32 bytes):
00 b0 cd a2 79 92 ff ff 00 3f a1 a2 79 92 ff ff ....y....?..y...
00 ee 5c dd 80 92 ff ff 00 f6 5c dd 80 92 ff ff ..\.......\.....
backtrace:
[<00000000b2ba0f35>] qedr_create_qp+0xb3/0x6c0 [qedr]
[<00000000e85a43dd>] ib_uverbs_handler_UVERBS_METHOD_QP_CREATE+0x555/0xad0 [ib_uverbs]
[<00000000fee4d029>] ib_uverbs_cmd_verbs+0xa5a/0xb80 [ib_uverbs]
[<000000005d622660>] ib_uverbs_ioctl+0xa4/0x110 [ib_uverbs]
[<00000000eb4cdc71>] ksys_ioctl+0x87/0xc0
[<00000000abe6b23a>] __x64_sys_ioctl+0x16/0x20
[<0000000046e7cef4>] do_syscall_64+0x4d/0x90
[<00000000c6948f76>] entry_SYSCALL_64_after_hwframe+0x44/0xa9--- drivers/infiniband/hw/qedr/verbs.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/infiniband/hw/qedr/verbs.c +2 -0
@@ -2518,6 +2518,8 @@ int qedr_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata)if (rdma_protocol_iwarp (&dev->ibdev,1 ))qedr_iw_qp_rem_ref (&qp->ibqp); +else +kfree (qp);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 219/408 RDMA/qedr: Fix use of uninitialized field
In reply to Greg Kroah-HartmanFrom: Michal Kalderon <[email protected]>
[ Upstream commit a379ad54e55a12618cae7f6333fd1b3071de9606 ]
dev->attr.page_size_caps was used uninitialized when setting device attributes
--- drivers/infiniband/hw/qedr/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/qedr/main.c +1 -1
@@ -601,7 +601,7 @@ static int qedr_set_device_attr(struct qedr_dev *dev) qed_attr = dev->ops->rdma_query_device (dev->rdma_ctx);/* Part 2 - check capabilities */ - page_size = ~dev->attr.page_size_caps +1 ; + page_size = ~qed_attr->page_size_caps +1 ;if (page_size >PAGE_SIZE ) { DP_ERR(dev, "Kernel PAGE_SIZE is %ld which is smaller than minimum page size (%d) required by qedr\n",
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 220/408 RDMA/qedr: Fix return code if accept is called on a destroyed qp
In reply to Greg Kroah-HartmanFrom: Michal Kalderon <[email protected]>
[ Upstream commit 8a5a10a1a74465065c75d9de1aa6685e1f1aa117 ]
In iWARP, accept could be called after a QP is already destroyed. In this case an error should be returned and not success.
--- drivers/infiniband/hw/qedr/qedr_iw_cm.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/infiniband/hw/qedr/qedr_iw_cm.c +4 -2
@@ -736,7 +736,7 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param)struct qedr_dev *dev = ep->dev;struct qedr_qp *qp;struct qed_iwarp_accept_in params; -int rc =0 ; +int rc;DP_DEBUG (dev,QEDR_MSG_IWARP ,"Accept on qpid=%d\n" , conn_param->qpn);
@@ -759,8 +759,10 @@ int qedr_iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) params.ord = conn_param->ord;if (test_and_set_bit (QEDR_IWARP_CM_WAIT_FOR_CONNECT , - &qp->iwarp_cm_flags)) + &qp->iwarp_cm_flags)) { + rc = -EINVAL ; goto err;/* QP already destroyed */ + } rc = dev->ops->iwarp_accept (dev->rdma_ctx, ¶ms);if (rc) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 221/408 RDMA/qedr: Fix inline size returned for iWARP
In reply to Greg Kroah-HartmanFrom: Michal Kalderon <[email protected]>
[ Upstream commit fbf58026b2256e9cd5f241a4801d79d3b2b7b89d ]
commit 59e8970b3798 ("RDMA/qedr: Return max inline data in QP query result") changed query_qp max_inline size to return the max roce inline size. When iwarp was introduced, this should have been modified to return the max inline size based on protocol. This size is cached in the device attributes
--- drivers/infiniband/hw/qedr/verbs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/infiniband/hw/qedr/verbs.c +1 -1
@@ -2405,7 +2405,7 @@ int qedr_query_qp(struct ib_qp *ibqp, qp_attr->cap.max_recv_wr = qp->rq.max_wr; qp_attr->cap.max_send_sge = qp->sq.max_sges; qp_attr->cap.max_recv_sge = qp->rq.max_sges; - qp_attr->cap.max_inline_data =ROCE_REQ_MAX_INLINE_DATA_SIZE ; + qp_attr->cap.max_inline_data = dev->attr.max_inline; qp_init_attr->cap = qp_attr->cap; qp_attr->ah_attr.type =RDMA_AH_ATTR_TYPE_ROCE ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 222/408 powerpc/book3s64/hash/4k: Support large linear mapping range with 4K
In reply to Greg Kroah-HartmanFrom: Aneesh Kumar K.V <[email protected]>
[ Upstream commit 7746406baa3bc9e23fdd7b7da2f04d86e25ab837 ]
With commit: 0034d395f89d ("powerpc/mm/hash64: Map all the kernel regions in the same 0xc range"), we now split the 64TB address range into 4 contexts each of 16TB. That implies we can do only 16TB linear mapping.
On some systems, eg. Power9, memory attached to nodes > 0 will appear above 16TB in the linear mapping. This resulted in kernel crash when we boot such systems in hash translation mode with 4K PAGE_SIZE.
This patch updates the kernel mapping such that we now start supporting upto 61TB of memory with 4K. The kernel mapping now looks like below 4K PAGE_SIZE and hash translation.
vmalloc start = 0xc0003d0000000000
IO start = 0xc0003e0000000000
vmemmap start = 0xc0003f0000000000Our MAX_PHYSMEM_BITS for 4K is still 64TB even though we can only map 61TB. We prevent bolt mapping anything outside 61TB range by checking against H_VMALLOC_START.
--- arch/powerpc/include/asm/book3s/64/hash-4k.h | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
arch/powerpc/include/asm/book3s/64/hash-4k.h +6 -7
@@ -13,20 +13,19 @@*/ #define MAX_EA_BITS_PER_CONTEXT 46 -#define REGION_SHIFT (MAX_EA_BITS_PER_CONTEXT - 2)/* -* Our page table limit us to 64TB. Hence for the kernel mapping, -* each MAP area is limited to 16 TB. -* The four map areas are: linear mapping, vmap, IO and vmemmap +* Our page table limit us to 64TB. For 64TB physical memory, we only need 64GB +* of vmemmap space. To better support sparse memory layout, we use 61TB +* linear map range, 1TB of vmalloc, 1TB of I/O and 1TB of vmememmap. */ +#define REGION_SHIFT (40)#define H_KERN_MAP_SIZE (ASM_CONST(1) << REGION_SHIFT)/* -* Define the address range of the kernel non-linear virtual area -* 16TB +* Define the address range of the kernel non-linear virtual area (61TB) */ -#define H_KERN_VIRT_START ASM_CONST(0xc000100000000000) +#define H_KERN_VIRT_START ASM_CONST(0xc0003d0000000000)#ifndef __ASSEMBLY__#define H_PTE_TABLE_SIZE (sizeof(pte_t) << H_PTE_INDEX_SIZE)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 223/408 powerpc/tau: Use appropriate temperature sample interval
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 66943005cc41f48e4d05614e8f76c0ca1812f0fd ]
According to the MPC750 Users Manual, the SITV value in Thermal Management Register 3 is 13 bits long. The present code calculates the SITV value as 60 * 500 cycles. This would overflow to give 10 us on a 500 MHz CPU rather than the intended 60 us. (But according to the Microprocessor Datasheet, there is also a factor of 266 that has to be applied to this value on certain parts i.e. speed sort above 266 MHz.) Always use the maximum cycle count, as recommended by the Datasheet.
--- arch/powerpc/include/asm/reg.h | 2 +- arch/powerpc/kernel/tau_6xx.c | 12 ++++-------- 2 files changed, 5 insertions(+), 9 deletions(-)
arch/powerpc/include/asm/reg.h +1 -1
@@ -796,7 +796,7 @@#define THRM1_TIN (1 << 31)#define THRM1_TIV (1 << 30)#define THRM1_THRES (x) ((x&0x7f)<<23) -#define THRM3_SITV (x) ((x&0x3fff)<<1) +#define THRM3_SITV (x) ((x & 0x1fff) << 1)#define THRM1_TID (1<<2)#define THRM1_TIE (1<<1)#define THRM1_V (1<<0)
arch/powerpc/kernel/tau_6xx.c +4 -8
@@ -178,15 +178,11 @@ static void tau_timeout(void * info)* complex sleep code needs to be added. One mtspr every time * tau_timeout is called is probably not a big deal. * -* Enable thermal sensor and set up sample interval timer -* need 20 us to do the compare.. until a nice 'cpu_speed' function -* call is implemented, just assume a 500 mhz clock. It doesn't really -* matter if we take too long for a compare since it's all interrupt -* driven anyway. -* -* use a extra long time.. (60 us @ 500 mhz) +* The "PowerPC 740 and PowerPC 750 Microprocessor Datasheet" +* recommends that "the maximum value be set in THRM3 under all +* conditions." */ -mtspr (SPRN_THRM3 ,THRM3_SITV (500 *60 ) |THRM3_E ); +mtspr (SPRN_THRM3 ,THRM3_SITV (0x1fff ) |THRM3_E );local_irq_restore (flags); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 224/408 powerpc/tau: Convert from timer to workqueue
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit b1c6a0a10bfaf36ec82fde6f621da72407fa60a1 ]
Since commit 19dbdcb8039cf ("smp: Warn on function calls from softirq context") the Thermal Assist Unit driver causes a warning like the following when CONFIG_SMP is enabled.
------------[ cut here ]------------
WARNING: CPU: 0 PID: 0 at kernel/smp.c:428 smp_call_function_many_cond+0xf4/0x38c
Modules linked in:
CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.7.0-pmac #3
NIP: c00b37a8 LR: c00b3abc CTR: c001218c
REGS: c0799c60 TRAP: 0700 Not tainted (5.7.0-pmac)
MSR: 00029032 <EE,ME,IR,DR,RI> CR: 42000224 XER: 00000000
GPR00: c00b3abc c0799d18 c076e300 c079ef5c c0011fec 00000000 00000000 00000000
GPR08: 00000100 00000100 00008000 ffffffff 42000224 00000000 c079d040 c079d044
GPR16: 00000001 00000000 00000004 c0799da0 c079f054 c07a0000 c07a0000 00000000
GPR24: c0011fec 00000000 c079ef5c c079ef5c 00000000 00000000 00000000 00000000
NIP [c00b37a8] smp_call_function_many_cond+0xf4/0x38c
LR [c00b3abc] on_each_cpu+0x38/0x68
Call Trace:
[c0799d18] [ffffffff] 0xffffffff (unreliable)
[c0799d68] [c00b3abc] on_each_cpu+0x38/0x68
[c0799d88] [c0096704] call_timer_fn.isra.26+0x20/0x7c
[c0799d98] [c0096b40] run_timer_softirq+0x1d4/0x3fc
[c0799df8] [c05b4368] __do_softirq+0x118/0x240
[c0799e58] [c0039c44] irq_exit+0xc4/0xcc
[c0799e68] [c000ade8] timer_interrupt+0x1b0/0x230
[c0799ea8] [c0013520] ret_from_except+0x0/0x14
--- interrupt: 901 at arch_cpu_idle+0x24/0x6c
LR = arch_cpu_idle+0x24/0x6c
[c0799f70] [00000001] 0x1 (unreliable)
[c0799f80] [c0060990] do_idle+0xd8/0x17c
[c0799fa0] [c0060ba8] cpu_startup_entry+0x24/0x28
[c0799fb0] [c072d220] start_kernel+0x434/0x44c
[c0799ff0] [00003860] 0x3860
Instruction dump:
8129f204 2f890000 40beff98 3d20c07a 8929eec4 2f890000 40beff88 0fe00000
81220000 552805de 550802ef 4182ff84 <0fe00000> 3860ffff 7f65db78 7f44d378
---[ end trace 34a886e47819c2eb ]---Don't call on_each_cpu() from a timer callback, call it from a worker thread instead.
--- arch/powerpc/kernel/tau_6xx.c | 38 +++++++++++++++++------------------ 1 file changed, 18 insertions(+), 20 deletions(-)
arch/powerpc/kernel/tau_6xx.c +18 -20
@@ -13,13 +13,14 @@*/ #include <linux/errno.h> -#include <linux/jiffies.h> #include <linux/kernel.h> #include <linux/param.h> #include <linux/string.h> #include <linux/mm.h> #include <linux/interrupt.h> #include <linux/init.h> +#include <linux/delay.h> +#include <linux/workqueue.h> #include <asm/io.h> #include <asm/reg.h>
@@ -39,8 +40,6 @@ static struct tau_tempunsigned char grew; } tau[NR_CPUS ]; -struct timer_list tau_timer; -#undef DEBUG/* TODO: put these in a /proc interface, with some sanity checks, and maybe
@@ -50,7 +49,7 @@ struct timer_list tau_timer;#define step_size 2/* step size when temp goes out of range */ #define window_expand 1/* expand the window by this much */ /* configurable values for shrinking the window */ -#define shrink_timer 2*HZ/* period between shrinking the window */ +#define shrink_timer 2000/* period between shrinking the window */ #define min_window 2/* minimum window size, degrees C */ static void set_thresholds (unsigned long cpu)
@@ -187,14 +186,18 @@ static void tau_timeout(void * info)local_irq_restore (flags); } -static void tau_timeout_smp (struct timer_list *unused) -{ +static struct workqueue_struct *tau_workq; -/* schedule ourselves to be run again */ -mod_timer (&tau_timer, jiffies + shrink_timer) ; +static void tau_work_func (struct work_struct *work) +{ +msleep (shrink_timer);on_each_cpu (tau_timeout,NULL ,0 ); +/* schedule ourselves to be run again */ +queue_work (tau_workq, work); } +DECLARE_WORK (tau_work, tau_work_func); +/* * setup the TAU *
@@ -227,21 +230,16 @@ static int __init TAU_init(void)return 1 ; } - -/* first, set up the window shrinking timer */ -timer_setup (&tau_timer, tau_timeout_smp,0 ); - tau_timer.expires = jiffies + shrink_timer; -add_timer (&tau_timer); + tau_workq =alloc_workqueue ("tau" ,WQ_UNBOUND ,1 ,0 ); +if (!tau_workq) +return -ENOMEM ;on_each_cpu (TAU_init_smp,NULL ,0 ); -printk ("Thermal assist unit " ); -#ifdef CONFIG_TAU_INT -printk ("using interrupts, " ); -#else -printk ("using timers, " ); -#endif -printk ("shrink_timer: %d jiffies\n" , shrink_timer); +queue_work (tau_workq, &tau_work); + +pr_info ("Thermal assist unit using %s, shrink_timer: %d ms\n" , +IS_ENABLED (CONFIG_TAU_INT ) ?"interrupts" :"workqueue" , shrink_timer); tau_initialized =1 ;return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 225/408 powerpc/tau: Remove duplicated set_thresholds() call
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 420ab2bc7544d978a5d0762ee736412fe9c796ab ]
The commentary at the call site seems to disagree with the code. The conditional prevents calling set_thresholds() via the exception handler, which appears to crash. Perhaps that's because it immediately triggers another TAU exception. Anyway, calling set_thresholds() from TAUupdate() is redundant because tau_timeout() does so.
--- arch/powerpc/kernel/tau_6xx.c | 5 ----- 1 file changed, 5 deletions(-)
arch/powerpc/kernel/tau_6xx.c +0 -5
@@ -110,11 +110,6 @@ static void TAUupdate(int cpu)#ifdef DEBUG printk ("grew = %d\n" , tau[cpu].grew);#endif - -#ifndef CONFIG_TAU_INT /* tau_timeout will do this if not using interrupts */ -set_thresholds (cpu); -#endif - }#ifdef CONFIG_TAU_INT
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 226/408 powerpc/tau: Check processor type before enabling TAU interrupt
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit 5e3119e15fed5b9a9a7e528665ff098a4a8dbdbc ]
According to Freescale's documentation, MPC74XX processors have an erratum that prevents the TAU interrupt from working, so don't try to use it when running on those processors.
--- arch/powerpc/kernel/tau_6xx.c | 33 ++++++++++++++------------------- arch/powerpc/platforms/Kconfig | 5 ++--- 2 files changed, 16 insertions(+), 22 deletions(-)
arch/powerpc/kernel/tau_6xx.c +14 -19
@@ -40,6 +40,8 @@ static struct tau_tempunsigned char grew; } tau[NR_CPUS ]; +static bool tau_int_enable; +#undef DEBUG/* TODO: put these in a /proc interface, with some sanity checks, and maybe
@@ -54,22 +56,13 @@ static struct tau_tempstatic void set_thresholds (unsigned long cpu) { -#ifdef CONFIG_TAU_INT -/* -* setup THRM1, -* threshold, valid bit, enable interrupts, interrupt when below threshold -*/ -mtspr (SPRN_THRM1 ,THRM1_THRES (tau[cpu].low) |THRM1_V |THRM1_TIE |THRM1_TID ); +u32 maybe_tie = tau_int_enable ?THRM1_TIE :0 ; -/* setup THRM2, -* threshold, valid bit, enable interrupts, interrupt when above threshold -*/ -mtspr (SPRN_THRM2 ,THRM1_THRES (tau[cpu].high) |THRM1_V |THRM1_TIE ); -#else -/* same thing but don't enable interrupts */ -mtspr (SPRN_THRM1 ,THRM1_THRES (tau[cpu].low) |THRM1_V |THRM1_TID ); -mtspr (SPRN_THRM2 ,THRM1_THRES (tau[cpu].high) |THRM1_V ); -#endif +/* setup THRM1, threshold, valid bit, interrupt when below threshold */ +mtspr (SPRN_THRM1 ,THRM1_THRES (tau[cpu].low) |THRM1_V | maybe_tie |THRM1_TID ); + +/* setup THRM2, threshold, valid bit, interrupt when above threshold */ +mtspr (SPRN_THRM2 ,THRM1_THRES (tau[cpu].high) |THRM1_V | maybe_tie); }static void TAUupdate (int cpu)
@@ -142,9 +135,8 @@ static void tau_timeout(void * info)local_irq_save (flags); cpu =smp_processor_id (); -#ifndef CONFIG_TAU_INT -TAUupdate (cpu); -#endif +if (!tau_int_enable) +TAUupdate (cpu); size = tau[cpu].high - tau[cpu].low;if (size > min_window && ! tau[cpu].grew) {
@@ -225,6 +217,9 @@ static int __init TAU_init(void)return 1 ; } + tau_int_enable =IS_ENABLED (CONFIG_TAU_INT ) && + !strcmp (cur_cpu_spec->platform,"ppc750" ); + tau_workq =alloc_workqueue ("tau" ,WQ_UNBOUND ,1 ,0 );if (!tau_workq)return -ENOMEM ;
@@ -234,7 +229,7 @@ static int __init TAU_init(void)queue_work (tau_workq, &tau_work);pr_info ("Thermal assist unit using %s, shrink_timer: %d ms\n" , -IS_ENABLED (CONFIG_TAU_INT ) ?"interrupts" :"workqueue" , shrink_timer); + tau_int_enable ?"interrupts" :"workqueue" , shrink_timer); tau_initialized =1 ;return 0 ;
arch/powerpc/platforms/Kconfig +2 -3
@@ -219,9 +219,8 @@ config TAU temperature within 2-4 degrees Celsius. This option shows the current on-die temperature in /proc/cpuinfo if the cpu supports it. - Unfortunately, on some chip revisions, this sensor is very inaccurate - and in many cases, does not work at all, so don't assume the cpu - temp is actually what /proc/cpuinfo says it is. + Unfortunately, this sensor is very inaccurate when uncalibrated, so + don't assume the cpu temp is actually what /proc/cpuinfo says it is. config TAU_INT bool "Interrupt driven TAU driver (DANGEROUS)"
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 227/408 powerpc/tau: Disable TAU between measurements
In reply to Greg Kroah-HartmanFrom: Finn Thain <[email protected]>
[ Upstream commit e63d6fb5637e92725cf143559672a34b706bca4f ]
Enabling CONFIG_TAU_INT causes random crashes:
Unrecoverable exception 1700 at c0009414 (msr=1000)
Oops: Unrecoverable exception, sig: 6 [#1] BE PAGE_SIZE=4K MMU=Hash SMP NR_CPUS=2 PowerMac Modules linked in: CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.7.0-pmac-00043-gd5f545e1a8593 #5 NIP: c0009414 LR: c0009414 CTR: c00116fc REGS: c0799eb8 TRAP: 1700 Not tainted (5.7.0-pmac-00043-gd5f545e1a8593) MSR: 00001000 <ME> CR: 22000228 XER: 00000100
GPR00: 00000000 c0799f70 c076e300 00800000 0291c0ac 00e00000 c076e300 00049032
GPR08: 00000001 c00116fc 00000000 dfbd3200 ffffffff 007f80a8 00000000 00000000
GPR16: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 c075ce04
GPR24: c075ce04 dfff8880 c07b0000 c075ce04 00080000 00000001 c079ef98 c079ef5c NIP [c0009414] arch_cpu_idle+0x24/0x6c
LR [c0009414] arch_cpu_idle+0x24/0x6c
Call Trace:
[c0799f70] [00000001] 0x1 (unreliable)
[c0799f80] [c0060990] do_idle+0xd8/0x17c
[c0799fa0] [c0060ba4] cpu_startup_entry+0x20/0x28
[c0799fb0] [c072d220] start_kernel+0x434/0x44c
[c0799ff0] [00003860] 0x3860
Instruction dump:
XXXXXXXX XXXXXXXX XXXXXXXX 3d20c07b XXXXXXXX XXXXXXXX XXXXXXXX 7c0802a6 XXXXXXXX XXXXXXXX XXXXXXXX 4e800421 XXXXXXXX XXXXXXXX XXXXXXXX 7d2000a6
---[ end trace 3a0c9b5cb216db6b ]---
Resolve this problem by disabling each THRMn comparator when handling the associated THRMn interrupt and by disabling the TAU entirely when updating THRMn thresholds.
--- arch/powerpc/kernel/tau_6xx.c | 65 +++++++++++++--------------------- arch/powerpc/platforms/Kconfig | 9 ++--- 2 files changed, 26 insertions(+), 48 deletions(-)
arch/powerpc/kernel/tau_6xx.c +24 -41
@@ -42,8 +42,6 @@ static struct tau_tempstatic bool tau_int_enable; -#undef DEBUG -/* TODO: put these in a /proc interface, with some sanity checks, and maybe * dynamic adjustment to minimize # of interrupts */ /* configurable values for step size and how much to expand the window when
@@ -67,42 +65,33 @@ static void set_thresholds(unsigned long cpu)static void TAUupdate (int cpu) { -unsigned thrm; - -#ifdef DEBUG -printk ("TAUupdate " ); -#endif +u32 thrm; +u32 bits =THRM1_TIV |THRM1_TIN |THRM1_V ;/* if both thresholds are crossed, the step_sizes cancel out * and the window winds up getting expanded twice. */ -if ((thrm =mfspr (SPRN_THRM1 )) &THRM1_TIV ){/* is valid? */ -if (thrm &THRM1_TIN ){/* crossed low threshold */ -if (tau[cpu].low >= step_size){ - tau[cpu].low -= step_size; - tau[cpu].high -= (step_size - window_expand); - } - tau[cpu].grew =1 ; -#ifdef DEBUG -printk ("low threshold crossed " ); -#endif + thrm =mfspr (SPRN_THRM1 ); +if ((thrm & bits) == bits) { +mtspr (SPRN_THRM1 ,0 ); + +if (tau[cpu].low >= step_size) { + tau[cpu].low -= step_size; + tau[cpu].high -= (step_size - window_expand); } + tau[cpu].grew =1 ; +pr_debug ("%s: low threshold crossed\n" , __func__); } -if ((thrm =mfspr (SPRN_THRM2 )) &THRM1_TIV ){/* is valid? */ -if (thrm &THRM1_TIN ){/* crossed high threshold */ -if (tau[cpu].high <=127 -step_size){ - tau[cpu].low += (step_size - window_expand); - tau[cpu].high += step_size; - } - tau[cpu].grew =1 ; -#ifdef DEBUG -printk ("high threshold crossed " ); -#endif + thrm =mfspr (SPRN_THRM2 ); +if ((thrm & bits) == bits) { +mtspr (SPRN_THRM2 ,0 ); + +if (tau[cpu].high <=127 - step_size) { + tau[cpu].low += (step_size - window_expand); + tau[cpu].high += step_size; } + tau[cpu].grew =1 ; +pr_debug ("%s: high threshold crossed\n" , __func__); } - -#ifdef DEBUG -printk ("grew = %d\n" , tau[cpu].grew); -#endif }#ifdef CONFIG_TAU_INT
@@ -127,17 +116,17 @@ void TAUException(struct pt_regs * regs)static void tau_timeout (void * info) {int cpu; -unsigned long flags;int size;int shrink; -/* disabling interrupts *should* be okay */ -local_irq_save (flags); cpu =smp_processor_id ();if (!tau_int_enable)TAUupdate (cpu); +/* Stop thermal sensor comparisons and interrupts */ +mtspr (SPRN_THRM3 ,0 ); + size = tau[cpu].high - tau[cpu].low;if (size > min_window && ! tau[cpu].grew) {/* do an exponential shrink of half the amount currently over size */
@@ -159,18 +148,12 @@ static void tau_timeout(void * info)set_thresholds (cpu); -/* -* Do the enable every time, since otherwise a bunch of (relatively) -* complex sleep code needs to be added. One mtspr every time -* tau_timeout is called is probably not a big deal. -* +/* Restart thermal sensor comparisons and interrupts. * The "PowerPC 740 and PowerPC 750 Microprocessor Datasheet" * recommends that "the maximum value be set in THRM3 under all * conditions." */ mtspr (SPRN_THRM3 ,THRM3_SITV (0x1fff ) |THRM3_E ); - -local_irq_restore (flags); }static struct workqueue_struct *tau_workq;
arch/powerpc/platforms/Kconfig +2 -7
@@ -223,7 +223,7 @@ config TAU don't assume the cpu temp is actually what /proc/cpuinfo says it is. config TAU_INT - bool "Interrupt driven TAU driver (DANGEROUS)" + bool "Interrupt driven TAU driver (EXPERIMENTAL)" depends on TAU ---help--- The TAU supports an interrupt driven mode which causes an interrupt
@@ -231,12 +231,7 @@ config TAU_INT to get notified the temp has exceeded a range. With this option off, a timer is used to re-check the temperature periodically. - However, on some cpus it appears that the TAU interrupt hardware - is buggy and can cause a situation which would lead unexplained hard - lockups. - - Unless you are extending the TAU driver, or enjoy kernel/hardware - debugging, leave this option off. + If in doubt, say N here. config TAU_AVERAGE bool "Average high and low temp"
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 228/408 powerpc/64s/radix: Fix mm_cpumask trimming race vs kthread_use_mm
In reply to Greg Kroah-HartmanFrom: Nicholas Piggin <[email protected]>
[ Upstream commit a665eec0a22e11cdde708c1c256a465ebe768047 ]
Commit 0cef77c7798a7 ("powerpc/64s/radix: flush remote CPUs out of single-threaded mm_cpumask") added a mechanism to trim the mm_cpumask of a process under certain conditions. One of the assumptions is that mm_users would not be incremented via a reference outside the process context with mmget_not_zero() then go on to kthread_use_mm() via that reference.
That invariant was broken by io_uring code (see previous sparc64 fix), but I'll point Fixes: to the original powerpc commit because we are changing that assumption going forward, so this will make backports match up.
Fix this by no longer relying on that assumption, but by having each CPU check the mm is not being used, and clearing their own bit from the mask only if it hasn't been switched-to by the time the IPI is processed.
This relies on commit 38cf307c1f20 ("mm: fix kthread_use_mm() vs TLB invalidate") and ARCH_WANT_IRQS_OFF_ACTIVATE_MM to disable irqs over mm switch sequences.
Depends-on: 38cf307c1f20 ("mm: fix kthread_use_mm() vs TLB invalidate")
--- arch/powerpc/include/asm/tlb.h | 13 ------------- arch/powerpc/mm/book3s64/radix_tlb.c | 23 ++++++++++++++++------- 2 files changed, 16 insertions(+), 20 deletions(-)
arch/powerpc/include/asm/tlb.h +0 -13
@@ -67,19 +67,6 @@ static inline int mm_is_thread_local(struct mm_struct *mm)return false; return cpumask_test_cpu(smp_processor_id(), mm_cpumask(mm)); } -static inline void mm_reset_thread_local (struct mm_struct *mm) -{ -WARN_ON (atomic_read (&mm->context.copros) >0 ); -/* -* It's possible for mm_access to take a reference on mm_users to -* access the remote mm from another thread, but it's not allowed -* to set mm_cpumask, so mm_users may be > 1 here. -*/ -WARN_ON (current->mm != mm); -atomic_set (&mm->context.active_cpus,1 ); -cpumask_clear (mm_cpumask (mm)); -cpumask_set_cpu (smp_processor_id (),mm_cpumask (mm)); -}#else /* CONFIG_PPC_BOOK3S_64 */ static inline int mm_is_thread_local (struct mm_struct *mm) {
arch/powerpc/mm/book3s64/radix_tlb.c +16 -7
@@ -639,19 +639,29 @@ static void do_exit_flush_lazy_tlb(void *arg)struct mm_struct *mm = arg;unsigned long pid = mm->context.id; +/* +* A kthread could have done a mmget_not_zero() after the flushing CPU +* checked mm_is_singlethreaded, and be in the process of +* kthread_use_mm when interrupted here. In that case, current->mm will +* be set to mm, because kthread_use_mm() setting ->mm and switching to +* the mm is done with interrupts off. +*/ if (current->mm == mm) -return ;/* Local CPU */ + goto out_flush;if (current->active_mm == mm) { -/* -* Must be a kernel thread because sender is single-threaded. -*/ -BUG_ON (current->mm); +WARN_ON_ONCE (current->mm !=NULL ); +/* Is a kernel thread and is using mm as the lazy tlb */ mmgrab (&init_mm); -switch_mm (mm, &init_mm, current); current->active_mm = &init_mm; +switch_mm_irqs_off (mm, &init_mm, current);mmdrop (mm); } + +atomic_dec (&mm->context.active_cpus); +cpumask_clear_cpu (smp_processor_id (),mm_cpumask (mm)); + +out_flush:_tlbiel_pid (pid,RIC_FLUSH_ALL ); }
@@ -666,7 +676,6 @@ static void exit_flush_lazy_tlbs(struct mm_struct *mm)*/ smp_call_function_many (mm_cpumask (mm), do_exit_flush_lazy_tlb, (void *)mm,1 ); -mm_reset_thread_local (mm); }void radix__flush_tlb_mm (struct mm_struct *mm)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 229/408 RDMA/cma: Remove dead code for kernel rdmacm multicast
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 1bb5091def706732c749df9aae45fbca003696f2 ]
There is no kernel user of RDMA CM multicast so this code managing the multicast subscription of the kernel-only internal QP is dead. Remove it.
This makes the bug fixes in the next patches much simpler.
--- drivers/infiniband/core/cma.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-)
drivers/infiniband/core/cma.c +4 -15
@@ -4182,16 +4182,6 @@ static int cma_ib_mc_handler(int status, struct ib_sa_multicast *multicast)else pr_debug_ratelimited ("RDMA CM: MULTICAST_ERROR: failed to join multicast. status %d\n" , status); -mutex_lock (&id_priv->qp_mutex); -if (!status && id_priv->id.qp) { - status =ib_attach_mcast (id_priv->id.qp, &multicast->rec.mgid, -be16_to_cpu (multicast->rec.mlid)); -if (status) -pr_debug_ratelimited ("RDMA CM: MULTICAST_ERROR: failed to attach QP. status %d\n" , - status); - } -mutex_unlock (&id_priv->qp_mutex); - event.status = status; event.param.ud.private_data = mc->context;if (!status) {
@@ -4446,6 +4436,10 @@ int rdma_join_multicast(struct rdma_cm_id *id, struct sockaddr *addr,struct cma_multicast *mc;int ret; +/* Not supported for kernel QPs */ +if (WARN_ON (id->qp)) +return -EINVAL ; +if (!id->device)return -EINVAL ;
@@ -4500,11 +4494,6 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr)list_del (&mc->list);spin_unlock_irq (&id_priv->lock); -if (id->qp) -ib_detach_mcast (id->qp, - &mc->multicast.ib->rec.mgid, -be16_to_cpu (mc->multicast.ib->rec.mlid)); -BUG_ON (id_priv->cma_dev->device != id->device);if (rdma_cap_ib_mcast (id->device, id->port_num)) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 230/408 RDMA/cma: Consolidate the destruction of a cma_multicast in one place
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 3788d2997bc0150ea911a964d5b5a2e11808a936 ]
Two places were open coding this sequence, and also pull in cma_leave_roce_mc_group() which was called only once.
--- drivers/infiniband/core/cma.c | 63 +++++++++++++++++------------------ 1 file changed, 31 insertions(+), 32 deletions(-)
drivers/infiniband/core/cma.c +31 -32
@@ -1803,19 +1803,30 @@ static void cma_release_port(struct rdma_id_private *id_priv)mutex_unlock (&lock); } -static void cma_leave_roce_mc_group (struct rdma_id_private *id_priv, -struct cma_multicast *mc) +static void destroy_mc (struct rdma_id_private *id_priv, +struct cma_multicast *mc) { -struct rdma_dev_addr *dev_addr = &id_priv->id.route.addr.dev_addr; -struct net_device *ndev =NULL ; +if (rdma_cap_ib_mcast (id_priv->id.device, id_priv->id.port_num)) { +ib_sa_free_multicast (mc->multicast.ib); +kfree (mc); +return ; + } -if (dev_addr->bound_dev_if) - ndev =dev_get_by_index (dev_addr->net, dev_addr->bound_dev_if); -if (ndev) { -cma_igmp_send (ndev, &mc->multicast.ib->rec.mgid, false); -dev_put (ndev); +if (rdma_protocol_roce (id_priv->id.device, + id_priv->id.port_num)) { +struct rdma_dev_addr *dev_addr = + &id_priv->id.route.addr.dev_addr; +struct net_device *ndev =NULL ; + +if (dev_addr->bound_dev_if) + ndev =dev_get_by_index (dev_addr->net, + dev_addr->bound_dev_if); +if (ndev) { +cma_igmp_send (ndev, &mc->multicast.ib->rec.mgid, false); +dev_put (ndev); + } +kref_put (&mc->mcref, release_mc); } -kref_put (&mc->mcref, release_mc); }static void cma_leave_mc_groups (struct rdma_id_private *id_priv)
@@ -1823,16 +1834,10 @@ static void cma_leave_mc_groups(struct rdma_id_private *id_priv)struct cma_multicast *mc;while (!list_empty (&id_priv->mc_list)) { - mc =container_of (id_priv->mc_list.next, - struct cma_multicast, list); + mc = list_first_entry(&id_priv->mc_list, struct cma_multicast, + list);list_del (&mc->list); -if (rdma_cap_ib_mcast (id_priv->cma_dev->device, - id_priv->id.port_num)) { -ib_sa_free_multicast (mc->multicast.ib); -kfree (mc); - }else { -cma_leave_roce_mc_group (id_priv, mc); - } +destroy_mc (id_priv, mc); } }
@@ -4490,20 +4495,14 @@ void rdma_leave_multicast(struct rdma_cm_id *id, struct sockaddr *addr) id_priv = container_of(id, struct rdma_id_private, id);spin_lock_irq (&id_priv->lock);list_for_each_entry (mc, &id_priv->mc_list, list) { -if (!memcmp (&mc->addr, addr,rdma_addr_size (addr))) { -list_del (&mc->list); -spin_unlock_irq (&id_priv->lock); - -BUG_ON (id_priv->cma_dev->device != id->device); +if (memcmp (&mc->addr, addr,rdma_addr_size (addr)) !=0 ) +continue ; +list_del (&mc->list); +spin_unlock_irq (&id_priv->lock); -if (rdma_cap_ib_mcast (id->device, id->port_num)) { -ib_sa_free_multicast (mc->multicast.ib); -kfree (mc); - }else if (rdma_protocol_roce (id->device, id->port_num)) { -cma_leave_roce_mc_group (id_priv, mc); - } -return ; - } +WARN_ON (id_priv->cma_dev->device != id->device); +destroy_mc (id_priv, mc); +return ; }spin_unlock_irq (&id_priv->lock); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 231/408 perf intel-pt: Fix "context_switch event has no tid" error
In reply to Greg Kroah-HartmanFrom: Adrian Hunter <[email protected]>
[ Upstream commit 7d537a8d2e76bc4fc71e34545ceaa463ac2cd928 ]
A context_switch event can have no tid because pids can be detached from a task while the task is still running (in do_exit()). Note this won't happen with per-task contexts because then tracing stops at perf_event_exit_task()
If a task with no tid gets preempted, or a dying task gets preempted and its parent releases it, when it subsequently gets switched back in, Intel PT will not be able to determine what task is running and prints an error "context_switch event has no tid". However, it is not really an error because the task is in kernel space and the decoder can continue to decode successfully. Fix by changing the error to be only a logged message, and make allowance for tid == -1.
Example:
Using 5.9-rc4 with Preemptible Kernel (Low-Latency Desktop) e.g.
$ uname -r 5.9.0-rc4 $ grep PREEMPT .config # CONFIG_PREEMPT_NONE is not set # CONFIG_PREEMPT_VOLUNTARY is not set CONFIG_PREEMPT=y CONFIG_PREEMPT_COUNT=y CONFIG_PREEMPTION=y CONFIG_PREEMPT_RCU=y CONFIG_PREEMPT_NOTIFIERS=y CONFIG_DRM_I915_PREEMPT_TIMEOUT=640 CONFIG_DEBUG_PREEMPT=y # CONFIG_PREEMPT_TRACER is not set # CONFIG_PREEMPTIRQ_DELAY_TEST is not set
Before:
$ cat forkit.c
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>
int main()
{
pid_t child;
int status = 0; child = fork();
if (child == 0)
return 123;
wait(&status);
return 0;}
$ gcc -o forkit forkit.c $ sudo ~/bin/perf record --kcore -a -m,64M -e intel_pt/cyc/k & [1] 11016 $ taskset 2 ./forkit $ sudo pkill perf $ [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 17.262 MB perf.data ]
[1]+ Terminated sudo ~/bin/perf record --kcore -a -m,64M -e intel_pt/cyc/k
$ sudo ~/bin/perf script --show-task-events --show-switch-events --itrace=iqqe-o -C 1 --ns | grep -C 2 forkit
context_switch event has no tid
taskset 11019 [001] 66663.270045029: 1 instructions:k: ffffffffb1d9f844 strnlen_user+0xb4 ([kernel.kallsyms])
taskset 11019 [001] 66663.270201816: 1 instructions:k: ffffffffb1a83121 unmap_page_range+0x561 ([kernel.kallsyms])
forkit 11019 [001] 66663.270327553: PERF_RECORD_COMM exec: forkit:11019/11019
forkit 11019 [001] 66663.270420028: 1 instructions:k: ffffffffb1db9537 __clear_user+0x27 ([kernel.kallsyms])
forkit 11019 [001] 66663.270648704: 1 instructions:k: ffffffffb18829e6 do_user_addr_fault+0xf6 ([kernel.kallsyms])
forkit 11019 [001] 66663.270833163: 1 instructions:k: ffffffffb230a825 irqentry_exit_to_user_mode+0x15 ([kernel.kallsyms])
forkit 11019 [001] 66663.271092359: 1 instructions:k: ffffffffb1aea3d9 lock_page_memcg+0x9 ([kernel.kallsyms])
forkit 11019 [001] 66663.271207092: PERF_RECORD_FORK(11020:11020):(11019:11019)
forkit 11019 [001] 66663.271234775: PERF_RECORD_SWITCH_CPU_WIDE OUT next pid/tid: 11020/11020
forkit 11020 [001] 66663.271238407: PERF_RECORD_SWITCH_CPU_WIDE IN prev pid/tid: 11019/11019
forkit 11020 [001] 66663.271312066: 1 instructions:k: ffffffffb1a88140 handle_mm_fault+0x10 ([kernel.kallsyms])
forkit 11020 [001] 66663.271476225: PERF_RECORD_EXIT(11020:11020):(11019:11019)
forkit 11020 [001] 66663.271497488: PERF_RECORD_SWITCH_CPU_WIDE OUT preempt next pid/tid: 11019/11019
forkit 11019 [001] 66663.271500523: PERF_RECORD_SWITCH_CPU_WIDE IN prev pid/tid: 11020/11020
forkit 11019 [001] 66663.271517241: 1 instructions:k: ffffffffb24012cd error_entry+0x6d ([kernel.kallsyms])
forkit 11019 [001] 66663.271664080: PERF_RECORD_EXIT(11019:11019):(1386:1386)After:
$ sudo ~/bin/perf script --show-task-events --show-switch-events --itrace=iqqe-o -C 1 --ns | grep -C 2 forkit
taskset 11019 [001] 66663.270045029: 1 instructions:k: ffffffffb1d9f844 strnlen_user+0xb4 ([kernel.kallsyms])
taskset 11019 [001] 66663.270201816: 1 instructions:k: ffffffffb1a83121 unmap_page_range+0x561 ([kernel.kallsyms])
forkit 11019 [001] 66663.270327553: PERF_RECORD_COMM exec: forkit:11019/11019
forkit 11019 [001] 66663.270420028: 1 instructions:k: ffffffffb1db9537 __clear_user+0x27 ([kernel.kallsyms])
forkit 11019 [001] 66663.270648704: 1 instructions:k: ffffffffb18829e6 do_user_addr_fault+0xf6 ([kernel.kallsyms])
forkit 11019 [001] 66663.270833163: 1 instructions:k: ffffffffb230a825 irqentry_exit_to_user_mode+0x15 ([kernel.kallsyms])
forkit 11019 [001] 66663.271092359: 1 instructions:k: ffffffffb1aea3d9 lock_page_memcg+0x9 ([kernel.kallsyms])
forkit 11019 [001] 66663.271207092: PERF_RECORD_FORK(11020:11020):(11019:11019)
forkit 11019 [001] 66663.271234775: PERF_RECORD_SWITCH_CPU_WIDE OUT next pid/tid: 11020/11020
forkit 11020 [001] 66663.271238407: PERF_RECORD_SWITCH_CPU_WIDE IN prev pid/tid: 11019/11019
forkit 11020 [001] 66663.271312066: 1 instructions:k: ffffffffb1a88140 handle_mm_fault+0x10 ([kernel.kallsyms])
forkit 11020 [001] 66663.271476225: PERF_RECORD_EXIT(11020:11020):(11019:11019)
forkit 11020 [001] 66663.271497488: PERF_RECORD_SWITCH_CPU_WIDE OUT preempt next pid/tid: 11019/11019
forkit 11019 [001] 66663.271500523: PERF_RECORD_SWITCH_CPU_WIDE IN prev pid/tid: 11020/11020
forkit 11019 [001] 66663.271517241: 1 instructions:k: ffffffffb24012cd error_entry+0x6d ([kernel.kallsyms])
forkit 11019 [001] 66663.271664080: PERF_RECORD_EXIT(11019:11019):(1386:1386)
forkit 11019 [001] 66663.271688752: PERF_RECORD_SWITCH_CPU_WIDE OUT next pid/tid: -1/-1
:-1 -1 [001] 66663.271692086: PERF_RECORD_SWITCH_CPU_WIDE IN prev pid/tid: 11019/11019
:-1 -1 [001] 66663.271707466: 1 instructions:k: ffffffffb18eb096 update_load_avg+0x306 ([kernel.kallsyms])--- tools/perf/util/intel-pt.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/perf/util/intel-pt.c +4 -4
@@ -974,6 +974,8 @@ static void intel_pt_set_pid_tid_cpu(struct intel_pt *pt,if (queue->tid ==-1 || pt->have_sched_switch) { ptq->tid =machine__get_current_tid (pt->machine, ptq->cpu); +if (ptq->tid ==-1 ) + ptq->pid =-1 ;thread__zput (ptq->thread); }
@@ -2488,10 +2490,8 @@ static int intel_pt_context_switch(struct intel_pt *pt, union perf_event *event, tid = sample->tid; } -if (tid ==-1 ) { -pr_err ("context_switch event has no tid\n" ); -return -EINVAL ; - } +if (tid ==-1 ) +intel_pt_log ("context_switch event has no tid\n" ); intel_pt_log("context_switch: cpu %d pid %d tid %d time %"PRIu64" tsc %#"PRIx64"\n", cpu, pid, tid, sample->time, perf_time_to_tsc(sample->time,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 232/408 RDMA/hns: Set the unsupported wr opcode
In reply to Greg Kroah-HartmanFrom: Lijun Ou <[email protected]>
[ Upstream commit 22d3e1ed2cc837af87f76c3c8a4ccf4455e225c5 ]
hip06 does not support IB_WR_LOCAL_INV, so the ps_opcode should be set to an invalid value instead of being left uninitialized.
--- drivers/infiniband/hw/hns/hns_roce_hw_v1.c | 1 - 1 file changed, 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hw_v1.c +0 -1
@@ -271,7 +271,6 @@ static int hns_roce_v1_post_send(struct ib_qp *ibqp, ps_opcode =HNS_ROCE_WQE_OPCODE_SEND ;break ;case IB_WR_LOCAL_INV : -break ;case IB_WR_ATOMIC_CMP_AND_SWP :case IB_WR_ATOMIC_FETCH_AND_ADD :case IB_WR_LSO :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 233/408 RDMA/mlx5: Disable IB_DEVICE_MEM_MGT_EXTENSIONS if IB_WR_REG_MR cant work
In reply to Greg Kroah-HartmanFrom: Jason Gunthorpe <[email protected]>
[ Upstream commit 0ec52f0194638e2d284ad55eba5a7aff753de1b9 ]
set_reg_wr() always fails if !umr_modify_entity_size_disabled because mlx5_ib_can_use_umr() always fails. Without set_reg_wr() IB_WR_REG_MR doesn't work and that means the device should not advertise IB_DEVICE_MEM_MGT_EXTENSIONS.
--- drivers/infiniband/hw/mlx5/main.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/hw/mlx5/main.c +3 -1
@@ -888,7 +888,9 @@ static int mlx5_ib_query_device(struct ib_device *ibdev,/* We support 'Gappy' memory registration too */ props->device_cap_flags |=IB_DEVICE_SG_GAPS_REG ; } - props->device_cap_flags |=IB_DEVICE_MEM_MGT_EXTENSIONS ; +/* IB_WR_REG_MR always requires changing the entity size with UMR */ +if (!MLX5_CAP_GEN (dev->mdev, umr_modify_entity_size_disabled)) + props->device_cap_flags |=IB_DEVICE_MEM_MGT_EXTENSIONS ;if (MLX5_CAP_GEN (mdev, sho)) { props->device_cap_flags |=IB_DEVICE_INTEGRITY_HANDOVER ;/* At this stage no support for signature handover */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 234/408 i40iw: Add support to make destroy QP synchronous
In reply to Greg Kroah-HartmanFrom: Sindhu, Devale <[email protected]>
[ Upstream commit f2334964e969762e266a616acf9377f6046470a2 ]
Occasionally ib_write_bw crash is seen due to access of a pd object in i40iw_sc_qp_destroy after it is freed. Destroy qp is not synchronous in i40iw and thus the iwqp object could be referencing a pd object that is freed by ib core as a result of successful return from i40iw_destroy_qp.
Wait in i40iw_destroy_qp till all QP references are released and destroy the QP and its associated resources before returning. Switch to use the refcount API vs atomic API for lifetime management of the qp.
RIP: 0010:i40iw_sc_qp_destroy+0x4b/0x120 [i40iw] [...] RSP: 0018:ffffb4a7042e3ba8 EFLAGS: 00010002 RAX: 0000000000000000 RBX: 0000000000000001 RCX: dead000000000122 RDX: ffffb4a7042e3bac RSI: ffff8b7ef9b1e940 RDI: ffff8b7efbf09080 RBP: 0000000000000000 R08: 0000000000000001 R09: 0000000000000000 R10: 8080808080808080 R11: 0000000000000010 R12: ffff8b7efbf08050 R13: 0000000000000001 R14: ffff8b7f15042928 R15: ffff8b7ef9b1e940 FS: 0000000000000000(0000) GS:ffff8b7f2fa00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000400 CR3: 000000020d60a006 CR4: 00000000001606e0 Call Trace: i40iw_exec_cqp_cmd+0x4d3/0x5c0 [i40iw] ? try_to_wake_up+0x1ea/0x5d0 ? __switch_to_asm+0x40/0x70 i40iw_process_cqp_cmd+0x95/0xa0 [i40iw] i40iw_handle_cqp_op+0x42/0x1a0 [i40iw] ? cm_event_handler+0x13c/0x1f0 [iw_cm] i40iw_rem_ref+0xa0/0xf0 [i40iw] cm_work_handler+0x99c/0xd10 [iw_cm] process_one_work+0x1a1/0x360 worker_thread+0x30/0x380 ? process_one_work+0x360/0x360 kthread+0x10c/0x130 ? kthread_park+0x80/0x80 ret_from_fork+0x35/0x40
--- drivers/infiniband/hw/i40iw/i40iw.h | 9 ++-- drivers/infiniband/hw/i40iw/i40iw_cm.c | 10 ++-- drivers/infiniband/hw/i40iw/i40iw_hw.c | 4 +- drivers/infiniband/hw/i40iw/i40iw_utils.c | 59 ++++------------------- drivers/infiniband/hw/i40iw/i40iw_verbs.c | 31 ++++++++---- drivers/infiniband/hw/i40iw/i40iw_verbs.h | 3 +- 6 files changed, 45 insertions(+), 71 deletions(-)
drivers/infiniband/hw/i40iw/i40iw.h +4 -5
@@ -398,8 +398,8 @@ static inline struct i40iw_qp *to_iwqp(struct ib_qp *ibqp) }/* i40iw.c */ -void i40iw_add_ref (struct ib_qp *); -void i40iw_rem_ref (struct ib_qp *); +void i40iw_qp_add_ref (struct ib_qp *ibqp); +void i40iw_qp_rem_ref (struct ib_qp *ibqp);struct ib_qp *i40iw_get_qp (struct ib_device *,int ); void i40iw_flush_wqes(struct i40iw_device *iwdev,
@@ -543,9 +543,8 @@ enum i40iw_status_code i40iw_manage_qhash(struct i40iw_device *iwdev, bool wait);void i40iw_receive_ilq (struct i40iw_sc_vsi *vsi,struct i40iw_puda_buf *rbuf);void i40iw_free_sqbuf (struct i40iw_sc_vsi *vsi,void *bufp); -void i40iw_free_qp_resources (struct i40iw_device *iwdev, -struct i40iw_qp *iwqp, -u32 qp_num); +void i40iw_free_qp_resources (struct i40iw_qp *iwqp); +enum i40iw_status_code i40iw_obj_aligned_mem (struct i40iw_device *iwdev,struct i40iw_dma_mem *memptr,u32 size,u32 mask);
drivers/infiniband/hw/i40iw/i40iw_cm.c +5 -5
@@ -2322,7 +2322,7 @@ static void i40iw_rem_ref_cm_node(struct i40iw_cm_node *cm_node) iwqp = cm_node->iwqp;if (iwqp) { iwqp->cm_node =NULL ; -i40iw_rem_ref (&iwqp->ibqp); +i40iw_qp_rem_ref (&iwqp->ibqp); cm_node->iwqp =NULL ; }else if (cm_node->qhash_set) {i40iw_get_addr_info (cm_node, &nfo);
@@ -3452,7 +3452,7 @@ void i40iw_cm_disconn(struct i40iw_qp *iwqp)kfree (work);return ; } -i40iw_add_ref (&iwqp->ibqp); +i40iw_qp_add_ref (&iwqp->ibqp);spin_unlock_irqrestore (&iwdev->qptable_lock, flags); work->iwqp = iwqp;
@@ -3623,7 +3623,7 @@ static void i40iw_disconnect_worker(struct work_struct *work)kfree (dwork);i40iw_cm_disconn_true (iwqp); -i40iw_rem_ref (&iwqp->ibqp); +i40iw_qp_rem_ref (&iwqp->ibqp); }/**
@@ -3745,7 +3745,7 @@ int i40iw_accept(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) cm_node->lsmm_size = accept.size + conn_param->private_data_len;i40iw_cm_init_tsa_conn (iwqp, cm_node); cm_id->add_ref (cm_id); -i40iw_add_ref (&iwqp->ibqp); +i40iw_qp_add_ref (&iwqp->ibqp); attr.qp_state =IB_QPS_RTS ; cm_node->qhash_set = false;
@@ -3908,7 +3908,7 @@ int i40iw_connect(struct iw_cm_id *cm_id, struct iw_cm_conn_param *conn_param) iwqp->cm_node = cm_node; cm_node->iwqp = iwqp; iwqp->cm_id = cm_id; -i40iw_add_ref (&iwqp->ibqp); +i40iw_qp_add_ref (&iwqp->ibqp);if (cm_node->state !=I40IW_CM_STATE_OFFLOADED ) { cm_node->state =I40IW_CM_STATE_SYN_SENT ;
drivers/infiniband/hw/i40iw/i40iw_hw.c +2 -2
@@ -313,7 +313,7 @@ void i40iw_process_aeq(struct i40iw_device *iwdev) __func__, info->qp_cq_id);continue ; } -i40iw_add_ref (&iwqp->ibqp); +i40iw_qp_add_ref (&iwqp->ibqp);spin_unlock_irqrestore (&iwdev->qptable_lock, flags); qp = &iwqp->sc_qp;spin_lock_irqsave (&iwqp->lock, flags);
@@ -427,7 +427,7 @@ void i40iw_process_aeq(struct i40iw_device *iwdev)break ; }if (info->qp) -i40iw_rem_ref (&iwqp->ibqp); +i40iw_qp_rem_ref (&iwqp->ibqp); }while (1 );if (aeqcnt)
drivers/infiniband/hw/i40iw/i40iw_utils.c +10 -49
114 lines not on this page · raw message
drivers/infiniband/hw/i40iw/i40iw_verbs.c +22 -9
@@ -366,11 +366,11 @@ static struct i40iw_pbl *i40iw_get_pbl(unsigned long va,* @iwqp: qp ptr (user or kernel) * @qp_num: qp number assigned */ -void i40iw_free_qp_resources (struct i40iw_device *iwdev, -struct i40iw_qp *iwqp, -u32 qp_num) +void i40iw_free_qp_resources (struct i40iw_qp *iwqp) {struct i40iw_pbl *iwpbl = &iwqp->iwpbl; +struct i40iw_device *iwdev = iwqp->iwdev; +u32 qp_num = iwqp->ibqp.qp_num;i40iw_ieq_cleanup_qp (iwdev->vsi.ieq, &iwqp->sc_qp);i40iw_dealloc_push_page (iwdev, &iwqp->sc_qp);
@@ -404,6 +404,10 @@ static void i40iw_clean_cqes(struct i40iw_qp *iwqp, struct i40iw_cq *iwcq)static int i40iw_destroy_qp (struct ib_qp *ibqp,struct ib_udata *udata) {struct i40iw_qp *iwqp =to_iwqp (ibqp); +struct ib_qp_attr attr; +struct i40iw_device *iwdev = iwqp->iwdev; + +memset (&attr,0 ,sizeof (attr)); iwqp->destroyed =1 ;
@@ -418,7 +422,15 @@ static int i40iw_destroy_qp(struct ib_qp *ibqp, struct ib_udata *udata) } } -i40iw_rem_ref (&iwqp->ibqp); + attr.qp_state =IB_QPS_ERR ; +i40iw_modify_qp (&iwqp->ibqp, &attr,IB_QP_STATE ,NULL ); +i40iw_qp_rem_ref (&iwqp->ibqp); +wait_for_completion (&iwqp->free_qp); +i40iw_cqp_qp_destroy_cmd (&iwdev->sc_dev, &iwqp->sc_qp); +i40iw_rem_pdusecount (iwqp->iwpd, iwdev); +i40iw_free_qp_resources (iwqp); +i40iw_rem_devusecount (iwdev); +return 0 ; }
@@ -579,6 +591,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, qp->back_qp = (void *)iwqp; qp->push_idx =I40IW_INVALID_PUSH_PAGE_INDEX ; + iwqp->iwdev = iwdev; iwqp->ctx_info.iwarp_info = &iwqp->iwarp_info; if (i40iw_allocate_dma_mem(dev->hw,
@@ -603,7 +616,6 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, goto error; } - iwqp->iwdev = iwdev; iwqp->iwpd = iwpd; iwqp->ibqp.qp_num = qp_num; qp = &iwqp->sc_qp;
@@ -717,7 +729,7 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, goto error; } -i40iw_add_ref (&iwqp->ibqp); +refcount_set (&iwqp->refcount,1 );spin_lock_init (&iwqp->lock); iwqp->sig_all = (init_attr->sq_sig_type ==IB_SIGNAL_ALL_WR ) ?1 :0 ; iwdev->qp_table[qp_num] = iwqp;
@@ -739,10 +751,11 @@ static struct ib_qp *i40iw_create_qp(struct ib_pd *ibpd, }init_completion (&iwqp->sq_drained);init_completion (&iwqp->rq_drained); +init_completion (&iwqp->free_qp);return &iwqp->ibqp; error: -i40iw_free_qp_resources (iwdev, iwqp, qp_num); +i40iw_free_qp_resources (iwqp);return ERR_PTR (err_code); }
@@ -2654,13 +2667,13 @@ static const struct ib_device_ops i40iw_dev_ops = { .get_hw_stats = i40iw_get_hw_stats, .get_port_immutable = i40iw_port_immutable, .iw_accept = i40iw_accept, - .iw_add_ref = i40iw_add_ref, + .iw_add_ref = i40iw_qp_add_ref, .iw_connect = i40iw_connect, .iw_create_listen = i40iw_create_listen, .iw_destroy_listen = i40iw_destroy_listen, .iw_get_qp = i40iw_get_qp, .iw_reject = i40iw_reject, - .iw_rem_ref = i40iw_rem_ref, + .iw_rem_ref = i40iw_qp_rem_ref, .map_mr_sg = i40iw_map_mr_sg, .mmap = i40iw_mmap, .modify_qp = i40iw_modify_qp,
drivers/infiniband/hw/i40iw/i40iw_verbs.h +2 -1
@@ -140,7 +140,7 @@ struct i40iw_qp {struct i40iw_qp_host_ctx_info ctx_info;struct i40iwarp_offload_info iwarp_info;void *allocated_buffer; -atomic_t refcount; +refcount_t refcount;struct iw_cm_id *cm_id;void *cm_node;struct ib_mr *lsmm_mr;
@@ -175,5 +175,6 @@ struct i40iw_qp {struct i40iw_dma_mem ietf_mem;struct completion sq_drained;struct completion rq_drained; + struct completion free_qp; };#endif
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 235/408 perf stat: Skip duration_time in setup_system_wide
In reply to Greg Kroah-HartmanFrom: Jin Yao <[email protected]>
[ Upstream commit 002a3d690f95804bdef6b70b26154103518e13d9 ]
Some metrics (such as DRAM_BW_Use) consists of uncore events and duration_time. For uncore events, counter->core.system_wide is true. But for duration_time, counter->core.system_wide is false so target.system_wide is set to false.
Then 'enable_on_exec' is set in perf_event_attr of uncore event. Kernel will return error when trying to open the uncore event.
This patch skips the duration_time in setup_system_wide then target.system_wide will be set to true for the evlist of uncore events + duration_time.
Before (tested on skylake desktop):
# perf stat -M DRAM_BW_Use -- sleep 1 Error: The sys_perf_event_open() syscall returned with 22 (Invalid argument) for event (arb/event=0x84,umask=0x1/). /bin/dmesg | grep -i perf may provide additional information.
After:
# perf stat -M DRAM_BW_Use -- sleep 1
Performance counter stats for 'system wide':
169 arb/event=0x84,umask=0x1/ # 0.00 DRAM_BW_Use
40,427 arb/event=0x81,umask=0x1/
1,000,902,197 ns duration_time1.000902197 seconds time elapsed
--- tools/perf/builtin-stat.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/builtin-stat.c +3 -1
@@ -1671,8 +1671,10 @@ static void setup_system_wide(int forks)struct evsel *counter;evlist__for_each_entry (evsel_list, counter) { -if (!counter->core.system_wide) +if (!counter->core.system_wide && +strcmp (counter->name,"duration_time" )) {return ; + } }if (evsel_list->core.nr_entries)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 236/408 RDMA/hns: Fix the wrong value of rnr_retry when querying qp
In reply to Greg Kroah-HartmanFrom: Wenpeng Liang <[email protected]>
[ Upstream commit 99fcf82521d91468ee6115a3c253aa032dc63cbc ]
The rnr_retry returned to the user is not correct, it should be got from another fields in QPC.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +3 -1
@@ -4616,7 +4616,9 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, qp_attr->retry_cnt =roce_get_field (context.byte_212_lsn,V2_QPC_BYTE_212_RETRY_CNT_M ,V2_QPC_BYTE_212_RETRY_CNT_S ); - qp_attr->rnr_retry =le32_to_cpu (context.rq_rnr_timer); + qp_attr->rnr_retry =roce_get_field (context.byte_244_rnr_rxack, +V2_QPC_BYTE_244_RNR_CNT_M , +V2_QPC_BYTE_244_RNR_CNT_S ); done: qp_attr->cur_qp_state = qp_attr->qp_state;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 237/408 RDMA/hns: Fix missing sq_sig_type when querying QP
In reply to Greg Kroah-HartmanFrom: Weihang Li <[email protected]>
[ Upstream commit 05df49279f8926178ecb3ce88e61b63104cd6293 ]
The sq_sig_type field should be filled when querying QP, or the users may get a wrong value.
--- drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/hns/hns_roce_hw_v2.c +1 -0
@@ -4634,6 +4634,7 @@ static int hns_roce_v2_query_qp(struct ib_qp *ibqp, struct ib_qp_attr *qp_attr, } qp_init_attr->cap = qp_attr->cap; + qp_init_attr->sq_sig_type = hr_qp->sq_signal_bits; out:mutex_unlock (&hr_qp->mutex);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 238/408 mtd: rawnand: vf610: disable clk on error handling path in probe
In reply to Greg Kroah-HartmanFrom: Evgeny Novikov <[email protected]>
[ Upstream commit cb7dc3178a9862614b1e7567d77f4679f027a074 ]
vf610_nfc_probe() does not invoke clk_disable_unprepare() on one error handling path. The patch fixes that.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/mtd/nand/raw/vf610_nfc.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/mtd/nand/raw/vf610_nfc.c +4 -2
@@ -850,8 +850,10 @@ static int vf610_nfc_probe(struct platform_device *pdev) } of_id =of_match_device (vf610_nfc_dt_ids, &pdev->dev); -if (!of_id) -return -ENODEV ; +if (!of_id) { + err = -ENODEV ; + goto err_disable_clk; + } nfc->variant = (enum vf610_nfc_variant )of_id->data;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 239/408 mtd: spinand: gigadevice: Only one dummy byte in QUADIO
In reply to Greg Kroah-HartmanFrom: Hauke Mehrtens <[email protected]>
[ Upstream commit 6387ad9caf8f09747a8569e5876086b72ee9382c ]
The datasheet only lists one dummy byte in the 0xEH operation for the following chips:
* GD5F1GQ4xExxG
* GD5F1GQ4xFxxG
* GD5F1GQ4UAYIG
* GD5F4GQ4UAYIG
--- drivers/mtd/nand/spi/gigadevice.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/mtd/nand/spi/gigadevice.c +2 -2
@@ -21,7 +21,7 @@#define GD5FXGQ4UXFXXG_STATUS_ECC_UNCOR_ERROR (7 << 4) static SPINAND_OP_VARIANTS(read_cache_variants, - SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),SPINAND_PAGE_READ_FROM_CACHE_X4_OP (0 ,1 ,NULL ,0 ),SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP (0 ,1 ,NULL ,0 ), SPINAND_PAGE_READ_FROM_CACHE_X2_OP(0, 1, NULL, 0),
@@ -29,7 +29,7 @@ static SPINAND_OP_VARIANTS(read_cache_variants, SPINAND_PAGE_READ_FROM_CACHE_OP(false, 0, 1, NULL, 0)); static SPINAND_OP_VARIANTS(read_cache_variants_f, - SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 2, NULL, 0), + SPINAND_PAGE_READ_FROM_CACHE_QUADIO_OP(0, 1, NULL, 0),SPINAND_PAGE_READ_FROM_CACHE_X4_OP_3A (0 ,1 ,NULL ,0 ),SPINAND_PAGE_READ_FROM_CACHE_DUALIO_OP (0 ,1 ,NULL ,0 ), SPINAND_PAGE_READ_FROM_CACHE_X2_OP_3A(0, 1, NULL, 0),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 240/408 mtd: spinand: gigadevice: Add QE Bit
In reply to Greg Kroah-HartmanFrom: Hauke Mehrtens <[email protected]>
[ Upstream commit aea7687e77bebce5b67fab9d03347bd8df7933c7 ]
The following GigaDevice chips have the QE BIT in the feature flags, I checked the datasheets, but did not try this.
* GD5F1GQ4xExxG
* GD5F1GQ4xFxxG
* GD5F1GQ4UAYIG
* GD5F4GQ4UAYIG
The Quad operations like 0xEB mention that the QE bit has to be set.
--- drivers/mtd/nand/spi/gigadevice.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/mtd/nand/spi/gigadevice.c +5 -5
@@ -201,7 +201,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), - 0, + SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout, gd5fxgq4xa_ecc_get_status)), SPINAND_INFO("GD5F2GQ4xA", 0xF2,
@@ -210,7 +210,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), - 0, + SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout, gd5fxgq4xa_ecc_get_status)), SPINAND_INFO("GD5F4GQ4xA", 0xF4,
@@ -219,7 +219,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), - 0, + SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgq4xa_ooblayout, gd5fxgq4xa_ecc_get_status)), SPINAND_INFO("GD5F1GQ4UExxG", 0xd1,
@@ -228,7 +228,7 @@ static const struct spinand_info gigadevice_spinand_table[] = { SPINAND_INFO_OP_VARIANTS(&read_cache_variants, &write_cache_variants, &update_cache_variants), - 0, + SPINAND_HAS_QE_BIT, SPINAND_ECCINFO(&gd5fxgq4_variant2_ooblayout, gd5fxgq4uexxg_ecc_get_status)), SPINAND_INFO("GD5F1GQ4UFxxG", 0xb148,
@@ -237,7 +237,7 @@ static const struct spinand_info gigadevice_spinand_table[] = {SPINAND_INFO_OP_VARIANTS (&read_cache_variants_f, &write_cache_variants, &update_cache_variants), -0 , +SPINAND_HAS_QE_BIT ,SPINAND_ECCINFO (&gd5fxgq4_variant2_ooblayout, gd5fxgq4ufxxg_ecc_get_status)), };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 241/408 kdb: Fix pager search for multi-line strings
In reply to Greg Kroah-HartmanFrom: Daniel Thompson <[email protected]>
[ Upstream commit d081a6e353168f15e63eb9e9334757f20343319f ]
Currently using forward search doesn't handle multi-line strings correctly. The search routine replaces line breaks with \0 during the search and, for regular searches ("help | grep Common\n"), there is code after the line has been discarded or printed to replace the break character.
However during a pager search ("help\n" followed by "/Common\n") when the string is matched we will immediately return to normal output and the code that should restore the \n becomes unreachable. Fix this by restoring the replaced character when we disable the search mode and update the comment accordingly.
--- kernel/debug/kdb/kdb_io.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
kernel/debug/kdb/kdb_io.c +6 -2
@@ -679,12 +679,16 @@ int vkdb_printf(enum kdb_msgsrc src, const char *fmt, va_list ap) size_avail =sizeof (kdb_buffer) - len; goto kdb_print_out; } -if (kdb_grepping_flag >=KDB_GREPPING_FLAG_SEARCH ) +if (kdb_grepping_flag >=KDB_GREPPING_FLAG_SEARCH ) {/* * This was a interactive search (using '/' at more -* prompt) and it has completed. Clear the flag. +* prompt) and it has completed. Replace the \0 with +* its original value to ensure multi-line strings +* are handled properly, and return to normal mode. */ + *cphold = replaced_byte; kdb_grepping_flag =0 ; + }/* * at this point the string is a full line and * should be printed, up to the null.
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 242/408 overflow: Include header file with SIZE_MAX declaration
In reply to Greg Kroah-HartmanFrom: Leon Romanovsky <[email protected]>
[ Upstream commit a4947e84f23474803b62a2759b5808147e4e15f9 ]
The various array_size functions use SIZE_MAX define, but missed limits.h causes to failure to compile code that needs overflow.h.
In file included from drivers/infiniband/core/uverbs_std_types_device.c:6:
./include/linux/overflow.h: In function 'array_size':
./include/linux/overflow.h:258:10: error: 'SIZE_MAX' undeclared (first use in this function)
258 | return SIZE_MAX;
| ^~~~~~~~--- include/linux/overflow.h | 1 + 1 file changed, 1 insertion(+)
include/linux/overflow.h +1 -0
@@ -3,6 +3,7 @@#define __LINUX_OVERFLOW_H#include <linux/compiler.h> +#include <linux/limits.h> /* * In the fallback code below, we need to compute the minimum and
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 243/408 RDMA/ipoib: Set rtnl_link_ops for ipoib interfaces
In reply to Greg Kroah-HartmanFrom: Kamal Heib <[email protected]>
[ Upstream commit 5ce2dced8e95e76ff7439863a118a053a7fc6f91 ]
Report the "ipoib pkey", "mode" and "umcast" netlink attributes for every IPoiB interface type, not just children created with 'ip link add'.
After setting the rtnl_link_ops for the parent interface, implement the dellink() callback to block users from trying to remove it.
--- drivers/infiniband/ulp/ipoib/ipoib_main.c | 2 ++ drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 11 +++++++++++ drivers/infiniband/ulp/ipoib/ipoib_vlan.c | 2 ++ 3 files changed, 15 insertions(+)
drivers/infiniband/ulp/ipoib/ipoib_main.c +2 -0
@@ -2463,6 +2463,8 @@ static struct net_device *ipoib_add_port(const char *format,/* call event handler to ensure pkey in sync */ queue_work (ipoib_workqueue, &priv->flush_heavy); + ndev->rtnl_link_ops =ipoib_get_link_ops (); + result =register_netdev (ndev);if (result) { pr_warn("%s: couldn't register ipoib port %d; error %d\n",
drivers/infiniband/ulp/ipoib/ipoib_netlink.c +11 -0
@@ -144,6 +144,16 @@ static int ipoib_new_child_link(struct net *src_net, struct net_device *dev,return 0 ; } +static void ipoib_del_child_link (struct net_device *dev,struct list_head *head) +{ +struct ipoib_dev_priv *priv =ipoib_priv (dev); + +if (!priv->parent) +return ; + +unregister_netdevice_queue (dev, head); +} +static size_t ipoib_get_size (const struct net_device *dev) { return nla_total_size(2) + /* IFLA_IPOIB_PKEY */
@@ -158,6 +168,7 @@ static struct rtnl_link_ops ipoib_link_ops __read_mostly = { .priv_size = sizeof(struct ipoib_dev_priv), .setup = ipoib_setup_common, .newlink = ipoib_new_child_link, + .dellink = ipoib_del_child_link, .changelink = ipoib_changelink, .get_size = ipoib_get_size, .fill_info = ipoib_fill_info,
drivers/infiniband/ulp/ipoib/ipoib_vlan.c +2 -0
@@ -192,6 +192,8 @@ int ipoib_vlan_add(struct net_device *pdev, unsigned short pkey) } priv =ipoib_priv (ndev); + ndev->rtnl_link_ops =ipoib_get_link_ops (); + result =__ipoib_vlan_add (ppriv, priv, pkey,IPOIB_LEGACY_CHILD );if (result && ndev->reg_state ==NETREG_UNINITIALIZED )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 244/408 powerpc/perf: Exclude pmc5/6 from the irrelevant PMU group constraints
In reply to Greg Kroah-HartmanFrom: Athira Rajeev <[email protected]>
[ Upstream commit 3b6c3adbb2fa42749c3d38cfc4d4d0b7e096bb7b ]
PMU counter support functions enforces event constraints for group of events to check if all events in a group can be monitored. Incase of event codes using PMC5 and PMC6 ( 500fa and 600f4 respectively ), not all constraints are applicable, say the threshold or sample bits. But current code includes pmc5 and pmc6 in some group constraints (like IC_DC Qualifier bits) which is actually not applicable and hence results in those events not getting counted when scheduled along with group of other events. Patch fixes this by excluding PMC5/6 from constraints which are not relevant for it.
--- arch/powerpc/perf/isa207-common.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
arch/powerpc/perf/isa207-common.c +10 -0
@@ -269,6 +269,15 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) mask |=CNST_PMC_MASK (pmc); value |=CNST_PMC_VAL (pmc); + +/* +* PMC5 and PMC6 are used to count cycles and instructions and +* they do not support most of the constraint bits. Add a check +* to exclude PMC5/6 from most of the constraints except for +* EBB/BHRB. +*/ +if (pmc >=5 ) + goto ebb_bhrb; }if (pmc <=4 ) {
@@ -335,6 +344,7 @@ int isa207_get_constraint(u64 event, unsigned long *maskp, unsigned long *valp) } } +ebb_bhrb:if (!pmc && ebb)/* EBB events must specify the PMC */ return -1 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 245/408 powerpc/perf/hv-gpci: Fix starting index value
In reply to Greg Kroah-HartmanFrom: Kajol Jain <[email protected]>
[ Upstream commit 0f9866f7e85765bbda86666df56c92f377c3bc10 ]
Commit 9e9f60108423f ("powerpc/perf/{hv-gpci, hv-common}: generate requests with counters annotated") adds a framework for defining gpci counters.
In this patch, they adds starting_index value as '0xffffffffffffffff'. which is wrong as starting_index is of size 32 bits.
Because of this, incase we try to run hv-gpci event we get error.
In power9 machine:
command#: perf stat -e hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
-C 0 -I 1000
event syntax error: '..bie_count_and_time_tlbie_instructions_issued/'
\___ value too big for format, maximum is 4294967295This patch fix this issue and changes starting_index value to '0xffffffff'
After this patch:
command#: perf stat -e hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/ -C 0 -I 1000
1.000085786 1,024 hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
2.000287818 1,024 hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/
2.439113909 17,408 hv_gpci/system_tlbie_count_and_time_tlbie_instructions_issued/--- arch/powerpc/perf/hv-gpci-requests.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/powerpc/perf/hv-gpci-requests.h +3 -3
@@ -95,7 +95,7 @@ REQUEST(__field(0, 8, partition_id)#define REQUEST_NAME system_performance_capabilities#define REQUEST_NUM 0x40 -#define REQUEST_IDX_KIND "starting_index=0xffffffffffffffff" +#define REQUEST_IDX_KIND "starting_index=0xffffffff"#include I (REQUEST_BEGIN ) REQUEST(__field(0, 1, perf_collect_privileged) __field(0x1, 1, capability_mask)
@@ -223,7 +223,7 @@ REQUEST(__field(0, 2, partition_id)#define REQUEST_NAME system_hypervisor_times#define REQUEST_NUM 0xF0 -#define REQUEST_IDX_KIND "starting_index=0xffffffffffffffff" +#define REQUEST_IDX_KIND "starting_index=0xffffffff"#include I (REQUEST_BEGIN ) REQUEST(__count(0, 8, time_spent_to_dispatch_virtual_processors) __count(0x8, 8, time_spent_processing_virtual_processor_timers)
@@ -234,7 +234,7 @@ REQUEST(__count(0, 8, time_spent_to_dispatch_virtual_processors)#define REQUEST_NAME system_tlbie_count_and_time#define REQUEST_NUM 0xF4 -#define REQUEST_IDX_KIND "starting_index=0xffffffffffffffff" +#define REQUEST_IDX_KIND "starting_index=0xffffffff"#include I (REQUEST_BEGIN )REQUEST (__count (0 ,8 , tlbie_instructions_issued)/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 246/408 i3c: master: Fix error return in cdns_i3c_master_probe()
In reply to Greg Kroah-HartmanFrom: Jing Xiangfeng <[email protected]>
[ Upstream commit abea14bfdebbe9bd02f2ad24a1f3a878ed21c8f0 ]
Fix to return negative error code -ENOMEM from the error handling case instead of 0.
--- drivers/i3c/master/i3c-master-cdns.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/i3c/master/i3c-master-cdns.c +3 -1
@@ -1593,8 +1593,10 @@ static int cdns_i3c_master_probe(struct platform_device *pdev) master->ibi.slots =devm_kcalloc (&pdev->dev, master->ibi.num_slots,sizeof (*master->ibi.slots),GFP_KERNEL ); -if (!master->ibi.slots) +if (!master->ibi.slots) { + ret = -ENOMEM ; goto err_disable_sysclk; + }writel (IBIR_THR (1 ), master->regs +CMD_IBI_THR_CTRL );writel (MST_INT_IBIR_THR , master->regs +MST_IER );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 247/408 cpufreq: powernv: Fix frame-size-overflow in powernv_cpufreq_reboot_notifier
In reply to Greg Kroah-HartmanFrom: Srikar Dronamraju <[email protected]>
[ Upstream commit a2d0230b91f7e23ceb5d8fb6a9799f30517ec33a ]
The patch avoids allocating cpufreq_policy on stack hence fixing frame size overflow in 'powernv_cpufreq_reboot_notifier':
drivers/cpufreq/powernv-cpufreq.c: In function powernv_cpufreq_reboot_notifier:
drivers/cpufreq/powernv-cpufreq.c:906:1: error: the frame size of 2064 bytes is larger than 2048 bytes
--- drivers/cpufreq/powernv-cpufreq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/cpufreq/powernv-cpufreq.c +6 -3
@@ -884,12 +884,15 @@ static int powernv_cpufreq_reboot_notifier(struct notifier_block *nb, unsigned long action, void *unused) { int cpu; -struct cpufreq_policy cpu_policy; +struct cpufreq_policy *cpu_policy; rebooting = true;for_each_online_cpu (cpu) { -cpufreq_get_policy (&cpu_policy, cpu); -powernv_cpufreq_target_index (&cpu_policy,get_nominal_index ()); + cpu_policy =cpufreq_cpu_get (cpu); +if (!cpu_policy) +continue ; +powernv_cpufreq_target_index (cpu_policy,get_nominal_index ()); +cpufreq_cpu_put (cpu_policy); }return NOTIFY_DONE ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 248/408 IB/rdmavt: Fix sizeof mismatch
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 8e71f694e0c819db39af2336f16eb9689f1ae53f ]
An incorrect sizeof is being used, struct rvt_ibport ** is not correct, it should be struct rvt_ibport *. Note that since ** is the same size as
* this is not causing any issues. Improve this fix by using sizeof(*rdi->ports) as this allows us to not even reference the type of the pointer. Also remove line breaks as the entire statement can fit on one line.
Addresses-Coverity: ("Sizeof not portable (SIZEOF_MISMATCH)")
--- drivers/infiniband/sw/rdmavt/vt.c | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-)
drivers/infiniband/sw/rdmavt/vt.c +1 -3
@@ -95,9 +95,7 @@ struct rvt_dev_info *rvt_alloc_device(size_t size, int nports)if (!rdi)return rdi; - rdi->ports =kcalloc (nports, -sizeof (struct rvt_ibport **), -GFP_KERNEL ); + rdi->ports =kcalloc (nports,sizeof (*rdi->ports),GFP_KERNEL );if (!rdi->ports)ib_dealloc_device (&rdi->ibdev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 249/408 RDMA/rxe: Fix skb lifetime in rxe_rcv_mcast_pkt()
In reply to Greg Kroah-HartmanFrom: Bob Pearson <[email protected]>
[ Upstream commit e7ec96fc7932f48a6d6cdd05bf82004a1a04285b ]
The changes referenced below replaced sbk_clone)_ by taking additional references, passing the skb along and then freeing the skb. This deleted the packets before they could be processed and additionally passed bad data in each packet. Since pkt is stored in skb->cb changing pkt->qp changed it for all the packets.
Replace skb_get() by sbk_clone() in rxe_rcv_mcast_pkt() for cases where multiple QPs are receiving multicast packets on the same address.
Delete kfree_skb() because the packets need to live until they have been processed by each QP. They are freed later.
--- drivers/infiniband/sw/rxe/rxe_recv.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-)
drivers/infiniband/sw/rxe/rxe_recv.c +12 -5
@@ -281,6 +281,8 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)struct rxe_mc_elem *mce;struct rxe_qp *qp;union ib_gid dgid; +struct sk_buff *per_qp_skb; +struct rxe_pkt_info *per_qp_pkt;int err;if (skb->protocol ==htons (ETH_P_IP ))
@@ -309,21 +311,26 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)if (err)continue ; -/* if *not* the last qp in the list -* increase the users of the skb then post to the next qp +/* for all but the last qp create a new clone of the +* skb and pass to the qp. */ if (mce->qp_list.next != &mcg->qp_list) -skb_get (skb); + per_qp_skb =skb_clone (skb,GFP_ATOMIC ); +else + per_qp_skb = skb; - pkt->qp = qp; + per_qp_pkt =SKB_TO_PKT (per_qp_skb); + per_qp_pkt->qp = qp;rxe_add_ref (qp); -rxe_rcv_pkt (pkt, skb); +rxe_rcv_pkt (per_qp_pkt, per_qp_skb); }spin_unlock_bh (&mcg->mcg_lock);rxe_drop_ref (mcg);/* drop ref from rxe_pool_get_key. */ +return ; + err1:kfree_skb (skb); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 250/408 maiblox: mediatek: Fix handling of platform_get_irq() error
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 558e4c36ec9f2722af4fe8ef84dc812bcdb5c43a ]
platform_get_irq() returns -ERRNO on error. In such case casting to u32 and comparing to 0 would pass the check.
--- drivers/mailbox/mtk-cmdq-mailbox.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/mailbox/mtk-cmdq-mailbox.c +3 -5
@@ -70,7 +70,7 @@ struct cmdq_task {struct cmdq {struct mbox_controller mbox;void __iomem *base; -u32 irq; +int irq;u32 thread_nr;u32 irq_mask;struct cmdq_thread *thread;
@@ -474,10 +474,8 @@ static int cmdq_probe(struct platform_device *pdev) } cmdq->irq =platform_get_irq (pdev,0 ); -if (!cmdq->irq) { -dev_err (dev,"failed to get irq\n" ); -return -EINVAL ; - } +if (cmdq->irq <0 ) +return cmdq->irq; cmdq->thread_nr = (u32 )(unsigned long )of_device_get_match_data (dev); cmdq->irq_mask =GENMASK (cmdq->thread_nr -1 ,0 );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 251/408 selftests/powerpc: Fix eeh-basic.sh exit codes
In reply to Greg Kroah-HartmanFrom: Oliver O'Halloran <[email protected]>
[ Upstream commit 996f9e0f93f16211945c8d5f18f296a88cb32f91 ]
The kselftests test running infrastructure expects tests to finish with an exit code of 4 if the test decided it should be skipped. Currently eeh-basic.sh exits with the number of devices that failed to recover, so if four devices didn't recover we'll report a skip instead of a fail.
Fix this by checking if the return code is non-zero and report success and failure by returning 0 or 1 respectively. For the cases where should actually skip return 4.
--- tools/testing/selftests/powerpc/eeh/eeh-basic.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
tools/testing/selftests/powerpc/eeh/eeh-basic.sh +6 -3
@@ -1,17 +1,19 @@ #!/bin/sh # SPDX-License-Identifier: GPL-2.0-only +KSELFTESTS_SKIP=4 + . ./eeh-functions.sh if ! eeh_supported ; then echo "EEH not supported on this system, skipping" - exit 0; + exit $KSELFTESTS_SKIP; fi if [ ! -e "/sys/kernel/debug/powerpc/eeh_dev_check" ] && \ [ ! -e "/sys/kernel/debug/powerpc/eeh_dev_break" ] ; then echo "debugfs EEH testing files are missing. Is debugfs mounted?" - exit 1; + exit $KSELFTESTS_SKIP; fi pre_lspci=`mktemp`
@@ -79,4 +81,5 @@ echo "$failed devices failed to recover ($dev_count tested)" lspci | diff -u $pre_lspci - rm -f $pre_lspci -exit $failed +test "$failed" == 0 +exit $?
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 252/408 f2fs: wait for sysfs kobject removal before freeing f2fs_sb_info
In reply to Greg Kroah-HartmanFrom: Jamie Iles <[email protected]>
[ Upstream commit ae284d87abade58c8db7760c808f311ef1ce693c ]
syzkaller found that with CONFIG_DEBUG_KOBJECT_RELEASE=y, unmounting an f2fs filesystem could result in the following splat:
kobject: 'loop5' ((____ptrval____)): kobject_release, parent 0000000000000000 (delayed 250)
kobject: 'f2fs_xattr_entry-7:5' ((____ptrval____)): kobject_release, parent 0000000000000000 (delayed 750)
------------[ cut here ]------------ ODEBUG: free active (active state 0) object type: timer_list hint: delayed_work_timer_fn+0x0/0x98 WARNING: CPU: 0 PID: 699 at lib/debugobjects.c:485 debug_print_object+0x180/0x240 Kernel panic - not syncing: panic_on_warn set ... CPU: 0 PID: 699 Comm: syz-executor.5 Tainted: G S 5.9.0-rc8+ #101 Hardware name: linux,dummy-virt (DT) Call trace: dump_backtrace+0x0/0x4d8 show_stack+0x34/0x48 dump_stack+0x174/0x1f8 panic+0x360/0x7a0 __warn+0x244/0x2ec report_bug+0x240/0x398 bug_handler+0x50/0xc0 call_break_hook+0x160/0x1d8 brk_handler+0x30/0xc0 do_debug_exception+0x184/0x340 el1_dbg+0x48/0xb0 el1_sync_handler+0x170/0x1c8 el1_sync+0x80/0x100 debug_print_object+0x180/0x240 debug_check_no_obj_freed+0x200/0x430 slab_free_freelist_hook+0x190/0x210 kfree+0x13c/0x460 f2fs_put_super+0x624/0xa58 generic_shutdown_super+0x120/0x300 kill_block_super+0x94/0xf8 kill_f2fs_super+0x244/0x308 deactivate_locked_super+0x104/0x150 deactivate_super+0x118/0x148 cleanup_mnt+0x27c/0x3c0 __cleanup_mnt+0x28/0x38 task_work_run+0x10c/0x248 do_notify_resume+0x9d4/0x1188 work_pending+0x8/0x34c
Like the error handling for f2fs_register_sysfs(), we need to wait for the kobject to be destroyed before returning to prevent a potential use-after-free.
--- fs/f2fs/sysfs.c | 1 + 1 file changed, 1 insertion(+)
fs/f2fs/sysfs.c +1 -0
@@ -788,4 +788,5 @@ void f2fs_unregister_sysfs(struct f2fs_sb_info *sbi) }kobject_del (&sbi->s_kobj);kobject_put (&sbi->s_kobj); +wait_for_completion (&sbi->s_kobj_unregister); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 253/408 RDMA/rxe: Handle skb_clone() failure in rxe_recv.c
In reply to Greg Kroah-HartmanFrom: Bob Pearson <[email protected]>
[ Upstream commit 71abf20b28ff87fee6951ec2218d5ce7969c4e87 ]
If skb_clone() is unable to allocate memory for a new sk_buff this is not detected by the current code.
Check for a NULL return and continue. This is similar to other errors in this loop over QPs attached to the multicast address and consistent with the unreliable UD transport.
Addresses-Coverity-ID: 1497804: Null pointer dereferences (NULL_RETURNS)
--- drivers/infiniband/sw/rxe/rxe_recv.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/infiniband/sw/rxe/rxe_recv.c +3 -0
@@ -319,6 +319,9 @@ static void rxe_rcv_mcast_pkt(struct rxe_dev *rxe, struct sk_buff *skb)else per_qp_skb = skb; +if (unlikely (!per_qp_skb)) +continue ; + per_qp_pkt =SKB_TO_PKT (per_qp_skb); per_qp_pkt->qp = qp;rxe_add_ref (qp);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 254/408 mm/page_owner: change split_page_owner to take a count
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit 8fb156c9ee2db94f7127c930c89917634a1a9f56 ]
The implementation of split_page_owner() prefers a count rather than the old order of the page. When we support a variable size THP, we won't have the order at this point, but we will have the number of pages. So change the interface to what the caller and callee would prefer.
--- include/linux/page_owner.h | 6 +++--- mm/huge_memory.c | 2 +- mm/page_alloc.c | 2 +- mm/page_owner.c | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-)
include/linux/page_owner.h +3 -3
@@ -11,7 +11,7 @@ extern struct page_ext_operations page_owner_ops;extern void __reset_page_owner (struct page *page,unsigned int order);extern void __set_page_owner (struct page *page,unsigned int order,gfp_t gfp_mask); -extern void __split_page_owner (struct page *page,unsigned int order); +extern void __split_page_owner (struct page *page,unsigned int nr);extern void __copy_page_owner (struct page *oldpage,struct page *newpage);extern void __set_page_owner_migrate_reason (struct page *page,int reason);extern void __dump_page_owner (struct page *page);
@@ -31,10 +31,10 @@ static inline void set_page_owner(struct page *page,__set_page_owner (page, order, gfp_mask); } -static inline void split_page_owner (struct page *page,unsigned int order) +static inline void split_page_owner (struct page *page,unsigned int nr) {if (static_branch_unlikely (&page_owner_inited)) -__split_page_owner (page, order); +__split_page_owner (page, nr); }static inline void copy_page_owner (struct page *oldpage,struct page *newpage) {
mm/huge_memory.c +1 -1
@@ -2569,7 +2569,7 @@ static void __split_huge_page(struct page *page, struct list_head *list,ClearPageCompound (head); -split_page_owner (head,HPAGE_PMD_ORDER ); +split_page_owner (head,HPAGE_PMD_NR );/* See comment in __split_huge_page_tail() */ if (PageAnon (head)) {
mm/page_alloc.c +1 -1
@@ -3130,7 +3130,7 @@ void split_page(struct page *page, unsigned int order)for (i =1 ; i < (1 << order); i++)set_page_refcounted (page + i); -split_page_owner (page, order); +split_page_owner (page,1 << order); }EXPORT_SYMBOL_GPL (split_page);
mm/page_owner.c +2 -2
@@ -204,7 +204,7 @@ void __set_page_owner_migrate_reason(struct page *page, int reason) page_owner->last_migrate_reason = reason; } -void __split_page_owner (struct page *page,unsigned int order) +void __split_page_owner (struct page *page,unsigned int nr) {int i;struct page_ext *page_ext =lookup_page_ext (page);
@@ -213,7 +213,7 @@ void __split_page_owner(struct page *page, unsigned int order)if (unlikely (!page_ext))return ; -for (i =0 ; i < (1 << order); i++) { +for (i =0 ; i < nr; i++) { page_owner =get_page_owner (page_ext); page_owner->order =0 ; page_ext =page_ext_next (page_ext);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 255/408 lib/crc32.c: fix trivial typo in preprocessor condition
In reply to Greg Kroah-HartmanFrom: Tobias Jordan <[email protected]>
[ Upstream commit 904542dc56524f921a6bab0639ff6249c01e775f ]
Whether crc32_be needs a lookup table is chosen based on CRC_LE_BITS. Obviously, the _be function should be governed by the _BE_ define.
This probably never pops up as it's hard to come up with a configuration where CRC_BE_BITS isn't the same as CRC_LE_BITS and as nobody is using bitwise CRC anyway.
--- lib/crc32.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
lib/crc32.c +1 -1
@@ -331,7 +331,7 @@ static inline u32 __pure crc32_be_generic(u32 crc, unsigned char const *p,return crc; } -#if CRC_LE_BITS ==1 +#if CRC_BE_BITS ==1 u32 __pure crc32_be (u32 crc,unsigned char const *p,size_t len) {return crc32_be_generic (crc, p, len,NULL ,CRC32_POLY_BE );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 256/408 ramfs: fix nommu mmap with gaps in the page cache
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit 50b7d85680086126d7bd91dae81d57d4cb1ab6b7 ]
ramfs needs to check that pages are both physically contiguous and contiguous in the file. If the page cache happens to have, eg, page A for index 0 of the file, no page for index 1, and page A+1 for index 2, then an mmap of the first two pages of the file will succeed when it should fail.
--- fs/ramfs/file-nommu.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/ramfs/file-nommu.c +1 -1
@@ -224,7 +224,7 @@ static unsigned long ramfs_nommu_get_unmapped_area(struct file *file,if (!pages) goto out_free; - nr =find_get_pages (inode->i_mapping, &pgoff, lpages, pages); + nr =find_get_pages_contig (inode->i_mapping, pgoff, lpages, pages);if (nr != lpages) goto out_free_pages;/* leave if some pages were missing */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 257/408 rapidio: fix error handling path
In reply to Greg Kroah-HartmanFrom: Souptick Joarder <[email protected]>
[ Upstream commit fa63f083b3492b5ed5332b8d7c90b03b5ef24a1d ]
rio_dma_transfer() attempts to clamp the return value of pin_user_pages_fast() to be >= 0. However, the attempt fails because nr_pages is overridden a few lines later, and restored to the undesirable -ERRNO value.
The return value is ultimately stored in nr_pages, which in turn is passed to unpin_user_pages(), which expects nr_pages >= 0, else, disaster.
Fix this by fixing the nesting of the assignment to nr_pages: nr_pages should be clamped to zero if pin_user_pages_fast() returns -ERRNO, or set to the return value of pin_user_pages_fast(), otherwise.
[[email protected]: new changelog]
--- drivers/rapidio/devices/rio_mport_cdev.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/rapidio/devices/rio_mport_cdev.c +7 -6
@@ -873,15 +873,16 @@ rio_dma_transfer(struct file *filp, u32 transfer_mode,rmcd_error ("get_user_pages_unlocked err=%ld" , pinned); nr_pages =0 ; - }else + }else {rmcd_error ("pinned %ld out of %ld pages" , pinned, nr_pages); +/* +* Set nr_pages up to mean "how many pages to unpin, in +* the error handler: +*/ + nr_pages = pinned; + } ret = -EFAULT ; -/* -* Set nr_pages up to mean "how many pages to unpin, in -* the error handler: -*/ - nr_pages = pinned; goto err_pg; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 258/408 rapidio: fix the missed put_device() for rio_mport_add_riodev
In reply to Greg Kroah-HartmanFrom: Jing Xiangfeng <[email protected]>
[ Upstream commit 85094c05eeb47d195a74a25366a2db066f1c9d47 ]
rio_mport_add_riodev() misses to call put_device() when the device already exists. Add the missed function call to fix it.
--- drivers/rapidio/devices/rio_mport_cdev.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/rapidio/devices/rio_mport_cdev.c +4 -1
@@ -1683,6 +1683,7 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv,struct rio_dev *rdev;struct rio_switch *rswitch =NULL ;struct rio_mport *mport; +struct device *dev;size_t size;u32 rval;u32 swpinfo =0 ;
@@ -1697,8 +1698,10 @@ static int rio_mport_add_riodev(struct mport_cdev_priv *priv,rmcd_debug (RDEV ,"name:%s ct:0x%x did:0x%x hc:0x%x" , dev_info.name, dev_info.comptag, dev_info.destid, dev_info.hopcount); -if (bus_find_device_by_name (&rio_bus_type,NULL , dev_info.name)) { + dev =bus_find_device_by_name (&rio_bus_type,NULL , dev_info.name); +if (dev) {rmcd_debug (RDEV ,"device %s already exists" , dev_info.name); +put_device (dev);return -EEXIST ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 259/408 mailbox: avoid timer start from callback
In reply to Greg Kroah-HartmanFrom: Jassi Brar <[email protected]>
[ Upstream commit c7dacf5b0f32957b24ef29df1207dc2cd8307743 ]
If the txdone is done by polling, it is possible for msg_submit() to start the timer while txdone_hrtimer() callback is running. If the timer needs recheduling, it could already be enqueued by the time hrtimer_forward_now() is called, leading hrtimer to loudly complain.
WARNING: CPU: 3 PID: 74 at kernel/time/hrtimer.c:932 hrtimer_forward+0xc4/0x110 CPU: 3 PID: 74 Comm: kworker/u8:1 Not tainted 5.9.0-rc2-00236-gd3520067d01c-dirty #5 Hardware name: Libre Computer AML-S805X-AC (DT) Workqueue: events_freezable_power_ thermal_zone_device_check pstate: 20000085 (nzCv daIf -PAN -UAO BTYPE=--) pc : hrtimer_forward+0xc4/0x110 lr : txdone_hrtimer+0xf8/0x118
[...]
This can be fixed by not starting the timer from the callback path. Which requires the timer reloading as long as any message is queued on the channel, and not just when current tx is not done yet.
--- drivers/mailbox/mailbox.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
drivers/mailbox/mailbox.c +7 -5
@@ -82,9 +82,12 @@ static void msg_submit(struct mbox_chan *chan) exit:spin_unlock_irqrestore (&chan->lock, flags); -if (!err && (chan->txdone_method &TXDONE_BY_POLL )) -/* kick start the timer immediately to avoid delays */ -hrtimer_start (&chan->mbox->poll_hrt,0 ,HRTIMER_MODE_REL ); +/* kick start the timer immediately to avoid delays */ +if (!err && (chan->txdone_method &TXDONE_BY_POLL )) { +/* but only if not already active */ +if (!hrtimer_active (&chan->mbox->poll_hrt)) +hrtimer_start (&chan->mbox->poll_hrt,0 ,HRTIMER_MODE_REL ); + } }static void tx_tick (struct mbox_chan *chan,int r)
@@ -122,11 +125,10 @@ static enum hrtimer_restart txdone_hrtimer(struct hrtimer *hrtimer)struct mbox_chan *chan = &mbox->chans[i];if (chan->active_req && chan->cl) { + resched = true; txdone = chan->mbox->ops->last_tx_done (chan);if (txdone)tx_tick (chan,0 ); -else - resched = true; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 260/408 i2c: rcar: Auto select RESET_CONTROLLER
In reply to Greg Kroah-HartmanFrom: Dirk Behme <[email protected]>
[ Upstream commit 5b9bacf28a973a6b16510493416baeefa2c06289 ]
The i2c-rcar driver utilizes the Generic Reset Controller kernel feature, so select the RESET_CONTROLLER option when the I2C_RCAR option is selected with a Gen3 SoC.
--- drivers/i2c/busses/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/Kconfig +1 -0
@@ -1162,6 +1162,7 @@ config I2C_RCAR tristate "Renesas R-Car I2C Controller" depends on ARCH_RENESAS || COMPILE_TEST select I2C_SLAVE + select RESET_CONTROLLER if ARCH_RCAR_GEN3 help If you say yes to this option, support will be included for the R-Car I2C controller.
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 261/408 clk: meson: g12a: mark fclk_div2 as critical
In reply to Greg Kroah-HartmanFrom: Stefan Agner <[email protected]>
[ Upstream commit 2c4e80e06790cb49ad2603855d30c5aac2209c47 ]
On Amlogic Meson G12b platform, similar to fclk_div3, the fclk_div2 seems to be necessary for the system to operate correctly as well.
Typically, the clock also gets chosen by the eMMC peripheral. This probably masked the problem so far. However, when booting from a SD card the clock seems to get disabled which leads to a system freeze.
Let's mark this clock as critical, fixing boot from SD card on G12b platforms.
--- drivers/clk/meson/g12a.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/clk/meson/g12a.c +11 -0
@@ -298,6 +298,17 @@ static struct clk_regmap g12a_fclk_div2 = { &g12a_fclk_div2_div.hw }, .num_parents = 1, +/* +* Similar to fclk_div3, it seems that this clock is used by +* the resident firmware and is required by the platform to +* operate correctly. +* Until the following condition are met, we need this clock to +* be marked as critical: +* a) Mark the clock used by a firmware resource, if possible +* b) CCF has a clock hand-off mechanism to make the sure the +* clock stays on until the proper driver comes along +*/ + .flags = CLK_IS_CRITICAL, }, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 262/408 PCI: aardvark: Check for errors from pci_bridge_emul_init() call
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit 7862a6134456c8b4f8c39e8c94aa97e5c2f7f2b7 ]
Function pci_bridge_emul_init() may fail so correctly check for errors.
--- drivers/pci/controller/pci-aardvark.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/pci/controller/pci-aardvark.c +7 -4
@@ -503,7 +503,7 @@ static struct pci_bridge_emul_ops advk_pci_bridge_emul_ops = {* Initialize the configuration space of the PCI-to-PCI bridge * associated with the given PCIe interface. */ -static void advk_sw_pci_bridge_init (struct advk_pcie *pcie) +static int advk_sw_pci_bridge_init (struct advk_pcie *pcie) {struct pci_bridge_emul *bridge = &pcie->bridge;
@@ -527,8 +527,7 @@ static void advk_sw_pci_bridge_init(struct advk_pcie *pcie) bridge->data = pcie; bridge->ops = &advk_pci_bridge_emul_ops; -pci_bridge_emul_init (bridge,0 ); - +return pci_bridge_emul_init (bridge,0 ); } static bool advk_pcie_valid_device(struct advk_pcie *pcie, struct pci_bus *bus,
@@ -1027,7 +1026,11 @@ static int advk_pcie_probe(struct platform_device *pdev)advk_pcie_setup_hw (pcie); -advk_sw_pci_bridge_init (pcie); + ret =advk_sw_pci_bridge_init (pcie); +if (ret) { +dev_err (dev,"Failed to register emulated root PCI bridge\n" ); +return ret; + } ret =advk_pcie_init_irq_domain (pcie);if (ret) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 263/408 PCI: iproc: Set affinity mask on MSI interrupts
In reply to Greg Kroah-HartmanFrom: Mark Tomlinson <[email protected]>
[ Upstream commit eb7eacaa5b9e4f665bd08d416c8f88e63d2f123c ]
The core interrupt code expects the irq_set_affinity call to update the effective affinity for the interrupt. This was not being done, so update iproc_msi_irq_set_affinity() to do so.
--- drivers/pci/controller/pcie-iproc-msi.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-)
drivers/pci/controller/pcie-iproc-msi.c +9 -4
@@ -209,15 +209,20 @@ static int iproc_msi_irq_set_affinity(struct irq_data *data,struct iproc_msi *msi =irq_data_get_irq_chip_data (data);int target_cpu =cpumask_first (mask);int curr_cpu; +int ret; curr_cpu =hwirq_to_cpu (msi, data->hwirq);if (curr_cpu == target_cpu) -return IRQ_SET_MASK_OK_DONE ; + ret =IRQ_SET_MASK_OK_DONE ; +else { +/* steer MSI to the target CPU */ + data->hwirq =hwirq_to_canonical_hwirq (msi, data->hwirq) + target_cpu; + ret =IRQ_SET_MASK_OK ; + } -/* steer MSI to the target CPU */ - data->hwirq =hwirq_to_canonical_hwirq (msi, data->hwirq) + target_cpu; +irq_data_update_effective_affinity (data,cpumask_of (target_cpu)); -return IRQ_SET_MASK_OK ; +return ret; } static void iproc_msi_irq_compose_msi_msg(struct irq_data *data,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 264/408 rpmsg: smd: Fix a kobj leak in in qcom_smd_parse_edge()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit e69ee0cf655e8e0c4a80f4319e36019b74f17639 ]
We need to call of_node_put(node) on the error paths for this function.
--- drivers/rpmsg/qcom_smd.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)
drivers/rpmsg/qcom_smd.c +22 -10
@@ -1338,7 +1338,7 @@ static int qcom_smd_parse_edge(struct device *dev, ret =of_property_read_u32 (node, key, &edge->edge_id);if (ret) {dev_err (dev,"edge missing %s property\n" , key); -return -EINVAL ; + goto put_node; } edge->remote_pid =QCOM_SMEM_HOST_ANY ;
@@ -1349,32 +1349,37 @@ static int qcom_smd_parse_edge(struct device *dev, edge->mbox_client.knows_txdone = true; edge->mbox_chan =mbox_request_channel (&edge->mbox_client,0 );if (IS_ERR (edge->mbox_chan)) { -if (PTR_ERR (edge->mbox_chan) != -ENODEV ) -return PTR_ERR (edge->mbox_chan); +if (PTR_ERR (edge->mbox_chan) != -ENODEV ) { + ret =PTR_ERR (edge->mbox_chan); + goto put_node; + } edge->mbox_chan =NULL ; syscon_np =of_parse_phandle (node,"qcom,ipc" ,0 );if (!syscon_np) {dev_err (dev,"no qcom,ipc node\n" ); -return -ENODEV ; + ret = -ENODEV ; + goto put_node; } edge->ipc_regmap =syscon_node_to_regmap (syscon_np); -if (IS_ERR (edge->ipc_regmap)) -return PTR_ERR (edge->ipc_regmap); +if (IS_ERR (edge->ipc_regmap)) { + ret =PTR_ERR (edge->ipc_regmap); + goto put_node; + } key ="qcom,ipc" ; ret =of_property_read_u32_index (node, key,1 , &edge->ipc_offset);if (ret <0 ) {dev_err (dev,"no offset in %s\n" , key); -return -EINVAL ; + goto put_node; } ret =of_property_read_u32_index (node, key,2 , &edge->ipc_bit);if (ret <0 ) {dev_err (dev,"no bit in %s\n" , key); -return -EINVAL ; + goto put_node; } }
@@ -1385,7 +1390,8 @@ static int qcom_smd_parse_edge(struct device *dev, irq =irq_of_parse_and_map (node,0 );if (irq <0 ) {dev_err (dev,"required smd interrupt missing\n" ); -return -EINVAL ; + ret = irq; + goto put_node; } ret = devm_request_irq(dev, irq,
@@ -1393,12 +1399,18 @@ static int qcom_smd_parse_edge(struct device *dev, node->name, edge);if (ret) {dev_err (dev,"failed to request smd irq\n" ); -return ret; + goto put_node; } edge->irq = irq;return 0 ; + +put_node: +of_node_put (node); + edge->of_node =NULL ; + +return ret; }/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 265/408 PCI/IOV: Mark VFs as not implementing PCI_COMMAND_MEMORY
In reply to Greg Kroah-HartmanFrom: Matthew Rosato <[email protected]>
[ Upstream commit 12856e7acde4702b7c3238c15fcba86ff6aa507f ]
For VFs, the Memory Space Enable bit in the Command Register is hard-wired to 0.
Add a new bit to signify devices where the Command Register Memory Space Enable bit does not control the device's response to MMIO accesses.
--- drivers/pci/iov.c | 1 + include/linux/pci.h | 1 + 2 files changed, 2 insertions(+)
drivers/pci/iov.c +1 -0
@@ -158,6 +158,7 @@ int pci_iov_add_virtfn(struct pci_dev *dev, int id) virtfn->device = iov->vf_device; virtfn->is_virtfn =1 ; virtfn->physfn =pci_dev_get (dev); + virtfn->no_command_memory =1 ;if (id ==0 )pci_read_vf_config_common (virtfn);
include/linux/pci.h +1 -0
@@ -423,6 +423,7 @@ struct pci_dev { unsigned int is_probed:1; /* Device probing in progress */ unsigned int link_active_reporting:1;/* Device capable of reporting link active */ unsigned int no_vf_scan:1; /* Don't scan for VFs after IOV enablement */ + unsigned int no_command_memory:1; /* No PCI_COMMAND_MEMORY */pci_dev_flags_t dev_flags;atomic_t enable_cnt;/* pci_enable_device has been called */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 266/408 vfio/pci: Decouple PCI_COMMAND_MEMORY bit checks from is_virtfn
In reply to Greg Kroah-HartmanFrom: Matthew Rosato <[email protected]>
[ Upstream commit 515ecd5368f1510152fa4f9b9ce55b66ac56c334 ]
While it is true that devices with is_virtfn=1 will have a Memory Space Enable bit that is hard-wired to 0, this is not the only case where we see this behavior -- For example some bare-metal hypervisors lack Memory Space Enable bit emulation for devices not setting is_virtfn (s390). Fix this by instead checking for the newly-added no_command_memory bit which directly denotes the need for PCI_COMMAND_MEMORY emulation in vfio.
--- drivers/vfio/pci/vfio_pci_config.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-)
drivers/vfio/pci/vfio_pci_config.c +14 -10
@@ -406,7 +406,7 @@ bool __vfio_pci_memory_enabled(struct vfio_pci_device *vdev)* PF SR-IOV capability, there's therefore no need to trigger * faults based on the virtual value. */ -return pdev->is_virtfn || (cmd &PCI_COMMAND_MEMORY ); +return pdev->no_command_memory || (cmd &PCI_COMMAND_MEMORY ); }/*
@@ -518,8 +518,8 @@ static int vfio_basic_config_read(struct vfio_pci_device *vdev, int pos, count =vfio_default_config_read (vdev, pos, count, perm, offset, val); -/* Mask in virtual memory enable for SR-IOV devices */ -if (offset ==PCI_COMMAND && vdev->pdev->is_virtfn) { +/* Mask in virtual memory enable */ +if (offset ==PCI_COMMAND && vdev->pdev->no_command_memory) {u16 cmd =le16_to_cpu (*(__le16 *)&vdev->vconfig[PCI_COMMAND ]);u32 tmp_val =le32_to_cpu (*val);
@@ -587,9 +587,11 @@ static int vfio_basic_config_write(struct vfio_pci_device *vdev, int pos,* shows it disabled (phys_mem/io, then the device has * undergone some kind of backdoor reset and needs to be * restored before we allow it to enable the bars. -* SR-IOV devices will trigger this, but we catch them later +* SR-IOV devices will trigger this - for mem enable let's +* catch this now and for io enable it will be caught later */ -if ((new_mem && virt_mem && !phys_mem) || +if ((new_mem && virt_mem && !phys_mem && + !pdev->no_command_memory) || (new_io && virt_io && !phys_io) ||vfio_need_bar_restore (vdev))vfio_bar_restore (vdev);
@@ -1732,12 +1734,14 @@ int vfio_config_init(struct vfio_pci_device *vdev) vconfig[PCI_INTERRUPT_PIN]); vconfig[PCI_INTERRUPT_PIN ] =0 ;/* Gratuitous for good VFs */ - + } +if (pdev->no_command_memory) {/* -* VFs do no implement the memory enable bit of the COMMAND -* register therefore we'll not have it set in our initial -* copy of config space after pci_enable_device(). For -* consistency with PFs, set the virtual enable bit here. +* VFs and devices that set pdev->no_command_memory do not +* implement the memory enable bit of the COMMAND register +* therefore we'll not have it set in our initial copy of +* config space after pci_enable_device(). For consistency +* with PFs, set the virtual enable bit here. */ *(__le16 *)&vconfig[PCI_COMMAND ] |=cpu_to_le16 (PCI_COMMAND_MEMORY );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 267/408 clk: qcom: gcc-sdm660: Fix wrong parent_map
In reply to Greg Kroah-HartmanFrom: Konrad Dybcio <[email protected]>
[ Upstream commit d46e5a39f9be9288f1ce2170c4c7f8098f4e7f68 ]
This was likely overlooked while porting the driver upstream.
--- drivers/clk/qcom/gcc-sdm660.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/qcom/gcc-sdm660.c +1 -1
@@ -666,7 +666,7 @@ static struct clk_rcg2 hmss_rbcpr_clk_src = { .cmd_rcgr = 0x48044, .mnd_width = 0, .hid_width = 5, - .parent_map = gcc_parent_map_xo_gpll0_gpll0_early_div, + .parent_map = gcc_parent_map_xo_gpll0, .freq_tbl = ftbl_hmss_rbcpr_clk_src, .clkr.hw.init = &(struct clk_init_data ){ .name ="hmss_rbcpr_clk_src" ,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 268/408 clk: keystone: sci-clk: fix parsing assigned-clock data during probe
In reply to Greg Kroah-HartmanFrom: Tero Kristo <[email protected]>
[ Upstream commit 2f05cced7307489faab873367fb20cd212e1d890 ]
The DT clock probe loop incorrectly terminates after processing "clocks" only, fix this by re-starting the loop when all entries for current DT property have been parsed.
--- drivers/clk/keystone/sci-clk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/keystone/sci-clk.c +1 -1
@@ -522,7 +522,7 @@ static int ti_sci_scan_clocks_from_dt(struct sci_clk_provider *provider) np =of_find_node_with_property (np, *clk_name);if (!np) { clk_name++; -break ; +continue ; }if (!of_device_is_available (np))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 269/408 pwm: img: Fix null pointer access in probe
In reply to Greg Kroah-HartmanFrom: Hauke Mehrtens <[email protected]>
[ Upstream commit b39c0615d0667b3a6f2f5c4bf99ffadf3b518bb1 ]
dev_get_drvdata() is called in img_pwm_runtime_resume() before the driver data is set.
When pm_runtime_enabled() returns false in img_pwm_probe() it calls img_pwm_runtime_resume() which results in a null pointer access.
This patch fixes the problem by setting the driver data earlier in the img_pwm_probe() function.
This crash was seen when booting the Imagination Technologies Creator Ci40 (Marduk) with kernel 5.4 in OpenWrt.
--- drivers/pwm/pwm-img.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pwm/pwm-img.c +2 -1
@@ -277,6 +277,8 @@ static int img_pwm_probe(struct platform_device *pdev)return PTR_ERR (pwm->pwm_clk); } +platform_set_drvdata (pdev, pwm); +pm_runtime_set_autosuspend_delay (&pdev->dev,IMG_PWM_PM_TIMEOUT );pm_runtime_use_autosuspend (&pdev->dev);pm_runtime_enable (&pdev->dev);
@@ -313,7 +315,6 @@ static int img_pwm_probe(struct platform_device *pdev) goto err_suspend; } -platform_set_drvdata (pdev, pwm);return 0 ; err_suspend:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 270/408 clk: rockchip: Initialize hw to error to avoid undefined behavior
In reply to Greg Kroah-HartmanFrom: Stephen Boyd <[email protected]>
[ Upstream commit b608f11d49ec671739604cc763248d8e8fadbbeb ]
We can get down to this return value from ERR_CAST() without initializing hw. Set it to -ENOMEM so that we always return something sane.
Fixes the following smatch warning:
drivers/clk/rockchip/clk-half-divider.c:228 rockchip_clk_register_halfdiv() error: uninitialized symbol 'hw'. drivers/clk/rockchip/clk-half-divider.c:228 rockchip_clk_register_halfdiv() warn: passing zero to 'ERR_CAST'
--- drivers/clk/rockchip/clk-half-divider.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/clk/rockchip/clk-half-divider.c +1 -1
@@ -167,7 +167,7 @@ struct clk *rockchip_clk_register_halfdiv(const char *name,unsigned long flags, spinlock_t *lock) { - struct clk *clk; + struct clk *clk = ERR_PTR(-ENOMEM);struct clk_mux *mux =NULL ;struct clk_gate *gate =NULL ;struct clk_divider *div =NULL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 271/408 clk: mediatek: add UART0 clock support
In reply to Greg Kroah-HartmanFrom: Hanks Chen <[email protected]>
[ Upstream commit 804a892456b73604b7ecfb1b00a96a29f3d2aedf ]
Add MT6779 UART0 clock support.
--- drivers/clk/mediatek/clk-mt6779.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/clk/mediatek/clk-mt6779.c +2 -0
@@ -919,6 +919,8 @@ static const struct mtk_gate infra_clks[] = { "pwm_sel", 19),GATE_INFRA0 (CLK_INFRA_PWM ,"infra_pwm" ,"pwm_sel" ,21 ), +GATE_INFRA0 (CLK_INFRA_UART0 ,"infra_uart0" , +"uart_sel" ,22 ),GATE_INFRA0 (CLK_INFRA_UART1 ,"infra_uart1" ,"uart_sel" ,23 ), GATE_INFRA0(CLK_INFRA_UART2, "infra_uart2",
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 272/408 module: statically initialize init section freeing data
In reply to Greg Kroah-HartmanFrom: Daniel Jordan <[email protected]>
[ Upstream commit fdf09ab887829cd1b671e45d9549f8ec1ffda0fa ]
Corentin hit the following workqueue warning when running with CRYPTO_MANAGER_EXTRA_TESTS:
WARNING: CPU: 2 PID: 147 at kernel/workqueue.c:1473 __queue_work+0x3b8/0x3d0
Modules linked in: ghash_generic
CPU: 2 PID: 147 Comm: modprobe Not tainted
5.6.0-rc1-next-20200214-00068-g166c9264f0b1-dirty #545
Hardware name: Pine H64 model A (DT)
pc : __queue_work+0x3b8/0x3d0
Call trace:
__queue_work+0x3b8/0x3d0
queue_work_on+0x6c/0x90
do_init_module+0x188/0x1f0
load_module+0x1d00/0x22b0I wasn't able to reproduce on x86 or rpi 3b+.
This is
WARN_ON(!list_empty(&work->entry))
from __queue_work(), and it happens because the init_free_wq work item isn't initialized in time for a crypto test that requests the gcm module. Some crypto tests were recently moved earlier in boot as explained in commit c4741b230597 ("crypto: run initcalls for generic implementations earlier"), which went into mainline less than two weeks before the Fixes commit.
Avoid the warning by statically initializing init_free_wq and the corresponding llist.
Tested-on: sun50i-h6-pine-h64
Tested-on: imx8mn-ddr4-evk
Tested-on: sun50i-a64-bananapi-m64
--- kernel/module.c | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-)
kernel/module.c +3 -10
@@ -88,8 +88,9 @@ EXPORT_SYMBOL_GPL(module_mutex);static LIST_HEAD (modules);/* Work queue for freeing init sections in success case */ -static struct work_struct init_free_wq; -static struct llist_head init_free_list; +static void do_free_init (struct work_struct *w); +static DECLARE_WORK(init_free_wq, do_free_init); +static LLIST_HEAD (init_free_list);#ifdef CONFIG_MODULES_TREE_LOOKUP
@@ -3563,14 +3564,6 @@ static void do_free_init(struct work_struct *w) } } -static int __init modules_wq_init (void ) -{ -INIT_WORK (&init_free_wq, do_free_init); -init_llist_head (&init_free_list); -return 0 ; -} -module_init (modules_wq_init); -/* * This is where the real work happens. *
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 273/408 clk: at91: clk-main: update key before writing AT91_CKGR_MOR
In reply to Greg Kroah-HartmanFrom: Claudiu Beznea <[email protected]>
[ Upstream commit 85d071e7f19a6a9abf30476b90b3819642568756 ]
SAMA5D2 datasheet specifies on chapter 33.22.8 (PMC Clock Generator Main Oscillator Register) that writing any value other than 0x37 on KEY field aborts the write operation. Use the key when selecting main clock parent.
--- drivers/clk/at91/clk-main.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/clk/at91/clk-main.c +8 -3
@@ -437,12 +437,17 @@ static int clk_sam9x5_main_set_parent(struct clk_hw *hw, u8 index)return -EINVAL ;regmap_read (regmap,AT91_CKGR_MOR , &tmp); - tmp &= ~MOR_KEY_MASK ;if (index && !(tmp &AT91_PMC_MOSCSEL )) -regmap_write (regmap,AT91_CKGR_MOR , tmp |AT91_PMC_MOSCSEL ); + tmp =AT91_PMC_MOSCSEL ;else if (!index && (tmp &AT91_PMC_MOSCSEL )) -regmap_write (regmap,AT91_CKGR_MOR , tmp & ~AT91_PMC_MOSCSEL ); + tmp =0 ; +else +return 0 ; + +regmap_update_bits (regmap,AT91_CKGR_MOR , +AT91_PMC_MOSCSEL |MOR_KEY_MASK , + tmp |AT91_PMC_KEY );while (!clk_sam9x5_main_ready (regmap))cpu_relax ();
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 274/408 clk: bcm2835: add missing release if devm_clk_hw_register fails
In reply to Greg Kroah-HartmanFrom: Navid Emamdoost <[email protected]>
[ Upstream commit f6c992ca7dd4f49042eec61f3fb426c94d901675 ]
In the implementation of bcm2835_register_pll(), the allocated pll is leaked if devm_clk_hw_register() fails to register hw. Release pll if devm_clk_hw_register() fails.
--- drivers/clk/bcm/clk-bcm2835.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/clk/bcm/clk-bcm2835.c +3 -1
@@ -1336,8 +1336,10 @@ static struct clk_hw *bcm2835_register_pll(struct bcm2835_cprman *cprman, pll->hw.init = &init; ret =devm_clk_hw_register (cprman->dev, &pll->hw); -if (ret) +if (ret) { +kfree (pll);return NULL ; + }return &pll->hw; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 275/408 watchdog: Fix memleak in watchdog_cdev_register
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 5afb6d203d0293512aa2c6ae098274a2a4f6ed02 ]
When watchdog_kworker is NULL, we should free wd_data before the function returns to prevent memleak.
--- drivers/watchdog/watchdog_dev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/watchdog/watchdog_dev.c +3 -1
@@ -971,8 +971,10 @@ static int watchdog_cdev_register(struct watchdog_device *wdd) wd_data->wdd = wdd; wdd->wd_data = wd_data; -if (IS_ERR_OR_NULL (watchdog_kworker)) +if (IS_ERR_OR_NULL (watchdog_kworker)) { +kfree (wd_data);return -ENODEV ; + }device_initialize (&wd_data->dev); wd_data->dev.devt =MKDEV (MAJOR (watchdog_devt), wdd->id);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 276/408 watchdog: Use put_device on error
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 937425d4cd3ae4e2882b41e332bbbab616bcf0ad ]
We should use put_device() instead of freeing device directly after device_initialize().
--- drivers/watchdog/watchdog_dev.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/watchdog_dev.c +1 -1
@@ -1000,7 +1000,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)pr_err ("%s: a legacy watchdog module is probably present.\n" , wdd->info->identity); old_wd_data =NULL ; -kfree (wd_data); +put_device (&wd_data->dev);return err; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 277/408 watchdog: sp5100: Fix definition of EFCH_PM_DECODEEN3
In reply to Greg Kroah-HartmanFrom: Guenter Roeck <[email protected]>
[ Upstream commit 08c619b4923056b5dd2d5045757468c76ad0e3fe ]
EFCH_PM_DECODEEN3 is supposed to access DECODEEN register bits 24..31, in other words the register at byte offset 3.
--- drivers/watchdog/sp5100_tco.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/watchdog/sp5100_tco.h +1 -1
@@ -70,7 +70,7 @@#define EFCH_PM_DECODEEN_WDT_TMREN BIT(7) -#define EFCH_PM_DECODEEN3 0x00 +#define EFCH_PM_DECODEEN3 0x03#define EFCH_PM_DECODEEN_SECOND_RES GENMASK(1, 0)#define EFCH_PM_WATCHDOG_DISABLE ((u8)GENMASK(3, 2))
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 278/408 svcrdma: fix bounce buffers for unaligned offsets and multiple pages
In reply to Greg Kroah-HartmanFrom: Dan Aloni <[email protected]>
[ Upstream commit c327a310ec4d6ecbea13185ed56c11def441d9ab ]
This was discovered using O_DIRECT at the client side, with small unaligned file offsets or IOs that span multiple file pages.
--- net/sunrpc/xprtrdma/svc_rdma_sendto.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/sunrpc/xprtrdma/svc_rdma_sendto.c +2 -1
@@ -609,10 +609,11 @@ static int svc_rdma_pull_up_reply_msg(struct svcxprt_rdma *rdma,while (remaining) { len =min_t (u32,PAGE_SIZE - pageoff, remaining); -memcpy (dst,page_address (*ppages), len); +memcpy (dst,page_address (*ppages) + pageoff, len); remaining -= len; dst += len; pageoff =0 ; + ppages++; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 279/408 ext4: limit entries returned when counting fsmap records
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit af8c53c8bc087459b1aadd4c94805d8272358d79 ]
If userspace asked fsmap to try to count the number of entries, we cannot return more than UINT_MAX entries because fmh_entries is u32. Therefore, stop counting if we hit this limit or else we will waste time to return truncated results.
--- fs/ext4/fsmap.c | 3 +++ 1 file changed, 3 insertions(+)
fs/ext4/fsmap.c +3 -0
@@ -108,6 +108,9 @@ static int ext4_getfsmap_helper(struct super_block *sb,/* Are we just counting mappings? */ if (info->gfi_head->fmh_count ==0 ) { +if (info->gfi_head->fmh_entries ==UINT_MAX ) +return EXT4_QUERY_RANGE_ABORT ; +if (rec_fsblk > info->gfi_next_fsblk) info->gfi_head->fmh_entries++;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 280/408 vfio/pci: Clear token on bypass registration failure
In reply to Greg Kroah-HartmanFrom: Alex Williamson <[email protected]>
[ Upstream commit 852b1beecb6ff9326f7ca4bc0fe69ae860ebdb9e ]
The eventfd context is used as our irqbypass token, therefore if an eventfd is re-used, our token is the same. The irqbypass code will return an -EBUSY in this case, but we'll still attempt to unregister the producer, where if that duplicate token still exists, results in removing the wrong object. Clear the token of failed producers so that they harmlessly fall out when unregistered.
--- drivers/vfio/pci/vfio_pci_intrs.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/vfio/pci/vfio_pci_intrs.c +3 -1
@@ -352,11 +352,13 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, vdev->ctx[vector].producer.token = trigger; vdev->ctx[vector].producer.irq = irq; ret =irq_bypass_register_producer (&vdev->ctx[vector].producer); -if (unlikely (ret)) +if (unlikely (ret)) {dev_info (&pdev->dev,"irq bypass producer (token %p) registration fails: %d\n" , vdev->ctx[vector].producer.token, ret); + vdev->ctx[vector].producer.token =NULL ; + } vdev->ctx[vector].trigger = trigger;return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 281/408 vfio iommu type1: Fix memory leak in vfio_iommu_type1_pin_pages
In reply to Greg Kroah-HartmanFrom: Xiaoyang Xu <[email protected]>
[ Upstream commit 2e6cfd496f5b57034cf2aec738799571b5a52124 ]
pfn is not added to pfn_list when vfio_add_to_pfn_list fails. vfio_unpin_page_external will exit directly without calling vfio_iova_put_vfio_pfn. This will lead to a memory leak.
--- drivers/vfio/vfio_iommu_type1.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/vfio/vfio_iommu_type1.c +2 -1
@@ -631,7 +631,8 @@ static int vfio_iommu_type1_pin_pages(void *iommu_data, ret =vfio_add_to_pfn_list (dma, iova, phys_pfn[i]);if (ret) { -vfio_unpin_page_external (dma, iova, do_accounting); +if (put_pfn (phys_pfn[i], dma->prot) && do_accounting) +vfio_lock_acct (dma,-1 , true); goto pin_unwind; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 282/408 clk: imx8mq: Fix usdhc parents order
In reply to Greg Kroah-HartmanFrom: Abel Vesa <[email protected]>
[ Upstream commit b159c63d82ff8ffddc6c6f0eb881b113b36ecad7 ]
According to the latest RM (see Table 5-1. Clock Root Table), both usdhc root clocks have the parent order as follows:
000 - 25M_REF_CLK
001 - SYSTEM_PLL1_DIV2
010 - SYSTEM_PLL1_CLK
011 - SYSTEM_PLL2_DIV2
100 - SYSTEM_PLL3_CLK
101 - SYSTEM_PLL1_DIV3
110 - AUDIO_PLL2_CLK
111 - SYSTEM_PLL1_DIV8
So the audio_pll2_out and sys3_pll_out have to be swapped.
--- drivers/clk/imx/clk-imx8mq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clk/imx/clk-imx8mq.c +2 -2
@@ -157,10 +157,10 @@ static const char * const imx8mq_qspi_sels[] = {"osc_25m", "sys1_pll_400m", "sys "audio_pll2_out", "sys1_pll_266m", "sys3_pll_out", "sys1_pll_100m", };static const char *const imx8mq_usdhc1_sels[] = {"osc_25m" ,"sys1_pll_400m" ,"sys1_pll_800m" ,"sys2_pll_500m" , -"audio_pll2_out" ,"sys1_pll_266m" ,"sys3_pll_out" ,"sys1_pll_100m" , }; +"sys3_pll_out" ,"sys1_pll_266m" ,"audio_pll2_out" ,"sys1_pll_100m" , };static const char *const imx8mq_usdhc2_sels[] = {"osc_25m" ,"sys1_pll_400m" ,"sys1_pll_800m" ,"sys2_pll_500m" , -"audio_pll2_out" ,"sys1_pll_266m" ,"sys3_pll_out" ,"sys1_pll_100m" , }; +"sys3_pll_out" ,"sys1_pll_266m" ,"audio_pll2_out" ,"sys1_pll_100m" , };static const char *const imx8mq_i2c1_sels[] = {"osc_25m" ,"sys1_pll_160m" ,"sys2_pll_50m" ,"sys3_pll_out" ,"audio_pll1_out" ,"video_pll1_out" ,"audio_pll2_out" ,"sys1_pll_133m" , };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 283/408 SUNRPC: fix copying of multiple pages in gss_read_proxy_verf()
In reply to Greg Kroah-HartmanFrom: Martijn de Gouw <[email protected]>
[ Upstream commit d48c8124749c9a5081fe68680f83605e272c984b ]
When the passed token is longer than 4032 bytes, the remaining part of the token must be copied from the rqstp->rq_arg.pages. But the copy must make sure it happens in a consecutive way.
With the existing code, the first memcpy copies 'length' bytes from argv->iobase, but since the header is in front, this never fills the whole first page of in_token->pages.
The mecpy in the loop copies the following bytes, but starts writing at the next page of in_token->pages. This leaves the last bytes of page 0 unwritten.
Symptoms were that users with many groups were not able to access NFS exports, when using Active Directory as the KDC.
--- net/sunrpc/auth_gss/svcauth_gss.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-)
net/sunrpc/auth_gss/svcauth_gss.c +17 -10
@@ -1095,9 +1095,9 @@ static int gss_read_proxy_verf(struct svc_rqst *rqstp, struct gssp_in_token *in_token) {struct kvec *argv = &rqstp->rq_arg.head[0 ]; -unsigned int page_base, length; -int pages, i, res; -size_t inlen; +unsigned int length, pgto_offs, pgfrom_offs; +int pages, i, res, pgto, pgfrom; +size_t inlen, to_offs, from_offs; res =gss_read_common_verf (gc, argv, authp, in_handle);if (res)
@@ -1125,17 +1125,24 @@ static int gss_read_proxy_verf(struct svc_rqst *rqstp,memcpy (page_address (in_token->pages[0 ]), argv->iov_base, length); inlen -= length; - i =1 ; - page_base = rqstp->rq_arg.page_base; + to_offs = length; + from_offs = rqstp->rq_arg.page_base;while (inlen) { - length = min_t(unsigned int, inlen, PAGE_SIZE); -memcpy (page_address (in_token->pages[i]), -page_address (rqstp->rq_arg.pages[i]) + page_base, + pgto = to_offs >>PAGE_SHIFT ; + pgfrom = from_offs >>PAGE_SHIFT ; + pgto_offs = to_offs & ~PAGE_MASK ; + pgfrom_offs = from_offs & ~PAGE_MASK ; + + length = min_t(unsigned int, inlen, + min_t(unsigned int, PAGE_SIZE - pgto_offs, +PAGE_SIZE - pgfrom_offs)); +memcpy (page_address (in_token->pages[pgto]) + pgto_offs, +page_address (rqstp->rq_arg.pages[pgfrom]) + pgfrom_offs, length); + to_offs += length; + from_offs += length; inlen -= length; - page_base =0 ; - i++; }return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 284/408 Input: imx6ul_tsc - clean up some errors in imx6ul_tsc_resume()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 30df23c5ecdfb8da5b0bc17ceef67eff9e1b0957 ]
If imx6ul_tsc_init() fails then we need to clean up the clocks.
I reversed the "if (input_dev->users) {" condition to make the code a bit simpler.
--- drivers/input/touchscreen/imx6ul_tsc.c | 27 +++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
drivers/input/touchscreen/imx6ul_tsc.c +16 -11
@@ -530,20 +530,25 @@ static int __maybe_unused imx6ul_tsc_resume(struct device *dev)mutex_lock (&input_dev->mutex); -if (input_dev->users) { - retval =clk_prepare_enable (tsc->adc_clk); -if (retval) - goto out; - - retval =clk_prepare_enable (tsc->tsc_clk); -if (retval) { -clk_disable_unprepare (tsc->adc_clk); - goto out; - } +if (!input_dev->users) + goto out; - retval =imx6ul_tsc_init (tsc); + retval =clk_prepare_enable (tsc->adc_clk); +if (retval) + goto out; + + retval =clk_prepare_enable (tsc->tsc_clk); +if (retval) { +clk_disable_unprepare (tsc->adc_clk); + goto out; } + retval =imx6ul_tsc_init (tsc); +if (retval) { +clk_disable_unprepare (tsc->tsc_clk); +clk_disable_unprepare (tsc->adc_clk); + goto out; + } out:mutex_unlock (&input_dev->mutex);return retval;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 285/408 Input: stmfts - fix a & vs && typo
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit d04afe14b23651e7a8bc89727a759e982a8458e4 ]
In stmfts_sysfs_hover_enable_write(), we should check value and sdata->hover_enabled is all true.
--- drivers/input/touchscreen/stmfts.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/input/touchscreen/stmfts.c +1 -1
@@ -479,7 +479,7 @@ static ssize_t stmfts_sysfs_hover_enable_write(struct device *dev,mutex_lock (&sdata->mutex); -if (value & sdata->hover_enabled) +if (value && sdata->hover_enabled) goto out;if (sdata->running)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 286/408 Input: ep93xx_keypad - fix handling of platform_get_irq() error
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 7d50f6656dacf085a00beeedbc48b19a37d17881 ]
platform_get_irq() returns -ERRNO on error. In such case comparison to 0 would pass the check.
--- drivers/input/keyboard/ep93xx_keypad.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/input/keyboard/ep93xx_keypad.c +2 -2
@@ -250,8 +250,8 @@ static int ep93xx_keypad_probe(struct platform_device *pdev) } keypad->irq =platform_get_irq (pdev,0 ); -if (!keypad->irq) { - err = -ENXIO ; +if (keypad->irq <0 ) { + err = keypad->irq; goto failed_free; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 287/408 Input: omap4-keypad - fix handling of platform_get_irq() error
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 4738dd1992fa13acfbbd71800c71c612f466fa44 ]
platform_get_irq() returns -ERRNO on error. In such case comparison to 0 would pass the check.
--- drivers/input/keyboard/omap4-keypad.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/input/keyboard/omap4-keypad.c +2 -4
@@ -240,10 +240,8 @@ static int omap4_keypad_probe(struct platform_device *pdev) } irq =platform_get_irq (pdev,0 ); -if (!irq) { -dev_err (&pdev->dev,"no keyboard irq assigned\n" ); -return -EINVAL ; - } +if (irq <0 ) +return irq; keypad_data =kzalloc (sizeof (struct omap4_keypad ),GFP_KERNEL );if (!keypad_data) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 288/408 Input: twl4030_keypad - fix handling of platform_get_irq() error
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit c277e1f0dc3c7d7b5b028e20dd414df241642036 ]
platform_get_irq() returns -ERRNO on error. In such case casting to unsigned and comparing to 0 would pass the check.
--- drivers/input/keyboard/twl4030_keypad.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
drivers/input/keyboard/twl4030_keypad.c +3 -5
@@ -50,7 +50,7 @@ struct twl4030_keypad {bool autorepeat;unsigned int n_rows;unsigned int n_cols; -unsigned int irq; +int irq;struct device *dbg_dev;struct input_dev *input;
@@ -376,10 +376,8 @@ static int twl4030_kp_probe(struct platform_device *pdev) } kp->irq =platform_get_irq (pdev,0 ); -if (!kp->irq) { -dev_err (&pdev->dev,"no keyboard irq assigned\n" ); -return -EINVAL ; - } +if (kp->irq <0 ) +return kp->irq; error = matrix_keypad_build_keymap(keymap_data, NULL, TWL4030_MAX_ROWS,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 289/408 Input: sun4i-ps2 - fix handling of platform_get_irq() error
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit cafb3abea6136e59ea534004e5773361e196bb94 ]
platform_get_irq() returns -ERRNO on error. In such case comparison to 0 would pass the check.
--- drivers/input/serio/sun4i-ps2.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)
drivers/input/serio/sun4i-ps2.c +3 -6
@@ -211,7 +211,6 @@ static int sun4i_ps2_probe(struct platform_device *pdev)struct sun4i_ps2data *drvdata;struct serio *serio;struct device *dev = &pdev->dev; -unsigned int irq;int error; drvdata =kzalloc (sizeof (struct sun4i_ps2data ),GFP_KERNEL );
@@ -264,14 +263,12 @@ static int sun4i_ps2_probe(struct platform_device *pdev)writel (0 , drvdata->reg_base +PS2_REG_GCTL );/* Get IRQ for the device */ - irq =platform_get_irq (pdev,0 ); -if (!irq) { -dev_err (dev,"no IRQ found\n" ); - error = -ENXIO ; + drvdata->irq =platform_get_irq (pdev,0 ); +if (drvdata->irq <0 ) { + error = drvdata->irq; goto err_disable_clk; } - drvdata->irq = irq; drvdata->serio = serio; drvdata->dev = dev;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 290/408 KVM: x86: emulating RDPID failure shall return #UD rather than #GP
In reply to Greg Kroah-HartmanFrom: Robert Hoo <[email protected]>
[ Upstream commit a9e2e0ae686094571378c72d8146b5a1a92d0652 ]
Per Intel's SDM, RDPID takes a #UD if it is unsupported, which is more or less what KVM is emulating when MSR_TSC_AUX is not available. In fact, there are no scenarios in which RDPID is supposed to #GP.
Message-Id: <[email protected]>
--- arch/x86/kvm/emulate.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/kvm/emulate.c +1 -1
@@ -3617,7 +3617,7 @@ static int em_rdpid(struct x86_emulate_ctxt *ctxt)u64 tsc_aux =0 ;if (ctxt->ops->get_msr (ctxt,MSR_TSC_AUX , &tsc_aux)) -return emulate_gp (ctxt,0 ); +return emulate_ud (ctxt); ctxt->dst.val = tsc_aux;return X86EMUL_CONTINUE ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 291/408 scsi: bfa: Fix error return in bfad_pci_init()
In reply to Greg Kroah-HartmanFrom: Jing Xiangfeng <[email protected]>
[ Upstream commit f0f6c3a4fcb80fcbcce4ff6739996dd98c228afd ]
Fix to return error code -ENODEV from the error handling case instead of 0.
--- drivers/scsi/bfa/bfad.c | 1 + 1 file changed, 1 insertion(+)
drivers/scsi/bfa/bfad.c +1 -0
@@ -749,6 +749,7 @@ bfad_pci_init(struct pci_dev *pdev, struct bfad_s *bfad)if (bfad->pci_bar0_kva ==NULL ) {printk (KERN_ERR "Fail to map bar0\n" ); + rc = -ENODEV ; goto out_release_region; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 292/408 netfilter: conntrack: connection timeout after re-register
In reply to Greg Kroah-HartmanFrom: Francesco Ruggeri <[email protected]>
[ Upstream commit 4f25434bccc28cf8a07876ef5142a2869a674353 ]
If the first packet conntrack sees after a re-register is an outgoing keepalive packet with no data (SEG.SEQ = SND.NXT-1), td_end is set to SND.NXT-1.
When the peer correctly acknowledges SND.NXT, tcp_in_window fails check III (Upper bound for valid (s)ack: sack <= receiver.td_end) and returns false, which cascades into nf_conntrack_in setting skb->_nfct = 0 and in later conntrack iptables rules not matching. In cases where iptables are dropping packets that do not match conntrack rules this can result in idle tcp connections to time out.
v2: adjust td_end when getting the reply rather than when sending out
the keepalive packet.
--- net/netfilter/nf_conntrack_proto_tcp.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-)
net/netfilter/nf_conntrack_proto_tcp.c +13 -6
@@ -541,13 +541,20 @@ static bool tcp_in_window(const struct nf_conn *ct, swin = win << sender->td_scale; sender->td_maxwin = (swin ==0 ?1 : swin); sender->td_maxend = end + sender->td_maxwin; -/* -* We haven't seen traffic in the other direction yet -* but we have to tweak window tracking to pass III -* and IV until that happens. -*/ -if (receiver->td_maxwin ==0 ) +if (receiver->td_maxwin ==0 ) { +/* We haven't seen traffic in the other +* direction yet but we have to tweak window +* tracking to pass III and IV until that +* happens. +*/ receiver->td_end = receiver->td_maxend = sack; + }else if (sack == receiver->td_end +1 ) { +/* Likely a reply to a keepalive. +* Needed for III. +*/ + receiver->td_end++; + } + } } else if (((state->state == TCP_CONNTRACK_SYN_SENT && dir == IP_CT_DIR_ORIGINAL)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 293/408 netfilter: ebtables: Fixes dropping of small packets in bridge nat
In reply to Greg Kroah-HartmanFrom: Timothée COCAULT <[email protected]>
[ Upstream commit 63137bc5882a1882c553d389fdeeeace86ee1741 ]
Fixes an error causing small packets to get dropped. skb_ensure_writable expects the second parameter to be a length in the ethernet payload.=20 If we want to write the ethernet header (src, dst), we should pass 0. Otherwise, packets with small payloads (< ETH_ALEN) will get dropped.
--- net/bridge/netfilter/ebt_dnat.c | 2 +- net/bridge/netfilter/ebt_redirect.c | 2 +- net/bridge/netfilter/ebt_snat.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
net/bridge/netfilter/ebt_dnat.c +1 -1
@@ -21,7 +21,7 @@ ebt_dnat_tg(struct sk_buff *skb, const struct xt_action_param *par) {const struct ebt_nat_info *info = par->targinfo; -if (skb_ensure_writable (skb,ETH_ALEN )) +if (skb_ensure_writable (skb,0 ))return EBT_DROP ;ether_addr_copy (eth_hdr (skb)->h_dest, info->mac);
net/bridge/netfilter/ebt_redirect.c +1 -1
@@ -21,7 +21,7 @@ ebt_redirect_tg(struct sk_buff *skb, const struct xt_action_param *par) {const struct ebt_redirect_info *info = par->targinfo; -if (skb_ensure_writable (skb,ETH_ALEN )) +if (skb_ensure_writable (skb,0 ))return EBT_DROP ;if (xt_hooknum (par) !=NF_BR_BROUTING )
net/bridge/netfilter/ebt_snat.c +1 -1
@@ -22,7 +22,7 @@ ebt_snat_tg(struct sk_buff *skb, const struct xt_action_param *par) {const struct ebt_nat_info *info = par->targinfo; -if (skb_ensure_writable (skb,ETH_ALEN *2 )) +if (skb_ensure_writable (skb,0 ))return EBT_DROP ;ether_addr_copy (eth_hdr (skb)->h_source, info->mac);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 294/408 netfilter: nf_fwd_netdev: clear timestamp in forwarding path
In reply to Greg Kroah-HartmanFrom: Pablo Neira Ayuso <[email protected]>
[ Upstream commit c77761c8a59405cb7aa44188b30fffe13fbdd02d ]
Similar to 7980d2eabde8 ("ipvs: clear skb->tstamp in forwarding path"). fq qdisc requires tstamp to be cleared in forwarding path.
--- net/netfilter/nf_dup_netdev.c | 1 + net/netfilter/nft_fwd_netdev.c | 1 + 2 files changed, 2 insertions(+)
net/netfilter/nf_dup_netdev.c +1 -0
@@ -19,6 +19,7 @@ static void nf_do_netdev_egress(struct sk_buff *skb, struct net_device *dev)skb_push (skb, skb->mac_len); skb->dev = dev; + skb->tstamp =0 ;dev_queue_xmit (skb); }
net/netfilter/nft_fwd_netdev.c +1 -0
@@ -138,6 +138,7 @@ static void nft_fwd_neigh_eval(const struct nft_expr *expr,return ; skb->dev = dev; + skb->tstamp =0 ;neigh_xmit (neigh_table, dev, addr, skb); out: regs->verdict.code = verdict;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 295/408 arm64: dts: meson: vim3: correct led polarity
In reply to Greg Kroah-HartmanFrom: Jerome Brunet <[email protected]>
[ Upstream commit 1f9d87d08e4a2299e86f8a1600aedf87ecd3b636 ]
The LEDs on the vim3 are active when the gpio is high, not low.
--- arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/amlogic/meson-khadas-vim3.dtsi +2 -2
@@ -43,13 +43,13 @@ leds { white { label = "vim3:white:sys"; - gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_LOW>; + gpios = <&gpio_ao GPIOAO_4 GPIO_ACTIVE_HIGH>; linux,default-trigger = "heartbeat"; }; red { label = "vim3:red"; - gpios = <&gpio_expander 5 GPIO_ACTIVE_LOW>; + gpios = <&gpio_expander 5 GPIO_ACTIVE_HIGH>; }; };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 296/408 ARM: dts: imx6sl: fix rng node
In reply to Greg Kroah-HartmanFrom: Horia Geantă <[email protected]>
[ Upstream commit 82ffb35c2ce63ef8e0325f75eb48022abcf8edbe ]
rng DT node was added without a compatible string.
i.MX driver for RNGC (drivers/char/hw_random/imx-rngc.c) also claims support for RNGB, and is currently used for i.MX25.
Let's use this driver also for RNGB block in i.MX6SL.
--- arch/arm/boot/dts/imx6sl.dtsi | 2 ++ 1 file changed, 2 insertions(+)
arch/arm/boot/dts/imx6sl.dtsi +2 -0
@@ -936,8 +936,10 @@ memory-controller@21b0000 { }; rngb: rngb@21b4000 { + compatible = "fsl,imx6sl-rngb", "fsl,imx25-rngb"; reg = <0x021b4000 0x4000>; interrupts = <0 5 IRQ_TYPE_LEVEL_HIGH>; + clocks = <&clks IMX6SL_CLK_DUMMY>; }; weim: weim@21b8000 {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 297/408 ARM: at91: pm: of_node_put() after its usage
In reply to Greg Kroah-HartmanFrom: Claudiu Beznea <[email protected]>
[ Upstream commit e222f943519564978e082c152b4140a47e93392c ]
Put node after it has been used.
--- arch/arm/mach-at91/pm.c | 1 + 1 file changed, 1 insertion(+)
arch/arm/mach-at91/pm.c +1 -0
@@ -777,6 +777,7 @@ static void __init at91_pm_init(void (*pm_idle)(void)) pmc_np =of_find_matching_node_and_match (NULL , atmel_pmc_ids, &of_id); soc_pm.data.pmc =of_iomap (pmc_np,0 ); +of_node_put (pmc_np);if (!soc_pm.data.pmc) {pr_err ("AT91: PM not supported, PMC not found\n" );return ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 298/408 ARM: s3c24xx: fix mmc gpio lookup tables
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
[ Upstream commit 3af4e8774b6d03683932b0961998e01355bccd74 ]
The gpio controller names differ between s3c24xx and s3c64xx, and it seems that these all got the wrong names, using GPx instead of GPIOx.
--- arch/arm/mach-s3c24xx/mach-at2440evb.c | 2 +- arch/arm/mach-s3c24xx/mach-h1940.c | 4 ++-- arch/arm/mach-s3c24xx/mach-mini2440.c | 4 ++-- arch/arm/mach-s3c24xx/mach-n30.c | 4 ++-- arch/arm/mach-s3c24xx/mach-rx1950.c | 4 ++-- 5 files changed, 9 insertions(+), 9 deletions(-)
arch/arm/mach-s3c24xx/mach-at2440evb.c +1 -1
@@ -143,7 +143,7 @@ static struct gpiod_lookup_table at2440evb_mci_gpio_table = { .dev_id = "s3c2410-sdi", .table = {/* Card detect S3C2410_GPG(10) */ - GPIO_LOOKUP("GPG", 10, "cd", GPIO_ACTIVE_LOW), + GPIO_LOOKUP("GPIOG", 10, "cd", GPIO_ACTIVE_LOW), { }, }, };
arch/arm/mach-s3c24xx/mach-h1940.c +2 -2
@@ -468,9 +468,9 @@ static struct gpiod_lookup_table h1940_mmc_gpio_table = { .dev_id = "s3c2410-sdi", .table = {/* Card detect S3C2410_GPF(5) */ -GPIO_LOOKUP ("GPF" ,5 ,"cd" ,GPIO_ACTIVE_LOW ), +GPIO_LOOKUP ("GPIOF" ,5 ,"cd" ,GPIO_ACTIVE_LOW ),/* Write protect S3C2410_GPH(8) */ - GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW), + GPIO_LOOKUP("GPIOH", 8, "wp", GPIO_ACTIVE_LOW), { }, }, };
arch/arm/mach-s3c24xx/mach-mini2440.c +2 -2
@@ -244,9 +244,9 @@ static struct gpiod_lookup_table mini2440_mmc_gpio_table = { .dev_id = "s3c2410-sdi", .table = {/* Card detect S3C2410_GPG(8) */ -GPIO_LOOKUP ("GPG" ,8 ,"cd" ,GPIO_ACTIVE_LOW ), +GPIO_LOOKUP ("GPIOG" ,8 ,"cd" ,GPIO_ACTIVE_LOW ),/* Write protect S3C2410_GPH(8) */ - GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_HIGH), + GPIO_LOOKUP("GPIOH", 8, "wp", GPIO_ACTIVE_HIGH), { }, }, };
arch/arm/mach-s3c24xx/mach-n30.c +2 -2
@@ -359,9 +359,9 @@ static struct gpiod_lookup_table n30_mci_gpio_table = { .dev_id = "s3c2410-sdi", .table = {/* Card detect S3C2410_GPF(1) */ -GPIO_LOOKUP ("GPF" ,1 ,"cd" ,GPIO_ACTIVE_LOW ), +GPIO_LOOKUP ("GPIOF" ,1 ,"cd" ,GPIO_ACTIVE_LOW ),/* Write protect S3C2410_GPG(10) */ - GPIO_LOOKUP("GPG", 10, "wp", GPIO_ACTIVE_LOW), + GPIO_LOOKUP("GPIOG", 10, "wp", GPIO_ACTIVE_LOW), { }, }, };
arch/arm/mach-s3c24xx/mach-rx1950.c +2 -2
@@ -567,9 +567,9 @@ static struct gpiod_lookup_table rx1950_mmc_gpio_table = { .dev_id = "s3c2410-sdi", .table = {/* Card detect S3C2410_GPF(5) */ -GPIO_LOOKUP ("GPF" ,5 ,"cd" ,GPIO_ACTIVE_LOW ), +GPIO_LOOKUP ("GPIOF" ,5 ,"cd" ,GPIO_ACTIVE_LOW ),/* Write protect S3C2410_GPH(8) */ - GPIO_LOOKUP("GPH", 8, "wp", GPIO_ACTIVE_LOW), + GPIO_LOOKUP("GPIOH", 8, "wp", GPIO_ACTIVE_LOW), { }, }, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 299/408 ARM: dts: sun8i: r40: bananapi-m2-ultra: Fix dcdc1 regulator
In reply to Greg Kroah-HartmanFrom: Jernej Skrabec <[email protected]>
[ Upstream commit 3658a2b7f3e16c7053eb8d70657b94bb62c5a0f4 ]
DCDC1 regulator powers many different subsystems. While some of them can work at 3.0 V, some of them can not. For example, VCC-HDMI can only work between 3.24 V and 3.36 V. According to OS images provided by the board manufacturer this regulator should be set to 3.3 V.
Set DCDC1 and DCDC1SW to 3.3 V in order to fix this.
--- arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
arch/arm/boot/dts/sun8i-r40-bananapi-m2-ultra.dts +5 -5
@@ -223,16 +223,16 @@ ®_aldo3 { }; ®_dc1sw { - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; regulator-name = "vcc-gmac-phy"; }; ®_dcdc1 { regulator-always-on; - regulator-min-microvolt = <3000000>; - regulator-max-microvolt = <3000000>; - regulator-name = "vcc-3v0"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-name = "vcc-3v3"; }; ®_dcdc2 {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 300/408 arm64: dts: allwinner: h5: remove Mali GPU PMU module
In reply to Greg Kroah-HartmanFrom: Qiang Yu <[email protected]>
[ Upstream commit 2933bf3528007f834fb7f5eab033f9c5b0683f91 ]
H5's Mali GPU PMU is not present or working corretly although H5 datasheet record its interrupt vector.
Adding this module will miss lead lima driver try to shutdown it and get waiting timeout. This problem is not exposed before lima runtime PM support is added.
--- arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
arch/arm64/boot/dts/allwinner/sun50i-h5.dtsi +2 -4
@@ -155,8 +155,7 @@ mali: gpu@1e80000 { <GIC_SPI 104 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 105 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 106 IRQ_TYPE_LEVEL_HIGH>, - <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>, - <GIC_SPI 98 IRQ_TYPE_LEVEL_HIGH>; + <GIC_SPI 107 IRQ_TYPE_LEVEL_HIGH>; interrupt-names = "gp", "gpmmu", "pp",
@@ -167,8 +166,7 @@ mali: gpu@1e80000 { "pp2", "ppmmu2", "pp3", - "ppmmu3", - "pmu"; + "ppmmu3"; clocks = <&ccu CLK_BUS_GPU>, <&ccu CLK_GPU>; clock-names = "bus", "core"; resets = <&ccu RST_BUS_GPU>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 301/408 memory: omap-gpmc: Fix a couple off by ones
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 4c54228ac8fd55044195825873c50a524131fa53 ]
These comparisons should be >= instead of > to prevent reading one element beyond the end of the gpmc_cs[] array.
--- drivers/memory/omap-gpmc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/memory/omap-gpmc.c +2 -2
@@ -949,7 +949,7 @@ static int gpmc_cs_remap(int cs, u32 base)int ret;u32 old_base, size; -if (cs > gpmc_cs_num) { +if (cs >= gpmc_cs_num) {pr_err ("%s: requested chip-select is disabled\n" , __func__);return -ENODEV ; }
@@ -984,7 +984,7 @@ int gpmc_cs_request(int cs, unsigned long size, unsigned long *base)struct resource *res = &gpmc->mem;int r =-1 ; -if (cs > gpmc_cs_num) { +if (cs >= gpmc_cs_num) {pr_err ("%s: requested chip-select is disabled\n" , __func__);return -ENODEV ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 302/408 memory: omap-gpmc: Fix build error without CONFIG_OF
In reply to Greg Kroah-HartmanFrom: YueHaibing <[email protected]>
[ Upstream commit 13d029ee51da365aa9c859db0c7395129252bde8 ]
If CONFIG_OF is n, gcc fails:
drivers/memory/omap-gpmc.o: In function `gpmc_omap_onenand_set_timings':
omap-gpmc.c:(.text+0x2a88): undefined reference to `gpmc_read_settings_dt'
Add gpmc_read_settings_dt() helper function, which zero the gpmc_settings so the caller doesn't proceed with random/invalid settings.
--- drivers/memory/omap-gpmc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/memory/omap-gpmc.c +4 -0
@@ -2274,6 +2274,10 @@ static void gpmc_probe_dt_children(struct platform_device *pdev) } }#else +void gpmc_read_settings_dt (struct device_node *np,struct gpmc_settings *p) +{ +memset (p,0 ,sizeof (*p)); +}static int gpmc_probe_dt (struct platform_device *pdev) {return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 303/408 memory: fsl-corenet-cf: Fix handling of platform_get_irq() error
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit dd85345abca60a8916617e8d75c0f9ce334336dd ]
platform_get_irq() returns -ERRNO on error. In such case comparison to 0 would pass the check.
--- drivers/memory/fsl-corenet-cf.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-)
drivers/memory/fsl-corenet-cf.c +2 -4
@@ -211,10 +211,8 @@ static int ccf_probe(struct platform_device *pdev)dev_set_drvdata (&pdev->dev, ccf); irq =platform_get_irq (pdev,0 ); -if (!irq) { -dev_err (&pdev->dev,"%s: no irq\n" , __func__); -return -ENXIO ; - } +if (irq <0 ) +return irq; ret =devm_request_irq (&pdev->dev, irq, ccf_irq,0 , pdev->name, ccf);if (ret) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 304/408 arm64: dts: imx8mq: Add missing interrupts to GPC
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 791619f66843a213784efb2f171be98933bad991 ]
The i.MX General Power Controller v2 device node was missing interrupts property necessary to route its interrupt to GIC. This also fixes the dbts_check warnings like:
arch/arm64/boot/dts/freescale/imx8mq-evk.dt.yaml: gpc@303a0000:
{'compatible': ... '$nodename': ['gpc@303a0000']} is not valid under any of the given schemas arch/arm64/boot/dts/freescale/imx8mq-evk.dt.yaml: gpc@303a0000: 'interrupts' is a required property
--- arch/arm64/boot/dts/freescale/imx8mq.dtsi | 1 + 1 file changed, 1 insertion(+)
arch/arm64/boot/dts/freescale/imx8mq.dtsi +1 -0
@@ -516,6 +516,7 @@ src: reset-controller@30390000 { gpc: gpc@303a0000 { compatible = "fsl,imx8mq-gpc"; reg = <0x303a0000 0x10000>; + interrupts = <GIC_SPI 87 IRQ_TYPE_LEVEL_HIGH>; interrupt-parent = <&gic>; interrupt-controller; #interrupt-cells = <3>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 305/408 arm64: dts: qcom: msm8916: Remove one more thermal trip point unit name
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit e6859ae8603c5946b8f3ecbd9b4f02b72955b9d0 ]
Commit fe2aff0c574d2 ("arm64: dts: qcom: msm8916: remove unit name for thermal trip points") removed the unit names for most of the thermal trip points defined
in msm8916.dtsi, but missed to update the one for cpu0_1-thermal.
So why wasn't this spotted by "make dtbs_check"? Apparently, the name of the thermal zone is already invalid: thermal-zones.yaml specifies a regex of ^[a-zA-Z][a-zA-Z0-9\\-]{1,12}-thermal$, so it is not allowed to contain underscores. Therefore the thermal zone was never verified using the DTB schema.
After replacing the underscore in the thermal zone name, the warning shows up:
apq8016-sbc.dt.yaml: thermal-zones: cpu0-1-thermal:trips: 'trip-point@0'
does not match any of the regexes: '^[a-zA-Z][a-zA-Z0-9\\-_]{0,63}$', 'pinctrl-[0-9]+'Fix up the thermal zone names and remove the unit name for the trip point.
--- arch/arm64/boot/dts/qcom/msm8916.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/qcom/msm8916.dtsi +3 -3
@@ -175,14 +175,14 @@ pmu { }; thermal-zones { - cpu0_1-thermal { + cpu0-1-thermal { polling-delay-passive = <250>; polling-delay = <1000>; thermal-sensors = <&tsens 4>; trips { - cpu0_1_alert0: trip-point@0 { + cpu0_1_alert0: trip-point0 { temperature = <75000>; hysteresis = <2000>; type = "passive";
@@ -205,7 +205,7 @@ map0 { }; }; - cpu2_3-thermal { + cpu2-3-thermal { polling-delay-passive = <250>; polling-delay = <1000>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 306/408 arm64: dts: qcom: pm8916: Remove invalid reg size from wcd_codec
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit c2f0cbb57dbac6da3d38b47b5b96de0fe4e23884 ]
Tha parent node of "wcd_codec" specifies #address-cells = <1> and #size-cells = <0>, which means that each resource should be described by one cell for the address and size omitted.
However, wcd_codec currently lists 0x200 as second cell (probably the size of the resource). When parsing this would be treated like another memory resource - which is entirely wrong.
To quote the device tree specification [1]:
"If the parent node specifies a value of 0 for #size-cells,
the length field in the value of reg shall be omitted."
[1]: https://www.devicetree.org/specifications/
--- arch/arm64/boot/dts/qcom/pm8916.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/qcom/pm8916.dtsi +1 -1
@@ -113,7 +113,7 @@ pm8916_1: pm8916@1 { wcd_codec: codec@f000 { compatible = "qcom,pm8916-wcd-analog-codec"; - reg = <0xf000 0x200>; + reg = <0xf000>; reg-names = "pmic-codec-core"; clocks = <&gcc GCC_CODEC_DIGCODEC_CLK>; clock-names = "mclk";
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 307/408 arm64: dts: qcom: msm8916: Fix MDP/DSI interrupts
In reply to Greg Kroah-HartmanFrom: Stephan Gerhold <[email protected]>
[ Upstream commit 027cca9eb5b450c3f6bb916ba999144c2ec23cb7 ]
The mdss node sets #interrupt-cells = <1>, so its interrupts should be referenced using a single cell (in this case: only the interrupt number).
However, right now the mdp/dsi node both have two interrupt cells set, e.g. interrupts = <4 0>. The 0 is probably meant to say IRQ_TYPE_NONE (= 0), but with #interrupt-cells = <1> this is actually interpreted as a second interrupt line.
Remove the IRQ flags from both interrupts to fix this.
--- arch/arm64/boot/dts/qcom/msm8916.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/qcom/msm8916.dtsi +2 -2
@@ -934,7 +934,7 @@ mdp: mdp@1a01000 { reg-names = "mdp_phys"; interrupt-parent = <&mdss>; - interrupts = <0 0>; + interrupts = <0>; clocks = <&gcc GCC_MDSS_AHB_CLK>, <&gcc GCC_MDSS_AXI_CLK>,
@@ -966,7 +966,7 @@ dsi0: dsi@1a98000 { reg-names = "dsi_ctrl"; interrupt-parent = <&mdss>; - interrupts = <4 0>; + interrupts = <4>; assigned-clocks = <&gcc BYTE0_CLK_SRC>, <&gcc PCLK0_CLK_SRC>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 308/408 arm64: dts: renesas: r8a77990: Fix MSIOF1 DMA channels
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 453802c463abd003a7c38ffbc90b67ba162335b6 ]
According to Technical Update TN-RCT-S0352A/E, MSIOF1 DMA can only be used with SYS-DMAC0 on R-Car E3.
--- arch/arm64/boot/dts/renesas/r8a77990.dtsi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/renesas/r8a77990.dtsi +2 -3
@@ -1168,9 +1168,8 @@ msiof1: spi@e6ea0000 { reg = <0 0xe6ea0000 0 0x0064>; interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cpg CPG_MOD 210>; - dmas = <&dmac1 0x43>, <&dmac1 0x42>, - <&dmac2 0x43>, <&dmac2 0x42>; - dma-names = "tx", "rx", "tx", "rx"; + dmas = <&dmac0 0x43>, <&dmac0 0x42>; + dma-names = "tx", "rx"; power-domains = <&sysc R8A77990_PD_ALWAYS_ON>; resets = <&cpg 210>; #address-cells = <1>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 309/408 arm64: dts: renesas: r8a774c0: Fix MSIOF1 DMA channels
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit c91dfc9818df5f43c10c727f1cecaebdb5e2fa92 ]
According to Technical Update TN-RCT-S0352A/E, MSIOF1 DMA can only be used with SYS-DMAC0 on R-Car E3.
--- arch/arm64/boot/dts/renesas/r8a774c0.dtsi | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
arch/arm64/boot/dts/renesas/r8a774c0.dtsi +2 -3
@@ -1212,9 +1212,8 @@ msiof1: spi@e6ea0000 { reg = <0 0xe6ea0000 0 0x0064>; interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cpg CPG_MOD 210>; - dmas = <&dmac1 0x43>, <&dmac1 0x42>, - <&dmac2 0x43>, <&dmac2 0x42>; - dma-names = "tx", "rx", "tx", "rx"; + dmas = <&dmac0 0x43>, <&dmac0 0x42>; + dma-names = "tx", "rx"; power-domains = <&sysc R8A774C0_PD_ALWAYS_ON>; resets = <&cpg 210>; #address-cells = <1>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 310/408 arm64: dts: actions: limit address range for pinctrl node
In reply to Greg Kroah-HartmanFrom: Amit Singh Tomar <[email protected]>
[ Upstream commit 4bb1eb3cd4bd6241d5e5f99bbfd801ea5a007b6c ]
After commit 7cdf8446ed1d ("arm64: dts: actions: Add pinctrl node for Actions Semi S700") following error has been observed while booting Linux on Cubieboard7-lite(based on S700 SoC).
[ 0.257415] pinctrl-s700 e01b0000.pinctrl: can't request region for resource [mem 0xe01b0000-0xe01b0fff] [ 0.266902] pinctrl-s700: probe of e01b0000.pinctrl failed with error -16
This is due to the fact that memory range for "sps" power domain controller clashes with pinctrl.
One way to fix it, is to limit pinctrl address range which is safe to do as current pinctrl driver uses address range only up to 0x100.
This commit limits the pinctrl address range to 0x100 so that it doesn't conflict with sps range.
Semi S700")
--- arch/arm64/boot/dts/actions/s700.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/boot/dts/actions/s700.dtsi +1 -1
@@ -231,7 +231,7 @@ timer: timer@e024c000 { pinctrl: pinctrl@e01b0000 { compatible = "actions,s700-pinctrl"; - reg = <0x0 0xe01b0000 0x0 0x1000>; + reg = <0x0 0xe01b0000 0x0 0x100>; clocks = <&cmu CLK_GPIO>; gpio-controller; gpio-ranges = <&pinctrl 0 0 136>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 311/408 ARM: dts: owl-s500: Fix incorrect PPI interrupt specifiers
In reply to Greg Kroah-HartmanFrom: Cristian Ciocaltea <[email protected]>
[ Upstream commit 55f6c9931f7c32f19cf221211f099dfd8dab3af9 ]
The PPI interrupts for cortex-a9 were incorrectly specified, fix them.
--- arch/arm/boot/dts/owl-s500.dtsi | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
arch/arm/boot/dts/owl-s500.dtsi +3 -3
@@ -84,21 +84,21 @@ scu: scu@b0020000 { global_timer: timer@b0020200 { compatible = "arm,cortex-a9-global-timer"; reg = <0xb0020200 0x100>; - interrupts = <GIC_PPI 0 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; + interrupts = <GIC_PPI 11 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; status = "disabled"; }; twd_timer: timer@b0020600 { compatible = "arm,cortex-a9-twd-timer"; reg = <0xb0020600 0x20>; - interrupts = <GIC_PPI 2 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; + interrupts = <GIC_PPI 13 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; status = "disabled"; }; twd_wdt: wdt@b0020620 { compatible = "arm,cortex-a9-twd-wdt"; reg = <0xb0020620 0xe0>; - interrupts = <GIC_PPI 3 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; + interrupts = <GIC_PPI 14 (GIC_CPU_MASK_SIMPLE(4) | IRQ_TYPE_EDGE_RISING)>; status = "disabled"; };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 312/408 soc: fsl: qbman: Fix return value on success
In reply to Greg Kroah-HartmanFrom: Krzysztof Kozlowski <[email protected]>
[ Upstream commit 750cf40c0f7088f36a8a5d102e0488b1ac47faf5 ]
On error the function was meant to return -ERRNO. This also fixes compile warning:
drivers/soc/fsl/qbman/bman.c:640:6: warning: variable 'err' set but not used [-Wunused-but-set-variable]
--- drivers/soc/fsl/qbman/bman.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soc/fsl/qbman/bman.c +1 -1
@@ -660,7 +660,7 @@ int bm_shutdown_pool(u32 bpid) } done:put_affine_portal (); -return 0 ; +return err; }struct gen_pool *bm_bpalloc;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 313/408 ARM: OMAP2+: Restore MPU power domain if cpu_cluster_pm_enter() fails
In reply to Greg Kroah-HartmanFrom: Tony Lindgren <[email protected]>
[ Upstream commit 8f04aea048d56f3e39a7e543939450246542a6fc ]
If cpu_cluster_pm_enter() fails, we need to set MPU power domain back to enabled to prevent the next WFI from potentially triggering an undesired MPU power domain state change.
We already do this for omap_enter_idle_smp() but are missing it for omap_enter_idle_coupled().
--- arch/arm/mach-omap2/cpuidle44xx.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/arm/mach-omap2/cpuidle44xx.c +3 -1
@@ -174,8 +174,10 @@ static int omap_enter_idle_coupled(struct cpuidle_device *dev,*/ if (mpuss_can_lose_context) { error =cpu_cluster_pm_enter (); -if (error) +if (error) { +omap_set_pwrdm_state (mpu_pd,PWRDM_POWER_ON ); goto cpu_cluster_pm_out; + } } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 314/408 arm64: dts: zynqmp: Remove additional compatible string for i2c IPs
In reply to Greg Kroah-HartmanFrom: Michal Simek <[email protected]>
[ Upstream commit 35292518cb0a626fcdcabf739aed75060a018ab5 ]
DT binding permits only one compatible string which was decribed in past by commit 63cab195bf49 ("i2c: removed work arounds in i2c driver for Zynq Ultrascale+ MPSoC").
The commit aea37006e183 ("dt-bindings: i2c: cadence: Migrate i2c-cadence documentation to YAML") has converted binding to yaml and the following issues is reported:
...: i2c@ff030000: compatible: Additional items are not allowed ('cdns,i2c-r1p10' was unexpected)
From schema:.../Documentation/devicetree/bindings/i2c/cdns,i2c-r1p10.yaml fds ...: i2c@ff030000: compatible: ['cdns,i2c-r1p14', 'cdns,i2c-r1p10'] is too long
The commit c415f9e8304a ("ARM64: zynqmp: Fix i2c node's compatible string") has added the second compatible string but without removing origin one. The patch is only keeping one compatible string "cdns,i2c-r1p14".
--- arch/arm64/boot/dts/xilinx/zynqmp.dtsi | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/arm64/boot/dts/xilinx/zynqmp.dtsi +2 -2
@@ -419,7 +419,7 @@ gpio: gpio@ff0a0000 { }; i2c0: i2c@ff020000 { - compatible = "cdns,i2c-r1p14", "cdns,i2c-r1p10"; + compatible = "cdns,i2c-r1p14"; status = "disabled"; interrupt-parent = <&gic>; interrupts = <0 17 4>;
@@ -429,7 +429,7 @@ i2c0: i2c@ff020000 { }; i2c1: i2c@ff030000 { - compatible = "cdns,i2c-r1p14", "cdns,i2c-r1p10"; + compatible = "cdns,i2c-r1p14"; status = "disabled"; interrupt-parent = <&gic>; interrupts = <0 18 4>;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 315/408 ARM: dts: meson8: remove two invalid interrupt lines from the GPU node
In reply to Greg Kroah-HartmanFrom: Martin Blumenstingl <[email protected]>
[ Upstream commit 737e7610b545cc901a9696083c1824a7104b8d1b ]
The 3.10 vendor kernel defines the following GPU 20 interrupt lines:
#define INT_MALI_GP AM_IRQ(160) #define INT_MALI_GP_MMU AM_IRQ(161) #define INT_MALI_PP AM_IRQ(162) #define INT_MALI_PMU AM_IRQ(163) #define INT_MALI_PP0 AM_IRQ(164) #define INT_MALI_PP0_MMU AM_IRQ(165) #define INT_MALI_PP1 AM_IRQ(166) #define INT_MALI_PP1_MMU AM_IRQ(167) #define INT_MALI_PP2 AM_IRQ(168) #define INT_MALI_PP2_MMU AM_IRQ(169) #define INT_MALI_PP3 AM_IRQ(170) #define INT_MALI_PP3_MMU AM_IRQ(171) #define INT_MALI_PP4 AM_IRQ(172) #define INT_MALI_PP4_MMU AM_IRQ(173) #define INT_MALI_PP5 AM_IRQ(174) #define INT_MALI_PP5_MMU AM_IRQ(175) #define INT_MALI_PP6 AM_IRQ(176) #define INT_MALI_PP6_MMU AM_IRQ(177) #define INT_MALI_PP7 AM_IRQ(178) #define INT_MALI_PP7_MMU AM_IRQ(179)
However, the driver from the 3.10 vendor kernel does not use the following four interrupt lines:
- INT_MALI_PP3
- INT_MALI_PP3_MMU
- INT_MALI_PP7
- INT_MALI_PP7_MMU
Drop the "pp3" and "ppmmu3" interrupt lines. This is also important because there is no matching entry in interrupt-names for it (meaning the "pp2" interrupt is actually assigned to the "pp3" interrupt line).
--- arch/arm/boot/dts/meson8.dtsi | 2 -- 1 file changed, 2 deletions(-)
arch/arm/boot/dts/meson8.dtsi +0 -2
@@ -230,8 +230,6 @@ mali: gpu@c0000 { <GIC_SPI 167 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 168 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 169 IRQ_TYPE_LEVEL_HIGH>, - <GIC_SPI 170 IRQ_TYPE_LEVEL_HIGH>, - <GIC_SPI 171 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 172 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 173 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 316/408 lightnvm: fix out-of-bounds write to array devices->info[]
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit a48faebe65b0db55a73b9220c3d919eee849bb79 ]
There is an off-by-one array check that can lead to a out-of-bounds write to devices->info[i]. Fix this by checking by using >= rather than > for the size check. Also replace hard-coded array size limit with ARRAY_SIZE on the array.
Addresses-Coverity: ("Out-of-bounds write")
--- drivers/lightnvm/core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/lightnvm/core.c +3 -2
@@ -1316,8 +1316,9 @@ static long nvm_ioctl_get_devices(struct file *file, void __user *arg)strlcpy (info->bmname,"gennvm" ,sizeof (info->bmname)); i++; -if (i >31 ) { -pr_err ("max 31 devices can be reported.\n" ); +if (i >=ARRAY_SIZE (devices->info)) { +pr_err ("max %zd devices can be reported.\n" , +ARRAY_SIZE (devices->info));break ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 317/408 powerpc/powernv/dump: Fix race while processing OPAL dump
In reply to Greg Kroah-HartmanFrom: Vasant Hegde <[email protected]>
[ Upstream commit 0a43ae3e2beb77e3481d812834d33abe270768ab ]
Every dump reported by OPAL is exported to userspace through a sysfs interface and notified using kobject_uevent(). The userspace daemon (opal_errd) then reads the dump and acknowledges that the dump is saved safely to disk. Once acknowledged the kernel removes the respective sysfs file entry causing respective resources to be released including kobject.
However it's possible the userspace daemon may already be scanning dump entries when a new sysfs dump entry is created by the kernel. User daemon may read this new entry and ack it even before kernel can notify userspace about it through kobject_uevent() call. If that happens then we have a potential race between dump_ack_store->kobject_put() and kobject_uevent which can lead to use-after-free of a kernfs object resulting in a kernel crash.
This patch fixes this race by protecting the sysfs file creation/notification by holding a reference count on kobject until we safely send kobject_uevent().
The function create_dump_obj() returns the dump object which if used by caller function will end up in use-after-free problem again. However, the return value of create_dump_obj() function isn't being used today and there is no need as well. Hence change it to return void to make this fix complete.
--- arch/powerpc/platforms/powernv/opal-dump.c | 41 +++++++++++++++------- 1 file changed, 29 insertions(+), 12 deletions(-)
arch/powerpc/platforms/powernv/opal-dump.c +29 -12
@@ -318,15 +318,14 @@ static ssize_t dump_attr_read(struct file *filep, struct kobject *kobj,return count; } -static struct dump_obj *create_dump_obj (uint32_t id,size_t size, -uint32_t type) +static void create_dump_obj (uint32_t id,size_t size,uint32_t type) {struct dump_obj *dump;int rc; dump =kzalloc (sizeof (*dump),GFP_KERNEL );if (!dump) -return NULL ; +return ; dump->kobj.kset = dump_kset;
@@ -346,21 +345,39 @@ static struct dump_obj *create_dump_obj(uint32_t id, size_t size, rc =kobject_add (&dump->kobj,NULL ,"0x%x-0x%x" , type, id);if (rc) {kobject_put (&dump->kobj); -return NULL ; +return ; } +/* +* As soon as the sysfs file for this dump is created/activated there is +* a chance the opal_errd daemon (or any userspace) might read and +* acknowledge the dump before kobject_uevent() is called. If that +* happens then there is a potential race between +* dump_ack_store->kobject_put() and kobject_uevent() which leads to a +* use-after-free of a kernfs object resulting in a kernel crash. +* +* To avoid that, we need to take a reference on behalf of the bin file, +* so that our reference remains valid while we call kobject_uevent(). +* We then drop our reference before exiting the function, leaving the +* bin file to drop the last reference (if it hasn't already). +*/ + +/* Take a reference for the bin file */ +kobject_get (&dump->kobj); rc =sysfs_create_bin_file (&dump->kobj, &dump->dump_attr); -if (rc) { +if (rc ==0 ) { +kobject_uevent (&dump->kobj,KOBJ_ADD ); + +pr_info ("%s: New platform dump. ID = 0x%x Size %u\n" , + __func__, dump->id, dump->size); + }else { +/* Drop reference count taken for bin file */ kobject_put (&dump->kobj); -return NULL ; } -pr_info ("%s: New platform dump. ID = 0x%x Size %u\n" , - __func__, dump->id, dump->size); - -kobject_uevent (&dump->kobj,KOBJ_ADD ); - -return dump; +/* Drop our reference */ +kobject_put (&dump->kobj); +return ; }static irqreturn_t process_dump (int irq,void *data)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 318/408 powerpc/pseries: Avoid using addr_to_pfn in real mode
In reply to Greg Kroah-HartmanFrom: Ganesh Goudar <[email protected]>
[ Upstream commit 4ff753feab021242144818b9a3ba011238218145 ]
When an UE or memory error exception is encountered the MCE handler tries to find the pfn using addr_to_pfn() which takes effective address as an argument, later pfn is used to poison the page where memory error occurred, recent rework in this area made addr_to_pfn to run in real mode, which can be fatal as it may try to access memory outside RMO region.
Have two helper functions to separate things to be done in real mode and virtual mode without changing any functionality. This also fixes the following error as the use of addr_to_pfn is now moved to virtual mode.
Without this change following kernel crash is seen on hitting UE.
[ 485.128036] Oops: Kernel access of bad area, sig: 11 [#1] [ 485.128040] LE SMP NR_CPUS=2048 NUMA pSeries [ 485.128047] Modules linked in: [ 485.128067] CPU: 15 PID: 6536 Comm: insmod Kdump: loaded Tainted: G OE 5.7.0 #22 [ 485.128074] NIP: c00000000009b24c LR: c0000000000398d8 CTR: c000000000cd57c0 [ 485.128078] REGS: c000000003f1f970 TRAP: 0300 Tainted: G OE (5.7.0) [ 485.128082] MSR: 8000000000001003 <SF,ME,RI,LE> CR: 28008284 XER: 00000001 [ 485.128088] CFAR: c00000000009b190 DAR: c0000001fab00000 DSISR: 40000000 IRQMASK: 1 [ 485.128088] GPR00: 0000000000000001 c000000003f1fbf0 c000000001634300 0000b0fa01000000 [ 485.128088] GPR04: d000000002220000 0000000000000000 00000000fab00000 0000000000000022 [ 485.128088] GPR08: c0000001fab00000 0000000000000000 c0000001fab00000 c000000003f1fc14 [ 485.128088] GPR12: 0000000000000008 c000000003ff5880 d000000002100008 0000000000000000 [ 485.128088] GPR16: 000000000000ff20 000000000000fff1 000000000000fff2 d0000000021a1100 [ 485.128088] GPR20: d000000002200000 c00000015c893c50 c000000000d49b28 c00000015c893c50 [ 485.128088] GPR24: d0000000021a0d08 c0000000014e5da8 d0000000021a0818 000000000000000a [ 485.128088] GPR28: 0000000000000008 000000000000000a c0000000017e2970 000000000000000a [ 485.128125] NIP [c00000000009b24c] __find_linux_pte+0x11c/0x310 [ 485.128130] LR [c0000000000398d8] addr_to_pfn+0x138/0x170 [ 485.128133] Call Trace: [ 485.128135] Instruction dump: [ 485.128138] 3929ffff 7d4a3378 7c883c36 7d2907b4 794a1564 7d294038 794af082 3900ffff [ 485.128144] 79291f24 790af00e 78e70020 7d095214 <7c69502a> 2fa30000 419e011c 70690040 [ 485.128152] ---[ end trace d34b27e29ae0e340 ]---
--- arch/powerpc/platforms/pseries/ras.c | 118 ++++++++++++++++----------- 1 file changed, 69 insertions(+), 49 deletions(-)
arch/powerpc/platforms/pseries/ras.c +69 -49
@@ -494,18 +494,55 @@ int pSeries_system_reset_exception(struct pt_regs *regs)return 0 ;/* need to perform reset */ } +static int mce_handle_err_realmode (int disposition,u8 error_type) +{ +#ifdef CONFIG_PPC_BOOK3S_64 +if (disposition ==RTAS_DISP_NOT_RECOVERED ) { +switch (error_type) { +case MC_ERROR_TYPE_SLB : +case MC_ERROR_TYPE_ERAT : +/* +* Store the old slb content in paca before flushing. +* Print this when we go to virtual mode. +* There are chances that we may hit MCE again if there +* is a parity error on the SLB entry we trying to read +* for saving. Hence limit the slb saving to single +* level of recursion. +*/ +if (local_paca->in_mce ==1 ) +slb_save_contents (local_paca->mce_faulty_slbs); +flush_and_reload_slb (); + disposition =RTAS_DISP_FULLY_RECOVERED ; +break ; +default : +break ; + } + }else if (disposition ==RTAS_DISP_LIMITED_RECOVERY ) { +/* Platform corrected itself but could be degraded */ +pr_err ("MCE: limited recovery, system may be degraded\n" ); + disposition =RTAS_DISP_FULLY_RECOVERED ; + } +#endif +return disposition; +} -static int mce_handle_error (struct pt_regs *regs,struct rtas_error_log *errp) +static int mce_handle_err_virtmode (struct pt_regs *regs, +struct rtas_error_log *errp, +struct pseries_mc_errorlog *mce_log, +int disposition) {struct mce_error_info mce_err = {0 }; -unsigned long eaddr =0 , paddr =0 ; -struct pseries_errorlog *pseries_log; -struct pseries_mc_errorlog *mce_log; -int disposition =rtas_error_disposition (errp);int initiator =rtas_error_initiator (errp);int severity =rtas_error_severity (errp); +unsigned long eaddr =0 , paddr =0 ;u8 error_type, err_sub_type; +if (!mce_log) + goto out; + + error_type = mce_log->error_type; + err_sub_type =rtas_mc_error_sub_type (mce_log); +if (initiator ==RTAS_INITIATOR_UNKNOWN ) mce_err.initiator =MCE_INITIATOR_UNKNOWN ;else if (initiator ==RTAS_INITIATOR_CPU )
@@ -544,18 +581,7 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp) mce_err.error_type =MCE_ERROR_TYPE_UNKNOWN ; mce_err.error_class =MCE_ECLASS_UNKNOWN ; -if (!rtas_error_extended (errp)) - goto out; - - pseries_log =get_pseries_errorlog (errp,PSERIES_ELOG_SECT_ID_MCE ); -if (pseries_log ==NULL ) - goto out; - - mce_log = (struct pseries_mc_errorlog *)pseries_log->data; - error_type = mce_log->error_type; - err_sub_type =rtas_mc_error_sub_type (mce_log); - -switch (mce_log->error_type) { +switch (error_type) {case MC_ERROR_TYPE_UE : mce_err.error_type =MCE_ERROR_TYPE_UE ;switch (err_sub_type) {
@@ -652,37 +678,31 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp) mce_err.error_type =MCE_ERROR_TYPE_UNKNOWN ;break ; } +out: +save_mce_event (regs, disposition ==RTAS_DISP_FULLY_RECOVERED , + &mce_err, regs->nip, eaddr, paddr); +return disposition; +} -#ifdef CONFIG_PPC_BOOK3S_64 -if (disposition ==RTAS_DISP_NOT_RECOVERED ) { -switch (error_type) { -case MC_ERROR_TYPE_SLB : -case MC_ERROR_TYPE_ERAT : -/* -* Store the old slb content in paca before flushing. -* Print this when we go to virtual mode. -* There are chances that we may hit MCE again if there -* is a parity error on the SLB entry we trying to read -* for saving. Hence limit the slb saving to single -* level of recursion. -*/ -if (local_paca->in_mce ==1 ) -slb_save_contents (local_paca->mce_faulty_slbs); -flush_and_reload_slb (); - disposition =RTAS_DISP_FULLY_RECOVERED ; -break ; -default : -break ; - } - }else if (disposition ==RTAS_DISP_LIMITED_RECOVERY ) { -/* Platform corrected itself but could be degraded */ -printk (KERN_ERR "MCE: limited recovery, system may " -"be degraded\n" ); - disposition =RTAS_DISP_FULLY_RECOVERED ; - } -#endif +static int mce_handle_error (struct pt_regs *regs,struct rtas_error_log *errp) +{ +struct pseries_errorlog *pseries_log; +struct pseries_mc_errorlog *mce_log =NULL ; +int disposition =rtas_error_disposition (errp); +u8 error_type; + +if (!rtas_error_extended (errp)) + goto out; + + pseries_log =get_pseries_errorlog (errp,PSERIES_ELOG_SECT_ID_MCE ); +if (!pseries_log) + goto out; + + mce_log = (struct pseries_mc_errorlog *)pseries_log->data; + error_type = mce_log->error_type; + + disposition =mce_handle_err_realmode (disposition, error_type); -out:/* * Enable translation as we will be accessing per-cpu variables * in save_mce_event() which may fall outside RMO region, also
@@ -693,10 +713,10 @@ static int mce_handle_error(struct pt_regs *regs, struct rtas_error_log *errp)* Note: All the realmode handling like flushing SLB entries for * SLB multihit is done by now. */ +out:mtmsr (mfmsr () |MSR_IR |MSR_DR ); -save_mce_event (regs, disposition ==RTAS_DISP_FULLY_RECOVERED , - &mce_err, regs->nip, eaddr, paddr); - + disposition =mce_handle_err_virtmode (regs, errp, mce_log, + disposition);return disposition; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 319/408 nvmet: fix uninitialized work for zero kato
In reply to Greg Kroah-HartmanFrom: zhenwei pi <[email protected]>
[ Upstream commit 85bd23f3dc09a2ae9e56885420e52c54bf983713 ]
When connecting a controller with a zero kato value using the following command line
nvme connect -t tcp -n NQN -a ADDR -s PORT --keep-alive-tmo=0
the warning below can be reproduced:
WARNING: CPU: 1 PID: 241 at kernel/workqueue.c:1627 __queue_delayed_work+0x6d/0x90 with trace: mod_delayed_work_on+0x59/0x90 nvmet_update_cc+0xee/0x100 [nvmet] nvmet_execute_prop_set+0x72/0x80 [nvmet] nvmet_tcp_try_recv_pdu+0x2f7/0x770 [nvmet_tcp] nvmet_tcp_io_work+0x63f/0xb2d [nvmet_tcp] ...
This is caused by queuing up an uninitialized work. Althrough the keep-alive timer is disabled during allocating the controller (fixed in 0d3b6a8d213a), ka_work still has a chance to run (called by nvmet_start_ctrl).
--- drivers/nvme/target/core.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/nvme/target/core.c +2 -1
@@ -1048,7 +1048,8 @@ static void nvmet_start_ctrl(struct nvmet_ctrl *ctrl)* in case a host died before it enabled the controller. Hence, simply * reset the keep alive timer when the controller is enabled. */ -mod_delayed_work (system_wq, &ctrl->ka_work, ctrl->kato *HZ ); +if (ctrl->kato) +mod_delayed_work (system_wq, &ctrl->ka_work, ctrl->kato *HZ ); }static void nvmet_clear_ctrl (struct nvmet_ctrl *ctrl)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 320/408 NTB: hw: amd: fix an issue about leak system resources
In reply to Greg Kroah-HartmanFrom: Kaige Li <[email protected]>
[ Upstream commit 44a0a3c17919db1498cebb02ecf3cf4abc1ade7b ]
The related system resources were not released when pci_set_dma_mask(), pci_set_consistent_dma_mask(), or pci_iomap() return error in the amd_ntb_init_pci() function. Add pci_release_regions() to fix it.
--- drivers/ntb/hw/amd/ntb_hw_amd.c | 1 + 1 file changed, 1 insertion(+)
drivers/ntb/hw/amd/ntb_hw_amd.c +1 -0
@@ -1036,6 +1036,7 @@ static int amd_ntb_init_pci(struct amd_ntb_dev *ndev, err_dma_mask:pci_clear_master (pdev); +pci_release_regions (pdev); err_pci_regions:pci_disable_device (pdev); err_pci_enable:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 321/408 sched/features: Fix !CONFIG_JUMP_LABEL case
In reply to Greg Kroah-HartmanFrom: Juri Lelli <[email protected]>
[ Upstream commit a73f863af4ce9730795eab7097fb2102e6854365 ]
Commit:
765cc3a4b224e ("sched/core: Optimize sched_feat() for !CONFIG_SCHED_DEBUG builds")
made sched features static for !CONFIG_SCHED_DEBUG configurations, but overlooked the CONFIG_SCHED_DEBUG=y and !CONFIG_JUMP_LABEL cases.
For the latter echoing changes to /sys/kernel/debug/sched_features has the nasty effect of effectively changing what sched_features reports, but without actually changing the scheduler behaviour (since different translation units get different sysctl_sched_features).
Fix CONFIG_SCHED_DEBUG=y and !CONFIG_JUMP_LABEL configurations by properly restructuring ifdefs.
--- kernel/sched/core.c | 2 +- kernel/sched/sched.h | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-)
kernel/sched/core.c +1 -1
@@ -36,7 +36,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(sched_overutilized_tp); DEFINE_PER_CPU_SHARED_ALIGNED(struct rq, runqueues); -#if defined(CONFIG_SCHED_DEBUG ) && defined(CONFIG_JUMP_LABEL ) +#ifdef CONFIG_SCHED_DEBUG /* * Debugging: various feature bits *
kernel/sched/sched.h +10 -3
@@ -1568,7 +1568,7 @@ enum {#undef SCHED_FEAT -#if defined(CONFIG_SCHED_DEBUG ) && defined(CONFIG_JUMP_LABEL ) +#ifdef CONFIG_SCHED_DEBUG /* * To support run-time toggling of sched features, all the translation units
@@ -1576,6 +1576,7 @@ enum {*/ extern const_debug unsigned int sysctl_sched_features; +#ifdef CONFIG_JUMP_LABEL #define SCHED_FEAT (name, enabled) \ static __always_inline bool static_branch_##name(struct static_key *key) \ { \
@@ -1588,7 +1589,13 @@ static __always_inline bool static_branch_##name(struct static_key *key) \extern struct static_key sched_feat_keys[__SCHED_FEAT_NR];#define sched_feat (x) (static_branch_##x(&sched_feat_keys[__SCHED_FEAT_##x])) -#else /* !(SCHED_DEBUG && CONFIG_JUMP_LABEL) */ +#else /* !CONFIG_JUMP_LABEL */ + +#define sched_feat (x) (sysctl_sched_features & (1UL << __SCHED_FEAT_##x)) + +#endif /* CONFIG_JUMP_LABEL */ + +#else /* !SCHED_DEBUG */ /* * Each translation unit has its own copy of sysctl_sched_features to allow
@@ -1604,7 +1611,7 @@ static const_debug __maybe_unused unsigned int sysctl_sched_features =#define sched_feat (x) !!(sysctl_sched_features & (1UL << __SCHED_FEAT_##x)) -#endif /* SCHED_DEBUG && CONFIG_JUMP_LABEL */ +#endif /* SCHED_DEBUG */ extern struct static_key_false sched_numa_balancing;extern struct static_key_false sched_schedstats;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 322/408 perf: correct SNOOPX field offset
In reply to Greg Kroah-HartmanFrom: Al Grant <[email protected]>
[ Upstream commit f3d301c1f2f5676465cdf3259737ea19cc82731f ]
perf_event.h has macros that define the field offsets in the data_src bitmask in perf records. The SNOOPX and REMOTE offsets were both 37. These are distinct fields, and the bitfield layout in perf_mem_data_src confirms that SNOOPX should be at offset 38.
--- include/uapi/linux/perf_event.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
include/uapi/linux/perf_event.h +1 -1
@@ -1131,7 +1131,7 @@ union perf_mem_data_src {#define PERF_MEM_SNOOPX_FWD 0x01/* forward */ /* 1 free */ -#define PERF_MEM_SNOOPX_SHIFT 37 +#define PERF_MEM_SNOOPX_SHIFT 38/* locked instruction */ #define PERF_MEM_LOCK_NA 0x01/* not available */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 323/408 i2c: core: Restore acpi_walk_dep_device_list() getting called after registering the ACPI i2c devs
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 8058d69905058ec8f467a120b5ec5bb831ea67f3 ]
Commit 21653a4181ff ("i2c: core: Call i2c_acpi_install_space_handler() before i2c_acpi_register_devices()")'s intention was to only move the acpi_install_address_space_handler() call to the point before where the ACPI declared i2c-children of the adapter where instantiated by i2c_acpi_register_devices().
But i2c_acpi_install_space_handler() had a call to acpi_walk_dep_device_list() hidden (that is I missed it) at the end of it, so as an unwanted side-effect now acpi_walk_dep_device_list() was also being called before i2c_acpi_register_devices().
Move the acpi_walk_dep_device_list() call to the end of i2c_acpi_register_devices(), so that it is once again called *after* the i2c_client-s hanging of the adapter have been created.
This fixes the Microsoft Surface Go 2 hanging at boot.
--- drivers/i2c/i2c-core-acpi.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-)
drivers/i2c/i2c-core-acpi.c +10 -1
@@ -264,6 +264,7 @@ static acpi_status i2c_acpi_add_device(acpi_handle handle, u32 level,void i2c_acpi_register_devices (struct i2c_adapter *adap) {acpi_status status; +acpi_handle handle;if (!has_acpi_companion (&adap->dev))return ;
@@ -274,6 +275,15 @@ void i2c_acpi_register_devices(struct i2c_adapter *adap) adap, NULL);if (ACPI_FAILURE (status))dev_warn (&adap->dev,"failed to enumerate I2C slaves\n" ); + +if (!adap->dev.parent) +return ; + + handle =ACPI_HANDLE (adap->dev.parent); +if (!handle) +return ; + +acpi_walk_dep_device_list (handle); } const struct acpi_device_id *
@@ -737,7 +747,6 @@ int i2c_acpi_install_space_handler(struct i2c_adapter *adapter)return -ENOMEM ; } -acpi_walk_dep_device_list (handle);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 324/408 md/bitmap: fix memory leak of temporary bitmap
In reply to Greg Kroah-HartmanFrom: Zhao Heming <[email protected]>
[ Upstream commit 1383b347a8ae4a69c04ae3746e6cb5c8d38e2585 ]
Callers of get_bitmap_from_slot() are responsible to free the bitmap.
--- drivers/md/md-bitmap.c | 3 ++- drivers/md/md-cluster.c | 1 + 2 files changed, 3 insertions(+), 1 deletion(-)
drivers/md/md-bitmap.c +2 -1
@@ -1954,6 +1954,7 @@ int md_bitmap_load(struct mddev *mddev) }EXPORT_SYMBOL_GPL (md_bitmap_load); +/* caller need to free returned bitmap with md_bitmap_free() */ struct bitmap *get_bitmap_from_slot (struct mddev *mddev,int slot) {int rv =0 ;
@@ -2017,6 +2018,7 @@ int md_bitmap_copy_from_slot(struct mddev *mddev, int slot,md_bitmap_unplug (mddev->bitmap); *low = lo; *high = hi; +md_bitmap_free (bitmap);return rv; }
@@ -2620,4 +2622,3 @@ struct attribute_group md_bitmap_group = { .name = "bitmap", .attrs = md_bitmap_attrs, }; -
drivers/md/md-cluster.c +1 -0
@@ -1166,6 +1166,7 @@ static int resize_bitmaps(struct mddev *mddev, sector_t newsize, sector_t oldsiz* can't resize bitmap */ goto out; +md_bitmap_free (bitmap); }return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 325/408 block: ratelimit handle_bad_sector() message
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
[ Upstream commit f4ac712e4fe009635344b9af5d890fe25fcc8c0d ]
syzbot is reporting unkillable task [1], for the caller is failing to handle a corrupted filesystem image which attempts to access beyond the end of the device. While we need to fix the caller, flooding the console with handle_bad_sector() message is unlikely useful.
[1] https://syzkaller.appspot.com/bug?id=f1f49fb971d7a3e01bd8ab8cff2ff4572ccf3092
--- block/blk-core.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
block/blk-core.c +4 -5
@@ -743,11 +743,10 @@ static void handle_bad_sector(struct bio *bio, sector_t maxsector) {char b[BDEVNAME_SIZE ]; -printk (KERN_INFO "attempt to access beyond end of device\n" ); -printk (KERN_INFO "%s: rw=%d, want=%Lu, limit=%Lu\n" , -bio_devname (bio, b), bio->bi_opf, - (unsigned long long )bio_end_sector (bio), - (long long )maxsector); +pr_info_ratelimited ("attempt to access beyond end of device\n" +"%s: rw=%d, want=%llu, limit=%llu\n" , +bio_devname (bio, b), bio->bi_opf, +bio_end_sector (bio), maxsector); }#ifdef CONFIG_FAIL_MAKE_REQUEST
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 326/408 crypto: ccp - fix error handling
In reply to Greg Kroah-HartmanFrom: Pavel Machek <[email protected]>
[ Upstream commit e356c49c6cf0db3f00e1558749170bd56e47652d ]
Fix resource leak in error handling.
--- drivers/crypto/ccp/ccp-ops.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/ccp/ccp-ops.c +1 -1
@@ -1746,7 +1746,7 @@ ccp_run_sha_cmd(struct ccp_cmd_queue *cmd_q, struct ccp_cmd *cmd)break ;default : ret = -EINVAL ; - goto e_ctx; + goto e_data; } }else {/* Stash the context */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 327/408 x86/asm: Replace __force_order with a memory clobber
In reply to Greg Kroah-HartmanFrom: Arvind Sankar <[email protected]>
[ Upstream commit aa5cacdc29d76a005cbbee018a47faa6e724dd2d ]
The CRn accessor functions use __force_order as a dummy operand to prevent the compiler from reordering CRn reads/writes with respect to each other.
The fact that the asm is volatile should be enough to prevent this:
volatile asm statements should be executed in program order. However GCC 4.9.x and 5.x have a bug that might result in reordering. This was fixed in 8.1, 7.3 and 6.5. Versions prior to these, including 5.x and 4.9.x, may reorder volatile asm statements with respect to each other.
There are some issues with __force_order as implemented:
- It is used only as an input operand for the write functions, and hence doesn't do anything additional to prevent reordering writes.
- It allows memory accesses to be cached/reordered across write functions, but CRn writes affect the semantics of memory accesses, so this could be dangerous.
- __force_order is not actually defined in the kernel proper, but the LLVM toolchain can in some cases require a definition: LLVM (as well as GCC 4.9) requires it for PIE code, which is why the compressed kernel has a definition, but also the clang integrated assembler may consider the address of __force_order to be significant, resulting in a reference that requires a definition.
Fix this by:
- Using a memory clobber for the write functions to additionally prevent caching/reordering memory accesses across CRn writes.
- Using a dummy input operand with an arbitrary constant address for the read functions, instead of a global variable. This will prevent reads from being reordered across writes, while allowing memory loads to be cached/reordered across CRn reads, which should be safe.
--- arch/x86/boot/compressed/pgtable_64.c | 9 --------- arch/x86/include/asm/special_insns.h | 28 ++++++++++++++------------- arch/x86/kernel/cpu/common.c | 4 ++-- 3 files changed, 17 insertions(+), 24 deletions(-)
arch/x86/boot/compressed/pgtable_64.c +0 -9
@@ -5,15 +5,6 @@#include "pgtable.h" #include "../string.h" -/* -* __force_order is used by special_insns.h asm code to force instruction -* serialization. -* -* It is not referenced from the code, but GCC < 5 with -fPIE would fail -* due to an undefined symbol. Define it to make these ancient GCCs work. -*/ -unsigned long __force_order; -#define BIOS_START_MIN 0x20000U/* 128K, less than this is insane */ #define BIOS_START_MAX 0x9f000U/* 640K, absolute maximum */
arch/x86/include/asm/special_insns.h +15 -13
@@ -10,45 +10,47 @@#include <linux/jump_label.h> /* -* Volatile isn't enough to prevent the compiler from reordering the -* read/write functions for the control registers and messing everything up. -* A memory clobber would solve the problem, but would prevent reordering of -* all loads stores around it, which can hurt performance. Solution is to -* use a variable and mimic reads and writes to it to enforce serialization +* The compiler should not reorder volatile asm statements with respect to each +* other: they should execute in program order. However GCC 4.9.x and 5.x have +* a bug (which was fixed in 8.1, 7.3 and 6.5) where they might reorder +* volatile asm. The write functions are not affected since they have memory +* clobbers preventing reordering. To prevent reads from being reordered with +* respect to writes, use a dummy memory operand. */ -extern unsigned long __force_order; + +#define __FORCE_ORDER "m"(*(unsigned int *)0x1000UL)void native_write_cr0 (unsigned long val);static inline unsigned long native_read_cr0 (void ) {unsigned long val; - asmvolatile ("mov %%cr0,%0\n\t" :"=r" (val),"=m" (__force_order)); + asm volatile("mov %%cr0,%0\n\t" : "=r" (val) : __FORCE_ORDER);return val; }static inline unsigned long native_read_cr2 (void ) {unsigned long val; - asmvolatile ("mov %%cr2,%0\n\t" :"=r" (val),"=m" (__force_order)); + asm volatile("mov %%cr2,%0\n\t" : "=r" (val) : __FORCE_ORDER);return val; }static inline void native_write_cr2 (unsigned long val) { - asmvolatile ("mov %0,%%cr2" : :"r" (val),"m" (__force_order)); + asmvolatile ("mov %0,%%cr2" : :"r" (val) :"memory" ); }static inline unsigned long __native_read_cr3 (void ) {unsigned long val; - asmvolatile ("mov %%cr3,%0\n\t" :"=r" (val),"=m" (__force_order)); + asm volatile("mov %%cr3,%0\n\t" : "=r" (val) : __FORCE_ORDER);return val; }static inline void native_write_cr3 (unsigned long val) { - asmvolatile ("mov %0,%%cr3" : :"r" (val),"m" (__force_order)); + asmvolatile ("mov %0,%%cr3" : :"r" (val) :"memory" ); }static inline unsigned long native_read_cr4 (void )
@@ -63,10 +65,10 @@ static inline unsigned long native_read_cr4(void) asm volatile("1: mov %%cr4, %0\n" "2:\n" _ASM_EXTABLE(1b, 2b) - : "=r" (val), "=m" (__force_order) : "0" (0)); + : "=r" (val) : "0" (0), __FORCE_ORDER); #else/* CR4 always exists on x86_64. */ - asmvolatile ("mov %%cr4,%0\n\t" :"=r" (val),"=m" (__force_order)); + asm volatile("mov %%cr4,%0\n\t" : "=r" (val) : __FORCE_ORDER);#endif return val; }
arch/x86/kernel/cpu/common.c +2 -2
@@ -377,7 +377,7 @@ void native_write_cr0(unsigned long val)unsigned long bits_missing =0 ; set_register: - asmvolatile ("mov %0,%%cr0" :"+r" (val),"+m" (__force_order)); + asmvolatile ("mov %0,%%cr0" :"+r" (val) : :"memory" );if (static_branch_likely (&cr_pinning)) {if (unlikely ((val &X86_CR0_WP ) !=X86_CR0_WP )) {
@@ -396,7 +396,7 @@ void native_write_cr4(unsigned long val)unsigned long bits_changed =0 ; set_register: - asmvolatile ("mov %0,%%cr4" :"+r" (val),"+m" (cr4_pinned_bits)); + asmvolatile ("mov %0,%%cr4" :"+r" (val) : :"memory" );if (static_branch_likely (&cr_pinning)) {if (unlikely ((val & cr4_pinned_mask) != cr4_pinned_bits)) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 328/408 x86/mce: Add Skylake quirk for patrol scrub reported errors
In reply to Greg Kroah-HartmanFrom: Borislav Petkov <[email protected]>
[ Upstream commit fd258dc4442c5c1c069c6b5b42bfe7d10cddda95 ]
The patrol scrubber in Skylake and Cascade Lake systems can be configured to report uncorrected errors using a special signature in the machine check bank and to signal using CMCI instead of machine check.
Update the severity calculation mechanism to allow specifying the model, minimum stepping and range of machine check bank numbers.
Add a new rule to detect the special signature (on model 0x55, stepping
Quoted 1 line
=4 in any of the memory controller banks).
[ bp: Rewrite it.
aegl: Productize it. ]
--- arch/x86/kernel/cpu/mce/severity.c | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-)
arch/x86/kernel/cpu/mce/severity.c +26 -2
@@ -9,9 +9,11 @@#include <linux/seq_file.h> #include <linux/init.h> #include <linux/debugfs.h> -#include <asm/mce.h> #include <linux/uaccess.h> +#include <asm/mce.h> +#include <asm/intel-family.h> +#include "internal.h" /*
@@ -40,9 +42,14 @@ static struct severity {unsigned char context;unsigned char excp;unsigned char covered; +unsigned char cpu_model; +unsigned char cpu_minstepping; +unsigned char bank_lo, bank_hi;char *msg; } severities[] = { #define MCESEV(s, m, c...) { .sev = MCE_ ## s ## _SEVERITY, .msg = m, ## c } +#define BANK_RANGE (l, h) .bank_lo = l, .bank_hi = h +#define MODEL_STEPPING (m, s) .cpu_model = m, .cpu_minstepping = s#define KERNEL .context = IN_KERNEL#define USER .context = IN_USER#define KERNEL_RECOV .context = IN_KERNEL_RECOV
@@ -97,7 +104,6 @@ static struct severity {KEEP ,"Corrected error" ,NOSER ,BITCLR (MCI_STATUS_UC ) ), -/* * known AO MCACODs reported via MCE or CMC: *
@@ -113,6 +119,18 @@ static struct severity { AO, "Action optional: last level cache writeback error", SER, MASK(MCI_UC_AR|MCACOD, MCI_STATUS_UC|MCACOD_L3WB) ), +/* +* Quirk for Skylake/Cascade Lake. Patrol scrubber may be configured +* to report uncorrected errors using CMCI with a special signature. +* UC=0, MSCOD=0x0010, MCACOD=binary(000X 0000 1100 XXXX) reported +* in one of the memory controller banks. +* Set severity to "AO" for same action as normal patrol scrub error. +*/ +MCESEV ( +AO ,"Uncorrected Patrol Scrub Error" , +SER ,MASK (MCI_STATUS_UC |MCI_ADDR |0xffffeff0 ,MCI_ADDR |0x001000c0 ), +MODEL_STEPPING (INTEL_FAM6_SKYLAKE_X ,4 ),BANK_RANGE (13 ,18 ) + ),/* ignore OVER for UCNA */ MCESEV(
@@ -320,6 +338,12 @@ static int mce_severity_intel(struct mce *m, int tolerant, char **msg, bool is_econtinue ;if (s->excp && excp != s->excp)continue ; +if (s->cpu_model && boot_cpu_data.x86_model != s->cpu_model) +continue ; +if (s->cpu_minstepping && boot_cpu_data.x86_stepping < s->cpu_minstepping) +continue ; +if (s->bank_lo && (m->bank < s->bank_lo || m->bank > s->bank_hi)) +continue ;if (msg) *msg = s->msg; s->covered =1 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 329/408 media: firewire: fix memory leak
In reply to Greg Kroah-HartmanFrom: Pavel Machek <[email protected]>
[ Upstream commit b28e32798c78a346788d412f1958f36bb760ec03 ]
Fix memory leak in node_probe.
--- drivers/media/firewire/firedtv-fw.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/media/firewire/firedtv-fw.c +4 -2
@@ -272,8 +272,10 @@ static int node_probe(struct fw_unit *unit, const struct ieee1394_device_id *id) name_len =fw_csr_string (unit->directory,CSR_MODEL , name,sizeof (name)); -if (name_len <0 ) -return name_len; +if (name_len <0 ) { + err = name_len; + goto fail_free; + }for (i =ARRAY_SIZE (model_names); --i; )if (strlen (model_names[i]) <= name_len &&strncmp (name, model_names[i], name_len) ==0 )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 330/408 media: ati_remote: sanity check for both endpoints
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
[ Upstream commit a8be80053ea74bd9c3f9a3810e93b802236d6498 ]
If you do sanity checks, you should do them for both endpoints. Hence introduce checking for endpoint type for the output endpoint, too.
--- drivers/media/rc/ati_remote.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/rc/ati_remote.c +4 -0
@@ -835,6 +835,10 @@ static int ati_remote_probe(struct usb_interface *interface,err ("%s: endpoint_in message size==0? \n" , __func__);return -ENODEV ; } +if (!usb_endpoint_is_int_out (endpoint_out)) { +err ("%s: Unexpected endpoint_out\n" , __func__); +return -ENODEV ; + } ati_remote =kzalloc (sizeof (struct ati_remote ),GFP_KERNEL ); rc_dev =rc_allocate_device (RC_DRIVER_SCANCODE );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 331/408 media: st-delta: Fix reference count leak in delta_run_work
In reply to Greg Kroah-HartmanFrom: Aditya Pakki <[email protected]>
[ Upstream commit 57cc666d36adc7b45e37ba4cd7bc4e44ec4c43d7 ]
delta_run_work() calls delta_get_sync() that increments the reference counter. In case of failure, decrement the reference count by calling delta_put_autosuspend().
--- drivers/media/platform/sti/delta/delta-v4l2.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/sti/delta/delta-v4l2.c +3 -1
@@ -954,8 +954,10 @@ static void delta_run_work(struct work_struct *work)/* enable the hardware */ if (!dec->pm) { ret =delta_get_sync (ctx); -if (ret) +if (ret) { +delta_put_autosuspend (ctx); goto err; + } }/* decode this access unit */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 332/408 media: sti: Fix reference count leaks
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit 6f4432bae9f2d12fc1815b5e26cc07e69bcad0df ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code, causing incorrect ref count if pm_runtime_put_noidle() is not called in error handling paths. Thus call pm_runtime_put_noidle() if pm_runtime_get_sync() fails.
--- drivers/media/platform/sti/hva/hva-hw.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/platform/sti/hva/hva-hw.c +2 -0
@@ -272,6 +272,7 @@ static unsigned long int hva_hw_get_ip_version(struct hva_dev *hva)if (pm_runtime_get_sync (dev) <0 ) {dev_err (dev,"%s failed to get pm_runtime\n" ,HVA_PREFIX ); +pm_runtime_put_noidle (dev);mutex_unlock (&hva->protect_mutex);return -EFAULT ; }
@@ -553,6 +554,7 @@ void hva_hw_dump_regs(struct hva_dev *hva, struct seq_file *s)if (pm_runtime_get_sync (dev) <0 ) {seq_puts (s,"Cannot wake up IP\n" ); +pm_runtime_put_noidle (dev);mutex_unlock (&hva->protect_mutex);return ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 333/408 media: exynos4-is: Fix several reference count leaks due to pm_runtime_get_sync
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit 7ef64ceea0008c17e94a8a2c60c5d6d46f481996 ]
On calling pm_runtime_get_sync() the reference count of the device is incremented. In case of failure, decrement the reference count before returning the error.
--- drivers/media/platform/exynos4-is/fimc-isp.c | 4 +++- drivers/media/platform/exynos4-is/fimc-lite.c | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/media/platform/exynos4-is/fimc-isp.c +3 -1
@@ -305,8 +305,10 @@ static int fimc_isp_subdev_s_power(struct v4l2_subdev *sd, int on)if (on) { ret =pm_runtime_get_sync (&is->pdev->dev); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put (&is->pdev->dev);return ret; + }set_bit (IS_ST_PWR_ON , &is->state); ret =fimc_is_start_firmware (is);
drivers/media/platform/exynos4-is/fimc-lite.c +1 -1
@@ -470,7 +470,7 @@ static int fimc_lite_open(struct file *file)set_bit (ST_FLITE_IN_USE , &fimc->state); ret =pm_runtime_get_sync (&fimc->pdev->dev);if (ret <0 ) - goto unlock; + goto err_pm; ret =v4l2_fh_open (file);if (ret <0 )
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 334/408 media: exynos4-is: Fix a reference count leak due to pm_runtime_get_sync
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit c47f7c779ef0458a58583f00c9ed71b7f5a4d0a2 ]
On calling pm_runtime_get_sync() the reference count of the device is incremented. In case of failure, decrement the reference count before returning the error.
--- drivers/media/platform/exynos4-is/media-dev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/exynos4-is/media-dev.c +3 -1
@@ -484,8 +484,10 @@ static int fimc_md_register_sensor_entities(struct fimc_md *fmd)return -ENXIO ; ret =pm_runtime_get_sync (fmd->pmf); -if (ret <0 ) +if (ret <0 ) { +pm_runtime_put (fmd->pmf);return ret; + } fmd->num_sensors =0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 335/408 media: exynos4-is: Fix a reference count leak
In reply to Greg Kroah-HartmanFrom: Qiushi Wu <[email protected]>
[ Upstream commit 64157b2cb1940449e7df2670e85781c690266588 ]
pm_runtime_get_sync() increments the runtime PM usage counter even when it returns an error code, causing incorrect ref count if pm_runtime_put_noidle() is not called in error handling paths. Thus call pm_runtime_put_noidle() if pm_runtime_get_sync() fails.
--- drivers/media/platform/exynos4-is/mipi-csis.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/platform/exynos4-is/mipi-csis.c +3 -1
@@ -510,8 +510,10 @@ static int s5pcsis_s_stream(struct v4l2_subdev *sd, int enable)if (enable) {s5pcsis_clear_counters (state); ret =pm_runtime_get_sync (&state->pdev->dev); -if (ret && ret !=1 ) +if (ret && ret !=1 ) { +pm_runtime_put_noidle (&state->pdev->dev);return ret; + } }mutex_lock (&state->lock);
Signature · 1 line
2.25.1