5.8.17-rc1 review
Subsystems (3)
Greg Kroah-Hartman
maintainerPATCH 148/633 spi: spi-s3c64xx: Check return values
In reply to Greg Kroah-HartmanFrom: Łukasz Stelmach <[email protected]>
[ Upstream commit 2f4db6f705c5cba85d23836c19b44d9687dc1334 ]
Check return values in prepare_dma() and s3c64xx_spi_config() and propagate errors upwards.
--- drivers/spi/spi-s3c64xx.c | 50 ++++++++++++++++++++++++++++++++------- 1 file changed, 41 insertions(+), 9 deletions(-)
drivers/spi/spi-s3c64xx.c +41 -9
@@ -122,6 +122,7 @@struct s3c64xx_spi_dma_data {struct dma_chan *ch; +dma_cookie_t cookie;enum dma_transfer_direction direction; };
@@ -264,12 +265,13 @@ static void s3c64xx_spi_dmacb(void *data)spin_unlock_irqrestore (&sdd->lock, flags); } -static void prepare_dma (struct s3c64xx_spi_dma_data *dma, +static int prepare_dma (struct s3c64xx_spi_dma_data *dma,struct sg_table *sgt) {struct s3c64xx_spi_driver_data *sdd;struct dma_slave_config config;struct dma_async_tx_descriptor *desc; +int ret;memset (&config,0 ,sizeof (config));
@@ -293,12 +295,24 @@ static void prepare_dma(struct s3c64xx_spi_dma_data *dma, desc =dmaengine_prep_slave_sg (dma->ch, sgt->sgl, sgt->nents, dma->direction,DMA_PREP_INTERRUPT ); +if (!desc) { +dev_err (&sdd->pdev->dev,"unable to prepare %s scatterlist" , + dma->direction ==DMA_DEV_TO_MEM ?"rx" :"tx" ); +return -ENOMEM ; + } desc->callback = s3c64xx_spi_dmacb; desc->callback_param = dma; -dmaengine_submit (desc); + dma->cookie =dmaengine_submit (desc); + ret =dma_submit_error (dma->cookie); +if (ret) { +dev_err (&sdd->pdev->dev,"DMA submission failed" ); +return -EIO ; + } +dma_async_issue_pending (dma->ch); +return 0 ; }static void s3c64xx_spi_set_cs (struct spi_device *spi,bool enable)
@@ -348,11 +362,12 @@ static bool s3c64xx_spi_can_dma(struct spi_master *master,return xfer->len > (FIFO_LVL_MASK (sdd) >>1 ) +1 ; } -static void s3c64xx_enable_datapath (struct s3c64xx_spi_driver_data *sdd, +static int s3c64xx_enable_datapath (struct s3c64xx_spi_driver_data *sdd,struct spi_transfer *xfer,int dma_mode) {void __iomem *regs = sdd->regs;u32 modecfg, chcfg; +int ret =0 ; modecfg =readl (regs +S3C64XX_SPI_MODE_CFG ); modecfg &= ~(S3C64XX_SPI_MODE_TXDMA_ON |S3C64XX_SPI_MODE_RXDMA_ON );
@@ -378,7 +393,7 @@ static void s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd, chcfg |=S3C64XX_SPI_CH_TXCH_ON ;if (dma_mode) { modecfg |=S3C64XX_SPI_MODE_TXDMA_ON ; -prepare_dma (&sdd->tx_dma, &xfer->tx_sg); + ret =prepare_dma (&sdd->tx_dma, &xfer->tx_sg); }else {switch (sdd->cur_bpw) {case 32 :
@@ -410,12 +425,17 @@ static void s3c64xx_enable_datapath(struct s3c64xx_spi_driver_data *sdd,writel (((xfer->len *8 / sdd->cur_bpw) &0xffff ) |S3C64XX_SPI_PACKET_CNT_EN , regs +S3C64XX_SPI_PACKET_CNT ); -prepare_dma (&sdd->rx_dma, &xfer->rx_sg); + ret =prepare_dma (&sdd->rx_dma, &xfer->rx_sg); } } +if (ret) +return ret; +writel (modecfg, regs +S3C64XX_SPI_MODE_CFG );writel (chcfg, regs +S3C64XX_SPI_CH_CFG ); + +return 0 ; } static u32 s3c64xx_spi_wait_for_timeout(struct s3c64xx_spi_driver_data *sdd,
@@ -548,9 +568,10 @@ static int s3c64xx_wait_for_pio(struct s3c64xx_spi_driver_data *sdd,return 0 ; } -static void s3c64xx_spi_config (struct s3c64xx_spi_driver_data *sdd) +static int s3c64xx_spi_config (struct s3c64xx_spi_driver_data *sdd) {void __iomem *regs = sdd->regs; +int ret;u32 val;/* Disable Clock */
@@ -598,7 +619,9 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd)if (sdd->port_conf->clk_from_cmu) {/* The src_clk clock is divided internally by 2 */ -clk_set_rate (sdd->src_clk, sdd->cur_speed *2 ); + ret =clk_set_rate (sdd->src_clk, sdd->cur_speed *2 ); +if (ret) +return ret; }else {/* Configure Clock */ val =readl (regs +S3C64XX_SPI_CLK_CFG );
@@ -612,6 +635,8 @@ static void s3c64xx_spi_config(struct s3c64xx_spi_driver_data *sdd) val |=S3C64XX_SPI_ENCLK_ENABLE ;writel (val, regs +S3C64XX_SPI_CLK_CFG ); } + +return 0 ; }#define XFER_DMAADDR_INVALID DMA_BIT_MASK(32)
@@ -654,7 +679,9 @@ static int s3c64xx_spi_transfer_one(struct spi_master *master, sdd->cur_bpw = bpw; sdd->cur_speed = speed; sdd->cur_mode = spi->mode; -s3c64xx_spi_config (sdd); + status =s3c64xx_spi_config (sdd); +if (status) +return status; } if (!is_polling(sdd) && (xfer->len > fifo_len) &&
@@ -681,10 +708,15 @@ static int s3c64xx_spi_transfer_one(struct spi_master *master,/* Start the signals */ s3c64xx_spi_set_cs (spi, true); -s3c64xx_enable_datapath (sdd, xfer, use_dma); + status =s3c64xx_enable_datapath (sdd, xfer, use_dma);spin_unlock_irqrestore (&sdd->lock, flags); +if (status) { +dev_err (&spi->dev,"failed to enable data path for transfer: %d\n" , status); +break ; + } +if (use_dma) status =s3c64xx_wait_for_dma (sdd, xfer);else
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 149/633 hwmon: (bt1-pvt) Test sensor power supply on probe
In reply to Greg Kroah-HartmanFrom: Serge Semin <[email protected]>
[ Upstream commit a6db1561291fc0f2f9aa23bf38f381adc63e7b14 ]
Baikal-T1 PVT sensor has got a dedicated power supply domain (feed up by the external GPVT/VPVT_18 pins). In case if it isn't powered up, the registers will be accessible, but the sensor conversion just won't happen. Due to that an attempt to read data from any PVT sensor will cause the task hanging up. For instance that will happen if XP11 jumper isn't installed on the Baikal-T1-based BFK3.1 board. Let's at least test whether the conversion work on the device probe procedure. By doing so will make sure that the PVT sensor is powered up at least at boot time.
--- drivers/hwmon/bt1-pvt.c | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)
drivers/hwmon/bt1-pvt.c +40 -0
@@ -13,6 +13,7 @@#include <linux/bitops.h> #include <linux/clk.h> #include <linux/completion.h> +#include <linux/delay.h> #include <linux/device.h> #include <linux/hwmon-sysfs.h> #include <linux/hwmon.h>
@@ -982,6 +983,41 @@ static int pvt_request_clks(struct pvt_hwmon *pvt)return 0 ; } +static int pvt_check_pwr (struct pvt_hwmon *pvt) +{ +unsigned long tout; +int ret =0 ; +u32 data; + +/* +* Test out the sensor conversion functionality. If it is not done on +* time then the domain must have been unpowered and we won't be able +* to use the device later in this driver. +* Note If the power source is lost during the normal driver work the +* data read procedure will either return -ETIMEDOUT (for the +* alarm-less driver configuration) or just stop the repeated +* conversion. In the later case alas we won't be able to detect the +* problem. +*/ +pvt_update (pvt->regs +PVT_INTR_MASK ,PVT_INTR_ALL ,PVT_INTR_ALL ); +pvt_update (pvt->regs +PVT_CTRL ,PVT_CTRL_EN ,PVT_CTRL_EN ); +pvt_set_tout (pvt,0 ); +readl (pvt->regs +PVT_DATA ); + + tout =PVT_TOUT_MIN /NSEC_PER_USEC ; +usleep_range (tout,2 * tout); + + data =readl (pvt->regs +PVT_DATA ); +if (!(data &PVT_DATA_VALID )) { + ret = -ENODEV ; +dev_err (pvt->dev,"Sensor is powered down\n" ); + } + +pvt_update (pvt->regs +PVT_CTRL ,PVT_CTRL_EN ,0 ); + +return ret; +} +static void pvt_init_iface (struct pvt_hwmon *pvt) {u32 trim, temp;
@@ -1109,6 +1145,10 @@ static int pvt_probe(struct platform_device *pdev)if (ret)return ret; + ret =pvt_check_pwr (pvt); +if (ret) +return ret; +pvt_init_iface (pvt); ret =pvt_request_irq (pvt);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 150/633 hwmon: (bt1-pvt) Cache current update timeout
In reply to Greg Kroah-HartmanFrom: Serge Semin <[email protected]>
[ Upstream commit 0015503e5f6357f286bef34d039e43359fa4efd4 ]
Instead of converting the update timeout data to the milliseconds each time on the read procedure let's preserve the currently set timeout in the dedicated driver private data cache. The cached value will be then used in the timeout read method and in the alarm-less data conversion to prevent the caller task hanging up in case if the PVT sensor is suddenly powered down.
--- drivers/hwmon/bt1-pvt.c | 85 ++++++++++++++++++++++------------------- drivers/hwmon/bt1-pvt.h | 3 ++ 2 files changed, 49 insertions(+), 39 deletions(-)
drivers/hwmon/bt1-pvt.c +46 -39
@@ -655,44 +655,16 @@ static int pvt_write_trim(struct pvt_hwmon *pvt, long val)static int pvt_read_timeout (struct pvt_hwmon *pvt,long *val) { -unsigned long rate; -ktime_t kt; -u32 data; - - rate =clk_get_rate (pvt->clks[PVT_CLOCK_REF ].clk); -if (!rate) -return -ENODEV ; - -/* -* Don't bother with mutex here, since we just read data from MMIO. -* We also have to scale the ticks timeout up to compensate the -* ms-ns-data translations. -*/ - data =readl (pvt->regs +PVT_TTIMEOUT ) +1 ; +int ret; -/* -* Calculate ref-clock based delay (Ttotal) between two consecutive -* data samples of the same sensor. So we first must calculate the -* delay introduced by the internal ref-clock timer (Tref * Fclk). -* Then add the constant timeout cuased by each conversion latency -* (Tmin). The basic formulae for each conversion is following: -* Ttotal = Tref * Fclk + Tmin -* Note if alarms are enabled the sensors are polled one after -* another, so in order to have the delay being applicable for each -* sensor the requested value must be equally redistirbuted. -*/ -#if defined(CONFIG_SENSORS_BT1_PVT_ALARMS ) - kt =ktime_set (PVT_SENSORS_NUM * (u64 )data,0 ); - kt =ktime_divns (kt, rate); - kt =ktime_add_ns (kt,PVT_SENSORS_NUM *PVT_TOUT_MIN ); -#else - kt =ktime_set (data,0 ); - kt =ktime_divns (kt, rate); - kt =ktime_add_ns (kt,PVT_TOUT_MIN ); -#endif + ret =mutex_lock_interruptible (&pvt->iface_mtx); +if (ret) +return ret;/* Return the result in msec as hwmon sysfs interface requires. */ - *val =ktime_to_ms (kt); + *val =ktime_to_ms (pvt->timeout); + +mutex_unlock (&pvt->iface_mtx);return 0 ; }
@@ -700,7 +672,7 @@ static int pvt_read_timeout(struct pvt_hwmon *pvt, long *val)static int pvt_write_timeout (struct pvt_hwmon *pvt,long val) {unsigned long rate; -ktime_t kt; +ktime_t kt, cache;u32 data;int ret;
@@ -713,7 +685,7 @@ static int pvt_write_timeout(struct pvt_hwmon *pvt, long val)* between all available sensors to have the requested delay * applicable to each individual sensor. */ - kt =ms_to_ktime (val); + cache = kt =ms_to_ktime (val);#if defined(CONFIG_SENSORS_BT1_PVT_ALARMS ) kt =ktime_divns (kt,PVT_SENSORS_NUM );#endif
@@ -742,6 +714,7 @@ static int pvt_write_timeout(struct pvt_hwmon *pvt, long val)return ret;pvt_set_tout (pvt, data); + pvt->timeout = cache;mutex_unlock (&pvt->iface_mtx);
@@ -1018,10 +991,17 @@ static int pvt_check_pwr(struct pvt_hwmon *pvt)return ret; } -static void pvt_init_iface (struct pvt_hwmon *pvt) +static int pvt_init_iface (struct pvt_hwmon *pvt) { +unsigned long rate;u32 trim, temp; + rate =clk_get_rate (pvt->clks[PVT_CLOCK_REF ].clk); +if (!rate) { +dev_err (pvt->dev,"Invalid reference clock rate\n" ); +return -ENODEV ; + } +/* * Make sure all interrupts and controller are disabled so not to * accidentally have ISR executed before the driver data is fully
@@ -1036,12 +1016,37 @@ static void pvt_init_iface(struct pvt_hwmon *pvt)pvt_set_mode (pvt, pvt_info[pvt->sensor].mode);pvt_set_tout (pvt,PVT_TOUT_DEF ); +/* +* Preserve the current ref-clock based delay (Ttotal) between the +* sensors data samples in the driver data so not to recalculate it +* each time on the data requests and timeout reads. It consists of the +* delay introduced by the internal ref-clock timer (N / Fclk) and the +* constant timeout caused by each conversion latency (Tmin): +* Ttotal = N / Fclk + Tmin +* If alarms are enabled the sensors are polled one after another and +* in order to get the next measurement of a particular sensor the +* caller will have to wait for at most until all the others are +* polled. In that case the formulae will look a bit different: +* Ttotal = 5 * (N / Fclk + Tmin) +*/ +#if defined(CONFIG_SENSORS_BT1_PVT_ALARMS ) + pvt->timeout =ktime_set (PVT_SENSORS_NUM *PVT_TOUT_DEF ,0 ); + pvt->timeout =ktime_divns (pvt->timeout, rate); + pvt->timeout =ktime_add_ns (pvt->timeout,PVT_SENSORS_NUM *PVT_TOUT_MIN ); +#else + pvt->timeout =ktime_set (PVT_TOUT_DEF ,0 ); + pvt->timeout =ktime_divns (pvt->timeout, rate); + pvt->timeout =ktime_add_ns (pvt->timeout,PVT_TOUT_MIN ); +#endif + trim =PVT_TRIM_DEF ;if (!of_property_read_u32 (pvt->dev->of_node,"baikal,pvt-temp-offset-millicelsius" , &temp)) trim =pvt_calc_trim (temp);pvt_set_trim (pvt, trim); + +return 0 ; }static int pvt_request_irq (struct pvt_hwmon *pvt)
@@ -1149,7 +1154,9 @@ static int pvt_probe(struct platform_device *pdev)if (ret)return ret; -pvt_init_iface (pvt); + ret =pvt_init_iface (pvt); +if (ret) +return ret; ret =pvt_request_irq (pvt);if (ret)
drivers/hwmon/bt1-pvt.h +3 -0
@@ -10,6 +10,7 @@#include <linux/completion.h> #include <linux/hwmon.h> #include <linux/kernel.h> +#include <linux/ktime.h> #include <linux/mutex.h> #include <linux/seqlock.h>
@@ -201,6 +202,7 @@ struct pvt_cache {* if alarms are disabled). * @sensor: current PVT sensor the data conversion is being performed for. * @cache: data cache descriptor. +* @timeout: conversion timeout cache. */ struct pvt_hwmon {struct device *dev;
@@ -214,6 +216,7 @@ struct pvt_hwmon {struct mutex iface_mtx;enum pvt_sensor_type sensor;struct pvt_cache cache[PVT_SENSORS_NUM ]; +ktime_t timeout; };/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 151/633 hwmon: (bt1-pvt) Wait for the completion with timeout
In reply to Greg Kroah-HartmanFrom: Serge Semin <[email protected]>
[ Upstream commit 0ffd21d5985506d164ada9e8fff6daae8ef469a1 ]
If the PVT sensor is suddenly powered down while a caller is waiting for the conversion completion, the request won't be finished and the task will hang up on this procedure until the power is back up again. Let's call the wait_for_completion_timeout() method instead to prevent that. The cached timeout is exactly what we need to predict for how long conversion could normally last.
--- drivers/hwmon/bt1-pvt.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/hwmon/bt1-pvt.c +12 -1
@@ -477,6 +477,7 @@ static int pvt_read_data(struct pvt_hwmon *pvt, enum pvt_sensor_type type, long *val) {struct pvt_cache *cache = &pvt->cache[type]; +unsigned long timeout;u32 data;int ret;
@@ -500,7 +501,14 @@ static int pvt_read_data(struct pvt_hwmon *pvt, enum pvt_sensor_type type,pvt_update (pvt->regs +PVT_INTR_MASK ,PVT_INTR_DVALID ,0 );pvt_update (pvt->regs +PVT_CTRL ,PVT_CTRL_EN ,PVT_CTRL_EN ); -wait_for_completion (&cache->conversion); +/* +* Wait with timeout since in case if the sensor is suddenly powered +* down the request won't be completed and the caller will hang up on +* this procedure until the power is back up again. Multiply the +* timeout by the factor of two to prevent a false timeout. +*/ + timeout =2 *usecs_to_jiffies (ktime_to_us (pvt->timeout)); + ret =wait_for_completion_timeout (&cache->conversion, timeout);pvt_update (pvt->regs +PVT_CTRL ,PVT_CTRL_EN ,0 ); pvt_update(pvt->regs + PVT_INTR_MASK, PVT_INTR_DVALID,
@@ -510,6 +518,9 @@ static int pvt_read_data(struct pvt_hwmon *pvt, enum pvt_sensor_type type,mutex_unlock (&pvt->iface_mtx); +if (!ret) +return -ETIMEDOUT ; +if (type ==PVT_TEMP ) *val =pvt_calc_poly (&poly_N_to_temp, data);else
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 152/633 btrfs: add owner and fs_info to alloc_state io_tree
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit 154f7cb86809a3a796bffbc7a5a7ce0dee585eaa ]
Commit 1c11b63eff2a ("btrfs: replace pending/pinned chunks lists with io tree") introduced btrfs_device::alloc_state extent io tree, but it doesn't initialize the fs_info and owner member.
This means the following features are not properly supported:
- Fs owner report for insert_state() error
Without fs_info initialized, although btrfs_err() won't panic, it won't output which fs is causing the error.
- Wrong owner for trace events
alloc_state will get the owner as pinned extents.
Fix this by assiging proper fs_info and owner forbtrfs_device::alloc_state.
--- fs/btrfs/extent-io-tree.h | 1 + fs/btrfs/volumes.c | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-)
fs/btrfs/extent-io-tree.h +1 -0
@@ -48,6 +48,7 @@ enum {IO_TREE_INODE_FILE_EXTENT ,IO_TREE_LOG_CSUM_RANGE ,IO_TREE_SELFTEST , + IO_TREE_DEVICE_ALLOC_STATE, }; struct extent_io_tree {
fs/btrfs/volumes.c +4 -3
@@ -406,7 +406,7 @@ void __exit btrfs_cleanup_fs_uuids(void)* Returned struct is not linked onto any lists and must be destroyed using * btrfs_free_device. */ -static struct btrfs_device *__alloc_device (void ) +static struct btrfs_device *__alloc_device (struct btrfs_fs_info *fs_info) {struct btrfs_device *dev;
@@ -433,7 +433,8 @@ static struct btrfs_device *__alloc_device(void)btrfs_device_data_ordered_init (dev);INIT_RADIX_TREE (&dev->reada_zones,GFP_NOFS & ~__GFP_DIRECT_RECLAIM);INIT_RADIX_TREE (&dev->reada_extents,GFP_NOFS & ~__GFP_DIRECT_RECLAIM); -extent_io_tree_init (NULL , &dev->alloc_state,0 ,NULL ); +extent_io_tree_init (fs_info, &dev->alloc_state, +IO_TREE_DEVICE_ALLOC_STATE ,NULL );return dev; }
@@ -6545,7 +6546,7 @@ struct btrfs_device *btrfs_alloc_device(struct btrfs_fs_info *fs_info,if (WARN_ON (!devid && !fs_info))return ERR_PTR (-EINVAL ); - dev =__alloc_device (); + dev =__alloc_device (fs_info);if (IS_ERR (dev))return dev;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 153/633 blk-mq: move cancel of hctx->run_work to the front of blk_exit_queue
In reply to Greg Kroah-HartmanFrom: Yang Yang <[email protected]>
[ Upstream commit 47ce030b7ac5a5259a9a5919f230b52497afc31a ]
blk_exit_queue will free elevator_data, while blk_mq_run_work_fn will access it. Move cancel of hctx->run_work to the front of blk_exit_queue to avoid use-after-free.
--- block/blk-mq-sysfs.c | 2 -- block/blk-sysfs.c | 9 ++++++++- 2 files changed, 8 insertions(+), 3 deletions(-)
block/blk-mq-sysfs.c +0 -2
@@ -36,8 +36,6 @@ static void blk_mq_hw_sysfs_release(struct kobject *kobj) struct blk_mq_hw_ctx *hctx = container_of(kobj, struct blk_mq_hw_ctx, kobj); -cancel_delayed_work_sync (&hctx->run_work); -if (hctx->flags &BLK_MQ_F_BLOCKING )cleanup_srcu_struct (hctx->srcu);blk_free_flush_queue (hctx->fq);
block/blk-sysfs.c +8 -1
@@ -896,9 +896,16 @@ static void __blk_release_queue(struct work_struct *work)blk_free_queue_stats (q->stats); -if (queue_is_mq (q)) +if (queue_is_mq (q)) { +struct blk_mq_hw_ctx *hctx; +int i; +cancel_delayed_work_sync (&q->requeue_work); +queue_for_each_hw_ctx (q, hctx, i) +cancel_delayed_work_sync (&hctx->run_work); + } +blk_exit_queue (q);blk_queue_free_zone_bitmaps (q);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 154/633 ath10k: provide survey info as accumulated data
In reply to Greg Kroah-HartmanFrom: Venkateswara Naralasetty <[email protected]>
[ Upstream commit 720e5c03e5cb26d33d97f55192b791bb48478aa5 ]
It is expected that the returned counters by .get_survey are monotonic increasing. But the data from ath10k gets reset to zero regularly. Channel active/busy time are then showing incorrect values (less than previous or sometimes zero) for the currently active channel during successive survey dump commands.
example:
$ iw dev wlan0 survey dump Survey data from wlan0 frequency: 5180 MHz [in use] channel active time: 54995 ms channel busy time: 432 ms channel receive time: 0 ms channel transmit time: 59 ms ...
$ iw dev wlan0 survey dump Survey data from wlan0 frequency: 5180 MHz [in use] channel active time: 32592 ms channel busy time: 254 ms channel receive time: 0 ms channel transmit time: 0 ms ...
The correct way to handle this is to use the non-clearing WMI_BSS_SURVEY_REQ_TYPE_READ wmi_bss_survey_req_type. The firmware will then accumulate the survey data and handle wrap arounds.
Tested-on: QCA9984 hw1.0 10.4-3.5.3-00057
Tested-on: QCA988X hw2.0 10.2.4-1.0-00047
Tested-on: QCA9888 hw2.0 10.4-3.9.0.2-00024
Tested-on: QCA4019 hw1.0 10.4-3.6-00140
--- drivers/net/wireless/ath/ath10k/mac.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/mac.c +1 -1
@@ -7283,7 +7283,7 @@ ath10k_mac_update_bss_chan_survey(struct ath10k *ar, struct ieee80211_channel *channel) {int ret; -enum wmi_bss_survey_req_type type =WMI_BSS_SURVEY_REQ_TYPE_READ_CLEAR ; +enum wmi_bss_survey_req_type type =WMI_BSS_SURVEY_REQ_TYPE_READ ;lockdep_assert_held (&ar->conf_mutex);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 155/633 drm/vkms: fix xrgb on compute crc
In reply to Greg Kroah-HartmanFrom: Melissa Wen <[email protected]>
[ Upstream commit 0986191186128b10b6bbfa5220fc587ed5725e49 ]
The previous memset operation was not correctly zeroing the alpha channel to compute the crc, and as a result, the IGT subtest kms_cursor_crc/pipe-A-cursor-alpha-transparent fails.
--- drivers/gpu/drm/vkms/vkms_composer.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vkms/vkms_composer.c +1 -1
@@ -33,7 +33,7 @@ static uint32_t compute_crc(void *vaddr_out, struct vkms_composer *composer) + (i * composer->pitch) + (j * composer->cpp);/* XRGB format ignores Alpha channel */ -memset (vaddr_out + src_offset +24 ,0 ,8 ); +bitmap_clear (vaddr_out + src_offset,24 ,8 ); crc =crc32_le (crc, vaddr_out + src_offset,sizeof (u32)); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 156/633 Bluetooth: hci_uart: Cancel init work before unregistering
In reply to Greg Kroah-HartmanFrom: Samuel Holland <[email protected]>
[ Upstream commit 3b799254cf6f481460719023d7a18f46651e5e7f ]
If hci_uart_tty_close() or hci_uart_unregister_device() is called while hu->init_ready is scheduled, hci_register_dev() could be called after the hci_uart is torn down. Avoid this by ensuring the work is complete or canceled before checking the HCI_UART_REGISTERED flag.
--- drivers/bluetooth/hci_ldisc.c | 1 + drivers/bluetooth/hci_serdev.c | 2 ++ 2 files changed, 3 insertions(+)
drivers/bluetooth/hci_ldisc.c +1 -0
@@ -538,6 +538,7 @@ static void hci_uart_tty_close(struct tty_struct *tty)clear_bit (HCI_UART_PROTO_READY , &hu->flags);percpu_up_write (&hu->proto_lock); +cancel_work_sync (&hu->init_ready);cancel_work_sync (&hu->write_work);if (hdev) {
drivers/bluetooth/hci_serdev.c +2 -0
@@ -355,6 +355,8 @@ void hci_uart_unregister_device(struct hci_uart *hu)struct hci_dev *hdev = hu->hdev;clear_bit (HCI_UART_PROTO_READY , &hu->flags); + +cancel_work_sync (&hu->init_ready);if (test_bit (HCI_UART_REGISTERED , &hu->flags))hci_unregister_dev (hdev);hci_free_dev (hdev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 157/633 drm/amd/display: Fix wrong return value in dm_update_plane_state()
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
[ Upstream commit c35376137e940c3389df2726a92649c01a9844b4 ]
On an error exit path, a negative error code should be returned instead of a positive return value.
--- drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c +1 -2
@@ -8178,8 +8178,7 @@ static int dm_update_plane_state(struct dc *dc, dm_old_plane_state->dc_state, dm_state->context)) { - ret =EINVAL ; -return ret; +return -EINVAL ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 158/633 drm/vgem: add missing platform_device_unregister() in vgem_init()
In reply to Greg Kroah-HartmanFrom: Qinglang Miao <[email protected]>
[ Upstream commit 57fb54082d5d14512dfd21bc39d91945d3ad1ee9 ]
When vgem_init() get into out_put, the unregister call of vgem_device->platform is missing. So add it before return.
--- drivers/gpu/drm/vgem/vgem_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vgem/vgem_drv.c +1 -1
@@ -471,8 +471,8 @@ static int __init vgem_init(void) out_put:drm_dev_put (&vgem_device->drm); +platform_device_unregister (vgem_device->platform);return ret; - out_unregister:platform_device_unregister (vgem_device->platform); out_free:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 159/633 drm/vkms: add missing platform_device_unregister() in vkms_init()
In reply to Greg Kroah-HartmanFrom: Qinglang Miao <[email protected]>
[ Upstream commit 7995bd13296111d672d8c5959f5e81dbbbda5286 ]
When vkms_init() get into out_put, the unregister call of vkms_device->platform is missing. So add it before return.
--- drivers/gpu/drm/vkms/vkms_drv.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/vkms/vkms_drv.c +1 -1
@@ -188,8 +188,8 @@ static int __init vkms_init(void) out_put:drm_dev_put (&vkms_device->drm); +platform_device_unregister (vkms_device->platform);return ret; - out_unregister:platform_device_unregister (vkms_device->platform); out_free:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 160/633 drm: panel: Fix bus format for OrtusTech COM43H4M85ULC panel
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit f098f168e91ca915c6cf8aa316136af647792f2f ]
The OrtusTech COM43H4M85ULC panel is a 18-bit RGB panel, set the bus format to MEDIA_BUS_FMT_RGB666_1X18.
--- drivers/gpu/drm/panel/panel-simple.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/panel/panel-simple.c +1 -1
@@ -2867,7 +2867,7 @@ static const struct panel_desc ortustech_com43h4m85ulc = { .width = 56, .height = 93, }, - .bus_format = MEDIA_BUS_FMT_RGB888_1X24, + .bus_format = MEDIA_BUS_FMT_RGB666_1X18, .bus_flags = DRM_BUS_FLAG_DE_HIGH | DRM_BUS_FLAG_PIXDATA_DRIVE_POSEDGE, .connector_type = DRM_MODE_CONNECTOR_DPI, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 161/633 ath6kl: prevent potential array overflow in ath6kl_add_new_sta()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 54f9ab7b870934b70e5a21786d951fbcf663970f ]
The value for "aid" comes from skb->data so Smatch marks it as untrusted. If it's invalid then it can result in an out of bounds array access in ath6kl_add_new_sta().
--- drivers/net/wireless/ath/ath6kl/main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/ath/ath6kl/main.c +3 -0
@@ -430,6 +430,9 @@ void ath6kl_connect_ap_mode_sta(struct ath6kl_vif *vif, u16 aid, u8 *mac_addr,ath6kl_dbg (ATH6KL_DBG_TRC ,"new station %pM aid=%d\n" , mac_addr, aid); +if (aid <1 || aid >AP_MAX_NUM_STA ) +return ; +if (assoc_req_len >sizeof (struct ieee80211_hdr_3addr )) {struct ieee80211_mgmt *mgmt = (struct ieee80211_mgmt *) assoc_info;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 162/633 ath9k: Fix potential out of bounds in ath9k_htc_txcompletion_cb()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 2705cd7558e718a7240c64eb0afb2edad5f8c190 ]
The value of "htc_hdr->endpoint_id" comes from skb->data so Smatch marks it as untrusted so we have to check it before using it as an array offset.
This is similar to a bug that syzkaller found in commit e4ff08a4d727 ("ath9k: Fix use-after-free Write in ath9k_htc_rx_msg") so it is probably a real issue.
--- drivers/net/wireless/ath/ath9k/htc_hst.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/ath/ath9k/htc_hst.c +2 -0
@@ -339,6 +339,8 @@ void ath9k_htc_txcompletion_cb(struct htc_target *htc_handle,if (skb) { htc_hdr = (struct htc_frame_hdr *) skb->data; +if (htc_hdr->endpoint_id >=ARRAY_SIZE (htc_handle->endpoint)) + goto ret; endpoint = &htc_handle->endpoint[htc_hdr->endpoint_id];skb_pull (skb,sizeof (struct htc_frame_hdr ));
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 163/633 ath10k: Fix the size used in a dma_free_coherent() call in an error handling path
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 454530a9950b5a26d4998908249564cedfc4babc ]
Update the size used in 'dma_free_coherent()' in order to match the one used in the corresponding 'dma_alloc_coherent()'.
--- drivers/net/wireless/ath/ath10k/ce.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/ath10k/ce.c +1 -1
@@ -1555,7 +1555,7 @@ ath10k_ce_alloc_src_ring(struct ath10k *ar, unsigned int ce_id, ret =ath10k_ce_alloc_shadow_base (ar, src_ring, nentries);if (ret) {dma_free_coherent (ar->dev, - (nentries *sizeof (struct ce_desc_64 ) + + (nentries *sizeof (struct ce_desc ) +CE_DESC_RING_ALIGN ), src_ring->base_addr_owner_space_unaligned, base_addr);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 164/633 wcn36xx: Fix reported 802.11n rx_highest rate wcn3660/wcn3680
In reply to Greg Kroah-HartmanFrom: Bryan O'Donoghue <[email protected]>
[ Upstream commit 3b9fb6791e7113679b1eb472e6ce1659e80f5797 ]
Qualcomm's document "80-WL007-1 Rev. J" states that the highest rx rate for the WCN3660 and WCN3680 on MCS 7 is 150 Mbps not the 72 Mbps stated here.
This patch fixes the data-rate declared in the 5GHz table.
hardware")
--- drivers/net/wireless/ath/wcn36xx/main.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/ath/wcn36xx/main.c +1 -1
@@ -163,7 +163,7 @@ static struct ieee80211_supported_band wcn_band_5ghz = { .ampdu_density = IEEE80211_HT_MPDU_DENSITY_16, .mcs = { .rx_mask = { 0xff, 0, 0, 0, 0, 0, 0, 0, 0, 0, }, - .rx_highest =cpu_to_le16 (72 ), + .rx_highest =cpu_to_le16 (150 ), .tx_params = IEEE80211_HT_MCS_TX_DEFINED, } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 165/633 ASoC: qcom: lpass-platform: fix memory leak
In reply to Greg Kroah-HartmanFrom: Rohit kumar <[email protected]>
[ Upstream commit 5fd188215d4eb52703600d8986b22311099a5940 ]
lpass_pcm_data is never freed. Free it in close
ops to avoid memory leak.
--- sound/soc/qcom/lpass-platform.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/qcom/lpass-platform.c +2 -1
@@ -61,7 +61,7 @@ static int lpass_platform_pcmops_open(struct snd_soc_component *component,int ret, dma_ch, dir = substream->stream;struct lpass_pcm_data *data; - data =devm_kzalloc (soc_runtime->dev,sizeof (*data),GFP_KERNEL ); + data =kzalloc (sizeof (*data),GFP_KERNEL );if (!data)return -ENOMEM ;
@@ -118,6 +118,7 @@ static int lpass_platform_pcmops_close(struct snd_soc_component *component,if (v->free_dma_channel) v->free_dma_channel (drvdata, data->dma_ch); +kfree (data);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 166/633 ASoC: qcom: lpass-cpu: fix concurrency issue
In reply to Greg Kroah-HartmanFrom: Rohit kumar <[email protected]>
[ Upstream commit 753a6e17942f6f425ca622e1610625998312ad89 ]
i2sctl register value is set to 0 during hw_free(). This impacts any ongoing concurrent session on the same i2s port. As trigger() stop already resets enable bit to 0, there is no need of explicit hw_free. Removing it to fix the issue.
--- sound/soc/qcom/lpass-cpu.c | 16 ---------------- 1 file changed, 16 deletions(-)
sound/soc/qcom/lpass-cpu.c +0 -16
@@ -209,21 +209,6 @@ static int lpass_cpu_daiops_hw_params(struct snd_pcm_substream *substream,return 0 ; } -static int lpass_cpu_daiops_hw_free (struct snd_pcm_substream *substream, -struct snd_soc_dai *dai) -{ -struct lpass_data *drvdata =snd_soc_dai_get_drvdata (dai); -int ret; - - ret =regmap_write (drvdata->lpaif_map, -LPAIF_I2SCTL_REG (drvdata->variant, dai->driver->id), -0 ); -if (ret) -dev_err (dai->dev,"error writing to i2sctl reg: %d\n" , ret); - -return ret; -} -static int lpass_cpu_daiops_prepare (struct snd_pcm_substream *substream,struct snd_soc_dai *dai) {
@@ -304,7 +289,6 @@ const struct snd_soc_dai_ops asoc_qcom_lpass_cpu_dai_ops = { .startup = lpass_cpu_daiops_startup, .shutdown = lpass_cpu_daiops_shutdown, .hw_params = lpass_cpu_daiops_hw_params, - .hw_free = lpass_cpu_daiops_hw_free, .prepare = lpass_cpu_daiops_prepare, .trigger = lpass_cpu_daiops_trigger, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 167/633 ath11k: Fix possible memleak in ath11k_qmi_init_service
In reply to Greg Kroah-HartmanFrom: Wang Yufen <[email protected]>
[ Upstream commit 28f1632118818d9dccabf4c0fccfe49686742317 ]
When qmi_add_lookup fail, we should destroy the workqueue
--- drivers/net/wireless/ath/ath11k/qmi.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/wireless/ath/ath11k/qmi.c +1 -0
@@ -2419,6 +2419,7 @@ int ath11k_qmi_init_service(struct ath11k_base *ab) ATH11K_QMI_WLFW_SERVICE_INS_ID_V01);if (ret <0 ) {ath11k_warn (ab,"failed to add qmi lookup\n" ); +destroy_workqueue (ab->qmi.event_wq);return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 168/633 brcmfmac: check ndev pointer
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit 9c9f015bc9f8839831c7ba0a6d731a3853c464e2 ]
Clang static analysis reports this error
brcmfmac/core.c:490:4: warning: Dereference of null pointer
(*ifp)->ndev->stats.rx_errors++;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~In this block of code
if (ret || !(*ifp) || !(*ifp)->ndev) {
if (ret != -ENODATA && *ifp)
(*ifp)->ndev->stats.rx_errors++;
brcmu_pkt_buf_free_skb(skb);
return -ENODATA;
}(*ifp)->ndev being NULL is caught as an error
But then it is used to report the error.
So add a check before using it.
--- drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/broadcom/brcm80211/brcmfmac/core.c +1 -1
@@ -483,7 +483,7 @@ static int brcmf_rx_hdrpull(struct brcmf_pub *drvr, struct sk_buff *skb, ret =brcmf_proto_hdrpull (drvr, true, skb, ifp);if (ret || !(*ifp) || !(*ifp)->ndev) { -if (ret != -ENODATA && *ifp) +if (ret != -ENODATA && *ifp && (*ifp)->ndev) (*ifp)->ndev->stats.rx_errors++;brcmu_pkt_buf_free_skb (skb);return -ENODATA ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 169/633 mwifiex: Do not use GFP_KERNEL in atomic context
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit d2ab7f00f4321370a8ee14e5630d4349fdacc42e ]
A possible call chain is as follow:
mwifiex_sdio_interrupt (sdio.c)
--> mwifiex_main_process (main.c)
--> mwifiex_process_cmdresp (cmdevt.c)
--> mwifiex_process_sta_cmdresp (sta_cmdresp.c)
--> mwifiex_ret_802_11_scan (scan.c)
--> mwifiex_parse_single_response_buf (scan.c)'mwifiex_sdio_interrupt()' is an interrupt function.
Also note that 'mwifiex_ret_802_11_scan()' already uses GFP_ATOMIC.
So use GFP_ATOMIC instead of GFP_KERNEL when memory is allocated in 'mwifiex_parse_single_response_buf()'.
or
--- drivers/net/wireless/marvell/mwifiex/scan.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/wireless/marvell/mwifiex/scan.c +1 -1
@@ -1889,7 +1889,7 @@ mwifiex_parse_single_response_buf(struct mwifiex_private *priv, u8 **bss_info, chan,CFG80211_BSS_FTYPE_UNKNOWN , bssid, timestamp, cap_info_bitmap, beacon_period, - ie_buf, ie_len, rssi, GFP_KERNEL); + ie_buf, ie_len, rssi, GFP_ATOMIC);if (bss) { bss_priv = (struct mwifiex_bss_priv *)bss->priv; bss_priv->band = band;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 170/633 staging: rtl8192u: Do not use GFP_KERNEL in atomic context
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit acac75bb451fd39344eb54fad6602dfc9482e970 ]
'rtl8192_irq_rx_tasklet()' is a tasklet initialized in 'rtl8192_init_priv_task()'.
Quoted 1 line
From this function it is possible to allocate some memory with the
GFP_KERNEL flag, which is not allowed in the atomic context of a tasklet.
Use GFP_ATOMIC instead.
The call chain is:
rtl8192_irq_rx_tasklet (in r8192U_core.c)
--> rtl8192_rx_nomal (in r8192U_core.c)
--> ieee80211_rx (in ieee80211/ieee80211_rx.c)
--> RxReorderIndicatePacket (in ieee80211/ieee80211_rx.c)--- drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/rtl8192u/ieee80211/ieee80211_rx.c +1 -1
@@ -597,7 +597,7 @@ static void RxReorderIndicatePacket(struct ieee80211_device *ieee, prxbIndicateArray =kmalloc_array (REORDER_WIN_SIZE ,sizeof (struct ieee80211_rxb *), -GFP_KERNEL ); +GFP_ATOMIC );if (!prxbIndicateArray)return ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 171/633 drm/amd/display: fix potential integer overflow when shifting 32 bit variable bl_pwm
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit 1d5503331b12a76266049289747dfd94f1643fde ]
The 32 bit unsigned integer bl_pwm is being shifted using 32 bit arithmetic and then being assigned to a 64 bit unsigned integer. There is a potential for a 32 bit overflow so cast bl_pwm to enforce a 64 bit shift operation to avoid this.
Addresses-Coverity: ("unintentional integer overflow")
--- drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dce/dce_panel_cntl.c +1 -1
@@ -75,7 +75,7 @@ static unsigned int calculate_16_bit_backlight_from_pwm(struct dce_panel_cntl *delse bl_pwm &=0xFFFF ; - current_backlight = bl_pwm << (1 + bl_int_count); + current_backlight = (uint64_t )bl_pwm << (1 + bl_int_count);if (bl_period ==0 ) bl_period =0xFFFF ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 172/633 selftests/bpf: Fix test_vmlinux test to use bpf_probe_read_user()
In reply to Greg Kroah-HartmanFrom: Andrii Nakryiko <[email protected]>
[ Upstream commit 02f47faa25db134f6043fb6b12a68b5d4c980bb6 ]
The test is reading UAPI kernel structure from user-space. So it doesn't need CO-RE relocations and has to use bpf_probe_read_user().
--- tools/testing/selftests/bpf/progs/test_vmlinux.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
tools/testing/selftests/bpf/progs/test_vmlinux.c +9 -3
@@ -19,12 +19,14 @@ SEC("tp/syscalls/sys_enter_nanosleep")int handle__tp (struct trace_event_raw_sys_enter *args) {struct __kernel_timespec *ts; +long tv_nsec;if (args->id != __NR_nanosleep)return 0 ; ts = (void *)args->args[0 ]; -if (BPF_CORE_READ (ts, tv_nsec) !=MY_TV_NSEC ) +if (bpf_probe_read_user (&tv_nsec,sizeof (ts->tv_nsec), &ts->tv_nsec) || + tv_nsec !=MY_TV_NSEC )return 0 ; tp_called = true;
@@ -35,12 +37,14 @@ SEC("raw_tp/sys_enter")int BPF_PROG (handle__raw_tp ,struct pt_regs *regs,long id) {struct __kernel_timespec *ts; +long tv_nsec;if (id != __NR_nanosleep)return 0 ; ts = (void *)PT_REGS_PARM1_CORE (regs); -if (BPF_CORE_READ (ts, tv_nsec) !=MY_TV_NSEC ) +if (bpf_probe_read_user (&tv_nsec,sizeof (ts->tv_nsec), &ts->tv_nsec) || + tv_nsec !=MY_TV_NSEC )return 0 ; raw_tp_called = true;
@@ -51,12 +55,14 @@ SEC("tp_btf/sys_enter")int BPF_PROG (handle__tp_btf ,struct pt_regs *regs,long id) {struct __kernel_timespec *ts; +long tv_nsec;if (id != __NR_nanosleep)return 0 ; ts = (void *)PT_REGS_PARM1_CORE (regs); -if (BPF_CORE_READ (ts, tv_nsec) !=MY_TV_NSEC ) +if (bpf_probe_read_user (&tv_nsec,sizeof (ts->tv_nsec), &ts->tv_nsec) || + tv_nsec !=MY_TV_NSEC )return 0 ; tp_btf_called = true;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 173/633 drm/gma500: fix error check
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit cdd296cdae1af2d27dae3fcfbdf12c5252ab78cf ]
Reviewing this block of code in cdv_intel_dp_init()
ret = cdv_intel_dp_aux_native_read(gma_encoder, DP_DPCD_REV, ...
cdv_intel_edp_panel_vdd_off(gma_encoder);
if (ret == 0) {
/* if this fails, presume the device is a ghost */
DRM_INFO("failed to retrieve link info, disabling eDP\n");
drm_encoder_cleanup(encoder);
cdv_intel_dp_destroy(connector);
goto err_priv;
} else {The (ret == 0) is not strict enough. cdv_intel_dp_aux_native_read() returns > 0 on success otherwise it is failure.
So change to <=
--- drivers/gpu/drm/gma500/cdv_intel_dp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/gma500/cdv_intel_dp.c +1 -1
@@ -2078,7 +2078,7 @@ cdv_intel_dp_init(struct drm_device *dev, struct psb_intel_mode_device *mode_dev intel_dp->dpcd, sizeof(intel_dp->dpcd));cdv_intel_edp_panel_vdd_off (gma_encoder); -if (ret ==0 ) { +if (ret <=0 ) {/* if this fails, presume the device is a ghost */ DRM_INFO ("failed to retrieve link info, disabling eDP\n" );drm_encoder_cleanup (encoder);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 174/633 scsi: qla4xxx: Fix an error handling path in qla4xxx_get_host_stats()
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 574918e69720fe62ab3eb42ec3750230c8d16b06 ]
Update the size used in 'dma_free_coherent()' in order to match the one used in the corresponding 'dma_alloc_coherent()'.
--- drivers/scsi/qla4xxx/ql4_os.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/qla4xxx/ql4_os.c +1 -1
@@ -1220,7 +1220,7 @@ static int qla4xxx_get_host_stats(struct Scsi_Host *shost, char *buf, int len)le64_to_cpu (ql_iscsi_stats->iscsi_sequence_error); exit_host_stats:if (ql_iscsi_stats) -dma_free_coherent (&ha->pdev->dev, host_stats_size, +dma_free_coherent (&ha->pdev->dev, stats_size, ql_iscsi_stats, iscsi_stats_dma); ql4_printk(KERN_INFO, ha, "%s: Get host stats done\n",
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 175/633 scsi: qla2xxx: Fix the size used in a dma_free_coherent() call
In reply to Greg Kroah-HartmanFrom: Christophe JAILLET <[email protected]>
[ Upstream commit 650b323c8e7c3ac4830a20895b1d444fd68dd787 ]
Update the size used in 'dma_free_coherent()' in order to match the one used in the corresponding 'dma_alloc_coherent()'.
[mkp: removed memset() hunk that has already been addressed]
--- drivers/scsi/qla2xxx/qla_mbx.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/qla2xxx/qla_mbx.c +1 -1
@@ -4908,7 +4908,7 @@ qla25xx_set_els_cmds_supported(scsi_qla_host_t *vha) "Done %s.\n", __func__); } -dma_free_coherent (&ha->pdev->dev,DMA_POOL_SIZE , +dma_free_coherent (&ha->pdev->dev,ELS_CMD_MAP_SIZE , els_cmd_map, els_cmd_map_dma);return rval;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 176/633 scsi: qla2xxx: Fix wrong return value in qlt_chk_unresolv_exchg()
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
[ Upstream commit bbf2d06a9d767718bfe6028d6288c03edb98554a ]
In the case of a failed retry, a positive value EIO is returned here. I think this is a typo error. It is necessary to return an error value.
[mkp: caller checks != 0 but the rest of the file uses -Exxx so fix this up to be consistent]
--- drivers/scsi/qla2xxx/qla_target.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/qla2xxx/qla_target.c +1 -1
@@ -5668,7 +5668,7 @@ static int qlt_chk_unresolv_exchg(struct scsi_qla_host *vha,/* found existing exchange */ qpair->retry_term_cnt++;if (qpair->retry_term_cnt >=5 ) { - rc =EIO ; + rc = -EIO ; qpair->retry_term_cnt =0 ;ql_log (ql_log_warn, vha,0xffff ,"Unable to send ABTS Respond. Dumping firmware.\n" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 177/633 scsi: qla2xxx: Fix wrong return value in qla_nvme_register_hba()
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
[ Upstream commit ca4fb89a3d714a770e9c73c649da830f3f4a5326 ]
On an error exit path, a negative error code should be returned instead of a positive return value.
--- drivers/scsi/qla2xxx/qla_nvme.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/qla2xxx/qla_nvme.c +1 -1
@@ -683,7 +683,7 @@ int qla_nvme_register_hba(struct scsi_qla_host *vha)struct nvme_fc_port_template *tmpl;struct qla_hw_data *ha;struct nvme_fc_port_info pinfo; -int ret =EINVAL ; +int ret = -EINVAL ;if (!IS_ENABLED (CONFIG_NVME_FC ))return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 178/633 scsi: csiostor: Fix wrong return value in csio_hw_prep_fw()
In reply to Greg Kroah-HartmanFrom: Tianjia Zhang <[email protected]>
[ Upstream commit 44f4daf8678ae5f08c93bbe70792f90cd88e4649 ]
On an error exit path, a negative error code should be returned instead of a positive return value.
--- drivers/scsi/csiostor/csio_hw.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/csiostor/csio_hw.c +1 -1
@@ -2384,7 +2384,7 @@ static int csio_hw_prep_fw(struct csio_hw *hw, struct fw_info *fw_info,FW_HDR_FW_VER_MICRO_G (c),FW_HDR_FW_VER_BUILD_G (c),FW_HDR_FW_VER_MAJOR_G (k),FW_HDR_FW_VER_MINOR_G (k), FW_HDR_FW_VER_MICRO_G(k), FW_HDR_FW_VER_BUILD_G(k)); - ret =EINVAL ; + ret = -EINVAL ; goto bye; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 179/633 libbpf: Fix unintentional success return code in bpf_object__load
In reply to Greg Kroah-HartmanFrom: Alex Gartrell <[email protected]>
[ Upstream commit ef05afa66c59c2031a3798916ef3ff3778232129 ]
There are code paths where EINVAL is returned directly without setting errno. In that case, errno could be 0, which would mask the failure. For example, if a careless programmer set log_level to 10000 out of laziness, they would have to spend a long time trying to figure out why.
--- tools/lib/bpf/libbpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/lib/bpf/libbpf.c +1 -1
@@ -5253,7 +5253,7 @@ load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt,free (log_buf); goto retry_load; } - ret = -errno; + ret = errno ? -errno : -LIBBPF_ERRNO__LOAD ; cp =libbpf_strerror_r (errno, errmsg,sizeof (errmsg));pr_warn ("load bpf program failed: %s\n" , cp);pr_perm_msg (ret);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 180/633 wilc1000: Fix memleak in wilc_sdio_probe
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 8d95ab34b21ee0f870a9185b6457e8f6eb54914c ]
When devm_clk_get() returns -EPROBE_DEFER, sdio_priv should be freed just like when wilc_cfg80211_init() fails.
--- drivers/staging/wilc1000/sdio.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/staging/wilc1000/sdio.c +3 -2
@@ -151,9 +151,10 @@ static int wilc_sdio_probe(struct sdio_func *func, wilc->dev = &func->dev; wilc->rtc_clk =devm_clk_get (&func->card->dev,"rtc" ); -if (PTR_ERR_OR_ZERO (wilc->rtc_clk) == -EPROBE_DEFER ) +if (PTR_ERR_OR_ZERO (wilc->rtc_clk) == -EPROBE_DEFER ) { +kfree (sdio_priv);return -EPROBE_DEFER ; -else if (!IS_ERR (wilc->rtc_clk)) + }else if (!IS_ERR (wilc->rtc_clk))clk_prepare_enable (wilc->rtc_clk);dev_info (&func->dev,"Driver Initializing success\n" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 181/633 wilc1000: Fix memleak in wilc_bus_probe
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit 9a19a939abfa7d949f584a7ad872e683473fdc14 ]
When devm_clk_get() returns -EPROBE_DEFER, spi_priv should be freed just like when wilc_cfg80211_init() fails.
--- drivers/staging/wilc1000/spi.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/staging/wilc1000/spi.c +3 -2
@@ -112,9 +112,10 @@ static int wilc_bus_probe(struct spi_device *spi) wilc->dev_irq_num = spi->irq; wilc->rtc_clk =devm_clk_get (&spi->dev,"rtc_clk" ); -if (PTR_ERR_OR_ZERO (wilc->rtc_clk) == -EPROBE_DEFER ) +if (PTR_ERR_OR_ZERO (wilc->rtc_clk) == -EPROBE_DEFER ) { +kfree (spi_priv);return -EPROBE_DEFER ; -else if (!IS_ERR (wilc->rtc_clk)) + }else if (!IS_ERR (wilc->rtc_clk))clk_prepare_enable (wilc->rtc_clk);return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 182/633 rtw88: dont treat NULL pointer as an array
In reply to Greg Kroah-HartmanFrom: Brian Norris <[email protected]>
[ Upstream commit 22b726cbdd09d9891ede8aa122a950d2d0ae5e09 ]
I'm not a standards expert, but this really looks to be undefined behavior, when chip->dig_cck may be NULL. (And, we're trying to do a NULL check a few lines down, because some chip variants will use NULL.)
--- drivers/net/wireless/realtek/rtw88/phy.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/wireless/realtek/rtw88/phy.c +3 -2
@@ -147,12 +147,13 @@ void rtw_phy_dig_write(struct rtw_dev *rtwdev, u8 igi) {struct rtw_chip_info *chip = rtwdev->chip;struct rtw_hal *hal = &rtwdev->hal; -const struct rtw_hw_reg *dig_cck = &chip->dig_cck[0 ];u32 addr, mask;u8 path; -if (dig_cck) +if (chip->dig_cck) { +const struct rtw_hw_reg *dig_cck = &chip->dig_cck[0 ];rtw_write32_mask (rtwdev, dig_cck->addr, dig_cck->mask, igi >>1 ); + }for (path =0 ; path < hal->rf_path_num; path++) { addr = chip->dig[path].addr;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 183/633 backlight: sky81452-backlight: Fix refcount imbalance on error
In reply to Greg Kroah-HartmanFrom: [email protected] <[email protected]>
[ Upstream commit b7a4f80bc316a56d6ec8750e93e66f42431ed960 ]
When of_property_read_u32_array() returns an error code, a pairing refcount decrement is needed to keep np's refcount balanced.
--- drivers/video/backlight/sky81452-backlight.c | 1 + 1 file changed, 1 insertion(+)
drivers/video/backlight/sky81452-backlight.c +1 -0
@@ -196,6 +196,7 @@ static struct sky81452_bl_platform_data *sky81452_bl_parse_dt( num_entry);if (ret <0 ) {dev_err (dev,"led-sources node is invalid.\n" ); +of_node_put (np);return ERR_PTR (-EINVAL ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 184/633 staging: emxx_udc: Fix passing of NULL to dma_alloc_coherent()
In reply to Greg Kroah-HartmanFrom: Alex Dewar <[email protected]>
[ Upstream commit cc34073c6248e9cec801bf690d1455f264d12357 ]
In nbu2ss_eq_queue() memory is allocated with dma_alloc_coherent(), though, strangely, NULL is passed as the struct device* argument. Pass the UDC's device instead. Fix up the corresponding call to dma_free_coherent() in the same way.
Build-tested on x86 only.
--- drivers/staging/emxx_udc/emxx_udc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/emxx_udc/emxx_udc.c +2 -2
@@ -2593,7 +2593,7 @@ static int nbu2ss_ep_queue(struct usb_ep *_ep,if (req->unaligned) {if (!ep->virt_buf) - ep->virt_buf =dma_alloc_coherent (NULL ,PAGE_SIZE , + ep->virt_buf =dma_alloc_coherent (udc->dev,PAGE_SIZE , &ep->phys_buf,GFP_ATOMIC |GFP_DMA );if (ep->epnum >0 ) {
@@ -3148,7 +3148,7 @@ static int nbu2ss_drv_remove(struct platform_device *pdev)for (i =0 ; i <NUM_ENDPOINTS ; i++) { ep = &udc->ep[i];if (ep->virt_buf) -dma_free_coherent (NULL ,PAGE_SIZE , (void *)ep->virt_buf, +dma_free_coherent (udc->dev,PAGE_SIZE , (void *)ep->virt_buf, ep->phys_buf); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 185/633 VMCI: check return value of get_user_pages_fast() for errors
In reply to Greg Kroah-HartmanFrom: Alex Dewar <[email protected]>
[ Upstream commit 90ca6333fd65f318c47bff425e1ea36c0a5539f6 ]
In a couple of places in qp_host_get_user_memory(), get_user_pages_fast() is called without properly checking for errors. If e.g. -EFAULT is returned, this negative value will then be passed on to qp_release_pages(), which expects a u64 as input.
Fix this by only calling qp_release_pages() when we have a positive number returned.
--- drivers/misc/vmw_vmci/vmci_queue_pair.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
drivers/misc/vmw_vmci/vmci_queue_pair.c +6 -4
@@ -657,8 +657,9 @@ static int qp_host_get_user_memory(u64 produce_uva,if (retval < (int )produce_q->kernel_if->num_pages) {pr_debug ("get_user_pages_fast(produce) failed (retval=%d)" , retval); -qp_release_pages (produce_q->kernel_if->u.h.header_page, - retval, false); +if (retval >0 ) +qp_release_pages (produce_q->kernel_if->u.h.header_page, + retval, false); err =VMCI_ERROR_NO_MEM ; goto out; }
@@ -670,8 +671,9 @@ static int qp_host_get_user_memory(u64 produce_uva,if (retval < (int )consume_q->kernel_if->num_pages) {pr_debug ("get_user_pages_fast(consume) failed (retval=%d)" , retval); -qp_release_pages (consume_q->kernel_if->u.h.header_page, - retval, false); +if (retval >0 ) +qp_release_pages (consume_q->kernel_if->u.h.header_page, + retval, false);qp_release_pages (produce_q->kernel_if->u.h.header_page, produce_q->kernel_if->num_pages, false); err =VMCI_ERROR_NO_MEM ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 186/633 mm/error_inject: Fix allow_error_inject function signatures.
In reply to Greg Kroah-HartmanFrom: Alexei Starovoitov <[email protected]>
[ Upstream commit 76cd61739fd107a7f7ec4c24a045e98d8ee150f0 ]
'static' and 'static noinline' function attributes make no guarantees that gcc/clang won't optimize them. The compiler may decide to inline 'static' function and in such case ALLOW_ERROR_INJECT becomes meaningless. The compiler could have inlined __add_to_page_cache_locked() in one callsite and didn't inline in another. In such case injecting errors into it would cause unpredictable behavior. It's worse with 'static noinline' which won't be inlined, but it still can be optimized. Like the compiler may decide to remove one argument or constant propagate the value depending on the callsite.
To avoid such issues make sure that these functions are global noinline.
--- mm/filemap.c | 8 ++++---- mm/page_alloc.c | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-)
mm/filemap.c +4 -4
@@ -826,10 +826,10 @@ int replace_page_cache_page(struct page *old, struct page *new, gfp_t gfp_mask) }EXPORT_SYMBOL_GPL (replace_page_cache_page); -static int __add_to_page_cache_locked (struct page *page, -struct address_space *mapping, -pgoff_t offset,gfp_t gfp_mask, -void **shadowp) +noinline int __add_to_page_cache_locked(struct page *page, +struct address_space *mapping, +pgoff_t offset,gfp_t gfp_mask, +void **shadowp) {XA_STATE (xas, &mapping->i_pages, offset);int huge =PageHuge (page);
mm/page_alloc.c +1 -1
@@ -3487,7 +3487,7 @@ static inline bool __should_fail_alloc_page(gfp_t gfp_mask, unsigned int order)#endif /* CONFIG_FAIL_PAGE_ALLOC */ -static noinline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) +noinline bool should_fail_alloc_page(gfp_t gfp_mask, unsigned int order) {return __should_fail_alloc_page (gfp_mask, order); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 187/633 drm: panel: Fix bpc for OrtusTech COM43H4M85ULC panel
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit 3b8095169982ff4ec2a1b4be61b7224bbef23b48 ]
The OrtusTech COM43H4M85ULC panel is a 18-bit RGB panel. Commit f098f168e91c ("drm: panel: Fix bus format for OrtusTech COM43H4M85ULC panel") has fixed the bus formats, but forgot to address the bpc value. Set it to 6.
--- drivers/gpu/drm/panel/panel-simple.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/panel/panel-simple.c +1 -1
@@ -2862,7 +2862,7 @@ static const struct drm_display_mode ortustech_com43h4m85ulc_mode = {static const struct panel_desc ortustech_com43h4m85ulc = { .modes = &ortustech_com43h4m85ulc_mode, .num_modes =1 , - .bpc =8 , + .bpc =6 , .size = { .width =56 , .height =93 ,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 188/633 samples/bpf: Fix to xdpsock to avoid recycling frames
In reply to Greg Kroah-HartmanFrom: Weqaar Janjua <[email protected]>
[ Upstream commit b69e56cf765155dcac0037d7d0f162a2afab76c2 ]
The txpush program in the xdpsock sample application is supposed to send out all packets in the umem in a round-robin fashion. The problem is that it only cycled through the first BATCH_SIZE worth of packets. Fixed this so that it cycles through all buffers in the umem as intended.
--- samples/bpf/xdpsock_user.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
samples/bpf/xdpsock_user.c +5 -5
@@ -921,7 +921,7 @@ static void rx_drop_all(void) } } -static void tx_only (struct xsk_socket_info *xsk,u32 frame_nb,int batch_size) +static void tx_only (struct xsk_socket_info *xsk,u32 *frame_nb,int batch_size) {u32 idx;unsigned int i;
@@ -934,14 +934,14 @@ static void tx_only(struct xsk_socket_info *xsk, u32 frame_nb, int batch_size)for (i =0 ; i < batch_size; i++) {struct xdp_desc *tx_desc =xsk_ring_prod__tx_desc (&xsk->tx, idx + i); - tx_desc->addr = (frame_nb + i) <<XSK_UMEM__DEFAULT_FRAME_SHIFT ; + tx_desc->addr = (*frame_nb + i) <<XSK_UMEM__DEFAULT_FRAME_SHIFT ; tx_desc->len =PKT_SIZE ; }xsk_ring_prod__submit (&xsk->tx, batch_size); xsk->outstanding_tx += batch_size; - frame_nb += batch_size; - frame_nb %=NUM_FRAMES ; + *frame_nb += batch_size; + *frame_nb %=NUM_FRAMES ;complete_tx_only (xsk, batch_size); }
@@ -997,7 +997,7 @@ static void tx_only_all(void) }for (i =0 ; i < num_socks; i++) -tx_only (xsks[i], frame_nb[i], batch_size); +tx_only (xsks[i], &frame_nb[i], batch_size); pkt_cnt += batch_size;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 189/633 drm/crc-debugfs: Fix memleak in crc_control_write
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit f7ec68b341dbd5da13d4c65ce444dcd605f1c42e ]
When verify_crc_source() fails, source needs to be freed. However, current code is returning directly and ends up leaking memory.
--- drivers/gpu/drm/drm_debugfs_crc.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/gpu/drm/drm_debugfs_crc.c +3 -1
@@ -144,8 +144,10 @@ static ssize_t crc_control_write(struct file *file, const char __user *ubuf, source[len -1 ] ='\0' ; ret = crtc->funcs->verify_crc_source (crtc, source, &values_cnt); -if (ret) +if (ret) { +kfree (source);return ret; + }spin_lock_irq (&crc->lock);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 190/633 Bluetooth: Clear suspend tasks on unregister
In reply to Greg Kroah-HartmanFrom: Abhishek Pandit-Subedi <[email protected]>
[ Upstream commit 0e9952804ec9c8ba60f131225eab80634339f042 ]
While unregistering, make sure to clear the suspend tasks before cancelling the work. If the unregister is called during resume from suspend, this will unnecessarily add 2s to the resume time otherwise.
--- net/bluetooth/hci_core.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
net/bluetooth/hci_core.c +11 -0
@@ -3280,6 +3280,16 @@ void hci_copy_identity_address(struct hci_dev *hdev, bdaddr_t *bdaddr, } } +static void hci_suspend_clear_tasks (struct hci_dev *hdev) +{ +int i; + +for (i =0 ; i < __SUSPEND_NUM_TASKS; i++) +clear_bit (i, hdev->suspend_tasks); + +wake_up (&hdev->suspend_wait_q); +} +static int hci_suspend_wait_event (struct hci_dev *hdev) {#define WAKE_COND \
@@ -3609,6 +3619,7 @@ void hci_unregister_dev(struct hci_dev *hdev)cancel_work_sync (&hdev->power_on);unregister_pm_notifier (&hdev->suspend_notifier); +hci_suspend_clear_tasks (hdev);cancel_work_sync (&hdev->suspend_prepare);hci_dev_do_close (hdev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 191/633 selftests: vm: add fragment CONFIG_GUP_BENCHMARK
In reply to Greg Kroah-HartmanFrom: Anatoly Pugachev <[email protected]>
[ Upstream commit cae1d5a2c5a491141faa747e9944ba40ab4ab786 ]
When running gup_benchmark test the following output states that the config options is missing.
$ sudo ./gup_benchmark open: No such file or directory
$ sudo strace -e trace=file ./gup_benchmark 2>&1 | tail -3 openat(AT_FDCWD, "/sys/kernel/debug/gup_benchmark", O_RDWR) = -1 ENOENT (No such file or directory) open: No such file or directory +++ exited with 1 +++
Fix it by adding config option fragment.
--- tools/testing/selftests/vm/config | 1 + 1 file changed, 1 insertion(+)
tools/testing/selftests/vm/config +1 -0
@@ -3,3 +3,4 @@ CONFIG_USERFAULTFD=y CONFIG_TEST_VMALLOC=m CONFIG_DEVICE_PRIVATE=y CONFIG_TEST_HMM=m +CONFIG_GUP_BENCHMARK=y
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 192/633 scsi: ufs: Make ufshcd_print_trs() consider UFSHCD_QUIRK_PRDT_BYTE_GRAN
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
[ Upstream commit cc770ce34aeeff21991f162f0db1a758ea672727 ]
Fix ufshcd_print_trs() to consider UFSHCD_QUIRK_PRDT_BYTE_GRAN when using utp_transfer_req_desc::prd_table_length, so that it doesn't treat the number of bytes as the number of entries.
Originally from Kiwoong Kim
(https://lkml.kernel.org/r/[email protected]).
--- drivers/scsi/ufs/ufshcd.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/ufs/ufshcd.c +3 -0
@@ -484,6 +484,9 @@ void ufshcd_print_trs(struct ufs_hba *hba, unsigned long bitmap, bool pr_prdt) prdt_length =le16_to_cpu ( lrbp->utr_descriptor_ptr->prd_table_length); +if (hba->quirks &UFSHCD_QUIRK_PRDT_BYTE_GRAN ) + prdt_length /=sizeof (struct ufshcd_sg_entry ); + dev_err(hba->dev, "UPIU[%d] - PRDT - %d entries phys@0x%llx\n", tag, prdt_length,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 193/633 binder: Remove bogus warning on failed same-process transaction
In reply to Greg Kroah-HartmanFrom: Jann Horn <[email protected]>
[ Upstream commit e8b8ae7ce32e17a5c29f0289e9e2a39c7dcaa1b8 ]
While binder transactions with the same binder_proc as sender and recipient are forbidden, transactions with the same task_struct as sender and recipient are possible (even though currently there is a weird check in binder_transaction() that rejects them in the target==0 case). Therefore, task_struct identities can't be used to distinguish whether the caller is running in the context of the sender or the recipient.
Since I see no easy way to make this WARN_ON() useful and correct, let's just remove it.
--- drivers/android/binder.c | 2 -- 1 file changed, 2 deletions(-)
drivers/android/binder.c +0 -2
@@ -2324,8 +2324,6 @@ static void binder_transaction_buffer_release(struct binder_proc *proc,* file is done when the transaction is torn * down. */ -WARN_ON (failed_at && - proc->tsk == current->group_leader); }break ;case BINDER_TYPE_PTR :/*
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 194/633 tty: serial: earlycon dependency
In reply to Greg Kroah-HartmanFrom: Tong Zhang <[email protected]>
[ Upstream commit 0fb9342d06b0f667b915ba58bfefc030e534a218 ]
parse_options() in drivers/tty/serial/earlycon.c calls uart_parse_earlycon in drivers/tty/serial/serial_core.c therefore selecting SERIAL_EARLYCON should automatically select SERIAL_CORE, otherwise will result in symbol not found error during linking if SERIAL_CORE is not configured as builtin
--- drivers/tty/serial/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/Kconfig +1 -0
@@ -8,6 +8,7 @@ menu "Serial drivers" config SERIAL_EARLYCON bool + depends on SERIAL_CORE help Support for early consoles with the earlycon parameter. This enables the console before standard serial driver is probed. The console is
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 195/633 tty: hvcs: Dont NULL tty->driver_data until hvcs_cleanup()
In reply to Greg Kroah-HartmanFrom: Tyrel Datwyler <[email protected]>
[ Upstream commit 63ffcbdad738e3d1c857027789a2273df3337624 ]
The code currently NULLs tty->driver_data in hvcs_close() with the intent of informing the next call to hvcs_open() that device needs to be reconfigured. However, when hvcs_cleanup() is called we copy hvcsd from tty->driver_data which was previoulsy NULLed by hvcs_close() and our call to tty_port_put(&hvcsd->port) doesn't actually do anything since &hvcsd->port ends up translating to NULL by chance. This has the side effect that when hvcs_remove() is called we have one too many port references preventing hvcs_destuct_port() from ever being called. This also prevents us from reusing the /dev/hvcsX node in a future hvcs_probe() and we can eventually run out of /dev/hvcsX devices.
Fix this by waiting to NULL tty->driver_data in hvcs_cleanup().
--- drivers/tty/hvc/hvcs.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/tty/hvc/hvcs.c +7 -7
@@ -1216,13 +1216,6 @@ static void hvcs_close(struct tty_struct *tty, struct file *filp)tty_wait_until_sent (tty,HVCS_CLOSE_WAIT ); -/* -* This line is important because it tells hvcs_open that this -* device needs to be re-configured the next time hvcs_open is -* called. -*/ - tty->driver_data =NULL ; -free_irq (irq, hvcsd);return ; }else if (hvcsd->port.count <0 ) {
@@ -1237,6 +1230,13 @@ static void hvcs_cleanup(struct tty_struct * tty) {struct hvcs_struct *hvcsd = tty->driver_data; +/* +* This line is important because it tells hvcs_open that this +* device needs to be re-configured the next time hvcs_open is +* called. +*/ + tty->driver_data =NULL ; +tty_port_put (&hvcsd->port); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 196/633 pty: do tty_flip_buffer_push without port->lock in pty_write
In reply to Greg Kroah-HartmanFrom: Artem Savkov <[email protected]>
[ Upstream commit 71a174b39f10b4b93223d374722aa894b5d8a82e ]
b6da31b2c07c "tty: Fix data race in tty_insert_flip_string_fixed_flag" puts tty_flip_buffer_push under port->lock introducing the following possible circular locking dependency:
[30129.876566] ======================================================
[30129.876566] WARNING: possible circular locking dependency detected
[30129.876567] 5.9.0-rc2+ #3 Tainted: G S W
[30129.876568] ------------------------------------------------------
[30129.876568] sysrq.sh/1222 is trying to acquire lock:
[30129.876569] ffffffff92c39480 (console_owner){....}-{0:0}, at: console_unlock+0x3fe/0xa90[30129.876572] but task is already holding lock:
[30129.876572] ffff888107cb9018 (&pool->lock/1){-.-.}-{2:2}, at: show_workqueue_state.cold.55+0x15b/0x6ca[30129.876576] which lock already depends on the new lock.
[30129.876577] the existing dependency chain (in reverse order) is:
[30129.876578] -> #3 (&pool->lock/1){-.-.}-{2:2}:
[30129.876581] _raw_spin_lock+0x30/0x70
[30129.876581] __queue_work+0x1a3/0x10f0
[30129.876582] queue_work_on+0x78/0x80
[30129.876582] pty_write+0x165/0x1e0
[30129.876583] n_tty_write+0x47f/0xf00
[30129.876583] tty_write+0x3d6/0x8d0
[30129.876584] vfs_write+0x1a8/0x650[30129.876588] -> #2 (&port->lock#2){-.-.}-{2:2}:
[30129.876590] _raw_spin_lock_irqsave+0x3b/0x80
[30129.876591] tty_port_tty_get+0x1d/0xb0
[30129.876592] tty_port_default_wakeup+0xb/0x30
[30129.876592] serial8250_tx_chars+0x3d6/0x970
[30129.876593] serial8250_handle_irq.part.12+0x216/0x380
[30129.876593] serial8250_default_handle_irq+0x82/0xe0
[30129.876594] serial8250_interrupt+0xdd/0x1b0
[30129.876595] __handle_irq_event_percpu+0xfc/0x850[30129.876602] -> #1 (&port->lock){-.-.}-{2:2}:
[30129.876605] _raw_spin_lock_irqsave+0x3b/0x80
[30129.876605] serial8250_console_write+0x12d/0x900
[30129.876606] console_unlock+0x679/0xa90
[30129.876606] register_console+0x371/0x6e0
[30129.876607] univ8250_console_init+0x24/0x27
[30129.876607] console_init+0x2f9/0x45e[30129.876609] -> #0 (console_owner){....}-{0:0}:
[30129.876611] __lock_acquire+0x2f70/0x4e90
[30129.876612] lock_acquire+0x1ac/0xad0
[30129.876612] console_unlock+0x460/0xa90
[30129.876613] vprintk_emit+0x130/0x420
[30129.876613] printk+0x9f/0xc5
[30129.876614] show_pwq+0x154/0x618
[30129.876615] show_workqueue_state.cold.55+0x193/0x6ca
[30129.876615] __handle_sysrq+0x244/0x460
[30129.876616] write_sysrq_trigger+0x48/0x4a
[30129.876616] proc_reg_write+0x1a6/0x240
[30129.876617] vfs_write+0x1a8/0x650[30129.876619] other info that might help us debug this:
[30129.876620] Chain exists of: [30129.876621] console_owner --> &port->lock#2 --> &pool->lock/1
[30129.876625] Possible unsafe locking scenario:
[30129.876626] CPU0 CPU1 [30129.876626] ---- ---- [30129.876627] lock(&pool->lock/1); [30129.876628] lock(&port->lock#2); [30129.876630] lock(&pool->lock/1); [30129.876631] lock(console_owner);
[30129.876633] *** DEADLOCK ***
[30129.876634] 5 locks held by sysrq.sh/1222:
[30129.876634] #0: ffff8881d3ce0470 (sb_writers#3){.+.+}-{0:0}, at: vfs_write+0x359/0x650
[30129.876637] #1: ffffffff92c612c0 (rcu_read_lock){....}-{1:2}, at: __handle_sysrq+0x4d/0x460
[30129.876640] #2: ffffffff92c612c0 (rcu_read_lock){....}-{1:2}, at: show_workqueue_state+0x5/0xf0
[30129.876642] #3: ffff888107cb9018 (&pool->lock/1){-.-.}-{2:2}, at: show_workqueue_state.cold.55+0x15b/0x6ca
[30129.876645] #4: ffffffff92c39980 (console_lock){+.+.}-{0:0}, at: vprintk_emit+0x123/0x420[30129.876648] stack backtrace: [30129.876649] CPU: 3 PID: 1222 Comm: sysrq.sh Tainted: G S W 5.9.0-rc2+ #3 [30129.876649] Hardware name: Intel Corporation 2012 Client Platform/Emerald Lake 2, BIOS ACRVMBY1.86C.0078.P00.1201161002 01/16/2012 [30129.876650] Call Trace: [30129.876650] dump_stack+0x9d/0xe0 [30129.876651] check_noncircular+0x34f/0x410 [30129.876653] __lock_acquire+0x2f70/0x4e90 [30129.876656] lock_acquire+0x1ac/0xad0 [30129.876658] console_unlock+0x460/0xa90 [30129.876660] vprintk_emit+0x130/0x420 [30129.876660] printk+0x9f/0xc5 [30129.876661] show_pwq+0x154/0x618 [30129.876662] show_workqueue_state.cold.55+0x193/0x6ca [30129.876664] __handle_sysrq+0x244/0x460 [30129.876665] write_sysrq_trigger+0x48/0x4a [30129.876665] proc_reg_write+0x1a6/0x240 [30129.876666] vfs_write+0x1a8/0x650
It looks like the commit was aimed to protect tty_insert_flip_string and there is no need for tty_flip_buffer_push to be under this lock.
--- drivers/tty/pty.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/tty/pty.c +1 -1
@@ -120,10 +120,10 @@ static int pty_write(struct tty_struct *tty, const unsigned char *buf, int c)spin_lock_irqsave (&to->port->lock, flags);/* Stuff the data into the input queue of the other end */ c =tty_insert_flip_string (to->port, buf, c); +spin_unlock_irqrestore (&to->port->lock, flags);/* And shovel */ if (c)tty_flip_buffer_push (to->port); -spin_unlock_irqrestore (&to->port->lock, flags); }return c; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 197/633 pwm: lpss: Fix off by one error in base_unit math in pwm_lpss_prepare()
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit 181f4d2f44463fe09fe4df02e03095cb87151c29 ]
According to the data-sheet the way the PWM controller works is that each input clock-cycle the base_unit gets added to a N bit counter and that counter overflowing determines the PWM output frequency.
So assuming e.g. a 16 bit counter this means that if base_unit is set to 1, after 65535 input clock-cycles the counter has been increased from 0 to 65535 and it will overflow on the next cycle, so it will overflow after every 65536 clock cycles and thus the calculations done in pwm_lpss_prepare() should use 65536 and not 65535.
This commit fixes this. Note this also aligns the calculations in pwm_lpss_prepare() with those in pwm_lpss_get_state().
Note this effectively reverts commit 684309e5043e ("pwm: lpss: Avoid potential overflow of base_unit"). The next patch in this series really fixes the potential overflow of the base_unit value.
--- drivers/pwm/pwm-lpss.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/pwm/pwm-lpss.c +3 -3
@@ -93,7 +93,7 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm,* The equation is: * base_unit = round(base_unit_range * freq / c) */ - base_unit_range =BIT (lpwm->info->base_unit_bits) -1 ; + base_unit_range =BIT (lpwm->info->base_unit_bits); freq *= base_unit_range; base_unit =DIV_ROUND_CLOSEST_ULL (freq, c);
@@ -104,8 +104,8 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, orig_ctrl = ctrl =pwm_lpss_read (pwm); ctrl &= ~PWM_ON_TIME_DIV_MASK ; - ctrl &= ~(base_unit_range <<PWM_BASE_UNIT_SHIFT ); - base_unit &= base_unit_range; + ctrl &= ~((base_unit_range -1 ) <<PWM_BASE_UNIT_SHIFT ); + base_unit &= (base_unit_range -1 ); ctrl |= (u32 ) base_unit <<PWM_BASE_UNIT_SHIFT ; ctrl |= on_time_div;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 198/633 pwm: lpss: Add range limit check for the base_unit register value
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
[ Upstream commit ef9f60daab309558c8bb3e086a9a11ee40bd6061 ]
When the user requests a high enough period ns value, then the calculations in pwm_lpss_prepare() might result in a base_unit value of 0.
But according to the data-sheet the way the PWM controller works is that each input clock-cycle the base_unit gets added to a N bit counter and that counter overflowing determines the PWM output frequency. Adding 0 to the counter is a no-op. The data-sheet even explicitly states that writing 0 to the base_unit bits will result in the PWM outputting a continuous 0 signal.
When the user requestes a low enough period ns value, then the calculations in pwm_lpss_prepare() might result in a base_unit value which is bigger then base_unit_range - 1. Currently the codes for this deals with this by applying a mask:
base_unit &= (base_unit_range - 1);
But this means that we let the value overflow the range, we throw away the higher bits and store whatever value is left in the lower bits into the register leading to a random output frequency, rather then clamping the output frequency to the highest frequency which the hardware can do.
This commit fixes both issues by clamping the base_unit value to be between 1 and (base_unit_range - 1).
--- drivers/pwm/pwm-lpss.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/pwm/pwm-lpss.c +2 -1
@@ -97,6 +97,8 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, freq *= base_unit_range; base_unit =DIV_ROUND_CLOSEST_ULL (freq, c); +/* base_unit must not be 0 and we also want to avoid overflowing it */ + base_unit =clamp_val (base_unit,1 , base_unit_range -1 ); on_time_div =255ULL * duty_ns;do_div (on_time_div, period_ns);
@@ -105,7 +107,6 @@ static void pwm_lpss_prepare(struct pwm_lpss_chip *lpwm, struct pwm_device *pwm, orig_ctrl = ctrl =pwm_lpss_read (pwm); ctrl &= ~PWM_ON_TIME_DIV_MASK ; ctrl &= ~((base_unit_range -1 ) <<PWM_BASE_UNIT_SHIFT ); - base_unit &= (base_unit_range -1 ); ctrl |= (u32 ) base_unit <<PWM_BASE_UNIT_SHIFT ; ctrl |= on_time_div;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 199/633 drivers/virt/fsl_hypervisor: Fix error handling path
In reply to Greg Kroah-HartmanFrom: Souptick Joarder <[email protected]>
[ Upstream commit 7f360bec37857bfd5a48cef21d86f58a09a3df63 ]
First, when memory allocation for sg_list_unaligned failed, there is a bug of calling put_pages() as we haven't pinned any pages.
Second, if get_user_pages_fast() failed we should unpin num_pinned pages.
This will address both.
As part of these changes, minor update in documentation.
--- drivers/virt/fsl_hypervisor.c | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-)
drivers/virt/fsl_hypervisor.c +8 -9
@@ -157,7 +157,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)unsigned int i;long ret =0 ; -int num_pinned;/* return value from get_user_pages() */ +int num_pinned =0 ;/* return value from get_user_pages_fast() */ phys_addr_t remote_paddr;/* The next address in the remote buffer */ uint32_t count;/* The number of bytes left to copy */
@@ -174,7 +174,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)return -EINVAL ;/* -* The array of pages returned by get_user_pages() covers only +* The array of pages returned by get_user_pages_fast() covers only * page-aligned memory. Since the user buffer is probably not * page-aligned, we need to handle the discrepancy. *
@@ -224,7 +224,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)/* * 'pages' is an array of struct page pointers that's initialized by -* get_user_pages(). +* get_user_pages_fast(). */ pages =kcalloc (num_pages,sizeof (struct page *),GFP_KERNEL );if (!pages) {
@@ -241,7 +241,7 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p)if (!sg_list_unaligned) {pr_debug ("fsl-hv: could not allocate S/G list\n" ); ret = -ENOMEM ; - goto exit; + goto free_pages; } sg_list =PTR_ALIGN (sg_list_unaligned,sizeof (struct fh_sg_list ));
@@ -250,7 +250,6 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) num_pages, param.source != -1 ? FOLL_WRITE : 0, pages);if (num_pinned != num_pages) { -/* get_user_pages() failed */ pr_debug ("fsl-hv: could not lock source buffer\n" ); ret = (num_pinned <0 ) ? num_pinned : -EFAULT ; goto exit;
@@ -292,13 +291,13 @@ static long ioctl_memcpy(struct fsl_hv_ioctl_memcpy __user *p) virt_to_phys(sg_list), num_pages); exit: -if (pages) { -for (i =0 ; i < num_pages; i++) -if (pages[i]) -put_page (pages[i]); +if (pages && (num_pinned >0 )) { +for (i =0 ; i < num_pinned; i++) +put_page (pages[i]); }kfree (sg_list_unaligned); +free_pages:kfree (pages);if (!ret)
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 200/633 ath11k: fix a double free and a memory leak
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit 7e8453e35e406981d7c529ff8f804285bc894ba3 ]
clang static analyzer reports this problem
mac.c:6204:2: warning: Attempt to free released memory
kfree(ar->mac.sbands[NL80211_BAND_2GHZ].channels);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~The channels pointer is allocated in ath11k_mac_setup_channels_rates() When it fails midway, it cleans up the memory it has already allocated. So the error handling needs to skip freeing the memory.
There is a second problem. ath11k_mac_setup_channels_rates(), allocates 3 channels. err_free misses releasing ar->mac.sbands[NL80211_BAND_6GHZ].channels
--- drivers/net/wireless/ath/ath11k/mac.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/net/wireless/ath/ath11k/mac.c +3 -1
@@ -5824,7 +5824,7 @@ static int __ath11k_mac_register(struct ath11k *ar) ret =ath11k_mac_setup_channels_rates (ar, cap->supported_bands);if (ret) - goto err_free; + goto err;ath11k_mac_setup_ht_vht_cap (ar, cap, &ht_cap);ath11k_mac_setup_he_cap (ar, cap);
@@ -5938,7 +5938,9 @@ static int __ath11k_mac_register(struct ath11k *ar) err_free:kfree (ar->mac.sbands[NL80211_BAND_2GHZ ].channels);kfree (ar->mac.sbands[NL80211_BAND_5GHZ ].channels); +kfree (ar->mac.sbands[NL80211_BAND_6GHZ ].channels); +err:SET_IEEE80211_DEV (ar->hw,NULL );return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 201/633 video: fbdev: vga16fb: fix setting of pixclock because a pass-by-value error
In reply to Greg Kroah-HartmanFrom: Colin Ian King <[email protected]>
[ Upstream commit c72fab81ceaa54408b827a2f0486d9a0f4be34cf ]
The pixclock is being set locally because it is being passed as a pass-by-value argument rather than pass-by-reference, so the computed pixclock is never being set in var->pixclock. Fix this by passing by reference.
[This dates back to 2002, I found the offending commit from the git history git://git.kernel.org/pub/scm/linux/kernel/git/tglx/history.git ]
Addresses-Coverity: ("Unused value")
--- drivers/video/fbdev/vga16fb.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/video/fbdev/vga16fb.c +7 -7
@@ -243,7 +243,7 @@ static void vga16fb_update_fix(struct fb_info *info) }static void vga16fb_clock_chip (struct vga16fb_par *par, -unsigned int pixclock, +unsigned int *pixclock,const struct fb_info *info,int mul,int div) {
@@ -259,14 +259,14 @@ static void vga16fb_clock_chip(struct vga16fb_par *par, { 0 /* bad */, 0x00, 0x00}};int err; - pixclock = (pixclock * mul) / div; + *pixclock = (*pixclock * mul) / div; best = vgaclocks; - err = pixclock - best->pixclock; + err = *pixclock - best->pixclock;if (err <0 ) err = -err;for (ptr = vgaclocks +1 ; ptr->pixclock; ptr++) {int tmp; - tmp = pixclock - ptr->pixclock; + tmp = *pixclock - ptr->pixclock;if (tmp <0 ) tmp = -tmp;if (tmp < err) { err = tmp;
@@ -275,7 +275,7 @@ static void vga16fb_clock_chip(struct vga16fb_par *par, } par->misc |= best->misc; par->clkdiv = best->seq_clock_mode; - pixclock = (best->pixclock * div) / mul; + *pixclock = (best->pixclock * div) / mul; }#define FAIL (X ) return -EINVAL
@@ -497,10 +497,10 @@ static int vga16fb_check_var(struct fb_var_screeninfo *var,if (mode &MODE_8BPP )/* pixel clock == vga clock / 2 */ -vga16fb_clock_chip (par, var->pixclock, info,1 ,2 ); +vga16fb_clock_chip (par, &var->pixclock, info,1 ,2 );else /* pixel clock == vga clock */ -vga16fb_clock_chip (par, var->pixclock, info,1 ,1 ); +vga16fb_clock_chip (par, &var->pixclock, info,1 ,1 ); var->red.offset = var->green.offset = var->blue.offset = var->transp.offset =0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 202/633 video: fbdev: sis: fix null ptr dereference
In reply to Greg Kroah-HartmanFrom: Tom Rix <[email protected]>
[ Upstream commit ad6f93e9cd56f0b10e9b22e3e137d17a1a035242 ]
Clang static analysis reports this representative error
init.c:2501:18: warning: Array access (from variable 'queuedata') results
in a null pointer dereference
templ |= ((queuedata[i] & 0xc0) << 3);
This is the problem block of code
if(ModeNo > 0x13) {
...
if(SiS_Pr->ChipType == SIS_730) {
queuedata = &FQBQData730[0];
} else {
queuedata = &FQBQData[0];
}} else {
}
queuedata is not set in the else block
Reviewing the old code, the arrays FQBQData730 and FQBQData were used directly.
So hoist the setting of queuedata out of the if-else block.
--- drivers/video/fbdev/sis/init.c | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
drivers/video/fbdev/sis/init.c +5 -6
@@ -2428,6 +2428,11 @@ SiS_SetCRT1FIFO_630(struct SiS_Private *SiS_Pr, unsigned short ModeNo, i =0 ; +if (SiS_Pr->ChipType ==SIS_730 ) + queuedata = &FQBQData730[0 ]; +else + queuedata = &FQBQData[0 ]; +if (ModeNo >0x13 ) {/* Get VCLK */
@@ -2445,12 +2450,6 @@ SiS_SetCRT1FIFO_630(struct SiS_Private *SiS_Pr, unsigned short ModeNo,/* Get half colordepth */ colorth = colortharray[(SiS_Pr->SiS_ModeType - ModeEGA)]; -if (SiS_Pr->ChipType ==SIS_730 ) { - queuedata = &FQBQData730[0 ]; - }else { - queuedata = &FQBQData[0 ]; - } - do { templ = SiS_CalcDelay2(SiS_Pr, queuedata[i]) * VCLK * colorth;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 203/633 video: fbdev: radeon: Fix memleak in radeonfb_pci_register
In reply to Greg Kroah-HartmanFrom: Dinghao Liu <[email protected]>
[ Upstream commit fe6c6a4af2be8c15bac77f7ea160f947c04840d1 ]
When radeon_kick_out_firmware_fb() fails, info should be freed just like the subsequent error paths.
--- drivers/video/fbdev/aty/radeon_base.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/aty/radeon_base.c +1 -1
@@ -2311,7 +2311,7 @@ static int radeonfb_pci_register(struct pci_dev *pdev, ret =radeon_kick_out_firmware_fb (pdev);if (ret) -return ret; + goto err_release_fb;/* request the mem regions */ ret =pci_request_region (pdev,0 ,"radeonfb framebuffer" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 204/633 ASoC: fsl: imx-es8328: add missing put_device() call in imx_es8328_probe()
In reply to Greg Kroah-HartmanFrom: Yu Kuai <[email protected]>
[ Upstream commit e525db7e4b44c5b2b5aac0dad24e23cb58c54d22 ]
if of_find_device_by_node() succeed, imx_es8328_probe() doesn't have a corresponding put_device(). Thus add a jump target to fix the exception handling for this function implementation.
--- sound/soc/fsl/imx-es8328.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
sound/soc/fsl/imx-es8328.c +7 -5
@@ -145,13 +145,13 @@ static int imx_es8328_probe(struct platform_device *pdev) data =devm_kzalloc (dev,sizeof (*data),GFP_KERNEL );if (!data) { ret = -ENOMEM ; - goto fail; + goto put_device; } comp =devm_kzalloc (dev,3 *sizeof (*comp),GFP_KERNEL );if (!comp) { ret = -ENOMEM ; - goto fail; + goto put_device; } data->dev = dev;
@@ -182,12 +182,12 @@ static int imx_es8328_probe(struct platform_device *pdev) ret =snd_soc_of_parse_card_name (&data->card,"model" );if (ret) {dev_err (dev,"Unable to parse card name\n" ); - goto fail; + goto put_device; } ret =snd_soc_of_parse_audio_routing (&data->card,"audio-routing" );if (ret) {dev_err (dev,"Unable to parse routing: %d\n" , ret); - goto fail; + goto put_device; } data->card.num_links =1 ; data->card.owner =THIS_MODULE ;
@@ -196,10 +196,12 @@ static int imx_es8328_probe(struct platform_device *pdev) ret =snd_soc_register_card (&data->card);if (ret) {dev_err (dev,"Unable to register: %d\n" , ret); - goto fail; + goto put_device; }platform_set_drvdata (pdev, data); +put_device: +put_device (&ssi_pdev->dev); fail:of_node_put (ssi_np);of_node_put (codec_np);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 205/633 scsi: ufs: ufs-mediatek: Fix HOST_PA_TACTIVATE quirk
In reply to Greg Kroah-HartmanFrom: Stanley Chu <[email protected]>
[ Upstream commit a3e40b80dc951057033dce86f0e675b2b822b513 ]
Simply add HOST_PA_TACTIVATE quirk back since it was incorrectly removed before.
--- drivers/scsi/ufs/ufs-mediatek.c | 6 ------ 1 file changed, 6 deletions(-)
drivers/scsi/ufs/ufs-mediatek.c +0 -6
@@ -585,13 +585,7 @@ static int ufs_mtk_apply_dev_quirks(struct ufs_hba *hba)static void ufs_mtk_fixup_dev_quirks (struct ufs_hba *hba) { -struct ufs_dev_info *dev_info = &hba->dev_info; -u16 mid = dev_info->wmanufacturerid; -ufshcd_fixup_dev_quirks (hba, ufs_mtk_dev_fixups); - -if (mid ==UFS_VENDOR_SAMSUNG ) - hba->dev_quirks &= ~UFS_DEVICE_QUIRK_HOST_PA_TACTIVATE ; }/**
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 206/633 HID: roccat: add bounds checking in kone_sysfs_write_settings()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit d4f98dbfe717490e771b6e701904bfcf4b4557f0 ]
This code doesn't check if "settings->startup_profile" is within bounds and that could result in an out of bounds array access. What the code does do is it checks if the settings can be written to the firmware, so it's possible that the firmware has a bounds check? It's safer and easier to verify when the bounds checking is done in the kernel.
--- drivers/hid/hid-roccat-kone.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-)
drivers/hid/hid-roccat-kone.c +16 -7
@@ -294,31 +294,40 @@ static ssize_t kone_sysfs_write_settings(struct file *fp, struct kobject *kobj,struct kone_device *kone =hid_get_drvdata (dev_get_drvdata (dev));struct usb_device *usb_dev =interface_to_usbdev (to_usb_interface (dev));int retval =0 , difference, old_profile; +struct kone_settings *settings = (struct kone_settings *)buf;/* I need to get my data in one piece */ if (off !=0 || count !=sizeof (struct kone_settings ))return -EINVAL ;mutex_lock (&kone->kone_lock); - difference =memcmp (buf, &kone->settings,sizeof (struct kone_settings )); + difference =memcmp (settings, &kone->settings, +sizeof (struct kone_settings ));if (difference) { - retval =kone_set_settings (usb_dev, - (struct kone_settings const *)buf); -if (retval) { -mutex_unlock (&kone->kone_lock); -return retval; +if (settings->startup_profile <1 || + settings->startup_profile >5 ) { + retval = -EINVAL ; + goto unlock; } + retval =kone_set_settings (usb_dev, settings); +if (retval) + goto unlock; + old_profile = kone->settings.startup_profile; -memcpy (&kone->settings, buf,sizeof (struct kone_settings )); +memcpy (&kone->settings, settings,sizeof (struct kone_settings ));kone_profile_activated (kone, kone->settings.startup_profile);if (kone->settings.startup_profile != old_profile)kone_profile_report (kone, kone->settings.startup_profile); } +unlock:mutex_unlock (&kone->kone_lock); +if (retval) +return retval; +return sizeof (struct kone_settings ); } static BIN_ATTR(settings, 0660, kone_sysfs_read_settings,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 207/633 drm/msm: Avoid div-by-zero in dpu_crtc_atomic_check()
In reply to Greg Kroah-HartmanFrom: Stephen Boyd <[email protected]>
[ Upstream commit 22f760941844dbcee6ee446e1896532f6dff01ef ]
The cstate->num_mixers member is only set to a non-zero value once dpu_encoder_virt_mode_set() is called, but the atomic check function can be called by userspace before that. Let's avoid the div-by-zero here and inside _dpu_crtc_setup_lm_bounds() by skipping this part of the atomic check if dpu_encoder_virt_mode_set() hasn't been called yet. This fixes an UBSAN warning:
UBSAN: Undefined behaviour in drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c:860:31 division by zero CPU: 7 PID: 409 Comm: frecon Tainted: G S 5.4.31 #128 Hardware name: Google Trogdor (rev0) (DT) Call trace: dump_backtrace+0x0/0x14c show_stack+0x20/0x2c dump_stack+0xa0/0xd8 __ubsan_handle_divrem_overflow+0xec/0x110 dpu_crtc_atomic_check+0x97c/0x9d4 drm_atomic_helper_check_planes+0x160/0x1c8 drm_atomic_helper_check+0x54/0xbc drm_atomic_check_only+0x6a8/0x880 drm_atomic_commit+0x20/0x5c drm_atomic_helper_set_config+0x98/0xa0 drm_mode_setcrtc+0x308/0x5dc drm_ioctl_kernel+0x9c/0x114 drm_ioctl+0x2ac/0x4b0 drm_compat_ioctl+0xe8/0x13c __arm64_compat_sys_ioctl+0x184/0x324 el0_svc_common+0xa4/0x154 el0_svc_compat_handler+0x
--- drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_crtc.c +5 -3
@@ -881,7 +881,7 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,struct drm_plane *plane;struct drm_display_mode *mode; -int cnt =0 , rc =0 , mixer_width, i, z_pos; +int cnt =0 , rc =0 , mixer_width =0 , i, z_pos;struct dpu_multirect_plane_states multirect_plane[DPU_STAGE_MAX *2 ];int multirect_count =0 ;
@@ -914,9 +914,11 @@ static int dpu_crtc_atomic_check(struct drm_crtc *crtc,memset (pipe_staged,0 ,sizeof (pipe_staged)); - mixer_width = mode->hdisplay / cstate->num_mixers; +if (cstate->num_mixers) { + mixer_width = mode->hdisplay / cstate->num_mixers; -_dpu_crtc_setup_lm_bounds (crtc, state); +_dpu_crtc_setup_lm_bounds (crtc, state); + } crtc_rect.x2 = mode->hdisplay; crtc_rect.y2 = mode->vdisplay;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 208/633 drm/panfrost: Ensure GPU quirks are always initialised
In reply to Greg Kroah-HartmanFrom: Steven Price <[email protected]>
[ Upstream commit 8c3c818c23a5bbce6ff180dd2ee04415241df77c ]
The GPU 'CONFIG' registers used to work around hardware issues are cleared on reset so need to be programmed every time the GPU is reset. However panfrost_device_reset() failed to do this.
To avoid this in future instead move the call to panfrost_gpu_init_quirks() to panfrost_gpu_power_on() so that the regsiters are always programmed just before the cores are powered.
--- drivers/gpu/drm/panfrost/panfrost_gpu.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/panfrost/panfrost_gpu.c +2 -1
@@ -304,6 +304,8 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev)int ret;u32 val; +panfrost_gpu_init_quirks (pfdev); +/* Just turn on everything for now */ gpu_write (pfdev,L2_PWRON_LO , pfdev->features.l2_present); ret = readl_relaxed_poll_timeout(pfdev->iomem + L2_READY_LO,
@@ -355,7 +357,6 @@ int panfrost_gpu_init(struct panfrost_device *pfdev)return err; } -panfrost_gpu_init_quirks (pfdev);panfrost_gpu_power_on (pfdev);return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 209/633 iomap: Clear page error before beginning a write
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit e6e7ca92623a43156100306861272e04d46385fc ]
If we find a page in write_begin which is !Uptodate, we need to clear any error on the page before starting to read data into it. This matches how filemap_fault(), do_read_cache_page() and generic_file_buffered_read() handle PageError on !Uptodate pages. When calling iomap_set_range_uptodate() in __iomap_write_begin(), blocks were not being marked as uptodate.
This was found with generic/127 and a specially modified kernel which would fail (some) readahead I/Os. The test read some bytes in a prior page which caused readahead to extend into page 0x34. There was a subsequent write to page 0x34, followed by a read to page 0x34. Because the blocks were still marked as !Uptodate, the read caused all blocks to be re-read, overwriting the write. With this change, and the next one, the bytes which were written are marked as being Uptodate, so even though the page is still marked as !Uptodate, the blocks containing the written data are not re-read from storage.
--- fs/iomap/buffered-io.c | 1 + 1 file changed, 1 insertion(+)
fs/iomap/buffered-io.c +1 -0
@@ -578,6 +578,7 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,if (PageUptodate (page))return 0 ; +ClearPageError (page); do { iomap_adjust_read_range(inode, iop, &block_start,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 210/633 iomap: Mark read blocks uptodate in write_begin
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit 14284fedf59f1647264f4603d64418cf1fcd3eb0 ]
When bringing (portions of) a page uptodate, we were marking blocks that were zeroed as being uptodate, but not blocks that were read from storage.
Like the previous commit, this problem was found with generic/127 and a kernel which failed readahead I/Os. This bug causes writes to be silently lost when working with flaky storage.
--- fs/iomap/buffered-io.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-)
fs/iomap/buffered-io.c +6 -8
@@ -574,7 +574,6 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,loff_t block_start = pos & ~(block_size -1 );loff_t block_end = (pos + len + block_size -1 ) & ~(block_size -1 );unsigned from =offset_in_page (pos), to = from + len, poff, plen; -int status;if (PageUptodate (page))return 0 ;
@@ -595,14 +594,13 @@ __iomap_write_begin(struct inode *inode, loff_t pos, unsigned len, int flags,if (WARN_ON_ONCE (flags &IOMAP_WRITE_F_UNSHARE ))return -EIO ;zero_user_segments (page, poff, from, to, poff + plen); -iomap_set_range_uptodate (page, poff, plen); -continue ; + }else { +int status =iomap_read_page_sync (block_start, page, + poff, plen, srcmap); +if (status) +return status; } - - status =iomap_read_page_sync (block_start, page, poff, plen, - srcmap); -if (status) -return status; +iomap_set_range_uptodate (page, poff, plen); }while ((block_start += plen) < block_end);return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 211/633 selftests/lkdtm: Use "comm" instead of "diff" for dmesg
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
[ Upstream commit d00451c8118f8f7ab8e057bc6ee2f8b7d70b6a1c ]
Instead of full GNU diff (which smaller boot environments may not have), use "comm" which is more available.
--- tools/testing/selftests/lkdtm/run.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/lkdtm/run.sh +1 -1
@@ -82,7 +82,7 @@ dmesg > "$DMESG" ($SHELL -c 'cat <(echo '"$test"') >'"$TRIGGER" 2>/dev/null) || true # Record and dump the results -dmesg | diff --changed-group-format='%>' --unchanged-group-format='' "$DMESG" - > "$LOG" || true +dmesg | comm --nocheck-order -13 "$DMESG" - > "$LOG" || true cat "$LOG" # Check for expected output
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 212/633 Bluetooth: Re-order clearing suspend tasks
In reply to Greg Kroah-HartmanFrom: Abhishek Pandit-Subedi <[email protected]>
[ Upstream commit 3eec158d5eca7dd455118d9e00568aad2371219f ]
Unregister_pm_notifier is a blocking call so suspend tasks should be cleared beforehand. Otherwise, the notifier will wait for completion before returning (and we encounter a 2s timeout on resume).
--- net/bluetooth/hci_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/bluetooth/hci_core.c +1 -1
@@ -3618,8 +3618,8 @@ void hci_unregister_dev(struct hci_dev *hdev)cancel_work_sync (&hdev->power_on); -unregister_pm_notifier (&hdev->suspend_notifier);hci_suspend_clear_tasks (hdev); +unregister_pm_notifier (&hdev->suspend_notifier);cancel_work_sync (&hdev->suspend_prepare);hci_dev_do_close (hdev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 213/633 pinctrl: mcp23s08: Fix mcp23x17_regmap initialiser
In reply to Greg Kroah-HartmanFrom: Thomas Preston <[email protected]>
[ Upstream commit b445f6237744df5e8d4f56f8733b2108c611220a ]
The mcp23x17_regmap is initialised with structs named "mcp23x16". However, the mcp23s08 driver doesn't support the MCP23016 device yet, so this appears to be a typo.
--- drivers/pinctrl/pinctrl-mcp23s08.c | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-)
drivers/pinctrl/pinctrl-mcp23s08.c +11 -11
@@ -87,7 +87,7 @@ const struct regmap_config mcp23x08_regmap = { };EXPORT_SYMBOL_GPL (mcp23x08_regmap); -static const struct reg_default mcp23x16_defaults[] = { +static const struct reg_default mcp23x17_defaults[] = { {.reg =MCP_IODIR <<1 , .def =0xffff }, {.reg =MCP_IPOL <<1 , .def =0x0000 }, {.reg =MCP_GPINTEN <<1 , .def =0x0000 },
@@ -98,23 +98,23 @@ static const struct reg_default mcp23x16_defaults[] = { {.reg = MCP_OLAT << 1, .def = 0x0000}, }; -static const struct regmap_range mcp23x16_volatile_range = { +static const struct regmap_range mcp23x17_volatile_range = { .range_min =MCP_INTF <<1 , .range_max =MCP_GPIO <<1 , }; -static const struct regmap_access_table mcp23x16_volatile_table = { - .yes_ranges = &mcp23x16_volatile_range, +static const struct regmap_access_table mcp23x17_volatile_table = { + .yes_ranges = &mcp23x17_volatile_range, .n_yes_ranges =1 , }; -static const struct regmap_range mcp23x16_precious_range = { +static const struct regmap_range mcp23x17_precious_range = { .range_min =MCP_GPIO <<1 , .range_max =MCP_GPIO <<1 , }; -static const struct regmap_access_table mcp23x16_precious_table = { - .yes_ranges = &mcp23x16_precious_range, +static const struct regmap_access_table mcp23x17_precious_table = { + .yes_ranges = &mcp23x17_precious_range, .n_yes_ranges =1 , };
@@ -124,10 +124,10 @@ const struct regmap_config mcp23x17_regmap = { .reg_stride = 2, .max_register = MCP_OLAT << 1, - .volatile_table = &mcp23x16_volatile_table, - .precious_table = &mcp23x16_precious_table, - .reg_defaults = mcp23x16_defaults, - .num_reg_defaults = ARRAY_SIZE(mcp23x16_defaults), + .volatile_table = &mcp23x17_volatile_table, + .precious_table = &mcp23x17_precious_table, + .reg_defaults = mcp23x17_defaults, + .num_reg_defaults = ARRAY_SIZE(mcp23x17_defaults), .cache_type = REGCACHE_FLAT, .val_format_endian = REGMAP_ENDIAN_LITTLE, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 214/633 pinctrl: mcp23s08: Fix mcp23x17 precious range
In reply to Greg Kroah-HartmanFrom: Thomas Preston <[email protected]>
[ Upstream commit b9b7fb29433b906635231d0a111224efa009198c ]
On page 23 of the datasheet [0] it says "The register remains unchanged until the interrupt is cleared via a read of INTCAP or GPIO." Include INTCAPA and INTCAPB registers in precious range, so that they aren't accidentally cleared when we read via debugfs.
[0] https://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf
--- drivers/pinctrl/pinctrl-mcp23s08.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/pinctrl-mcp23s08.c +1 -1
@@ -109,7 +109,7 @@ static const struct regmap_access_table mcp23x17_volatile_table = { };static const struct regmap_range mcp23x17_precious_range = { - .range_min =MCP_GPIO <<1 , + .range_min =MCP_INTCAP <<1 , .range_max =MCP_GPIO <<1 , };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 215/633 pinctrl: devicetree: Keep deferring even on timeout
In reply to Greg Kroah-HartmanFrom: Thierry Reding <[email protected]>
[ Upstream commit 84f28fc38d2ff99e2ac623325ba37809da611b8e ]
driver_deferred_probe_check_state() may return -ETIMEDOUT instead of -EPROBE_DEFER after all built-in drivers have been probed. This can cause issues for built-in drivers that depend on resources provided by loadable modules.
One such case happens on Tegra where I2C controllers are used during early boot to set up the system PMIC, so the I2C driver needs to be a built-in driver. At the same time, some instances of the I2C controller depend on the DPAUX hardware for pinmuxing. Since the DPAUX is handled by the display driver, which is usually not built-in, the pin control states will not become available until after the root filesystem has been mounted and the display driver loaded from it.
--- drivers/pinctrl/devicetree.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/pinctrl/devicetree.c +2 -3
@@ -129,9 +129,8 @@ static int dt_to_map_one_config(struct pinctrl *p,if (!np_pctldev ||of_node_is_root (np_pctldev)) {of_node_put (np_pctldev); ret =driver_deferred_probe_check_state (p->dev); -/* keep deferring if modules are enabled unless we've timed out */ -if (IS_ENABLED (CONFIG_MODULES ) && !allow_default && - (ret == -ENODEV )) +/* keep deferring if modules are enabled */ +if (IS_ENABLED (CONFIG_MODULES ) && !allow_default && ret <0 ) ret = -EPROBE_DEFER ;return ret; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 216/633 drm/msm/adreno: fix probe without iommu
In reply to Greg Kroah-HartmanFrom: Luca Weiss <[email protected]>
[ Upstream commit 0a48db562c6264da2ae8013491efd6e8dc780520 ]
The function iommu_domain_alloc returns NULL on platforms without IOMMU such as msm8974. This resulted in PTR_ERR(-ENODEV) being assigned to gpu->aspace so the correct code path wasn't taken.
--- drivers/gpu/drm/msm/adreno/adreno_gpu.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/gpu/drm/msm/adreno/adreno_gpu.c +8 -2
@@ -189,10 +189,16 @@ struct msm_gem_address_space * adreno_iommu_create_address_space(struct msm_gpu *gpu, struct platform_device *pdev) { - struct iommu_domain *iommu = iommu_domain_alloc(&platform_bus_type); -struct msm_mmu *mmu =msm_iommu_new (&pdev->dev, iommu); + struct iommu_domain *iommu; +struct msm_mmu *mmu;struct msm_gem_address_space *aspace; + iommu =iommu_domain_alloc (&platform_bus_type); +if (!iommu) +return NULL ; + + mmu =msm_iommu_new (&pdev->dev, iommu); + aspace =msm_gem_address_space_create (mmu,"gpu" ,SZ_16M ,0xffffffff -SZ_16M );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 217/633 net/mlx5: Fix uninitialized variable warning
In reply to Greg Kroah-HartmanFrom: Moshe Tal <[email protected]>
[ Upstream commit 19f5b63bc9932d51292d72c9dc3ec95e5dfa2289 ]
Add variable initialization to eliminate the warning "variable may be used uninitialized".
--- drivers/net/ethernet/mellanox/mlx5/core/en/health.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/ethernet/mellanox/mlx5/core/en/health.c +1 -1
@@ -212,8 +212,8 @@ static int mlx5e_health_rsc_fmsg_binary(struct devlink_fmsg *fmsg, {u32 data_size; +int err =0 ;u32 offset; -int err;for (offset =0 ; offset < value_len; offset += data_size) { data_size = value_len - offset;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 218/633 net/mlx5: Dont call timecounter cyc2time directly from 1PPS flow
In reply to Greg Kroah-HartmanFrom: Eran Ben Elisha <[email protected]>
[ Upstream commit 0d2ffdc8d4002a62de31ff7aa3bef28c843c3cbe ]
Before calling timecounter_cyc2time(), clock->lock must be taken. Use mlx5_timecounter_cyc2time instead which guarantees a safe access.
--- drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c +3 -2
@@ -550,8 +550,9 @@ static int mlx5_pps_event(struct notifier_block *nb,switch (clock->ptp_info.pin_config[pin].func) {case PTP_PF_EXTTS : ptp_event.index = pin; - ptp_event.timestamp =timecounter_cyc2time (&clock->tc, -be64_to_cpu (eqe->data.pps.time_stamp)); + ptp_event.timestamp = +mlx5_timecounter_cyc2time (clock, +be64_to_cpu (eqe->data.pps.time_stamp));if (clock->pps_info.enabled) { ptp_event.type =PTP_CLOCK_PPSUSR ; ptp_event.pps_times.ts_real =
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 219/633 scsi: mpt3sas: Fix sync irqs
In reply to Greg Kroah-HartmanFrom: Tomas Henzl <[email protected]>
[ Upstream commit 45181eab8ba79ed7a41b549f00500c0093828521 ]
_base_process_reply_queue() called from _base_interrupt() may schedule a new irq poll. Fix this by calling synchronize_irq() first.
Also ensure that enable_irq() is called only when necessary to avoid "Unbalanced enable for IRQ..." errors.
--- drivers/scsi/mpt3sas/mpt3sas_base.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
drivers/scsi/mpt3sas/mpt3sas_base.c +9 -5
@@ -1808,18 +1808,22 @@ mpt3sas_base_sync_reply_irqs(struct MPT3SAS_ADAPTER *ioc)/* TMs are on msix_index == 0 */ if (reply_q->msix_index ==0 )continue ; +synchronize_irq (pci_irq_vector (ioc->pdev, reply_q->msix_index));if (reply_q->irq_poll_scheduled) {/* Calling irq_poll_disable will wait for any pending * callbacks to have completed. */ irq_poll_disable (&reply_q->irqpoll);irq_poll_enable (&reply_q->irqpoll); - reply_q->irq_poll_scheduled = false; - reply_q->irq_line_enable = true; -enable_irq (reply_q->os_irq); -continue ; +/* check how the scheduled poll has ended, +* clean up only if necessary +*/ +if (reply_q->irq_poll_scheduled) { + reply_q->irq_poll_scheduled = false; + reply_q->irq_line_enable = true; +enable_irq (reply_q->os_irq); + } } -synchronize_irq (pci_irq_vector (ioc->pdev, reply_q->msix_index)); } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 220/633 net: stmmac: Fix incorrect location to set real_num_rx|tx_queues
In reply to Greg Kroah-HartmanFrom: Aashish Verma <[email protected]>
[ Upstream commit 686cff3d7022ddf35d7e38bc80191eb92de5989a ]
netif_set_real_num_tx_queues() & netif_set_real_num_rx_queues() should be used to inform network stack about the real Tx & Rx queue (active) number in both stmmac_open() and stmmac_resume(), therefore, we move the code from stmmac_dvr_probe() to stmmac_hw_setup().
--- drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +4 -4
@@ -2736,6 +2736,10 @@ static int stmmac_hw_setup(struct net_device *dev, bool init_ptp)stmmac_enable_tbs (priv, priv->ioaddr, enable, chan); } +/* Configure real RX and TX queues */ +netif_set_real_num_rx_queues (dev, priv->plat->rx_queues_to_use); +netif_set_real_num_tx_queues (dev, priv->plat->tx_queues_to_use); +/* Start the ball rolling... */ stmmac_start_all_dma (priv);
@@ -4819,10 +4823,6 @@ int stmmac_dvr_probe(struct device *device,stmmac_check_ether_addr (priv); -/* Configure real RX and TX queues */ -netif_set_real_num_rx_queues (ndev, priv->plat->rx_queues_to_use); -netif_set_real_num_tx_queues (ndev, priv->plat->tx_queues_to_use); - ndev->netdev_ops = &stmmac_netdev_ops; ndev->hw_features = NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM |
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 221/633 net: stmmac: use netif_tx_start|stop_all_queues() function
In reply to Greg Kroah-HartmanFrom: Ong Boon Leong <[email protected]>
[ Upstream commit 9f19306d166688a73356aa636c62e698bf2063cc ]
The current implementation of stmmac_stop_all_queues() and stmmac_start_all_queues() will not work correctly when the value of tx_queues_to_use is changed through ethtool -L DEVNAME rx N tx M command.
Also, netif_tx_start|stop_all_queues() are only needed in driver open() and close() only.
--- .../net/ethernet/stmicro/stmmac/stmmac_main.c | 33 +------------------ 1 file changed, 1 insertion(+), 32 deletions(-)
drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +1 -32
@@ -176,32 +176,6 @@ static void stmmac_enable_all_queues(struct stmmac_priv *priv) } } -/** -* stmmac_stop_all_queues - Stop all queues -* @priv: driver private structure -*/ -static void stmmac_stop_all_queues (struct stmmac_priv *priv) -{ -u32 tx_queues_cnt = priv->plat->tx_queues_to_use; -u32 queue; - -for (queue =0 ; queue < tx_queues_cnt; queue++) -netif_tx_stop_queue (netdev_get_tx_queue (priv->dev, queue)); -} - -/** -* stmmac_start_all_queues - Start all queues -* @priv: driver private structure -*/ -static void stmmac_start_all_queues (struct stmmac_priv *priv) -{ -u32 tx_queues_cnt = priv->plat->tx_queues_to_use; -u32 queue; - -for (queue =0 ; queue < tx_queues_cnt; queue++) -netif_tx_start_queue (netdev_get_tx_queue (priv->dev, queue)); -} -static void stmmac_service_event_schedule (struct stmmac_priv *priv) { if (!test_bit(STMMAC_DOWN, &priv->state) &&
@@ -2866,7 +2840,7 @@ static int stmmac_open(struct net_device *dev) }stmmac_enable_all_queues (priv); -stmmac_start_all_queues (priv); +netif_tx_start_all_queues (priv->dev);return 0 ;
@@ -2907,8 +2881,6 @@ static int stmmac_release(struct net_device *dev)phylink_stop (priv->phylink);phylink_disconnect_phy (priv->phylink); -stmmac_stop_all_queues (priv); -stmmac_disable_all_queues (priv);for (chan =0 ; chan < priv->plat->tx_queues_to_use; chan++)
@@ -5078,7 +5050,6 @@ int stmmac_suspend(struct device *dev)mutex_lock (&priv->lock);netif_device_detach (ndev); -stmmac_stop_all_queues (priv);stmmac_disable_all_queues (priv);
@@ -5203,8 +5174,6 @@ int stmmac_resume(struct device *dev)stmmac_enable_all_queues (priv); -stmmac_start_all_queues (priv); -mutex_unlock (&priv->lock);if (!device_may_wakeup (priv->device)) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 222/633 xfs: force the log after remapping a synchronous-writes file
In reply to Greg Kroah-HartmanFrom: Darrick J. Wong <[email protected]>
[ Upstream commit 5ffce3cc22a0e89813ed0c7162a68b639aef9ab6 ]
Commit 5833112df7e9 tried to make it so that a remap operation would force the log out to disk if the filesystem is mounted with mandatory synchronous writes. Unfortunately, that commit failed to handle the case where the inode or the file descriptor require mandatory synchronous writes.
Refactor the check into into a helper that will look for all three conditions, and now we can treat reflink just like any other synchronous write.
--- fs/xfs/xfs_file.c | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-)
fs/xfs/xfs_file.c +16 -1
@@ -1005,6 +1005,21 @@ xfs_file_fadvise(return ret; } +/* Does this file, inode, or mount want synchronous writes? */ +static inline bool xfs_file_sync_writes (struct file *filp) +{ +struct xfs_inode *ip =XFS_I (file_inode (filp)); + +if (ip->i_mount->m_flags &XFS_MOUNT_WSYNC ) +return true; +if (filp->f_flags & (__O_SYNC |O_DSYNC )) +return true; +if (IS_SYNC (file_inode (filp))) +return true; + +return false; +} + STATIC loff_t xfs_file_remap_range( struct file *file_in,
@@ -1062,7 +1077,7 @@ xfs_file_remap_range(if (ret) goto out_unlock; -if (mp->m_flags &XFS_MOUNT_WSYNC ) +if (xfs_file_sync_writes (file_in) ||xfs_file_sync_writes (file_out))xfs_log_force_inode (dest); out_unlock:xfs_reflink_remap_unlock (file_in, file_out);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 223/633 cpufreq: armada-37xx: Add missing MODULE_DEVICE_TABLE
In reply to Greg Kroah-HartmanFrom: Pali Rohár <[email protected]>
[ Upstream commit c942d1542f1bc5001216fabce9cb8ffbe515777e ]
CONFIG_ARM_ARMADA_37XX_CPUFREQ is tristate option and therefore this cpufreq driver can be compiled as a module. This patch adds missing MODULE_DEVICE_TABLE which generates correct modalias for automatic loading of this cpufreq driver when is compiled as an external module.
--- drivers/cpufreq/armada-37xx-cpufreq.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/cpufreq/armada-37xx-cpufreq.c +6 -0
@@ -484,6 +484,12 @@ static int __init armada37xx_cpufreq_driver_init(void)/* late_initcall, to guarantee the driver is loaded after A37xx clock driver */ late_initcall (armada37xx_cpufreq_driver_init); +static const struct of_device_id __maybe_unused armada37xx_cpufreq_of_match[] = { + { .compatible ="marvell,armada-3700-nb-pm" }, + { }, +}; +MODULE_DEVICE_TABLE (of, armada37xx_cpufreq_of_match); +MODULE_AUTHOR ("Gregory CLEMENT <[email protected]>" );MODULE_DESCRIPTION ("Armada 37xx cpufreq driver" );MODULE_LICENSE ("GPL" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 224/633 drm: mxsfb: check framebuffer pitch
In reply to Greg Kroah-HartmanFrom: Stefan Agner <[email protected]>
[ Upstream commit d5a0c816900419105a12e7471bf074319dfa34be ]
The lcdif IP does not support a framebuffer pitch (stride) other than framebuffer width. Check for equality and reject the framebuffer otherwise.
This prevents a distorted picture when using 640x800 and running the Mesa graphics stack. Mesa tries to use a cache aligned stride, which leads at that particular resolution to width != stride. Currently Mesa has no fallback behavior, but rejecting this configuration allows userspace to handle the issue correctly.
--- drivers/gpu/drm/mxsfb/mxsfb_drv.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-)
drivers/gpu/drm/mxsfb/mxsfb_drv.c +20 -1
@@ -26,6 +26,7 @@#include <drm/drm_drv.h> #include <drm/drm_fb_cma_helper.h> #include <drm/drm_fb_helper.h> +#include <drm/drm_fourcc.h> #include <drm/drm_gem_cma_helper.h> #include <drm/drm_gem_framebuffer_helper.h> #include <drm/drm_irq.h>
@@ -87,8 +88,26 @@ void mxsfb_disable_axi_clk(struct mxsfb_drm_private *mxsfb)clk_disable_unprepare (mxsfb->clk_axi); } +static struct drm_framebuffer * +mxsfb_fb_create (struct drm_device *dev,struct drm_file *file_priv, +const struct drm_mode_fb_cmd2 *mode_cmd) +{ +const struct drm_format_info *info; + + info =drm_get_format_info (dev, mode_cmd); +if (!info) +return ERR_PTR (-EINVAL ); + +if (mode_cmd->width * info->cpp[0 ] != mode_cmd->pitches[0 ]) { +dev_dbg (dev->dev,"Invalid pitch: fb width must match pitch\n" ); +return ERR_PTR (-EINVAL ); + } + +return drm_gem_fb_create (dev, file_priv, mode_cmd); +} +static const struct drm_mode_config_funcs mxsfb_mode_config_funcs = { - .fb_create = drm_gem_fb_create, + .fb_create = mxsfb_fb_create, .atomic_check = drm_atomic_helper_check, .atomic_commit = drm_atomic_helper_commit, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 225/633 ima: Fix NULL pointer dereference in ima_file_hash
In reply to Greg Kroah-HartmanFrom: KP Singh <[email protected]>
[ Upstream commit aa662fc04f5b290b3979332588bf8d812b189962 ]
ima_file_hash can be called when there is no iint->ima_hash available even though the inode exists in the integrity cache. It is fairly common for a file to not have a hash. (e.g. an mknodat, prior to the file being closed).
Another example where this can happen (suggested by Jann Horn):
Process A does:
while(1) {
unlink("/tmp/imafoo");
fd = open("/tmp/imafoo", O_RDWR|O_CREAT|O_TRUNC, 0700);
if (fd == -1) {
perror("open");
continue;
}
write(fd, "A", 1);
close(fd);
}and Process B does:
while (1) {
int fd = open("/tmp/imafoo", O_RDONLY);
if (fd == -1)
continue;
char *mapping = mmap(NULL, 0x1000, PROT_READ|PROT_EXEC,
MAP_PRIVATE, fd, 0);
if (mapping != MAP_FAILED)
munmap(mapping, 0x1000);
close(fd);}
Due to the race to get the iint->mutex between ima_file_hash and process_measurement iint->ima_hash could still be NULL.
--- security/integrity/ima/ima_main.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
security/integrity/ima/ima_main.c +10 -0
@@ -531,6 +531,16 @@ int ima_file_hash(struct file *file, char *buf, size_t buf_size)return -EOPNOTSUPP ;mutex_lock (&iint->mutex); + +/* +* ima_file_hash can be called when ima_collect_measurement has still +* not been called, we might not always have a hash. +*/ +if (!iint->ima_hash) { +mutex_unlock (&iint->mutex); +return -EOPNOTSUPP ; + } +if (buf) {size_t copied_size;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 226/633 ASoC: topology: disable size checks for bytes_ext controls if needed
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 6788fc1a66a0c1d1cec7a0f84f94b517eae8611c ]
When CONFIG_SND_CTL_VALIDATION is set, accesses to extended bytes control generate spurious error messages when the size exceeds 512 bytes, such as
[ 11.224223] sof_sdw sof_sdw: control 2:0:0:EQIIR5.0 eqiir_coef_5:0:
invalid count 1024
In addition the error check returns -EINVAL which has the nasty side effect of preventing applications accessing controls from working, e.g.
root@plb:~# alsamixer cannot load mixer controls: Invalid argument
It's agreed that the control interface has been abused since 2014, but forcing a check should not prevent existing solutions from working.
This patch skips the checks conditionally if CONFIG_SND_CTL_VALIDATION is set and the byte array provided by topology is > 512. This preserves the checks for all other cases.
--- sound/soc/soc-topology.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/soc/soc-topology.c +11 -0
@@ -592,6 +592,17 @@ static int soc_tplg_kcontrol_bind_io(struct snd_soc_tplg_ctl_hdr *hdr, k->info = snd_soc_bytes_info_ext; k->tlv.c = snd_soc_bytes_tlv_callback; +/* +* When a topology-based implementation abuses the +* control interface and uses bytes_ext controls of +* more than 512 bytes, we need to disable the size +* checks, otherwise accesses to such controls will +* return an -EINVAL error and prevent the card from +* being configured. +*/ +if (IS_ENABLED (CONFIG_SND_CTL_VALIDATION ) && sbe->max >512 ) + k->access |=SNDRV_CTL_ELEM_ACCESS_SKIP_CHECK ; + ext_ops = tplg->bytes_ext_ops; num_ops = tplg->bytes_ext_ops_count;for (i =0 ; i < num_ops; i++) {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 227/633 ASoC: tlv320adcx140: Fix digital gain range
In reply to Greg Kroah-HartmanFrom: Camel Guo <[email protected]>
[ Upstream commit 73154aca4a03a2ab4833fd36683feb884af06d4b ]
According to its datasheet, the digital gain should be -100 dB when CHx_DVOL is 1 and 27 dB when CHx_DVOL is 255. But with the current dig_vol_tlv, "Digital CHx Out Volume" shows 27.5 dB if CHx_DVOL is 255 and -95.5 dB if CHx_DVOL is 1. This commit fixes this bug.
--- sound/soc/codecs/tlv320adcx140.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/codecs/tlv320adcx140.c +1 -1
@@ -154,7 +154,7 @@ static const struct regmap_config adcx140_i2c_regmap = { };/* Digital Volume control. From -100 to 27 dB in 0.5 dB steps */ -static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10000, 50, 0); +static DECLARE_TLV_DB_SCALE(dig_vol_tlv, -10050, 50, 0);/* ADC gain. From 0 to 42 dB in 1 dB steps */ static DECLARE_TLV_DB_SCALE(adc_tlv, 0, 100, 0);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 228/633 coresight: etm4x: Fix etm4_count race by moving cpuhp callbacks to init
In reply to Greg Kroah-HartmanFrom: Sai Prakash Ranjan <[email protected]>
[ Upstream commit 2d1a8bfb61ec0177343e99ebd745e3e4ceb0d0d5 ]
etm4_count keeps track of number of ETMv4 registered and on some systems, a race is observed on etm4_count variable which can lead to multiple calls to cpuhp_setup_state_nocalls_cpuslocked(). This function internally calls cpuhp_store_callbacks() which prevents multiple registrations of callbacks for a given state and due to this race, it returns -EBUSY leading to ETM probe failures like below.
coresight-etm4x: probe of 7040000.etm failed with error -16
This race can easily be triggered with async probe by setting probe type as PROBE_PREFER_ASYNCHRONOUS and with ETM power management property "arm,coresight-loses-context-with-cpu".
Prevent this race by moving cpuhp callbacks to etm driver init since the cpuhp callbacks doesn't have to depend on the etm4_count and can be once setup during driver init. Similarly we move cpu_pm notifier registration to driver init and completely remove etm4_count usage. Also now we can use non cpuslocked version of cpuhp callbacks with this movement.
--- drivers/hwtracing/coresight/coresight-etm4x.c | 65 +++++++++---------- 1 file changed, 31 insertions(+), 34 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x.c +31 -34
@@ -48,8 +48,6 @@ module_param(pm_save_enable, int, 0444);MODULE_PARM_DESC (pm_save_enable,"Save/restore state on power down: 1 = never, 2 = self-hosted" ); -/* The number of ETMv4 currently registered */ -static int etm4_count;static struct etmv4_drvdata *etmdrvdata[NR_CPUS ];static void etm4_set_default_config (struct etmv4_config *config); static int etm4_set_event_filters(struct etmv4_drvdata *drvdata,
@@ -1394,28 +1392,25 @@ static struct notifier_block etm4_cpu_pm_nb = { .notifier_call = etm4_cpu_pm_notify, }; -/* Setup PM. Called with cpus locked. Deals with error conditions and counts */ -static int etm4_pm_setup_cpuslocked (void ) +/* Setup PM. Deals with error conditions and counts */ +static int __init etm4_pm_setup (void ) {int ret; -if (etm4_count++) -return 0 ; - ret =cpu_pm_register_notifier (&etm4_cpu_pm_nb);if (ret) - goto reduce_count; +return ret; - ret =cpuhp_setup_state_nocalls_cpuslocked (CPUHP_AP_ARM_CORESIGHT_STARTING , -"arm/coresight4:starting" , - etm4_starting_cpu, etm4_dying_cpu); + ret =cpuhp_setup_state_nocalls (CPUHP_AP_ARM_CORESIGHT_STARTING , +"arm/coresight4:starting" , + etm4_starting_cpu, etm4_dying_cpu);if (ret) goto unregister_notifier; - ret =cpuhp_setup_state_nocalls_cpuslocked (CPUHP_AP_ONLINE_DYN , -"arm/coresight4:online" , - etm4_online_cpu,NULL ); + ret =cpuhp_setup_state_nocalls (CPUHP_AP_ONLINE_DYN , +"arm/coresight4:online" , + etm4_online_cpu,NULL );/* HP dyn state ID returned in ret on success */ if (ret >0 ) {
@@ -1424,21 +1419,15 @@ static int etm4_pm_setup_cpuslocked(void) }/* failed dyn state - remove others */ -cpuhp_remove_state_nocalls_cpuslocked (CPUHP_AP_ARM_CORESIGHT_STARTING ); +cpuhp_remove_state_nocalls (CPUHP_AP_ARM_CORESIGHT_STARTING ); unregister_notifier:cpu_pm_unregister_notifier (&etm4_cpu_pm_nb); - -reduce_count: - --etm4_count;return ret; } -static void etm4_pm_clear (void ) +static void __init etm4_pm_clear (void ) { -if (--etm4_count !=0 ) -return ; -cpu_pm_unregister_notifier (&etm4_cpu_pm_nb);cpuhp_remove_state_nocalls (CPUHP_AP_ARM_CORESIGHT_STARTING );if (hp_online) {
@@ -1491,22 +1480,12 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)if (!desc.name)return -ENOMEM ; -cpus_read_lock (); etmdrvdata[drvdata->cpu] = drvdata;if (smp_call_function_single (drvdata->cpu, etm4_init_arch_data, drvdata,1 ))dev_err (dev,"ETM arch init failed\n" ); - ret =etm4_pm_setup_cpuslocked (); -cpus_read_unlock (); - -/* etm4_pm_setup_cpuslocked() does its own cleanup - exit on error */ -if (ret) { - etmdrvdata[drvdata->cpu] =NULL ; -return ret; - } -if (etm4_arch_supported (drvdata->arch) == false) { ret = -EINVAL ; goto err_arch_supported;
@@ -1553,7 +1532,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id) err_arch_supported: etmdrvdata[drvdata->cpu] =NULL ; -etm4_pm_clear ();return ret; }
@@ -1591,4 +1569,23 @@ static struct amba_driver etm4x_driver = { .probe = etm4_probe, .id_table = etm4_ids, }; -builtin_amba_driver (etm4x_driver); + +static int __init etm4x_init (void ) +{ +int ret; + + ret =etm4_pm_setup (); + +/* etm4_pm_setup() does its own cleanup - exit on error */ +if (ret) +return ret; + + ret =amba_driver_register (&etm4x_driver); +if (ret) { +pr_err ("Error registering etm4x driver\n" ); +etm4_pm_clear (); + } + +return ret; +} +device_initcall (etm4x_init);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 229/633 coresight: fix offset by one error in counting ports
In reply to Greg Kroah-HartmanFrom: Mian Yousaf Kaukab <[email protected]>
[ Upstream commit 9554c3551ed35d79b029e5e69383ae33117d9765 ]
Since port-numbers start from 0, add 1 to port-number to get the port count.
Fix following crash when Coresight is enabled on ACPI based systems:
[ 61.061736] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000008 ... [ 61.135494] pc : acpi_coresight_parse_graph+0x1c4/0x37c [ 61.140705] lr : acpi_coresight_parse_graph+0x160/0x37c [ 61.145915] sp : ffff800012f4ba40 [ 61.145917] x29: ffff800012f4ba40 x28: ffff00becce62f98 [ 61.159896] x27: 0000000000000005 x26: ffff00becd8a7c88 [ 61.165195] x25: ffff00becd8a7d88 x24: ffff00becce62f80 [ 61.170492] x23: ffff800011ef99c0 x22: ffff009efb8bc010 [ 61.175790] x21: 0000000000000018 x20: 0000000000000005 [ 61.181087] x19: ffff00becce62e80 x18: 0000000000000020 [ 61.186385] x17: 0000000000000001 x16: 00000000000002a8 [ 61.191682] x15: ffff000838648550 x14: ffffffffffffffff [ 61.196980] x13: 0000000000000000 x12: ffff00becce62d87 [ 61.202277] x11: 00000000ffffff76 x10: 000000000000002e [ 61.207575] x9 : ffff8000107e1a68 x8 : ffff00becce63000 [ 61.212873] x7 : 0000000000000018 x6 : 000000000000003f [ 61.218170] x5 : 0000000000000000 x4 : 0000000000000000 [ 61.223467] x3 : 0000000000000000 x2 : 0000000000000000 [ 61.228764] x1 : ffff00becce62f80 x0 : 0000000000000000 [ 61.234062] Call trace: [ 61.236497] acpi_coresight_parse_graph+0x1c4/0x37c [ 61.241361] coresight_get_platform_data+0xdc/0x130 [ 61.246225] tmc_probe+0x138/0x2dc [ 61.246227] amba_probe+0xdc/0x220 [ 61.255779] really_probe+0xe8/0x49c [ 61.255781] driver_probe_device+0xec/0x140 [ 61.255782] device_driver_attach+0xc8/0xd0 [ 61.255785] __driver_attach+0xac/0x180 [ 61.265857] bus_for_each_dev+0x78/0xcc [ 61.265859] driver_attach+0x2c/0x40 [ 61.265861] bus_add_driver+0x150/0x244 [ 61.265863] driver_register+0x80/0x13c [ 61.273591] amba_driver_register+0x60/0x70 [ 61.273594] tmc_driver_init+0x20/0x2c [ 61.281582] do_one_initcall+0x50/0x230 [ 61.281585] do_initcalls+0x104/0x144 [ 61.291831] kernel_init_freeable+0x168/0x1dc [ 61.291834] kernel_init+0x1c/0x120 [ 61.299215] ret_from_fork+0x10/0x18 [ 61.299219] Code: b9400022 f9400660 9b277c42 8b020000 (f9400404) [ 61.307381] ---[ end trace 63c6c3d7ec6a9b7c ]--- [ 61.315225] Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
--- drivers/hwtracing/coresight/coresight-platform.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/hwtracing/coresight/coresight-platform.c +5 -5
@@ -712,11 +712,11 @@ static int acpi_coresight_parse_graph(struct acpi_device *adev,return dir;if (dir ==ACPI_CORESIGHT_LINK_MASTER ) { -if (ptr->outport > pdata->nr_outport) - pdata->nr_outport = ptr->outport; +if (ptr->outport >= pdata->nr_outport) + pdata->nr_outport = ptr->outport +1 ; ptr++; }else { -WARN_ON (pdata->nr_inport == ptr->child_port); +WARN_ON (pdata->nr_inport == ptr->child_port +1 );/* * We do not track input port connections for a device. * However we need the highest port number described,
@@ -724,8 +724,8 @@ static int acpi_coresight_parse_graph(struct acpi_device *adev,* record for an output connection. Hence, do not move * the ptr for input connections */ -if (ptr->child_port > pdata->nr_inport) - pdata->nr_inport = ptr->child_port; +if (ptr->child_port >= pdata->nr_inport) + pdata->nr_inport = ptr->child_port +1 ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 230/633 coresight: cti: disclaim device only when its claimed
In reply to Greg Kroah-HartmanFrom: Tingwei Zhang <[email protected]>
[ Upstream commit 0dee28268ddbe53a981d4d87faf5dc0f1700e698 ]
Coresight_claim_device() is called in cti_starting_cpu() only when CTI is enabled while coresight_disclaim_device() is called uncontionally in cti_dying_cpu(). This triggered below WARNING. Only call disclaim device when CTI device is enabled to fix it.
[ 75.989643] WARNING: CPU: 1 PID: 14 at kernel/drivers/hwtracing/coresight/coresight.c:209 coresight_disclaim_device_unlocked+0x10/0x24 [ 75.989697] CPU: 1 PID: 14 Comm: migration/1 Not tainted 5.9.0-rc1-gff1304be0a05-dirty #21 [ 75.989709] Hardware name: Thundercomm Dragonboard 845c (DT) [ 75.989737] pstate: 80c00085 (Nzcv daIf +PAN +UAO BTYPE=--) [ 75.989758] pc : coresight_disclaim_device_unlocked+0x10/0x24 [ 75.989775] lr : coresight_disclaim_device+0x24/0x38 [ 75.989783] sp : ffff800011cd3c90 . [ 75.990018] Call trace: [ 75.990041] coresight_disclaim_device_unlocked+0x10/0x24 [ 75.990066] cti_dying_cpu+0x34/0x4c [ 75.990101] cpuhp_invoke_callback+0x84/0x1e0 [ 75.990121] take_cpu_down+0x90/0xe0 [ 75.990154] multi_cpu_stop+0x134/0x160 [ 75.990171] cpu_stopper_thread+0xb0/0x13c [ 75.990196] smpboot_thread_fn+0x1c4/0x270 [ 75.990222] kthread+0x128/0x154 [ 75.990251] ret_from_fork+0x10/0x18
--- drivers/hwtracing/coresight/coresight-cti.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/hwtracing/coresight/coresight-cti.c +2 -1
@@ -742,7 +742,8 @@ static int cti_dying_cpu(unsigned int cpu)spin_lock (&drvdata->spinlock); drvdata->config.hw_powered = false; -coresight_disclaim_device (drvdata->base); +if (drvdata->config.hw_enabled) +coresight_disclaim_device (drvdata->base);spin_unlock (&drvdata->spinlock);return 0 ; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 231/633 coresight: cti: remove pm_runtime_get_sync() from CPU hotplug
In reply to Greg Kroah-HartmanFrom: Tingwei Zhang <[email protected]>
[ Upstream commit 6e8836c6df5327bdb24211424f1ad1411d1ed64a ]
Below BUG is triggered by call pm_runtime_get_sync() in cti_cpuhp_enable_hw(). It's in CPU hotplug callback with interrupt disabled. Pm_runtime_get_sync() calls clock driver to enable clock which could sleep. Remove pm_runtime_get_sync() in cti_cpuhp_enable_hw() since pm_runtime_get_sync() is called in cti_enabld and pm_runtime_put() is called in cti_disabled. No need to increase pm count when CPU gets online since it's not decreased when CPU is offline.
[ 105.800279] BUG: scheduling while atomic: swapper/1/0/0x00000002 [ 105.800290] Modules linked in: [ 105.800327] CPU: 1 PID: 0 Comm: swapper/1 Tainted: G W 5.9.0-rc1-gff1304be0a05-dirty #21 [ 105.800337] Hardware name: Thundercomm Dragonboard 845c (DT) [ 105.800353] Call trace: [ 105.800414] dump_backtrace+0x0/0x1d4 [ 105.800439] show_stack+0x14/0x1c [ 105.800462] dump_stack+0xc0/0x100 [ 105.800490] __schedule_bug+0x58/0x74 [ 105.800523] __schedule+0x590/0x65c [ 105.800538] schedule+0x78/0x10c [ 105.800553] schedule_timeout+0x188/0x250 [ 105.800585] qmp_send.constprop.10+0x12c/0x1b0 [ 105.800599] qmp_qdss_clk_prepare+0x18/0x20 [ 105.800622] clk_core_prepare+0x48/0xd4 [ 105.800639] clk_prepare+0x20/0x34 [ 105.800663] amba_pm_runtime_resume+0x54/0x90 [ 105.800695] __rpm_callback+0xdc/0x138 [ 105.800709] rpm_callback+0x24/0x78 [ 105.800724] rpm_resume+0x328/0x47c [ 105.800739] __pm_runtime_resume+0x50/0x74 [ 105.800768] cti_starting_cpu+0x40/0xa4 [ 105.800795] cpuhp_invoke_callback+0x84/0x1e0 [ 105.800814] notify_cpu_starting+0x9c/0xb8 [ 105.800834] secondary_start_kernel+0xd8/0x164 [ 105.800933] CPU1: Booted secondary processor 0x0000000100 [0x517f803c]
--- drivers/hwtracing/coresight/coresight-cti.c | 3 --- 1 file changed, 3 deletions(-)
drivers/hwtracing/coresight/coresight-cti.c +0 -3
@@ -141,9 +141,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)static void cti_cpuhp_enable_hw (struct cti_drvdata *drvdata) {struct cti_config *config = &drvdata->config; -struct device *dev = &drvdata->csdev->dev; -pm_runtime_get_sync (dev->parent);spin_lock (&drvdata->spinlock); config->hw_powered = true;
@@ -163,7 +161,6 @@ static void cti_cpuhp_enable_hw(struct cti_drvdata *drvdata)/* did not re-enable due to no claim / no request */ cti_hp_not_enabled:spin_unlock (&drvdata->spinlock); -pm_runtime_put (dev->parent); }/* disable hardware */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 232/633 coresight: etm4x: Ensure default perf settings filter user/kernel
In reply to Greg Kroah-HartmanFrom: Mike Leach <[email protected]>
[ Upstream commit 096dcfb9cd6fefa7c03884b50c247593dc5f7dd3 ]
Moving from using an address filter to trace the default "all addresses" range to no filtering to acheive the same result, has caused the perf filtering of kernel/user address spaces from not working unless an explicit address filter was used.
This is due to the original code using a side-effect of the address filtering rather than setting the global TRCVICTLR exception level filtering.
The use of the mode sysfs file is also similarly affected.
A helper function is added to fix both instances.
--- drivers/hwtracing/coresight/coresight-etm4x.c | 32 +++++++++++++------ drivers/hwtracing/coresight/coresight-etm4x.h | 3 ++ 2 files changed, 25 insertions(+), 10 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x.c +22 -10
@@ -52,6 +52,7 @@ static struct etmv4_drvdata *etmdrvdata[NR_CPUS];static void etm4_set_default_config (struct etmv4_config *config);static int etm4_set_event_filters (struct etmv4_drvdata *drvdata,struct perf_event *event); +static u64 etm4_get_access_type (struct etmv4_config *config);static enum cpuhp_state hp_online;
@@ -779,6 +780,22 @@ static void etm4_init_arch_data(void *info)CS_LOCK (drvdata->base); } +/* Set ELx trace filter access in the TRCVICTLR register */ +static void etm4_set_victlr_access (struct etmv4_config *config) +{ +u64 access_type; + + config->vinst_ctrl &= ~(ETM_EXLEVEL_S_VICTLR_MASK |ETM_EXLEVEL_NS_VICTLR_MASK ); + +/* +* TRCVICTLR::EXLEVEL_NS:EXLEVELS: Set kernel / user filtering +* bits in vinst_ctrl, same bit pattern as TRCACATRn values returned by +* etm4_get_access_type() but with a relative shift in this register. +*/ + access_type =etm4_get_access_type (config) <<ETM_EXLEVEL_LSHIFT_TRCVICTLR ; + config->vinst_ctrl |= (u32 )access_type; +} +static void etm4_set_default_config (struct etmv4_config *config) {/* disable all events tracing */
@@ -796,6 +813,9 @@ static void etm4_set_default_config(struct etmv4_config *config)/* TRCVICTLR::EVENT = 0x01, select the always on logic */ config->vinst_ctrl =BIT (0 ); + +/* TRCVICTLR::EXLEVEL_NS:EXLEVELS: Set kernel / user filtering */ +etm4_set_victlr_access (config); }static u64 etm4_get_ns_access_type (struct etmv4_config *config)
@@ -1060,7 +1080,7 @@ static int etm4_set_event_filters(struct etmv4_drvdata *drvdata,void etm4_config_trace_mode (struct etmv4_config *config) { -u32 addr_acc, mode; +u32 mode; mode = config->mode; mode &= (ETM_MODE_EXCL_KERN |ETM_MODE_EXCL_USER );
@@ -1072,15 +1092,7 @@ void etm4_config_trace_mode(struct etmv4_config *config)if (!(mode &ETM_MODE_EXCL_KERN ) && !(mode &ETM_MODE_EXCL_USER ))return ; - addr_acc = config->addr_acc[ETM_DEFAULT_ADDR_COMP ]; -/* clear default config */ - addr_acc &= ~(ETM_EXLEVEL_NS_APP |ETM_EXLEVEL_NS_OS | -ETM_EXLEVEL_NS_HYP ); - - addr_acc |=etm4_get_ns_access_type (config); - - config->addr_acc[ETM_DEFAULT_ADDR_COMP ] = addr_acc; - config->addr_acc[ETM_DEFAULT_ADDR_COMP +1 ] = addr_acc; +etm4_set_victlr_access (config); }static int etm4_online_cpu (unsigned int cpu)
drivers/hwtracing/coresight/coresight-etm4x.h +3 -0
@@ -192,6 +192,9 @@#define ETM_EXLEVEL_NS_HYP BIT(14)#define ETM_EXLEVEL_NS_NA BIT(15) +/* access level control in TRCVICTLR - same bits as TRCACATRn but shifted */ +#define ETM_EXLEVEL_LSHIFT_TRCVICTLR 8 +/* secure / non secure masks - TRCVICTLR, IDR3 */ #define ETM_EXLEVEL_S_VICTLR_MASK GENMASK(19, 16)/* NS MON (EL3) mode never implemented */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 233/633 coresight: etm4x: Fix issues within reset interface of sysfs
In reply to Greg Kroah-HartmanFrom: Jonathan Zhou <[email protected]>
[ Upstream commit 4020fc8d4658dc1dbc27c5644bcb6254caa05e5e ]
The member @nr_addr_cmp is not a bool value, using operator '>' instead to avoid unexpected failure.
--- drivers/hwtracing/coresight/coresight-etm4x-sysfs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/hwtracing/coresight/coresight-etm4x-sysfs.c +1 -1
@@ -206,7 +206,7 @@ static ssize_t reset_store(struct device *dev,* each trace run. */ config->vinst_ctrl =BIT (0 ); -if (drvdata->nr_addr_cmp == true) { +if (drvdata->nr_addr_cmp >0 ) { config->mode |=ETM_MODE_VIEWINST_STARTSTOP ;/* SSSTATUS, bit[9] */ config->vinst_ctrl |=BIT (9 );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 234/633 coresight: cti: Write regsiters directly in cti_enable_hw()
In reply to Greg Kroah-HartmanFrom: Tingwei Zhang <[email protected]>
[ Upstream commit 984f37efa3857dcefa649fbdf64abb94591935c3 ]
Deadlock as below is triggered by one CPU holds drvdata->spinlock and calls cti_enable_hw(). Smp_call_function_single() is called in cti_enable_hw() and tries to let another CPU write CTI registers. That CPU is trying to get drvdata->spinlock in cti_cpu_pm_notify() and doesn't response to IPI from smp_call_function_single().
[ 988.335937] CPU: 6 PID: 10258 Comm: sh Tainted: G W L 5.8.0-rc6-mainline-16783-gc38daa79b26b-dirty #1 [ 988.346364] Hardware name: Thundercomm Dragonboard 845c (DT) [ 988.352073] pstate: 20400005 (nzCv daif +PAN -UAO BTYPE=--) [ 988.357689] pc : smp_call_function_single+0x158/0x1b8 [ 988.362782] lr : smp_call_function_single+0x124/0x1b8 ... [ 988.451638] Call trace: [ 988.454119] smp_call_function_single+0x158/0x1b8 [ 988.458866] cti_enable+0xb4/0xf8 [coresight_cti] [ 988.463618] coresight_control_assoc_ectdev+0x6c/0x128 [coresight] [ 988.469855] coresight_enable+0x1f0/0x364 [coresight] [ 988.474957] enable_source_store+0x5c/0x9c [coresight] [ 988.480140] dev_attr_store+0x14/0x28 [ 988.483839] sysfs_kf_write+0x38/0x4c [ 988.487532] kernfs_fop_write+0x1c0/0x2b0 [ 988.491585] vfs_write+0xfc/0x300 [ 988.494931] ksys_write+0x78/0xe0 [ 988.498283] __arm64_sys_write+0x18/0x20 [ 988.502240] el0_svc_common+0x98/0x160 [ 988.506024] do_el0_svc+0x78/0x80 [ 988.509377] el0_sync_handler+0xd4/0x270 [ 988.513337] el0_sync+0x164/0x180
This change write CTI registers directly in cti_enable_hw(). Config->hw_powered has been checked to be true with spinlock holded. CTI is powered and can be programmed until spinlock is released.
--- drivers/hwtracing/coresight/coresight-cti.c | 24 +++++---------------- 1 file changed, 5 insertions(+), 19 deletions(-)
drivers/hwtracing/coresight/coresight-cti.c +5 -19
@@ -86,22 +86,16 @@ void cti_write_all_hw_regs(struct cti_drvdata *drvdata)CS_LOCK (drvdata->base); } -static void cti_enable_hw_smp_call (void *info) -{ -struct cti_drvdata *drvdata = info; - -cti_write_all_hw_regs (drvdata); -} -/* write regs to hardware and enable */ static int cti_enable_hw (struct cti_drvdata *drvdata) {struct cti_config *config = &drvdata->config;struct device *dev = &drvdata->csdev->dev; +unsigned long flags;int rc =0 ;pm_runtime_get_sync (dev->parent); -spin_lock (&drvdata->spinlock); +spin_lock_irqsave (&drvdata->spinlock, flags);/* no need to do anything if enabled or unpowered*/ if (config->hw_enabled || !config->hw_powered)
@@ -112,19 +106,11 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)if (rc) goto cti_err_not_enabled; -if (drvdata->ctidev.cpu >=0 ) { - rc =smp_call_function_single (drvdata->ctidev.cpu, - cti_enable_hw_smp_call, - drvdata,1 ); -if (rc) - goto cti_err_not_enabled; - }else { -cti_write_all_hw_regs (drvdata); - } +cti_write_all_hw_regs (drvdata); config->hw_enabled = true;atomic_inc (&drvdata->config.enable_req_count); -spin_unlock (&drvdata->spinlock); +spin_unlock_irqrestore (&drvdata->spinlock, flags);return rc; cti_state_unchanged:
@@ -132,7 +118,7 @@ static int cti_enable_hw(struct cti_drvdata *drvdata)/* cannot enable due to error */ cti_err_not_enabled: -spin_unlock (&drvdata->spinlock); +spin_unlock_irqrestore (&drvdata->spinlock, flags);pm_runtime_put (dev->parent);return rc; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 235/633 coresight: etm4x: Handle unreachable sink in perf mode
In reply to Greg Kroah-HartmanFrom: Suzuki K Poulose <[email protected]>
[ Upstream commit 859d510e58dac94f0b204b7b5cccafbc130d2291 ]
If the specified/hinted sink is not reachable from a subset of the CPUs, we could end up unable to trace the event on those CPUs. This is the best effort we could do until we support 1:1 configurations. Fail gracefully in such cases avoiding a WARN_ON, which can be easily triggered by the user on certain platforms (Arm N1SDP), with the following trace paths :
CPU0
\
-- Funnel0 --> ETF0 -->
/ \
CPU1 \
MainFunnel
CPU2 /
\ /
-- Funnel1 --> ETF1 -->
/CPU1
$ perf record --per-thread -e cs_etm/@ETF0/u -- <app>
could trigger the following WARNING, when the event is scheduled on CPU2.
[10919.513250] ------------[ cut here ]------------ [10919.517861] WARNING: CPU: 2 PID: 24021 at
drivers/hwtracing/coresight/coresight-etm-perf.c:316 etm_event_start+0xf8/0x100
...
[10919.564403] CPU: 2 PID: 24021 Comm: perf Not tainted 5.8.0+ #24 [10919.570308] pstate: 80400089 (Nzcv daIf +PAN -UAO BTYPE=--) [10919.575865] pc : etm_event_start+0xf8/0x100 [10919.580034] lr : etm_event_start+0x80/0x100 [10919.584202] sp : fffffe001932f940 [10919.587502] x29: fffffe001932f940 x28: fffffc834995f800 [10919.592799] x27: 0000000000000000 x26: fffffe0011f3ced0 [10919.598095] x25: fffffc837fce244c x24: fffffc837fce2448 [10919.603391] x23: 0000000000000002 x22: fffffc8353529c00 [10919.608688] x21: fffffc835bb31000 x20: 0000000000000000 [10919.613984] x19: fffffc837fcdcc70 x18: 0000000000000000 [10919.619281] x17: 0000000000000000 x16: 0000000000000000 [10919.624577] x15: 0000000000000000 x14: 00000000000009f8 [10919.629874] x13: 00000000000009f8 x12: 0000000000000018 [10919.635170] x11: 0000000000000000 x10: 0000000000000000 [10919.640467] x9 : fffffe00108cd168 x8 : 0000000000000000 [10919.645763] x7 : 0000000000000020 x6 : 0000000000000001 [10919.651059] x5 : 0000000000000002 x4 : 0000000000000001 [10919.656356] x3 : 0000000000000000 x2 : 0000000000000000 [10919.661652] x1 : fffffe836eb40000 x0 : 0000000000000000 [10919.666949] Call trace: [10919.669382] etm_event_start+0xf8/0x100 [10919.673203] etm_event_add+0x40/0x60 [10919.676765] event_sched_in.isra.134+0xcc/0x210 [10919.681281] merge_sched_in+0xb0/0x2a8 [10919.685017] visit_groups_merge.constprop.140+0x15c/0x4b8 [10919.690400] ctx_sched_in+0x15c/0x170 [10919.694048] perf_event_sched_in+0x6c/0xa0 [10919.698130] ctx_resched+0x60/0xa0 [10919.701517] perf_event_exec+0x288/0x2f0 [10919.705425] begin_new_exec+0x4c8/0xf58 [10919.709247] load_elf_binary+0x66c/0xf30 [10919.713155] exec_binprm+0x15c/0x450 [10919.716716] __do_execve_file+0x508/0x748 [10919.720711] __arm64_sys_execve+0x40/0x50 [10919.724707] do_el0_svc+0xf4/0x1b8 [10919.728095] el0_sync_handler+0xf8/0x124 [10919.732003] el0_sync+0x140/0x180
Even though we don't support using separate sinks for the ETMs yet (e.g, for 1:1 configurations), we should at least honor the user's choice and handle the limitations gracefully, by simply skipping the tracing on ETMs which can't reach the requested sink.
--- drivers/hwtracing/coresight/coresight-etm-perf.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/hwtracing/coresight/coresight-etm-perf.c +10 -0
@@ -310,6 +310,16 @@ static void etm_event_start(struct perf_event *event, int flags)if (!event_data) goto fail; +/* +* Check if this ETM is allowed to trace, as decided +* at etm_setup_aux(). This could be due to an unreachable +* sink from this ETM. We can't do much in this case if +* the sink was specified or hinted to the driver. For +* now, simply don't record anything on this ETM. +*/ +if (!cpumask_test_cpu (cpu, &event_data->mask)) + goto fail_end_stop; + path =etm_event_cpu_path (event_data, cpu);/* We need a sink, no need to continue without one */ sink =coresight_get_sink (path);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 236/633 coresight: etm4x: Fix issues on trcseqevr access
In reply to Greg Kroah-HartmanFrom: Jonathan Zhou <[email protected]>
[ Upstream commit 4cd83037cd957ad97756055355ab4ee63f259380 ]
The TRCSEQEVR(3) is reserved, using '@nrseqstate - 1' instead to avoid accessing the reserved register.
--- drivers/hwtracing/coresight/coresight-etm4x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x.c +2 -2
@@ -1189,7 +1189,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) state->trcvdsacctlr =readl (drvdata->base +TRCVDSACCTLR ); state->trcvdarcctlr =readl (drvdata->base +TRCVDARCCTLR ); -for (i =0 ; i < drvdata->nrseqstate; i++) +for (i =0 ; i < drvdata->nrseqstate -1 ; i++) state->trcseqevr[i] =readl (drvdata->base +TRCSEQEVRn (i)); state->trcseqrstevr =readl (drvdata->base +TRCSEQRSTEVR );
@@ -1294,7 +1294,7 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)writel_relaxed (state->trcvdsacctlr, drvdata->base +TRCVDSACCTLR );writel_relaxed (state->trcvdarcctlr, drvdata->base +TRCVDARCCTLR ); -for (i =0 ; i < drvdata->nrseqstate; i++) +for (i =0 ; i < drvdata->nrseqstate -1 ; i++)writel_relaxed (state->trcseqevr[i], drvdata->base +TRCSEQEVRn (i));
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 237/633 nvmem: core: fix missing of_node_put() in of_nvmem_device_get()
In reply to Greg Kroah-HartmanFrom: Vadym Kochan <[email protected]>
[ Upstream commit b1c194dcdb1425fa59eec61ab927cfff33096149 ]
of_parse_phandle() returns device_node with incremented ref count which needs to be decremented by of_node_put() when device_node is not used.
--- drivers/nvmem/core.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/nvmem/core.c +4 -1
@@ -823,6 +823,7 @@ struct nvmem_device *of_nvmem_device_get(struct device_node *np, const char *id) {struct device_node *nvmem_np; +struct nvmem_device *nvmem;int index =0 ;if (id)
@@ -832,7 +833,9 @@ struct nvmem_device *of_nvmem_device_get(struct device_node *np, const char *id)if (!nvmem_np)return ERR_PTR (-ENOENT ); - return __nvmem_device_get(nvmem_np, device_match_of_node); + nvmem =__nvmem_device_get (nvmem_np, device_match_of_node); +of_node_put (nvmem_np); + return nvmem; }EXPORT_SYMBOL_GPL (of_nvmem_device_get);#endif
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 238/633 selftests: mptcp: interpret \n as a new line
In reply to Greg Kroah-HartmanFrom: Matthieu Baerts <[email protected]>
[ Upstream commit 8b974778f998ab1be23eca7436fc13d2d8c6bd59 ]
In case of errors, this message was printed:
(...)
# read: Resource temporarily unavailable
# client exit code 0, server 3
# \nnetns ns1-0-BJlt5D socket stat for 10003:
(...)
Obviously, the idea was to add a new line before the socket stat and not print "\nnetns".
--- tools/testing/selftests/net/mptcp/mptcp_connect.sh | 4 ++-- tools/testing/selftests/net/mptcp/mptcp_join.sh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/net/mptcp/mptcp_connect.sh +2 -2
@@ -421,9 +421,9 @@ do_transfer() duration=$(printf "(duration %05sms)" $duration) if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then echo "$duration [ FAIL ] client exit code $retc, server $rets" 1>&2 - echo "\nnetns ${listener_ns} socket stat for $port:" 1>&2 + echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port" - echo "\nnetns ${connector_ns} socket stat for $port:" 1>&2 + echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port" cat "$capout"
tools/testing/selftests/net/mptcp/mptcp_join.sh +2 -2
@@ -167,9 +167,9 @@ do_transfer() if [ ${rets} -ne 0 ] || [ ${retc} -ne 0 ]; then echo " client exit code $retc, server $rets" 1>&2 - echo "\nnetns ${listener_ns} socket stat for $port:" 1>&2 + echo -e "\nnetns ${listener_ns} socket stat for ${port}:" 1>&2 ip netns exec ${listener_ns} ss -nita 1>&2 -o "sport = :$port" - echo "\nnetns ${connector_ns} socket stat for $port:" 1>&2 + echo -e "\nnetns ${connector_ns} socket stat for ${port}:" 1>&2 ip netns exec ${connector_ns} ss -nita 1>&2 -o "dport = :$port" cat "$capout"
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 239/633 selftests/bpf: Fix endianness issue in sk_assign
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit b6ed6cf4a3acdeab9aed8e0a524850761ec9b152 ]
server_map's value size is 8, but the test tries to put an int there. This sort of works on x86 (unless followed by non-0), but hard fails on s390.
Fix by using __s64 instead of int.
--- tools/testing/selftests/bpf/prog_tests/sk_assign.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/bpf/prog_tests/sk_assign.c +1 -1
@@ -265,7 +265,7 @@ void test_sk_assign(void)TEST ("ipv6 udp port redir" ,AF_INET6 ,SOCK_DGRAM , false), TEST("ipv6 udp addr redir", AF_INET6, SOCK_DGRAM, true), }; -int server =-1 ; +__s64 server =-1 ;int server_map;int self_net;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 240/633 selftests/bpf: Fix endianness issue in test_sockopt_sk
In reply to Greg Kroah-HartmanFrom: Ilya Leoshkevich <[email protected]>
[ Upstream commit fec47bbc10b243690f5d0ee484a0bbdee273e71b ]
getsetsockopt() calls getsockopt() with optlen == 1, but then checks the resulting int. It is ok on little endian, but not on big endian.
Fix by checking char instead.
--- tools/testing/selftests/bpf/prog_tests/sockopt_sk.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/testing/selftests/bpf/prog_tests/sockopt_sk.c +2 -2
@@ -45,9 +45,9 @@ static int getsetsockopt(void) goto err; } -if (*(int *)big_buf !=0x08 ) { +if (*big_buf !=0x08 ) {log_err ("Unexpected getsockopt(IP_TOS) optval 0x%x != 0x08" , - *(int *)big_buf); + (int )*big_buf); goto err; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 241/633 xhci: dont create endpoint debugfs entry before ring buffer is set.
In reply to Greg Kroah-HartmanFrom: Mathias Nyman <[email protected]>
[ Upstream commit 167657a1bb5fcde53ac304ce6c564bd90a2f9185 ]
Make sure xHC completes the configure endpoint command and xhci driver sets the ring pointers correctly before we create the user readable debugfs file.
In theory there was a small gap where a user could have read the debugfs file and cause a NULL pointer dereference error as ring pointer was not yet set, in practise we want this change to simplify the upcoming streams debugfs support.
--- drivers/usb/host/xhci.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/usb/host/xhci.c +1 -2
@@ -1915,8 +1915,6 @@ static int xhci_add_endpoint(struct usb_hcd *hcd, struct usb_device *udev, ep_ctx =xhci_get_ep_ctx (xhci, virt_dev->in_ctx, ep_index);trace_xhci_add_endpoint (ep_ctx); -xhci_debugfs_create_endpoint (xhci, virt_dev, ep_index); - xhci_dbg(xhci, "add ep 0x%x, slot id %d, new drop flags = %#x, new add flags = %#x\n", (unsigned int) ep->desc.bEndpointAddress, udev->slot_id,
@@ -2949,6 +2947,7 @@ static int xhci_check_bandwidth(struct usb_hcd *hcd, struct usb_device *udev)xhci_check_bw_drop_ep_streams (xhci, virt_dev, i); virt_dev->eps[i].ring = virt_dev->eps[i].new_ring; virt_dev->eps[i].new_ring =NULL ; +xhci_debugfs_create_endpoint (xhci, virt_dev, i); } command_cleanup:kfree (command->completion);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 242/633 net: dsa: rtl8366: Check validity of passed VLANs
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit 6641a2c42b0a307b7638d10e5d4b90debc61389d ]
The rtl8366_set_vlan() and rtl8366_set_pvid() get invalid VLANs tossed at it, especially VLAN0, something the hardware and driver cannot handle. Check validity and bail out like we do in the other callbacks.
--- drivers/net/dsa/rtl8366.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/net/dsa/rtl8366.c +6 -0
@@ -43,6 +43,9 @@ int rtl8366_set_vlan(struct realtek_smi *smi, int vid, u32 member,int ret;int i; +if (!smi->ops->is_vlan_valid (smi, vid)) +return -EINVAL ; +dev_dbg (smi->dev,"setting VLAN%d 4k members: 0x%02x, untagged: 0x%02x\n" , vid, member, untag);
@@ -118,6 +121,9 @@ int rtl8366_set_pvid(struct realtek_smi *smi, unsigned int port,int ret;int i; +if (!smi->ops->is_vlan_valid (smi, vid)) +return -EINVAL ; +/* Try to find an existing MC entry for this VID */ for (i =0 ; i < smi->num_vlan_mc; i++) { ret = smi->ops->get_vlan_mc (smi, i, &vlanmc);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 243/633 net: dsa: rtl8366: Refactor VLAN/PVID init
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit 7e1301ed1881447d2a25f9c6423738c33cbca133 ]
The VLANs and PVIDs on the RTL8366 utilizes a "member configuration" (MC) which is largely unexplained in the code.
This set-up requires a special ordering: rtl8366_set_pvid() must be called first, followed by rtl8366_set_vlan(), else the MC will not be properly allocated. Relax this by factoring out the code obtaining an MC and reuse the helper in both rtl8366_set_pvid() and rtl8366_set_vlan() so we remove this strict ordering requirement.
In the process, add some better comments and debug prints so people who read the code understand what is going on.
--- drivers/net/dsa/realtek-smi-core.h | 4 +- drivers/net/dsa/rtl8366.c | 273 +++++++++++++++-------------- 2 files changed, 146 insertions(+), 131 deletions(-)
drivers/net/dsa/realtek-smi-core.h +3 -1
@@ -25,6 +25,9 @@ struct rtl8366_mib_counter {const char *name; }; +/** +* struct rtl8366_vlan_mc - Virtual LAN member configuration +*/ struct rtl8366_vlan_mc {u16 vid;u16 untag;
@@ -119,7 +122,6 @@ int realtek_smi_setup_mdio(struct realtek_smi *smi);int rtl8366_mc_is_used (struct realtek_smi *smi,int mc_index,int *used);int rtl8366_set_vlan (struct realtek_smi *smi,int vid,u32 member,u32 untag,u32 fid); -int rtl8366_get_pvid (struct realtek_smi *smi,int port,int *val);int rtl8366_set_pvid (struct realtek_smi *smi,unsigned int port,unsigned int vid);int rtl8366_enable_vlan4k (struct realtek_smi *smi,bool enable);
drivers/net/dsa/rtl8366.c +143 -130
332 lines not on this page · raw message
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 244/633 net: dsa: rtl8366: Skip PVID setting if not requested
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit 3dfe8dde093a07e82fa472c0f8c29a7f6a2006a5 ]
We go to lengths to determine whether the PVID should be set for this port or not, and then fail to take it into account. Fix this oversight.
--- drivers/net/dsa/rtl8366.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/dsa/rtl8366.c +3 -0
@@ -436,6 +436,9 @@ void rtl8366_vlan_add(struct dsa_switch *ds, int port,"failed to set up VLAN %04x" , vid); +if (!pvid) +continue ; + ret =rtl8366_set_pvid (smi, port, vid);if (ret) dev_err(smi->dev,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 245/633 net: wilc1000: clean up resource in error path of init mon interface
In reply to Greg Kroah-HartmanFrom: Huang Guobin <[email protected]>
[ Upstream commit 55bd149978679742374c800e56e8f6bc74378bbe ]
The wilc_wfi_init_mon_int() forgets to clean up resource when register_netdevice() failed. Add the missed call to fix it. And the return value of netdev_priv can't be NULL, so remove the unnecessary error handling.
--- drivers/staging/wilc1000/mon.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/staging/wilc1000/mon.c +1 -2
@@ -236,11 +236,10 @@ struct net_device *wilc_wfi_init_mon_interface(struct wilc *wl,if (register_netdevice (wl->monitor_dev)) {netdev_err (real_dev,"register_netdevice failed\n" ); +free_netdev (wl->monitor_dev);return NULL ; } priv =netdev_priv (wl->monitor_dev); -if (!priv) -return NULL ; priv->real_ndev = real_dev;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 246/633 ASoC: tas2770: Fix calling reset in probe
In reply to Greg Kroah-HartmanFrom: Dan Murphy <[email protected]>
[ Upstream commit b0bcbe615756d5923eec4e95996e4041627e5741 ]
tas2770_reset is called during i2c probe. The reset calls the snd_soc_component_write which depends on the tas2770->component being available. The component pointer is not set until codec_probe so move the reset to the codec_probe after the pointer is set.
--- sound/soc/codecs/tas2770.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
sound/soc/codecs/tas2770.c +2 -2
@@ -574,6 +574,8 @@ static int tas2770_codec_probe(struct snd_soc_component *component) tas2770->component = component; +tas2770_reset (tas2770); +return 0 ; }
@@ -770,8 +772,6 @@ static int tas2770_i2c_probe(struct i2c_client *client, tas2770->channel_size =0 ; tas2770->slot_width =0 ; -tas2770_reset (tas2770); - result =tas2770_register_codec (tas2770);if (result)dev_err (tas2770->dev,"Register codec failed.\n" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 247/633 ASoC: tas2770: Add missing bias level power states
In reply to Greg Kroah-HartmanFrom: Dan Murphy <[email protected]>
[ Upstream commit 4272caf34aa4699eca8e6e7f4a8e5ea2bde275c9 ]
Add the BIAS_STANDBY and BIAS_PREPARE to the set_bias_level or else the driver will return -EINVAL which is not correct as they are valid states.
--- sound/soc/codecs/tas2770.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
sound/soc/codecs/tas2770.c +6 -1
@@ -57,7 +57,12 @@ static int tas2770_set_bias_level(struct snd_soc_component *component,TAS2770_PWR_CTRL_MASK , TAS2770_PWR_CTRL_ACTIVE);break ; - +case SND_SOC_BIAS_STANDBY : +case SND_SOC_BIAS_PREPARE : +snd_soc_component_update_bits (component, +TAS2770_PWR_CTRL , +TAS2770_PWR_CTRL_MASK ,TAS2770_PWR_CTRL_MUTE ); +break ;case SND_SOC_BIAS_OFF : snd_soc_component_update_bits(component, TAS2770_PWR_CTRL,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 248/633 ASoC: tas2770: Fix required DT properties in the code
In reply to Greg Kroah-HartmanFrom: Dan Murphy <[email protected]>
[ Upstream commit 4b8ab8a7761fe2ba1c4e741703a848cb8f390f79 ]
The devicetree binding indicates that the ti,asi-format, ti,imon-slot-no and ti,vmon-slot-no are not required but the driver requires them or it fails to probe. Honor the binding and allow these entries to be optional and set the corresponding values to the default values for each as defined in the data sheet.
--- sound/soc/codecs/tas2770.c | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-)
sound/soc/codecs/tas2770.c +10 -11
@@ -707,29 +707,28 @@ static int tas2770_parse_dt(struct device *dev, struct tas2770_priv *tas2770) rc =fwnode_property_read_u32 (dev->fwnode,"ti,asi-format" , &tas2770->asi_format);if (rc) { -dev_err (tas2770->dev,"Looking up %s property failed %d\n" , -"ti,asi-format" , rc); - goto end; +dev_info (tas2770->dev,"Property %s is missing setting default slot\n" , +"ti,asi-format" ); + tas2770->asi_format =0 ; } rc =fwnode_property_read_u32 (dev->fwnode,"ti,imon-slot-no" , &tas2770->i_sense_slot);if (rc) { -dev_err (tas2770->dev,"Looking up %s property failed %d\n" , -"ti,imon-slot-no" , rc); - goto end; +dev_info (tas2770->dev,"Property %s is missing setting default slot\n" , +"ti,imon-slot-no" ); + tas2770->i_sense_slot =0 ; } rc =fwnode_property_read_u32 (dev->fwnode,"ti,vmon-slot-no" , &tas2770->v_sense_slot);if (rc) { -dev_err (tas2770->dev,"Looking up %s property failed %d\n" , -"ti,vmon-slot-no" , rc); - goto end; +dev_info (tas2770->dev,"Property %s is missing setting default slot\n" , +"ti,vmon-slot-no" ); + tas2770->v_sense_slot =2 ; } -end: -return rc; +return 0 ; } static int tas2770_i2c_probe(struct i2c_client *client,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 249/633 ASoC: tas2770: Fix error handling with update_bits
In reply to Greg Kroah-HartmanFrom: Dan Murphy <[email protected]>
[ Upstream commit cadab0aefcbadf488b16caf2770430e69f4d7839 ]
snd_soc_update_bits returns a 1 when the bit was successfully updated, returns a 0 is no update was needed and a negative if the call failed. The code is currently failing the case of a successful update by just checking for a non-zero number. Modify these checks and return the error code only if there is a negative.
--- sound/soc/codecs/tas2770.c | 52 ++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 28 deletions(-)
sound/soc/codecs/tas2770.c +24 -28
@@ -140,23 +140,18 @@ static int tas2770_dac_event(struct snd_soc_dapm_widget *w,TAS2770_PWR_CTRL ,TAS2770_PWR_CTRL_MASK , TAS2770_PWR_CTRL_MUTE); -if (ret) - goto end;break ;case SND_SOC_DAPM_PRE_PMD : ret =snd_soc_component_update_bits (component,TAS2770_PWR_CTRL ,TAS2770_PWR_CTRL_MASK ,TAS2770_PWR_CTRL_SHUTDOWN ); -if (ret) - goto end;break ;default :dev_err (tas2770->dev,"Not supported evevt\n" );return -EINVAL ; } -end:if (ret <0 )return ret;
@@ -248,6 +243,9 @@ static int tas2770_set_bitwidth(struct tas2770_priv *tas2770, int bitwidth)return -EINVAL ; } +if (ret <0 ) +return ret; + tas2770->channel_size = bitwidth; ret = snd_soc_component_update_bits(component,
@@ -256,16 +254,15 @@ static int tas2770_set_bitwidth(struct tas2770_priv *tas2770, int bitwidth)TAS2770_TDM_CFG_REG5_50_MASK ,TAS2770_TDM_CFG_REG5_VSNS_ENABLE | tas2770->v_sense_slot); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG6 ,TAS2770_TDM_CFG_REG6_ISNS_MASK |TAS2770_TDM_CFG_REG6_50_MASK ,TAS2770_TDM_CFG_REG6_ISNS_ENABLE | tas2770->i_sense_slot); - -end:if (ret <0 )return ret;
@@ -283,36 +280,35 @@ static int tas2770_set_samplerate(struct tas2770_priv *tas2770, int samplerate)TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_SMP_MASK , TAS2770_TDM_CFG_REG0_SMP_48KHZ); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_31_MASK ,TAS2770_TDM_CFG_REG0_31_44_1_48KHZ ); -if (ret) - goto end;break ;case 44100 : ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_SMP_MASK ,TAS2770_TDM_CFG_REG0_SMP_44_1KHZ ); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_31_MASK ,TAS2770_TDM_CFG_REG0_31_44_1_48KHZ ); -if (ret) - goto end;break ;case 96000 : ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_SMP_MASK ,TAS2770_TDM_CFG_REG0_SMP_48KHZ ); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0, TAS2770_TDM_CFG_REG0_31_MASK,
@@ -323,8 +319,9 @@ static int tas2770_set_samplerate(struct tas2770_priv *tas2770, int samplerate)TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_SMP_MASK , TAS2770_TDM_CFG_REG0_SMP_44_1KHZ); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0, TAS2770_TDM_CFG_REG0_31_MASK,
@@ -335,22 +332,22 @@ static int tas2770_set_samplerate(struct tas2770_priv *tas2770, int samplerate)TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_SMP_MASK , TAS2770_TDM_CFG_REG0_SMP_48KHZ); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_31_MASK ,TAS2770_TDM_CFG_REG0_31_176_4_192KHZ ); -if (ret) - goto end;break ;case 17640 : ret =snd_soc_component_update_bits (component,TAS2770_TDM_CFG_REG0 ,TAS2770_TDM_CFG_REG0_SMP_MASK ,TAS2770_TDM_CFG_REG0_SMP_44_1KHZ ); -if (ret) - goto end; +if (ret <0 ) +return ret; + ret = snd_soc_component_update_bits(component, TAS2770_TDM_CFG_REG0, TAS2770_TDM_CFG_REG0_31_MASK,
@@ -360,7 +357,6 @@ static int tas2770_set_samplerate(struct tas2770_priv *tas2770, int samplerate) ret = -EINVAL ; } -end:if (ret <0 )return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 250/633 ASoC: tlv320aic32x4: Fix bdiv clock rate derivation
In reply to Greg Kroah-HartmanFrom: Miquel Raynal <[email protected]>
[ Upstream commit 40b37136287ba6b34aa2f1f6123f3d6d205dc2f0 ]
Current code expects a single channel to be always used. Fix this situation by forwarding the number of channels used. Then fix the derivation of the bdiv clock rate.
--- sound/soc/codecs/tlv320aic32x4.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
sound/soc/codecs/tlv320aic32x4.c +6 -3
@@ -665,7 +665,7 @@ static int aic32x4_set_processing_blocks(struct snd_soc_component *component, }static int aic32x4_setup_clocks (struct snd_soc_component *component, -unsigned int sample_rate) +unsigned int sample_rate,unsigned int channels) {u8 aosr;u16 dosr;
@@ -753,7 +753,9 @@ static int aic32x4_setup_clocks(struct snd_soc_component *component, dosr);clk_set_rate (clocks[5 ].clk, - sample_rate *32 ); + sample_rate *32 * + channels); +return 0 ; } }
@@ -775,7 +777,8 @@ static int aic32x4_hw_params(struct snd_pcm_substream *substream,u8 iface1_reg =0 ;u8 dacsetup_reg =0 ; -aic32x4_setup_clocks (component,params_rate (params)); +aic32x4_setup_clocks (component,params_rate (params), +params_channels (params));switch (params_width (params)) {case 16 :
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 251/633 net: dsa: rtl8366rb: Support all 4096 VLANs
In reply to Greg Kroah-HartmanFrom: Linus Walleij <[email protected]>
[ Upstream commit a7920efdd86d8a0d74402dbc80ead03b023294ba ]
There is an off-by-one error in rtl8366rb_is_vlan_valid() making VLANs 0..4094 valid while it should be 1..4095. Fix it.
--- drivers/net/dsa/rtl8366rb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/rtl8366rb.c +1 -1
@@ -1270,7 +1270,7 @@ static bool rtl8366rb_is_vlan_valid(struct realtek_smi *smi, unsigned int vlan)if (smi->vlan4k_enabled) max =RTL8366RB_NUM_VIDS -1 ; -if (vlan ==0 || vlan >= max) +if (vlan ==0 || vlan > max)return false;return true;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 252/633 ASoC: SOF: control: add size checks for ext_bytes control .put()
In reply to Greg Kroah-HartmanFrom: Pierre-Louis Bossart <[email protected]>
[ Upstream commit 2ca210112ad91880d2d5a3f85fecc838600afbce ]
Make sure the TLV header and size are consistent before copying from userspace.
--- sound/soc/sof/control.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
sound/soc/sof/control.c +11 -0
@@ -298,6 +298,10 @@ int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,const struct snd_ctl_tlv __user *tlvd = (const struct snd_ctl_tlv __user *)binary_data; +/* make sure we have at least a header */ +if (size <sizeof (struct snd_ctl_tlv )) +return -EINVAL ; +/* * The beginning of bytes data contains a header from where * the length (as bytes) is needed to know the correct copy
@@ -306,6 +310,13 @@ int snd_sof_bytes_ext_put(struct snd_kcontrol *kcontrol,if (copy_from_user (&header, tlvd,sizeof (const struct snd_ctl_tlv )))return -EFAULT ; +/* make sure TLV info is consistent */ +if (header.length +sizeof (struct snd_ctl_tlv ) > size) { +dev_err_ratelimited (scomp->dev,"error: inconsistent TLV, data %d + header %zu > %d\n" , + header.length,sizeof (struct snd_ctl_tlv ), size); +return -EINVAL ; + } +/* be->max is coming from topology */ if (header.length > be->max) { dev_err_ratelimited(scomp->dev, "error: Bytes data size %d exceeds max %d.\n",
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 253/633 ASoC: tas2770: Fix unbalanced calls to pm_runtime
In reply to Greg Kroah-HartmanFrom: Dan Murphy <[email protected]>
[ Upstream commit d3d71c99b541040da198f43da3bbd85d8e9598cb ]
Fix the unbalanced call to the pm_runtime_disable when removing the module. pm_runtime_enable is not called nor is the pm_runtime setup in the code. Remove the i2c_remove function and the pm_runtime_disable.
--- sound/soc/codecs/tas2770.c | 9 --------- 1 file changed, 9 deletions(-)
sound/soc/codecs/tas2770.c +0 -9
@@ -16,7 +16,6 @@#include <linux/i2c.h> #include <linux/gpio.h> #include <linux/gpio/consumer.h> -#include <linux/pm_runtime.h> #include <linux/regulator/consumer.h> #include <linux/firmware.h> #include <linux/regmap.h>
@@ -780,13 +779,6 @@ static int tas2770_i2c_probe(struct i2c_client *client,return result; } -static int tas2770_i2c_remove (struct i2c_client *client) -{ -pm_runtime_disable (&client->dev); -return 0 ; -} - -static const struct i2c_device_id tas2770_i2c_id[] = { {"tas2770" ,0 }, { }
@@ -807,7 +799,6 @@ static struct i2c_driver tas2770_i2c_driver = { .of_match_table = of_match_ptr(tas2770_of_match), }, .probe = tas2770_i2c_probe, - .remove = tas2770_i2c_remove, .id_table = tas2770_i2c_id, };
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 254/633 spi: omap2-mcspi: Improve performance waiting for CHSTAT
In reply to Greg Kroah-HartmanFrom: Aswath Govindraju <[email protected]>
[ Upstream commit 7b1d96813317358312440d0d07abbfbeb0ef8d22 ]
This reverts commit 13d515c796 (spi: omap2-mcspi: Switch to readl_poll_timeout()).
The amount of time spent polling for the MCSPI_CHSTAT bits to be set on AM335x-icev2 platform is less than 1us (about 0.6us) in most cases, with or without using DMA. So, in most cases the function need not sleep. Also, setting the sleep_usecs to zero would not be optimal here because ktime_add_us() used in readl_poll_timeout() is slower compared to the direct addition used after the revert. So, it is sub-optimal to use readl_poll_timeout in this case.
When DMA is not enabled, this revert results in an increase of about 27% in throughput and decrease of about 20% in CPU usage. However, the CPU usage and throughput are almost the same when used with DMA.
Therefore, fix this by reverting the commit which switched to using readl_poll_timeout().
--- drivers/spi/spi-omap2-mcspi.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/spi/spi-omap2-mcspi.c +13 -4
@@ -24,7 +24,6 @@#include <linux/of.h> #include <linux/of_device.h> #include <linux/gcd.h> -#include <linux/iopoll.h> #include <linux/spi/spi.h> #include <linux/gpio.h>
@@ -349,9 +348,19 @@ static void omap2_mcspi_set_fifo(const struct spi_device *spi,static int mcspi_wait_for_reg_bit (void __iomem *reg,unsigned long bit) { -u32 val; - -return readl_poll_timeout (reg, val, val & bit,1 ,MSEC_PER_SEC ); +unsigned long timeout; + + timeout = jiffies +msecs_to_jiffies (1000 ); +while (!(readl_relaxed (reg) & bit)) { +if (time_after (jiffies, timeout)) { +if (!(readl_relaxed (reg) & bit)) +return -ETIMEDOUT ; +else +return 0 ; + } +cpu_relax (); + } +return 0 ; } static int mcspi_wait_for_completion(struct omap2_mcspi *mcspi,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 255/633 ath11k: Add checked value for ath11k_ahb_remove
In reply to Greg Kroah-HartmanFrom: Bo YU <[email protected]>
[ Upstream commit 80b892fc8a90e91498babf0f6817139e5ec64b5c ]
Return value form wait_for_completion_timeout should to be checked.
This is detected by Coverity: #CID:1464479 (CHECKED_RETURN)
--- drivers/net/wireless/ath/ath11k/ahb.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/net/wireless/ath/ath11k/ahb.c +7 -3
@@ -981,12 +981,16 @@ static int ath11k_ahb_probe(struct platform_device *pdev)static int ath11k_ahb_remove (struct platform_device *pdev) {struct ath11k_base *ab =platform_get_drvdata (pdev); +unsigned long left;reinit_completion (&ab->driver_recovery); -if (test_bit (ATH11K_FLAG_RECOVERY , &ab->dev_flags)) -wait_for_completion_timeout (&ab->driver_recovery, -ATH11K_AHB_RECOVERY_TIMEOUT ); +if (test_bit (ATH11K_FLAG_RECOVERY , &ab->dev_flags)) { + left =wait_for_completion_timeout (&ab->driver_recovery, +ATH11K_AHB_RECOVERY_TIMEOUT ); +if (!left) +ath11k_warn (ab,"failed to receive recovery response completion\n" ); + }set_bit (ATH11K_FLAG_UNREGISTERING , &ab->dev_flags);cancel_work_sync (&ab->restart_work);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 256/633 ath6kl: wmi: prevent a shift wrapping bug in ath6kl_wmi_delete_pstream_cmd()
In reply to Greg Kroah-HartmanFrom: Dan Carpenter <[email protected]>
[ Upstream commit 6a950755cec1a90ddaaff3e4acb5333617441c32 ]
The "tsid" is a user controlled u8 which comes from debugfs. Values more than 15 are invalid because "active_tsids" is a 16 bit variable. If the value of "tsid" is more than 31 then that leads to a shift wrapping bug.
--- drivers/net/wireless/ath/ath6kl/wmi.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/wireless/ath/ath6kl/wmi.c +5 -0
@@ -2645,6 +2645,11 @@ int ath6kl_wmi_delete_pstream_cmd(struct wmi *wmi, u8 if_idx, u8 traffic_class,return -EINVAL ; } +if (tsid >=16 ) { +ath6kl_err ("invalid tsid: %d\n" , tsid); +return -EINVAL ; + } + skb =ath6kl_wmi_get_new_buf (sizeof (*cmd));if (!skb)return -ENOMEM ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 257/633 drm: rcar-du: Put reference to VSP device
In reply to Greg Kroah-HartmanFrom: Laurent Pinchart <[email protected]>
[ Upstream commit 2a32dbdc2c7db5463483fa01fb220fd1b770c6bc ]
The reference to the VSP device acquired with of_find_device_by_node() in rcar_du_vsp_init() is never released. Fix it with a drmm action, which gets run both in the probe error path and in the remove path.
--- drivers/gpu/drm/rcar-du/rcar_du_vsp.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
drivers/gpu/drm/rcar-du/rcar_du_vsp.c +12 -0
@@ -13,6 +13,7 @@#include <drm/drm_fourcc.h> #include <drm/drm_gem_cma_helper.h> #include <drm/drm_gem_framebuffer_helper.h> +#include <drm/drm_managed.h> #include <drm/drm_plane_helper.h> #include <drm/drm_vblank.h>
@@ -341,6 +342,13 @@ static const struct drm_plane_funcs rcar_du_vsp_plane_funcs = { .atomic_destroy_state = rcar_du_vsp_plane_atomic_destroy_state, }; +static void rcar_du_vsp_cleanup (struct drm_device *dev,void *res) +{ +struct rcar_du_vsp *vsp = res; + +put_device (vsp->vsp); +} +int rcar_du_vsp_init (struct rcar_du_vsp *vsp,struct device_node *np,unsigned int crtcs) {
@@ -357,6 +365,10 @@ int rcar_du_vsp_init(struct rcar_du_vsp *vsp, struct device_node *np, vsp->vsp = &pdev->dev; + ret =drmm_add_action (rcdu->ddev, rcar_du_vsp_cleanup, vsp); +if (ret <0 ) +return ret; + ret =vsp1_du_init (vsp->vsp);if (ret <0 )return ret;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 258/633 phy: rockchip-dphy-rx0: Include linux/delay.h
In reply to Greg Kroah-HartmanFrom: Tomasz Figa <[email protected]>
[ Upstream commit 488e3f52a82775bf9a4826a9eb59f10336c3f012 ]
Fix an implicit declaration of usleep_range():
drivers/phy/rockchip/phy-rockchip-dphy-rx0.c: In function 'rk_dphy_enable':drivers/phy/rockchip/phy-rockchip-dphy-rx0.c:203:2: error: implicit declaration of function 'usleep_range' [-Werror=implicit-function-declaration]
--- .../staging/media/phy-rockchip-dphy-rx0/phy-rockchip-dphy-rx0.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/media/phy-rockchip-dphy-rx0/phy-rockchip-dphy-rx0.c +1 -0
@@ -16,6 +16,7 @@*/ #include <linux/clk.h> +#include <linux/delay.h> #include <linux/io.h> #include <linux/mfd/syscon.h> #include <linux/module.h>
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 259/633 dmaengine: dmatest: Check list for emptiness before access its last entry
In reply to Greg Kroah-HartmanFrom: Andy Shevchenko <[email protected]>
[ Upstream commit b28de385b71abf31ce68ec0387638bee26ae9024 ]
After writing a garbage to the channel we get an Oops in dmatest_chan_set() due to access to last entry in the empty list.
[ 212.670672] BUG: unable to handle page fault for address: fffffff000000020 [ 212.677562] #PF: supervisor read access in kernel mode [ 212.682702] #PF: error_code(0x0000) - not-present page ... [ 212.710074] RIP: 0010:dmatest_chan_set+0x149/0x2d0 [dmatest] [ 212.715739] Code: e8 cc f9 ff ff 48 8b 1d 0d 55 00 00 48 83 7b 10 00 0f 84 63 01 00 00 48 c7 c7 d0 65 4d c0 e8 ee 4a f5 e1 48 89 c6 48 8b 43 10 <48> 8b 40 20 48 8b 78 58 48 85 ff 0f 84 f5 00 00 00 e8 b1 41 f5 e1
Fix this by checking list for emptiness before accessing its last entry.
--- drivers/dma/dmatest.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/dma/dmatest.c +2 -3
@@ -1240,15 +1240,14 @@ static int dmatest_chan_set(const char *val, const struct kernel_param *kp)add_threaded_test (info);/* Check if channel was added successfully */ - dtc = list_last_entry(&info->channels, struct dmatest_chan, node); - -if (dtc->chan) { +if (!list_empty (&info->channels)) {/* * if new channel was not successfully added, revert the * "test_channel" string to the name of the last successfully * added channel. exception for when users issues empty string * to channel parameter. */ + dtc = list_last_entry(&info->channels, struct dmatest_chan, node);if ((strcmp (dma_chan_name (dtc->chan),strim (test_channel)) !=0 ) && (strcmp ("" ,strim (test_channel)) !=0 )) { ret = -EINVAL ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 260/633 ASoC: cros_ec_codec: fix kconfig dependency warning for SND_SOC_CROS_EC_CODEC
In reply to Greg Kroah-HartmanFrom: Necip Fazil Yildiran <[email protected]>
[ Upstream commit 50b18e4a2608e3897f3787eaa7dfa869b40d9923 ]
When SND_SOC_CROS_EC_CODEC is enabled and CRYPTO is disabled, it results in the following Kbuild warning:
WARNING: unmet direct dependencies detected for CRYPTO_LIB_SHA256
Depends on [n]: CRYPTO [=n]
Selected by [y]:
- SND_SOC_CROS_EC_CODEC [=y] && SOUND [=y] && !UML && SND [=y] && SND_SOC [=y] && CROS_EC [=y]
The reason is that SND_SOC_CROS_EC_CODEC selects CRYPTO_LIB_SHA256 without depending on or selecting CRYPTO while CRYPTO_LIB_SHA256 is subordinate to CRYPTO.
Honor the kconfig menu hierarchy to remove kconfig dependency warnings.
--- sound/soc/codecs/Kconfig | 1 + 1 file changed, 1 insertion(+)
sound/soc/codecs/Kconfig +1 -0
@@ -539,6 +539,7 @@ config SND_SOC_CQ0093VC config SND_SOC_CROS_EC_CODEC tristate "codec driver for ChromeOS EC" depends on CROS_EC + select CRYPTO select CRYPTO_LIB_SHA256 help If you say yes here you will get support for the
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 261/633 misc: mic: scif: Fix error handling path
In reply to Greg Kroah-HartmanFrom: Souptick Joarder <[email protected]>
[ Upstream commit a81072a9c0ae734b7889929b0bc070fe3f353f0e ]
Inside __scif_pin_pages(), when map_flags != SCIF_MAP_KERNEL it will call pin_user_pages_fast() to map nr_pages. However, pin_user_pages_fast() might fail with a return value -ERRNO.
The return value is stored in pinned_pages->nr_pages. which in turn is passed to unpin_user_pages(), which expects pinned_pages->nr_pages >=0, else disaster.
Fix this by assigning pinned_pages->nr_pages to 0 if pin_user_pages_fast() returns -ERRNO.
--- drivers/misc/mic/scif/scif_rma.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/misc/mic/scif/scif_rma.c +2 -2
@@ -1384,6 +1384,8 @@ int __scif_pin_pages(void *addr, size_t len, int *out_prot, (prot &SCIF_PROT_WRITE ) ?FOLL_WRITE :0 , pinned_pages->pages);if (nr_pages != pinned_pages->nr_pages) { +if (pinned_pages->nr_pages <0 ) + pinned_pages->nr_pages =0 ;if (try_upgrade) {if (ulimit)__scif_dec_pinned_vm_lock (mm, nr_pages);
@@ -1400,7 +1402,6 @@ int __scif_pin_pages(void *addr, size_t len, int *out_prot,if (pinned_pages->nr_pages < nr_pages) { err = -EFAULT ; - pinned_pages->nr_pages = nr_pages; goto dec_pinned; }
@@ -1413,7 +1414,6 @@ int __scif_pin_pages(void *addr, size_t len, int *out_prot,__scif_dec_pinned_vm_lock (mm, nr_pages);/* Something went wrong! Rollback */ error_unmap: - pinned_pages->nr_pages = nr_pages;scif_destroy_pinned_pages (pinned_pages); *pages =NULL ; dev_dbg(scif_info.mdev.this_device,
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 262/633 ALSA: seq: oss: Avoid mutex lock for a long-time ioctl
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit 2759caad2600d503c3b0ed800e7e03d2cd7a4c05 ]
Recently we applied a fix to cover the whole OSS sequencer ioctls with the mutex for dealing with the possible races. This works fine in general, but in theory, this may lead to unexpectedly long stall if an ioctl like SNDCTL_SEQ_SYNC is issued and an event with the far future timestamp was queued.
For fixing such a potential stall, this patch changes the mutex lock applied conditionally excluding such an ioctl command. Also, change the mutex_lock() with the interruptible version for user to allow escaping from the big-hammer mutex.
--- sound/core/seq/oss/seq_oss.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
sound/core/seq/oss/seq_oss.c +5 -2
@@ -174,9 +174,12 @@ odev_ioctl(struct file *file, unsigned int cmd, unsigned long arg)if (snd_BUG_ON (!dp))return -ENXIO ; -mutex_lock (®ister_mutex); +if (cmd !=SNDCTL_SEQ_SYNC && +mutex_lock_interruptible (®ister_mutex)) +return -ERESTARTSYS ; rc =snd_seq_oss_ioctl (dp, cmd, arg); -mutex_unlock (®ister_mutex); +if (cmd !=SNDCTL_SEQ_SYNC ) +mutex_unlock (®ister_mutex);return rc; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 263/633 usb: dwc2: Fix parameter type in function pointer prototype
In reply to Greg Kroah-HartmanFrom: Nathan Chancellor <[email protected]>
[ Upstream commit 362b9398c962c9ec563653444e15ef9032ef3a90 ]
When booting up on a Raspberry Pi 4 with Control Flow Integrity checking enabled, the following warning/panic happens:
[ 1.626435] CFI failure (target: dwc2_set_bcm_params+0x0/0x4): [ 1.632408] WARNING: CPU: 0 PID: 32 at kernel/cfi.c:30 __cfi_check_fail+0x54/0x5c [ 1.640021] Modules linked in: [ 1.643137] CPU: 0 PID: 32 Comm: kworker/0:1 Not tainted 5.8.0-rc6-next-20200724-00051-g89ba619726de #1 [ 1.652693] Hardware name: Raspberry Pi 4 Model B Rev 1.2 (DT) [ 1.658637] Workqueue: events deferred_probe_work_func [ 1.663870] pstate: 60000005 (nZCv daif -PAN -UAO BTYPE=--) [ 1.669542] pc : __cfi_check_fail+0x54/0x5c [ 1.673798] lr : __cfi_check_fail+0x54/0x5c [ 1.678050] sp : ffff8000102bbaa0 [ 1.681419] x29: ffff8000102bbaa0 x28: ffffab09e21c7000 [ 1.686829] x27: 0000000000000402 x26: ffff0000f6e7c228 [ 1.692238] x25: 00000000fb7cdb0d x24: 0000000000000005 [ 1.697647] x23: ffffab09e2515000 x22: ffffab09e069a000 [ 1.703055] x21: 4c550309df1cf4c1 x20: ffffab09e2433c60 [ 1.708462] x19: ffffab09e160dc50 x18: ffff0000f6e8cc78 [ 1.713870] x17: 0000000000000041 x16: ffffab09e0bce6f8 [ 1.719278] x15: ffffab09e1c819b7 x14: 0000000000000003 [ 1.724686] x13: 00000000ffffefff x12: 0000000000000000 [ 1.730094] x11: 0000000000000000 x10: 00000000ffffffff [ 1.735501] x9 : c932f7abfc4bc600 x8 : c932f7abfc4bc600 [ 1.740910] x7 : 077207610770075f x6 : ffff0000f6c38f00 [ 1.746317] x5 : 0000000000000000 x4 : 0000000000000000 [ 1.751723] x3 : 0000000000000000 x2 : 0000000000000000 [ 1.757129] x1 : ffff8000102bb7d8 x0 : 0000000000000032 [ 1.762539] Call trace: [ 1.765030] __cfi_check_fail+0x54/0x5c [ 1.768938] __cfi_check+0x5fa6c/0x66afc [ 1.772932] dwc2_init_params+0xd74/0xd78 [ 1.777012] dwc2_driver_probe+0x484/0x6ec [ 1.781180] platform_drv_probe+0xb4/0x100 [ 1.785350] really_probe+0x228/0x63c [ 1.789076] driver_probe_device+0x80/0xc0 [ 1.793247] __device_attach_driver+0x114/0x160 [ 1.797857] bus_for_each_drv+0xa8/0x128 [ 1.801851] __device_attach.llvm.14901095709067289134+0xc0/0x170 [ 1.808050] bus_probe_device+0x44/0x100 [ 1.812044] deferred_probe_work_func+0x78/0xb8 [ 1.816656] process_one_work+0x204/0x3c4 [ 1.820736] worker_thread+0x2f0/0x4c4 [ 1.824552] kthread+0x174/0x184 [ 1.827837] ret_from_fork+0x10/0x18
CFI validates that all indirect calls go to a function with the same exact function pointer prototype. In this case, dwc2_set_bcm_params is the target, which has a parameter of type 'struct dwc2_hsotg *', but it is being implicitly cast to have a parameter of type 'void *' because that is the set_params function pointer prototype. Make the function pointer protoype match the definitions so that there is no more violation.
--- drivers/usb/dwc2/params.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/usb/dwc2/params.c +1 -1
@@ -860,7 +860,7 @@ int dwc2_get_hwparams(struct dwc2_hsotg *hsotg)int dwc2_init_params (struct dwc2_hsotg *hsotg) {const struct of_device_id *match; -void (*set_params)(void *data); +void (*set_params)(struct dwc2_hsotg *data);dwc2_set_default_params (hsotg);dwc2_get_device_properties (hsotg);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 264/633 usb: dwc3: core: Properly default unspecified speed
In reply to Greg Kroah-HartmanFrom: Thinh Nguyen <[email protected]>
[ Upstream commit b574ce3ee45937f4a01edc98c59213bfc7effe50 ]
If the maximum_speed is not specified, default the device speed base on its HW capability. Don't prematurely check HW capability before validating the maximum_speed device property. The device property takes precedence in dwc->maximum_speed.
--- drivers/usb/dwc3/core.c | 35 ++++++++++++++++++----------------- 1 file changed, 18 insertions(+), 17 deletions(-)
drivers/usb/dwc3/core.c +18 -17
@@ -930,13 +930,6 @@ static int dwc3_core_init(struct dwc3 *dwc)*/ dwc3_writel (dwc->regs,DWC3_GUID ,LINUX_VERSION_CODE ); -/* Handle USB2.0-only core configuration */ -if (DWC3_GHWPARAMS3_SSPHY_IFC (dwc->hwparams.hwparams3) == -DWC3_GHWPARAMS3_SSPHY_IFC_DIS ) { -if (dwc->maximum_speed ==USB_SPEED_SUPER ) - dwc->maximum_speed =USB_SPEED_HIGH ; - } - ret =dwc3_phy_setup (dwc);if (ret) goto err0;
@@ -1382,6 +1375,8 @@ bool dwc3_has_imod(struct dwc3 *dwc)static void dwc3_check_params (struct dwc3 *dwc) {struct device *dev = dwc->dev; +unsigned int hwparam_gen = +DWC3_GHWPARAMS3_SSPHY_IFC (dwc->hwparams.hwparams3);/* Check for proper value of imod_interval */ if (dwc->imod_interval && !dwc3_has_imod (dwc)) {
@@ -1413,17 +1408,23 @@ static void dwc3_check_params(struct dwc3 *dwc) dwc->maximum_speed);/* fall through */ case USB_SPEED_UNKNOWN : -/* default to superspeed */ - dwc->maximum_speed =USB_SPEED_SUPER ; - -/* -* default to superspeed plus if we are capable. -*/ -if ((DWC3_IP_IS (DWC31 ) ||DWC3_IP_IS (DWC32 )) && - (DWC3_GHWPARAMS3_SSPHY_IFC (dwc->hwparams.hwparams3) == -DWC3_GHWPARAMS3_SSPHY_IFC_GEN2 )) +switch (hwparam_gen) { +case DWC3_GHWPARAMS3_SSPHY_IFC_GEN2 : dwc->maximum_speed =USB_SPEED_SUPER_PLUS ; - +break ; +case DWC3_GHWPARAMS3_SSPHY_IFC_GEN1 : +if (DWC3_IP_IS (DWC32 )) + dwc->maximum_speed =USB_SPEED_SUPER_PLUS ; +else + dwc->maximum_speed =USB_SPEED_SUPER ; +break ; +case DWC3_GHWPARAMS3_SSPHY_IFC_DIS : + dwc->maximum_speed =USB_SPEED_HIGH ; +break ; +default : + dwc->maximum_speed =USB_SPEED_SUPER ; +break ; + }break ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 265/633 usb: dwc2: Add missing cleanups when usb_add_gadget_udc() fails
In reply to Greg Kroah-HartmanFrom: Martin Blumenstingl <[email protected]>
[ Upstream commit e1c08cf23172ed6fb228d75efc9f4c80a6812116 ]
Call dwc2_debugfs_exit() and dwc2_hcd_remove() (if the HCD was enabled earlier) when usb_add_gadget_udc() has failed. This ensures that the debugfs entries created by dwc2_debugfs_init() as well as the HCD are cleaned up in the error path.
--- drivers/usb/dwc2/platform.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/usb/dwc2/platform.c +5 -1
@@ -584,12 +584,16 @@ static int dwc2_driver_probe(struct platform_device *dev)if (retval) { hsotg->gadget.udc =NULL ;dwc2_hsotg_remove (hsotg); - goto error_init; + goto error_debugfs; } }#endif /* CONFIG_USB_DWC2_PERIPHERAL || CONFIG_USB_DWC2_DUAL_ROLE */ return 0 ; +error_debugfs: +dwc2_debugfs_exit (hsotg); +if (hsotg->hcd_enabled) +dwc2_hcd_remove (hsotg); error_init:if (hsotg->params.activate_stm_id_vb_detection)regulator_disable (hsotg->usb33d);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 266/633 rtw88: Fix probe error handling race with firmware loading
In reply to Greg Kroah-HartmanFrom: Andreas Färber <[email protected]>
[ Upstream commit ecda9cda3338b594a1b82d62018c247132a39e57 ]
In case of rtw8822be, a probe failure after successful rtw_core_init() has been observed to occasionally lead to an oops from rtw_load_firmware_cb():
[ 3.924268] pci 0001:01:00.0: [10ec:b822] type 00 class 0xff0000 [ 3.930531] pci 0001:01:00.0: reg 0x10: [io 0x0000-0x00ff] [ 3.936360] pci 0001:01:00.0: reg 0x18: [mem 0x00000000-0x0000ffff 64bit] [ 3.944042] pci 0001:01:00.0: supports D1 D2 [ 3.948438] pci 0001:01:00.0: PME# supported from D0 D1 D2 D3hot D3cold [ 3.957312] pci 0001:01:00.0: BAR 2: no space for [mem size 0x00010000 64bit] [ 3.964645] pci 0001:01:00.0: BAR 2: failed to assign [mem size 0x00010000 64bit] [ 3.972332] pci 0001:01:00.0: BAR 0: assigned [io 0x10000-0x100ff] [ 3.986240] rtw_8822be 0001:01:00.0: enabling device (0000 -> 0001) [ 3.992735] rtw_8822be 0001:01:00.0: failed to map pci memory [ 3.998638] rtw_8822be 0001:01:00.0: failed to request pci io region [ 4.005166] rtw_8822be 0001:01:00.0: failed to setup pci resources [ 4.011580] rtw_8822be: probe of 0001:01:00.0 failed with error -12 [ 4.018827] cfg80211: Loading compiled-in X.509 certificates for regulatory database [ 4.029121] cfg80211: Loaded X.509 cert 'sforshee: 00b28ddf47aef9cea7' [ 4.050828] Unable to handle kernel paging request at virtual address edafeaac9607952c [ 4.058975] Mem abort info: [ 4.058980] ESR = 0x96000004 [ 4.058990] EC = 0x25: DABT (current EL), IL = 32 bits [ 4.070353] SET = 0, FnV = 0 [ 4.073487] EA = 0, S1PTW = 0 [ 4.073501] dw-apb-uart 98007800.serial: forbid DMA for kernel console [ 4.076723] Data abort info: [ 4.086415] ISV = 0, ISS = 0x00000004 [ 4.087731] Freeing unused kernel memory: 1792K [ 4.090391] CM = 0, WnR = 0 [ 4.098091] [edafeaac9607952c] address between user and kernel address ranges [ 4.105418] Internal error: Oops: 96000004 [#1] PREEMPT SMP [ 4.111129] Modules linked in: [ 4.114275] CPU: 1 PID: 31 Comm: kworker/1:1 Not tainted 5.9.0-rc5-next-20200915+ #700 [ 4.122386] Hardware name: Realtek Saola EVB (DT) [ 4.127223] Workqueue: events request_firmware_work_func [ 4.132676] pstate: 60000005 (nZCv daif -PAN -UAO BTYPE=--) [ 4.138393] pc : rtw_load_firmware_cb+0x54/0xbc [ 4.143040] lr : request_firmware_work_func+0x44/0xb4 [ 4.148217] sp : ffff800010133d70 [ 4.151616] x29: ffff800010133d70 x28: 0000000000000000 [ 4.157069] x27: 0000000000000000 x26: 0000000000000000 [ 4.162520] x25: 0000000000000000 x24: 0000000000000000 [ 4.167971] x23: ffff00007ac21908 x22: ffff00007ebb2100 [ 4.173424] x21: ffff00007ad35880 x20: edafeaac96079504 [ 4.178877] x19: ffff00007ad35870 x18: 0000000000000000 [ 4.184328] x17: 00000000000044d8 x16: 0000000000004310 [ 4.189780] x15: 0000000000000800 x14: 00000000ef006305 [ 4.195231] x13: ffffffff00000000 x12: ffffffffffffffff [ 4.200682] x11: 0000000000000020 x10: 0000000000000003 [ 4.206135] x9 : 0000000000000000 x8 : ffff00007e73f680 [ 4.211585] x7 : 0000000000000000 x6 : ffff80001119b588 [ 4.217036] x5 : ffff00007e649c80 x4 : ffff00007e649c80 [ 4.222487] x3 : ffff80001119b588 x2 : ffff8000108d1718 [ 4.227940] x1 : ffff800011bd5000 x0 : ffff00007ac21600 [ 4.233391] Call trace: [ 4.235906] rtw_load_firmware_cb+0x54/0xbc [ 4.240198] request_firmware_work_func+0x44/0xb4 [ 4.245027] process_one_work+0x178/0x1e4 [ 4.249142] worker_thread+0x1d0/0x268 [ 4.252989] kthread+0xe8/0xf8 [ 4.256127] ret_from_fork+0x10/0x18 [ 4.259800] Code: f94013f5 a8c37bfd d65f03c0 f9000260 (f9401681) [ 4.266049] ---[ end trace f822ebae1a8545c2 ]---
To avoid this, wait on the completion callbacks in rtw_core_deinit() before releasing firmware and continuing teardown.
Note that rtw_wait_firmware_completion() was introduced with c8e5695eae9959fc5774c0f490f2450be8bad3de ("rtw88: load wowlan firmware if wowlan is supported"), so backports to earlier branches may need to inline wait_for_completion(&rtwdev->fw.completion) instead.
--- drivers/net/wireless/realtek/rtw88/main.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/net/wireless/realtek/rtw88/main.c +2 -0
@@ -1479,6 +1479,8 @@ void rtw_core_deinit(struct rtw_dev *rtwdev)struct rtw_rsvd_page *rsvd_pkt, *tmp;unsigned long flags; +rtw_wait_firmware_completion (rtwdev); +if (fw->firmware)release_firmware (fw->firmware);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 267/633 rtw88: Fix potential probe error handling race with wow firmware loading
In reply to Greg Kroah-HartmanFrom: Andreas Färber <[email protected]>
[ Upstream commit ac4bac99161e8f7a7a9faef70d8ca8f69d5493a9 ]
If rtw_core_init() fails to load the wow firmware, rtw_core_deinit() will not get called to clean up the regular firmware.
Ensure that an error loading the wow firmware does not produce an oops for the regular firmware by waiting on its completion to be signalled before returning. Also release the loaded firmware.
--- drivers/net/wireless/realtek/rtw88/main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/realtek/rtw88/main.c +3 -0
@@ -1465,6 +1465,9 @@ int rtw_core_init(struct rtw_dev *rtwdev) ret =rtw_load_firmware (rtwdev,RTW_WOWLAN_FW );if (ret) {rtw_warn (rtwdev,"no wow firmware loaded\n" ); +wait_for_completion (&rtwdev->fw.completion); +if (rtwdev->fw.firmware) +release_firmware (rtwdev->fw.firmware);return ret; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 268/633 mt76: mt7915: fix possible memory leak in mt7915_mcu_add_beacon
In reply to Greg Kroah-HartmanFrom: Lorenzo Bianconi <[email protected]>
[ Upstream commit 071c8ce8e92a86b8bf78678e78eb4b79fdc16768 ]
Release mcu message memory in case of failure in mt7915_mcu_add_beacon routine
--- .../net/wireless/mediatek/mt76/mt7915/mcu.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-)
drivers/net/wireless/mediatek/mt76/mt7915/mcu.c +10 -8
@@ -2267,14 +2267,6 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,struct bss_info_bcn *bcn;int len =MT7915_BEACON_UPDATE_SIZE +MAX_BEACON_SIZE ; - rskb =mt7915_mcu_alloc_sta_req (dev, mvif,NULL , len); -if (IS_ERR (rskb)) -return PTR_ERR (rskb); - - tlv =mt7915_mcu_add_tlv (rskb,BSS_INFO_OFFLOAD ,sizeof (*bcn)); - bcn = (struct bss_info_bcn *)tlv; - bcn->enable = en; - skb =ieee80211_beacon_get_template (hw, vif, &offs);if (!skb)return -EINVAL ;
@@ -2285,6 +2277,16 @@ int mt7915_mcu_add_beacon(struct ieee80211_hw *hw,return -EINVAL ; } + rskb =mt7915_mcu_alloc_sta_req (dev, mvif,NULL , len); +if (IS_ERR (rskb)) { +dev_kfree_skb (skb); +return PTR_ERR (rskb); + } + + tlv =mt7915_mcu_add_tlv (rskb,BSS_INFO_OFFLOAD ,sizeof (*bcn)); + bcn = (struct bss_info_bcn *)tlv; + bcn->enable = en; +if (mvif->band_idx) { info =IEEE80211_SKB_CB (skb); info->hw_queue |=MT_TX_HW_QUEUE_EXT_PHY ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 269/633 quota: clear padding in v2r1_mem2diskdqb()
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 3d3dc274ce736227e3197868ff749cff2f175f63 ]
Freshly allocated memory contains garbage, better make sure to init all struct v2r1_disk_dqblk fields to avoid KMSAN report:
BUG: KMSAN: uninit-value in qtree_entry_unused+0x137/0x1b0 fs/quota/quota_tree.c:218 CPU: 0 PID: 23373 Comm: syz-executor.1 Not tainted 5.9.0-rc4-syzkaller #0 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x21c/0x280 lib/dump_stack.c:118 kmsan_report+0xf7/0x1e0 mm/kmsan/kmsan_report.c:122 __msan_warning+0x58/0xa0 mm/kmsan/kmsan_instr.c:219 qtree_entry_unused+0x137/0x1b0 fs/quota/quota_tree.c:218 v2r1_mem2diskdqb+0x43d/0x710 fs/quota/quota_v2.c:285 qtree_write_dquot+0x226/0x870 fs/quota/quota_tree.c:394 v2_write_dquot+0x1ad/0x280 fs/quota/quota_v2.c:333 dquot_commit+0x4af/0x600 fs/quota/dquot.c:482 ext4_write_dquot fs/ext4/super.c:5934 [inline] ext4_mark_dquot_dirty+0x4d8/0x6a0 fs/ext4/super.c:5985 mark_dquot_dirty fs/quota/dquot.c:347 [inline] mark_all_dquot_dirty fs/quota/dquot.c:385 [inline] dquot_alloc_inode+0xc05/0x12b0 fs/quota/dquot.c:1755 __ext4_new_inode+0x8204/0x9d70 fs/ext4/ialloc.c:1155 ext4_tmpfile+0x41a/0x850 fs/ext4/namei.c:2686 vfs_tmpfile+0x2a2/0x570 fs/namei.c:3283 do_tmpfile fs/namei.c:3316 [inline] path_openat+0x4035/0x6a90 fs/namei.c:3359 do_filp_open+0x2b8/0x710 fs/namei.c:3395 do_sys_openat2+0xa88/0x1140 fs/open.c:1168 do_sys_open fs/open.c:1184 [inline] __do_compat_sys_openat fs/open.c:1242 [inline] __se_compat_sys_openat+0x2a4/0x310 fs/open.c:1240 __ia32_compat_sys_openat+0x56/0x70 fs/open.c:1240 do_syscall_32_irqs_on arch/x86/entry/common.c:80 [inline] __do_fast_syscall_32+0x129/0x180 arch/x86/entry/common.c:139 do_fast_syscall_32+0x6a/0xc0 arch/x86/entry/common.c:162 do_SYSENTER_32+0x73/0x90 arch/x86/entry/common.c:205 entry_SYSENTER_compat_after_hwframe+0x4d/0x5c RIP: 0023:0xf7ff4549 Code: b8 01 10 06 03 74 b4 01 10 07 03 74 b0 01 10 08 03 74 d8 01 00 00 00 00 00 00 00 00 00 00 00 00 00 51 52 55 89 e5 0f 34 cd 80 <5d> 5a 59 c3 90 90 90 90 eb 0d 90 90 90 90 90 90 90 90 90 90 90 90 RSP: 002b:00000000f55cd0cc EFLAGS: 00000296 ORIG_RAX: 0000000000000127 RAX: ffffffffffffffda RBX: 00000000ffffff9c RCX: 0000000020000000 RDX: 0000000000410481 RSI: 0000000000000000 RDI: 0000000000000000 RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000 R13: 0000000000000000 R14: 0000000000000000 R15: 0000000000000000
Uninit was created at:
kmsan_save_stack_with_flags mm/kmsan/kmsan.c:143 [inline] kmsan_internal_poison_shadow+0x66/0xd0 mm/kmsan/kmsan.c:126 kmsan_slab_alloc+0x8a/0xe0 mm/kmsan/kmsan_hooks.c:80 slab_alloc_node mm/slub.c:2907 [inline] slab_alloc mm/slub.c:2916 [inline] __kmalloc+0x2bb/0x4b0 mm/slub.c:3982 kmalloc include/linux/slab.h:559 [inline] getdqbuf+0x56/0x150 fs/quota/quota_tree.c:52 qtree_write_dquot+0xf2/0x870 fs/quota/quota_tree.c:378 v2_write_dquot+0x1ad/0x280 fs/quota/quota_v2.c:333 dquot_commit+0x4af/0x600 fs/quota/dquot.c:482 ext4_write_dquot fs/ext4/super.c:5934 [inline] ext4_mark_dquot_dirty+0x4d8/0x6a0 fs/ext4/super.c:5985 mark_dquot_dirty fs/quota/dquot.c:347 [inline] mark_all_dquot_dirty fs/quota/dquot.c:385 [inline] dquot_alloc_inode+0xc05/0x12b0 fs/quota/dquot.c:1755 __ext4_new_inode+0x8204/0x9d70 fs/ext4/ialloc.c:1155 ext4_tmpfile+0x41a/0x850 fs/ext4/namei.c:2686 vfs_tmpfile+0x2a2/0x570 fs/namei.c:3283 do_tmpfile fs/namei.c:3316 [inline] path_openat+0x4035/0x6a90 fs/namei.c:3359 do_filp_open+0x2b8/0x710 fs/namei.c:3395 do_sys_openat2+0xa88/0x1140 fs/open.c:1168 do_sys_open fs/open.c:1184 [inline] __do_compat_sys_openat fs/open.c:1242 [inline] __se_compat_sys_openat+0x2a4/0x310 fs/open.c:1240 __ia32_compat_sys_openat+0x56/0x70 fs/open.c:1240 do_syscall_32_irqs_on arch/x86/entry/common.c:80 [inline] __do_fast_syscall_32+0x129/0x180 arch/x86/entry/common.c:139 do_fast_syscall_32+0x6a/0xc0 arch/x86/entry/common.c:162 do_SYSENTER_32+0x73/0x90 arch/x86/entry/common.c:205 entry_SYSENTER_compat_after_hwframe+0x4d/0x5c
--- fs/quota/quota_v2.c | 1 + 1 file changed, 1 insertion(+)
fs/quota/quota_v2.c +1 -0
@@ -282,6 +282,7 @@ static void v2r1_mem2diskdqb(void *dp, struct dquot *dquot) d->dqb_curspace =cpu_to_le64 (m->dqb_curspace); d->dqb_btime =cpu_to_le64 (m->dqb_btime); d->dqb_id =cpu_to_le32 (from_kqid (&init_user_ns, dquot->dq_id)); + d->dqb_pad =0 ;if (qtree_entry_unused (info, dp)) d->dqb_itime =cpu_to_le64 (1 ); }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 270/633 slimbus: core: check get_addr before removing laddr ida
In reply to Greg Kroah-HartmanFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit f97769fde678e111a1b7b165b380d8a3dfe54f4e ]
logical address can be either assigned by the SLIMBus controller or the core. Core uses IDA in cases where get_addr callback is not provided by the controller.
Core already has this check while allocating IDR, however during absence reporting this is not checked. This patch fixes this issue.
--- drivers/slimbus/core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/slimbus/core.c +2 -2
@@ -326,8 +326,8 @@ void slim_report_absent(struct slim_device *sbdev)mutex_lock (&ctrl->lock); sbdev->is_laddr_valid = false;mutex_unlock (&ctrl->lock); - -ida_simple_remove (&ctrl->laddr_ida, sbdev->laddr); +if (!ctrl->get_laddr) +ida_simple_remove (&ctrl->laddr_ida, sbdev->laddr);slim_device_update_status (sbdev,SLIM_DEVICE_STATUS_DOWN ); }EXPORT_SYMBOL_GPL (slim_report_absent);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 271/633 slimbus: core: do not enter to clock pause mode in core
In reply to Greg Kroah-HartmanFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit df2c471c4ae07e18a0396db670dca2ef867c5153 ]
Let the controller logic decide when to enter into clock pause mode! Entering in to pause mode during unregistration does not really make sense as the controller is totally going down at that point in time.
--- drivers/slimbus/core.c | 2 -- 1 file changed, 2 deletions(-)
drivers/slimbus/core.c +0 -2
@@ -301,8 +301,6 @@ int slim_unregister_controller(struct slim_controller *ctrl) {/* Remove all clients */ device_for_each_child (ctrl->dev,NULL , slim_ctrl_remove_device); -/* Enter Clock Pause */ -slim_ctrl_clk_pause (ctrl, false,0 );ida_simple_remove (&ctrl_ida, ctrl->id);return 0 ;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 272/633 slimbus: qcom-ngd-ctrl: disable ngd in qmi server down callback
In reply to Greg Kroah-HartmanFrom: Srinivas Kandagatla <[email protected]>
[ Upstream commit 709ec3f7fc5773ac4aa6fb22c3f0ac8103c674db ]
In QMI new server notification we enable the NGD however during delete server notification we do not disable the NGD.
This can lead to multiple instances of NGD being enabled, so make sure that we disable NGD in delete server callback to fix this issue!
--- drivers/slimbus/qcom-ngd-ctrl.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/slimbus/qcom-ngd-ctrl.c +4 -0
@@ -1277,9 +1277,13 @@ static void qcom_slim_ngd_qmi_del_server(struct qmi_handle *hdl, {struct qcom_slim_ngd_qmi *qmi = container_of(hdl, struct qcom_slim_ngd_qmi, svc_event_hdl); +struct qcom_slim_ngd_ctrl *ctrl = + container_of(qmi, struct qcom_slim_ngd_ctrl, qmi); qmi->svc_info.sq_node =0 ; qmi->svc_info.sq_port =0 ; + +qcom_slim_ngd_enable (ctrl, false); }static struct qmi_ops qcom_slim_ngd_qmi_svc_event_ops = {
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 273/633 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" ,
@@ -966,12 +966,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 )) {
@@ -988,9 +991,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) &&
@@ -1019,7 +1022,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 274/633 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 275/633 tty: hvc: fix link error with CONFIG_SERIAL_CORE_CONSOLE=n
In reply to Greg Kroah-HartmanFrom: Yang Yingliang <[email protected]>
[ Upstream commit 75fc65079d8253e1c25a5f8348111a85d71e0f01 ]
aarch64-linux-gnu-ld: drivers/tty/hvc/hvc_dcc.o: in function `dcc_early_write':
hvc_dcc.c:(.text+0x164): undefined reference to `uart_console_write'
The driver uses the uart_console_write(), but SERIAL_CORE_CONSOLE is not selected, so uart_console_write is not defined, then we get the error. Fix this by selecting SERIAL_CORE_CONSOLE.
--- drivers/tty/hvc/Kconfig | 1 + 1 file changed, 1 insertion(+)
drivers/tty/hvc/Kconfig +1 -0
@@ -81,6 +81,7 @@ config HVC_DCC bool "ARM JTAG DCC console" depends on ARM || ARM64 select HVC_DRIVER + select SERIAL_CORE_CONSOLE help This console uses the JTAG DCC on ARM to create a console under the HVC driver. This console is used through a JTAG only on ARM. If you don't have
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 276/633 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
@@ -355,16 +355,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;
@@ -376,13 +374,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 *
@@ -1436,7 +1451,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;
@@ -1466,7 +1481,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 277/633 hv: clocksource: Add notrace attribute to read_hv_sched_clock_*() functions
In reply to Greg Kroah-HartmanFrom: Mohammed Gamal <[email protected]>
[ Upstream commit 1f3aed01473c41c9f896fbf4c30d330655e8aa7c ]
When selecting function_graph tracer with the command:
# echo function_graph > /sys/kernel/debug/tracing/current_tracer
The kernel crashes with the following stack trace:
[69703.122389] BUG: stack guard page was hit at 000000001056545c (stack is 00000000fa3f8fed..0000000005d39503) [69703.122403] kernel stack overflow (double-fault): 0000 [#1] SMP PTI [69703.122413] CPU: 0 PID: 16982 Comm: bash Kdump: loaded Not tainted 4.18.0-236.el8.x86_64 #1 [69703.122420] Hardware name: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS Hyper-V UEFI Release v4.0 12/17/2019 [69703.122433] RIP: 0010repare_ftrace_return+0xa/0x110 [69703.122458] Code: 05 00 0f 0b 48 c7 c7 10 ca 69 ae 0f b6 f0 e8 4b 52 0c 00 31 c0 eb ca 66 0f 1f 84 00 00 00 00 00 55 48 89 e5 41 56 41 55 41 54 <53> 48 83 ec 18 65 48 8b 04 25 28 00 00 00 48 89 45 d8 31 c0 48 85 [69703.122467] RSP: 0018:ffffbd6d01118000 EFLAGS: 00010086 [69703.122476] RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000003 [69703.122484] RDX: 0000000000000000 RSI: ffffbd6d011180d8 RDI: ffffffffadce7550 [69703.122491] RBP: ffffbd6d01118018 R08: 0000000000000000 R09: ffff9d4b09266000 [69703.122498] R10: ffff9d4b0fc04540 R11: ffff9d4b0fc20a00 R12: ffff9d4b6e42aa90 [69703.122506] R13: ffff9d4b0fc20ab8 R14: 00000000000003e8 R15: ffffbd6d0111837c [69703.122514] FS: 00007fd5f2588740(0000) GS:ffff9d4b6e400000(0000) knlGS:0000000000000000 [69703.122521] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [69703.122528] CR2: ffffbd6d01117ff8 CR3: 00000000565d8001 CR4: 00000000003606f0 [69703.122538] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [69703.122545] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [69703.122552] Call Trace: [69703.122568] ftrace_graph_caller+0x6b/0xa0 [69703.122589] ? read_hv_sched_clock_tsc+0x5/0x20 [69703.122599] read_hv_sched_clock_tsc+0x5/0x20 [69703.122611] sched_clock+0x5/0x10 [69703.122621] sched_clock_local+0x12/0x80 [69703.122631] sched_clock_cpu+0x8c/0xb0 [69703.122644] trace_clock_global+0x21/0x90 [69703.122655] ring_buffer_lock_reserve+0x100/0x3c0 [69703.122671] trace_buffer_lock_reserve+0x16/0x50 [69703.122683] __trace_graph_entry+0x28/0x90 [69703.122695] trace_graph_entry+0xfd/0x1a0 [69703.122705] ? read_hv_clock_tsc_cs+0x10/0x10 [69703.122714] ? sched_clock+0x5/0x10 [69703.122723] prepare_ftrace_return+0x99/0x110 [69703.122734] ? read_hv_clock_tsc_cs+0x10/0x10 [69703.122743] ? sched_clock+0x5/0x10 [69703.122752] ftrace_graph_caller+0x6b/0xa0 [69703.122768] ? read_hv_clock_tsc_cs+0x10/0x10 [69703.122777] ? sched_clock+0x5/0x10 [69703.122786] ? read_hv_sched_clock_tsc+0x5/0x20 [69703.122796] ? ring_buffer_unlock_commit+0x1d/0xa0 [69703.122805] read_hv_sched_clock_tsc+0x5/0x20 [69703.122814] ftrace_graph_caller+0xa0/0xa0
[ ... recursion snipped ... ]
Setting the notrace attribute for read_hv_sched_clock_msr() and read_hv_sched_clock_tsc() fixes it.
--- drivers/clocksource/hyperv_timer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/clocksource/hyperv_timer.c +2 -2
@@ -341,7 +341,7 @@ static u64 notrace read_hv_clock_tsc_cs(struct clocksource *arg)return read_hv_clock_tsc (); } -static u64 read_hv_sched_clock_tsc (void ) +static u64 notrace read_hv_sched_clock_tsc(void) {return (read_hv_clock_tsc () - hv_sched_clock_offset) * (NSEC_PER_SEC /HV_CLOCK_HZ );
@@ -404,7 +404,7 @@ static u64 notrace read_hv_clock_msr_cs(struct clocksource *arg)return read_hv_clock_msr (); } -static u64 read_hv_sched_clock_msr (void ) +static u64 notrace read_hv_sched_clock_msr(void) {return (read_hv_clock_msr () - hv_sched_clock_offset) * (NSEC_PER_SEC /HV_CLOCK_HZ );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 278/633 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
@@ -4683,16 +4683,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 279/633 iomap: Use kzalloc to allocate iomap_page
In reply to Greg Kroah-HartmanFrom: Matthew Wilcox (Oracle) <[email protected]>
[ Upstream commit a6901d4d148dcbad7efb3174afbdf68c995618c2 ]
We can skip most of the initialisation, although spinlocks still need explicit initialisation as architectures may use a non-zero value to indicate unlocked. The comment is no longer useful as attach_page_private() handles the refcount now.
--- fs/iomap/buffered-io.c | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-)
fs/iomap/buffered-io.c +1 -9
@@ -49,16 +49,8 @@ iomap_page_create(struct inode *inode, struct page *page)if (iop ||i_blocksize (inode) ==PAGE_SIZE )return iop; - iop =kmalloc (sizeof (*iop),GFP_NOFS | __GFP_NOFAIL); -atomic_set (&iop->read_count,0 ); -atomic_set (&iop->write_count,0 ); + iop =kzalloc (sizeof (*iop),GFP_NOFS | __GFP_NOFAIL);spin_lock_init (&iop->uptodate_lock); -bitmap_zero (iop->uptodate,PAGE_SIZE /SECTOR_SIZE ); - -/* -* migrate_page_move_mapping() assumes that pages with private data have -* their count elevated by 1. -*/ attach_page_private (page, iop);return iop; }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 280/633 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 281/633 coresight: cti: Fix remove sysfs link error
In reply to Greg Kroah-HartmanFrom: Mike Leach <[email protected]>
[ Upstream commit 1cce921bce7dcf6fef9bdfa4dcc9406383274408 ]
CTI code to remove sysfs link to other devices on shutdown, incorrectly tries to remove a single ended link when these are all double ended. This implementation leaves elements in the link info structure undefined which results in a crash in recent tests for driver module unload.
This patch corrects the link removal code.
--- drivers/hwtracing/coresight/coresight-cti.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/hwtracing/coresight/coresight-cti.c +6 -3
@@ -494,12 +494,15 @@ static bool cti_add_sysfs_link(struct cti_drvdata *drvdata,return !link_err; } -static void cti_remove_sysfs_link (struct cti_trig_con *tc) +static void cti_remove_sysfs_link (struct cti_drvdata *drvdata, +struct cti_trig_con *tc) {struct coresight_sysfs_link link_info; + link_info.orig = drvdata->csdev; link_info.orig_name = tc->con_dev_name; link_info.target = tc->con_dev; + link_info.target_name =dev_name (&drvdata->csdev->dev);coresight_remove_sysfs_link (&link_info); }
@@ -590,7 +593,7 @@ void cti_remove_assoc_from_csdev(struct coresight_device *csdev) ctidev = &ctidrv->ctidev;list_for_each_entry (tc, &ctidev->trig_cons, node) {if (tc->con_dev == csdev->ect_dev) { -cti_remove_sysfs_link (tc); +cti_remove_sysfs_link (ctidrv, tc); tc->con_dev =NULL ;break ; }
@@ -634,7 +637,7 @@ static void cti_remove_conn_xrefs(struct cti_drvdata *drvdata)if (tc->con_dev) {coresight_set_assoc_ectdev_mutex (tc->con_dev,NULL ); -cti_remove_sysfs_link (tc); +cti_remove_sysfs_link (drvdata, tc); tc->con_dev =NULL ; } }
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 282/633 coresight: cti: Fix bug clearing sysfs links on callback
In reply to Greg Kroah-HartmanFrom: Mike Leach <[email protected]>
[ Upstream commit cab280bf3533c72f95ebdb65ce534b5cdc4729dc ]
During module unload, a coresight driver module will call back into the CTI driver to remove any links between the two devices.
The current code has 2 issues:-
1) in the CTI driver the matching code is matching to the wrong device so misses all the links.
2) The callback is called too late in the unload process resulting in a crash.
This fixes both the issues.
--- drivers/hwtracing/coresight/coresight-cti.c | 2 +- drivers/hwtracing/coresight/coresight.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-cti.c +1 -1
@@ -592,7 +592,7 @@ void cti_remove_assoc_from_csdev(struct coresight_device *csdev) ctidrv =csdev_to_cti_drvdata (csdev->ect_dev); ctidev = &ctidrv->ctidev;list_for_each_entry (tc, &ctidev->trig_cons, node) { -if (tc->con_dev == csdev->ect_dev) { +if (tc->con_dev == csdev) {cti_remove_sysfs_link (ctidrv, tc); tc->con_dev =NULL ;break ;
drivers/hwtracing/coresight/coresight.c +1 -1
@@ -1023,7 +1023,6 @@ static void coresight_device_release(struct device *dev) {struct coresight_device *csdev =to_coresight_device (dev); -cti_remove_assoc_from_csdev (csdev);fwnode_handle_put (csdev->dev.fwnode);kfree (csdev->refcnt);kfree (csdev);
@@ -1357,6 +1356,7 @@ void coresight_unregister(struct coresight_device *csdev) {etm_perf_del_symlink_sink (csdev);/* Remove references of that device in the topology */ +cti_remove_assoc_from_csdev (csdev);coresight_remove_conns (csdev);coresight_release_platform_data (csdev, csdev->pdata);device_unregister (&csdev->dev);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 283/633 coresight: etm4x: Fix save and restore of TRCVMIDCCTLR1 register
In reply to Greg Kroah-HartmanFrom: Sai Prakash Ranjan <[email protected]>
[ Upstream commit 3477326277451000bc667dfcc4fd0774c039184c ]
In commit f188b5e76aae ("coresight: etm4x: Save/restore state across CPU low power states"), mistakenly TRCVMIDCCTLR1 register value was saved in trcvmidcctlr0 state variable which is used to store TRCVMIDCCTLR0 register value in etm4x_cpu_save() and then same value is written back to both TRCVMIDCCTLR0 and TRCVMIDCCTLR1 in etm4x_cpu_restore(). There is already a trcvmidcctlr1 state variable available for TRCVMIDCCTLR1, so use it.
--- drivers/hwtracing/coresight/coresight-etm4x.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwtracing/coresight/coresight-etm4x.c +2 -2
@@ -1233,7 +1233,7 @@ static int etm4_cpu_save(struct etmv4_drvdata *drvdata) state->trccidcctlr1 =readl (drvdata->base +TRCCIDCCTLR1 ); state->trcvmidcctlr0 =readl (drvdata->base +TRCVMIDCCTLR0 ); - state->trcvmidcctlr0 =readl (drvdata->base +TRCVMIDCCTLR1 ); + state->trcvmidcctlr1 =readl (drvdata->base +TRCVMIDCCTLR1 ); state->trcclaimset =readl (drvdata->base +TRCCLAIMCLR );
@@ -1343,7 +1343,7 @@ static void etm4_cpu_restore(struct etmv4_drvdata *drvdata)writel_relaxed (state->trccidcctlr1, drvdata->base +TRCCIDCCTLR1 );writel_relaxed (state->trcvmidcctlr0, drvdata->base +TRCVMIDCCTLR0 ); -writel_relaxed (state->trcvmidcctlr0, drvdata->base +TRCVMIDCCTLR1 ); +writel_relaxed (state->trcvmidcctlr1, drvdata->base +TRCVMIDCCTLR1 );writel_relaxed (state->trcclaimset, drvdata->base +TRCCLAIMSET );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 284/633 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
@@ -4610,7 +4610,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 :
@@ -4625,6 +4625,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 285/633 bpf: disallow attaching modify_return tracing functions to other BPF programs
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit 1af9270e908cd50a4f5d815c9b6f794c7d57ed07 ]
Quoted 1 line
From the checks and commit messages for
modify_return, it seems it was
never the intention that it should be possible to attach a tracing program with expected_attach_type == BPF_MODIFY_RETURN to another BPF program. However, check_attach_modify_return() will only look at the function name, so if the target function starts with "security_", the attach will be allowed even for bpf2bpf attachment.
Fix this oversight by also blocking the modification if a target program is supplied.
--- kernel/bpf/verifier.c | 5 +++++ 1 file changed, 5 insertions(+)
kernel/bpf/verifier.c +5 -0
@@ -10862,6 +10862,11 @@ static int check_attach_btf_id(struct bpf_verifier_env *env) }if (prog->expected_attach_type ==BPF_MODIFY_RETURN ) { +if (tgt_prog) { +verbose (env,"can't modify return codes of BPF programs\n" ); + ret = -EINVAL ; + goto out; + } ret =check_attach_modify_return (prog, addr);if (ret) verbose(env, "%s() is not modifiable\n",
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 286/633 selftests: Remove fmod_ret from test_overhead
In reply to Greg Kroah-HartmanFrom: Toke Høiland-Jørgensen <[email protected]>
[ Upstream commit b000def2e052fc8ddea31a18019f6ebe044defb3 ]
The test_overhead prog_test included an fmod_ret program that attached to __set_task_comm() in the kernel. However, this function was never listed as allowed for return modification, so this only worked because of the verifier skipping tests when a trampoline already existed for the attach point. Now that the verifier checks have been fixed, remove fmod_ret from the test so it works again.
--- tools/testing/selftests/bpf/bench.c | 3 --- .../testing/selftests/bpf/benchs/bench_rename.c | 17 ----------------- .../selftests/bpf/prog_tests/test_overhead.c | 14 +------------- .../testing/selftests/bpf/progs/test_overhead.c | 6 ------ 4 files changed, 1 insertion(+), 39 deletions(-)
tools/testing/selftests/bpf/bench.c +0 -3
@@ -311,7 +311,6 @@ extern const struct bench bench_rename_kretprobe;extern const struct bench bench_rename_rawtp;extern const struct bench bench_rename_fentry;extern const struct bench bench_rename_fexit; -extern const struct bench bench_rename_fmodret;extern const struct bench bench_trig_base;extern const struct bench bench_trig_tp;extern const struct bench bench_trig_rawtp;
@@ -332,7 +331,6 @@ static const struct bench *benchs[] = { &bench_rename_rawtp, &bench_rename_fentry, &bench_rename_fexit, - &bench_rename_fmodret, &bench_trig_base, &bench_trig_tp, &bench_trig_rawtp,
@@ -462,4 +460,3 @@ int main(int argc, char **argv)return 0 ; } -
tools/testing/selftests/bpf/benchs/bench_rename.c +0 -17
@@ -106,12 +106,6 @@ static void setup_fexit()attach_bpf (ctx.skel->progs.prog5); } -static void setup_fmodret () -{ -setup_ctx (); -attach_bpf (ctx.skel->progs.prog6); -} -static void *consumer (void *input) {return NULL ;
@@ -182,14 +176,3 @@ const struct bench bench_rename_fexit = { .report_progress = hits_drops_report_progress, .report_final = hits_drops_report_final, }; - -const struct bench bench_rename_fmodret = { - .name ="rename-fmodret" , - .validate = validate, - .setup = setup_fmodret, - .producer_thread = producer, - .consumer_thread = consumer, - .measure = measure, - .report_progress = hits_drops_report_progress, - .report_final = hits_drops_report_final, -};
tools/testing/selftests/bpf/prog_tests/test_overhead.c +1 -13
@@ -61,10 +61,9 @@ void test_test_overhead(void)const char *raw_tp_name ="raw_tp/task_rename" ;const char *fentry_name ="fentry/__set_task_comm" ;const char *fexit_name ="fexit/__set_task_comm" ; -const char *fmodret_name ="fmod_ret/__set_task_comm" ;const char *kprobe_func ="__set_task_comm" ;struct bpf_program *kprobe_prog, *kretprobe_prog, *raw_tp_prog; -struct bpf_program *fentry_prog, *fexit_prog, *fmodret_prog; +struct bpf_program *fentry_prog, *fexit_prog;struct bpf_object *obj;struct bpf_link *link;int err, duration =0 ;
@@ -97,11 +96,6 @@ void test_test_overhead(void)if (CHECK (!fexit_prog,"find_probe" ,"prog '%s' not found\n" , fexit_name)) goto cleanup; - fmodret_prog =bpf_object__find_program_by_title (obj, fmodret_name); -if (CHECK (!fmodret_prog,"find_probe" , -"prog '%s' not found\n" , fmodret_name)) - goto cleanup; - err =bpf_object__load (obj);if (CHECK (err,"obj_load" ,"err %d\n" , err)) goto cleanup;
@@ -148,12 +142,6 @@ void test_test_overhead(void)test_run ("fexit" );bpf_link__destroy (link); -/* attach fmod_ret */ - link =bpf_program__attach_trace (fmodret_prog); -if (CHECK (IS_ERR (link),"attach fmod_ret" ,"err %ld\n" ,PTR_ERR (link))) - goto cleanup; -test_run ("fmod_ret" ); -bpf_link__destroy (link); cleanup:prctl (PR_SET_NAME , comm,0L ,0L ,0L );bpf_object__close (obj);
tools/testing/selftests/bpf/progs/test_overhead.c +0 -6
@@ -39,10 +39,4 @@ int BPF_PROG(prog5, struct task_struct *tsk, const char *buf, bool exec)return 0 ; } -SEC("fmod_ret/__set_task_comm") -int BPF_PROG (prog6 ,struct task_struct *tsk,const char *buf,bool exec) -{ -return !tsk; -} - char _license[] SEC("license") = "GPL";
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 287/633 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
@@ -869,6 +869,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; }
@@ -1924,6 +1925,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 288/633 pinctrl: aspeed: Use the right pinconf mask
In reply to Greg Kroah-HartmanFrom: Andrew Jeffery <[email protected]>
[ Upstream commit 1d6db5ae6b090d1a8edfcb36b9bf47c5f4fe27f6 ]
The Aspeed pinconf data structures are split into 'conf' and 'map' types, where the 'conf' struct defines which register and bitfield to manipulate, while the 'map' struct defines what value to write to the register and bitfield.
Both structs have a mask member, and the wrong mask was being used to tell the regmap which bits to update.
A todo is to look at whether we can remove the mask from the 'map' struct.
--- drivers/pinctrl/aspeed/pinctrl-aspeed.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/aspeed/pinctrl-aspeed.c +1 -1
@@ -515,7 +515,7 @@ int aspeed_pin_config_set(struct pinctrl_dev *pctldev, unsigned int offset, val = pmap->val <<__ffs (pconf->mask); rc =regmap_update_bits (pdata->scu, pconf->reg, - pmap->mask, val); + pconf->mask, val);if (rc <0 )return rc;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 289/633 iommu/qcom: add missing put_device() call in qcom_iommu_of_xlate()
In reply to Greg Kroah-HartmanFrom: Yu Kuai <[email protected]>
[ Upstream commit e2eae09939a89e0994f7965ba3c676a5eac8b4b0 ]
if of_find_device_by_node() succeed, qcom_iommu_of_xlate() doesn't have a corresponding put_device(). Thus add put_device() to fix the exception handling for this function implementation.
--- drivers/iommu/qcom_iommu.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/iommu/qcom_iommu.c +6 -2
@@ -578,8 +578,10 @@ static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)* index into qcom_iommu->ctxs: */ if (WARN_ON (asid <1 ) || -WARN_ON (asid > qcom_iommu->num_ctxs)) +WARN_ON (asid > qcom_iommu->num_ctxs)) { +put_device (&iommu_pdev->dev);return -EINVAL ; + }if (!dev_iommu_priv_get (dev)) {dev_iommu_priv_set (dev, qcom_iommu);
@@ -588,8 +590,10 @@ static int qcom_iommu_of_xlate(struct device *dev, struct of_phandle_args *args)* multiple different iommu devices. Multiple context * banks are ok, but multiple devices are not: */ -if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev))) +if (WARN_ON (qcom_iommu !=dev_iommu_priv_get (dev))) { +put_device (&iommu_pdev->dev);return -EINVAL ; + } }return iommu_fwspec_add_ids (dev, &asid,1 );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 290/633 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
@@ -794,6 +794,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 = {
@@ -801,7 +808,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 291/633 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
@@ -169,6 +169,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
@@ -2140,8 +2140,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;
@@ -2329,6 +2327,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);
@@ -2338,7 +2343,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);
@@ -2346,7 +2353,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 ();
@@ -2358,7 +2368,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);
@@ -2367,7 +2379,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 292/633 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
@@ -1415,8 +1415,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_mem_region (sm->io_res->start,0x100 ); err_res:
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 293/633 ASoC: wm_adsp: Pass full name to snd_ctl_notify
In reply to Greg Kroah-HartmanFrom: Adam Brickman <[email protected]>
[ Upstream commit 20441614d89867142060d3bcd79cc111d8ba7a8e ]
A call to wm_adsp_write_ctl() could cause a kernel crash if it does not retrieve a valid kcontrol from snd_soc_card_get_kcontrol(). This can happen due to a missing control name prefix. Then, snd_ctl_notify() crashes when it tries to use the id field.
Modified wm_adsp_write_ctl() to incorporate the name_prefix (if applicable) such that it is able to retrieve a valid id field from the kcontrol once the platform has booted.
--- sound/soc/codecs/wm_adsp.c | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-)
sound/soc/codecs/wm_adsp.c +19 -1
@@ -2043,6 +2043,7 @@ int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type, {struct wm_coeff_ctl *ctl;struct snd_kcontrol *kcontrol; +char ctl_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN ];int ret; ctl =wm_adsp_get_ctl (dsp, name, type, alg);
@@ -2053,8 +2054,25 @@ int wm_adsp_write_ctl(struct wm_adsp *dsp, const char *name, int type,return -EINVAL ; ret =wm_coeff_write_ctrl (ctl, buf, len); +if (ret) +return ret; + +if (ctl->flags &WMFW_CTL_FLAG_SYS ) +return 0 ; + +if (dsp->component->name_prefix) +snprintf (ctl_name,SNDRV_CTL_ELEM_ID_NAME_MAXLEN ,"%s %s" , + dsp->component->name_prefix, ctl->name); +else +snprintf (ctl_name,SNDRV_CTL_ELEM_ID_NAME_MAXLEN ,"%s" , + ctl->name); + + kcontrol =snd_soc_card_get_kcontrol (dsp->component->card, ctl_name); +if (!kcontrol) { +adsp_err (dsp,"Can't find kcontrol %s\n" , ctl_name); +return -EINVAL ; + } - kcontrol =snd_soc_card_get_kcontrol (dsp->component->card, ctl->name);snd_ctl_notify (dsp->component->card->snd_card,SNDRV_CTL_EVENT_MASK_VALUE , &kcontrol->id);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 294/633 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
@@ -3685,9 +3685,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 295/633 iwlwifi: dbg: remove no filter condition
In reply to Greg Kroah-HartmanFrom: Mordechay Goodstein <[email protected]>
[ Upstream commit bfdb157127dab2a85d4096a68a00ad568c9eb590 ]
Currently if group-id and command-id values are zero we trigger and collect every RX frame,
this is not the right behavior and zero value should be handled like any other filter.
--- drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c +2 -3
@@ -947,9 +947,8 @@ static bool iwl_dbg_tlv_check_fw_pkt(struct iwl_fw_runtime *fwrt,struct iwl_rx_packet *pkt = tp_data->fw_pkt;struct iwl_cmd_header *wanted_hdr = (void *)&trig_data; -if (pkt && ((wanted_hdr->cmd ==0 && wanted_hdr->group_id ==0 ) || - (pkt->hdr.cmd == wanted_hdr->cmd && - pkt->hdr.group_id == wanted_hdr->group_id))) { +if (pkt && (pkt->hdr.cmd == wanted_hdr->cmd && + pkt->hdr.group_id == wanted_hdr->group_id)) {struct iwl_rx_packet *fw_pkt = kmemdup(pkt, sizeof(*pkt) + iwl_rx_packet_payload_len(pkt),
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 296/633 iwlwifi: dbg: run init_cfg function once per driver load
In reply to Greg Kroah-HartmanFrom: Mordechay Goodstein <[email protected]>
[ Upstream commit 42f8a2735cc218b6b372134684d4cd3c1423f123 ]
Every time we call init_cfg driver appends the enabled triggers to the active triggers while this should be done only once per driver load.
--- drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/wireless/intel/iwlwifi/iwl-dbg-tlv.c +3 -0
@@ -1011,6 +1011,9 @@ static void iwl_dbg_tlv_init_cfg(struct iwl_fw_runtime *fwrt)enum iwl_fw_ini_buffer_location *ini_dest = &fwrt->trans->dbg.ini_dest;int ret, i; +if (*ini_dest !=IWL_FW_INI_LOCATION_INVALID ) +return ; +IWL_DEBUG_FW (fwrt,"WRT: Generating active triggers list, domain 0x%x\n" , fwrt->trans->dbg.domains_bitmap);
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 297/633 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 298/633 usb: gadget: u_serial: clear suspended flag when disconnecting
In reply to Greg Kroah-HartmanFrom: Yoshihiro Shimoda <[email protected]>
[ Upstream commit d98ef43bfb65b5201e1afe36aaf8c4f9d71b4307 ]
The commit aba3a8d01d62 ("usb: gadget: u_serial: add suspend resume callbacks") set/cleared the suspended flag in USB bus suspend/resume only. But, when a USB cable is disconnected in the suspend, since some controllers will not detect USB bus resume, the suspended flag is not cleared. After that, user cannot send any data. To fix the issue, clears the suspended flag in the gserial_disconnect().
--- drivers/usb/gadget/function/u_serial.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/gadget/function/u_serial.c +1 -0
@@ -1391,6 +1391,7 @@ void gserial_disconnect(struct gserial *gser)if (port->port.tty)tty_hangup (port->port.tty); } + port->suspended = false;spin_unlock_irqrestore (&port->port_lock, flags);/* disable endpoints, aborting down any active I/O */
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 299/633 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 300/633 bus: mhi: core: Fix the building of MHI module
In reply to Greg Kroah-HartmanFrom: Manivannan Sadhasivam <[email protected]>
[ Upstream commit 5fc4997fd9d065c98fb312ef56ffadffccc6d61d ]
The Kbuild rule to build MHI should use the append operator. This fixes the below warning reported by Kbuild test bot.
WARNING: modpost: missing MODULE_LICENSE() in drivers/bus/mhi/core/main.o
WARNING: modpost: missing MODULE_LICENSE() in drivers/bus/mhi/core/pm.o
WARNING: modpost: missing MODULE_LICENSE() in drivers/bus/mhi/core/boot.o
--- drivers/bus/mhi/core/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/bus/mhi/core/Makefile +1 -1
@@ -1,3 +1,3 @@ -obj-$(CONFIG_MHI_BUS) := mhi.o +obj-$(CONFIG_MHI_BUS) += mhi.o mhi-y := init.o main.o pm.o boot.o
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 301/633 ocxl: fix kconfig dependency warning for OCXL
In reply to Greg Kroah-HartmanFrom: Necip Fazil Yildiran <[email protected]>
[ Upstream commit 4b53a3c72116118d86fab4112277e1dc4edf273c ]
When OCXL is enabled and HOTPLUG_PCI is disabled, it results in the following Kbuild warning:
WARNING: unmet direct dependencies detected for HOTPLUG_PCI_POWERNV
Depends on [n]: PCI [=y] && HOTPLUG_PCI [=n] && PPC_POWERNV [=y] && EEH [=y] Selected by [y]:
- OCXL [=y] && PPC_POWERNV [=y] && PCI [=y] && EEH [=y]
The reason is that OCXL selects HOTPLUG_PCI_POWERNV without depending on or selecting HOTPLUG_PCI while HOTPLUG_PCI_POWERNV is subordinate to HOTPLUG_PCI.
HOTPLUG_PCI_POWERNV is a visible symbol with a set of dependencies. Selecting it will lead to overlooking its other dependencies as well.
Let OCXL depend on HOTPLUG_PCI_POWERNV instead to avoid Kbuild issues.
--- drivers/misc/ocxl/Kconfig | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/misc/ocxl/Kconfig +1 -2
@@ -9,9 +9,8 @@ config OCXL_BASE config OCXL tristate "OpenCAPI coherent accelerator support" - depends on PPC_POWERNV && PCI && EEH + depends on PPC_POWERNV && PCI && EEH && HOTPLUG_PCI_POWERNV select OCXL_BASE - select HOTPLUG_PCI_POWERNV default m help Select this option to enable the ocxl driver for Open
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 302/633 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
@@ -2355,7 +2355,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 303/633 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 */
@@ -2320,22 +2332,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 304/633 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 305/633 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 306/633 dmaengine: ioat: Allocate correct size for descriptor chunk
In reply to Greg Kroah-HartmanFrom: Logan Gunthorpe <[email protected]>
[ Upstream commit 028926e4ac8f21af343c25794117fd13c08b1712 ]
dma_alloc_coherent() is called with a fixed SZ_2M size, but frees happen with IOAT_CHUNK_SIZE. Recently, IOAT_CHUNK_SIZE was reduced to 512M but the allocation did not change. To fix, change to using the IOAT_CHUNK_SIZE define.
This was caught with the upcoming patchset for converting Intel platforms to the dma-iommu implementation. It has a warning when the unmapped size differs from the mapped size.
--- drivers/dma/ioat/dma.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/dma/ioat/dma.c +1 -1
@@ -389,7 +389,7 @@ ioat_alloc_ring(struct dma_chan *c, int order, gfp_t flags)struct ioat_descs *descs = &ioat_chan->descs[i]; descs->virt =dma_alloc_coherent (to_dev (ioat_chan), -SZ_2M , &descs->hw, flags); +IOAT_CHUNK_SIZE , &descs->hw, flags);if (!descs->virt) {int idx;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 307/633 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
@@ -1963,7 +1963,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 308/633 tracing: Fix parse_synth_field() error handling
In reply to Greg Kroah-HartmanFrom: Tom Zanussi <[email protected]>
[ Upstream commit 8fbeb52a598c7ab5aa603d6bb083b8a8d16d607a ]
synth_field_size() returns either a positive size or an error (zero or a negative value). However, the existing code assumes the only error value is 0. It doesn't handle negative error codes, as it assigns directly to field->size (a size_t; unsigned), thereby interpreting the error code as a valid size instead.
Do the test before assignment to field->size.
[ [email protected]: changelog addition, first paragraph above ]
--- kernel/trace/trace_events_synth.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
kernel/trace/trace_events_synth.c +4 -2
@@ -465,6 +465,7 @@ static struct synth_field *parse_synth_field(int argc, const char **argv,struct synth_field *field;const char *prefix =NULL , *field_type = argv[0 ], *field_name, *array;int len, ret =0 ; +ssize_t size;if (field_type[0 ] ==';' ) field_type++;
@@ -520,11 +521,12 @@ static struct synth_field *parse_synth_field(int argc, const char **argv, field->type[len -1 ] ='\0' ; } - field->size =synth_field_size (field->type); -if (!field->size) { + size =synth_field_size (field->type); +if (size <=0 ) { ret = -EINVAL ; goto free; } + field->size = size;if (synth_field_is_string (field->type)) field->is_string = true;
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 309/633 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
@@ -319,15 +319,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 ),
@@ -752,15 +743,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 310/633 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
@@ -1976,6 +1976,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 311/633 drm/panfrost: increase readl_relaxed_poll_timeout values
In reply to Greg Kroah-HartmanFrom: Christian Hewitt <[email protected]>
[ Upstream commit c2df75ad2a9f205820e4bc0db936d3d9af3da1ae ]
Amlogic SoC devices report the following errors frequently causing excessive dmesg log spam and early log rotataion, although the errors appear to be harmless as everything works fine:
[ 7.202702] panfrost ffe40000.gpu: error powering up gpu L2 [ 7.203760] panfrost ffe40000.gpu: error powering up gpu shader
ARM staff have advised increasing the timeout values to eliminate the errors in most normal scenarios, and testing with several different G31/G52 devices shows 20000 to be a reliable value.
--- drivers/gpu/drm/panfrost/panfrost_gpu.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/gpu/drm/panfrost/panfrost_gpu.c +2 -2
@@ -309,13 +309,13 @@ void panfrost_gpu_power_on(struct panfrost_device *pfdev)/* Just turn on everything for now */ gpu_write (pfdev,L2_PWRON_LO , pfdev->features.l2_present); ret =readl_relaxed_poll_timeout (pfdev->iomem +L2_READY_LO , - val, val == pfdev->features.l2_present,100 ,1000 ); + val, val == pfdev->features.l2_present,100 ,20000 );if (ret)dev_err (pfdev->dev,"error powering up gpu L2" );gpu_write (pfdev,SHADER_PWRON_LO , pfdev->features.shader_present); ret =readl_relaxed_poll_timeout (pfdev->iomem +SHADER_READY_LO , - val, val == pfdev->features.shader_present,100 ,1000 ); + val, val == pfdev->features.shader_present,100 ,20000 );if (ret)dev_err (pfdev->dev,"error powering up gpu shader" );
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 312/633 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
@@ -609,6 +609,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; }
@@ -649,6 +651,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
@@ -669,6 +673,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 313/633 bpf, sockmap: Remove skb_orphan and let normal skb_kfree do cleanup
In reply to Greg Kroah-HartmanFrom: John Fastabend <[email protected]>
[ Upstream commit 10d58d006356a075a7b056e0f6502db416d1a261 ]
Calling skb_orphan() is unnecessary in the strp rcv handler because the skb is from a skb_clone() in __strp_recv. So it never has a destructor or a sk assigned. Plus its confusing to read because it might hint to the reader that the skb could have an sk assigned which is not true. Even if we did have an sk assigned it would be cleaner to simply wait for the upcoming kfree_skb().
Additionally, move the comment about strparser clone up so its closer to the logic it is describing and add to it so that it is more complete.
--- net/core/skmsg.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
net/core/skmsg.c +7 -7
@@ -662,15 +662,16 @@ static int sk_psock_bpf_run(struct sk_psock *psock, struct bpf_prog *prog, {int ret; +/* strparser clones the skb before handing it to a upper layer, +* meaning we have the same data, but sk is NULL. We do want an +* sk pointer though when we run the BPF program. So we set it +* here and then NULL it to ensure we don't trigger a BUG_ON() +* in skb/sk operations later if kfree_skb is called with a +* valid skb->sk pointer and no destructor assigned. +*/ skb->sk = psock->sk;bpf_compute_data_end_sk_skb (skb); ret =bpf_prog_run_pin_on_cpu (prog, skb); -/* strparser clones the skb before handing it to a upper layer, -* meaning skb_orphan has been called. We NULL sk on the way out -* to ensure we don't trigger a BUG_ON() in skb/sk operations -* later and because we are not charging the memory of this skb -* to any socket yet. -*/ skb->sk =NULL ;return ret; }
@@ -795,7 +796,6 @@ static void sk_psock_strp_read(struct strparser *strp, struct sk_buff *skb) } prog =READ_ONCE (psock->progs.skb_verdict);if (likely (prog)) { -skb_orphan (skb);tcp_skb_bpf_redirect_clear (skb); ret =sk_psock_bpf_run (psock, prog, skb); ret =sk_psock_map_verd (ret,tcp_skb_bpf_redirect_fetch (skb));
Signature · 1 line
2.25.1
Greg Kroah-Hartman
maintainerPATCH 314/633 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 315/633 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 316/633 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
@@ -3336,7 +3336,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);
@@ -3361,6 +3361,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 317/633 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
@@ -5276,7 +5276,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 ;/*
@@ -5295,6 +5295,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