4.20.8-stable review
Subsystems (11)
Greg Kroah-Hartman
maintainerPATCH 148/352 cpuidle: big.LITTLE: fix refcount leak
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9456823c842f346c74265fcd98d008d87a7eb6f5 ]
of_find_node_by_path() acquires a reference to the node returned by it and that reference needs to be dropped by its caller. bl_idle_init() doesn't do that, so fix it.
--- drivers/cpuidle/cpuidle-big_little.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/cpuidle/cpuidle-big_little.c +6 -1
@@ -167,6 +167,7 @@ static int __init bl_idle_init(void) {int ret;struct device_node *root =of_find_node_by_path ("/" ); +const struct of_device_id *match_id;if (!root)return -ENODEV ;
@@ -174,7 +175,11 @@ static int __init bl_idle_init(void)/* * Initialize the driver just for a compliant set of machines */ -if (!of_match_node (compatible_machine_match, root)) + match_id =of_match_node (compatible_machine_match, root); + +of_node_put (root); + +if (!match_id)return -ENODEV ;if (!mcpm_is_available ())
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 149/352 OPP: Use opp_table->regulators to verify no regulator case
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 90e3577b5feb42bac1269e16bb3d2bdd8f6df40f ]
The value of opp_table->regulator_count is not very consistent right now and it may end up being 0 while we do have a "opp-microvolt" property in the OPP table. It was kept that way as we used to check if any regulators are set with the OPP core for a device or not using value of regulator_count.
Lets use opp_table->regulators for that purpose as the meaning of regulator_count is going to change in the later patches.
--- drivers/opp/core.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-)
drivers/opp/core.c +7 -4
@@ -196,12 +196,12 @@ unsigned long dev_pm_opp_get_max_volt_latency(struct device *dev)if (IS_ERR (opp_table))return 0 ; - count = opp_table->regulator_count; -/* Regulator may not be required for the device */ -if (!count) +if (!opp_table->regulators) goto put_opp_table; + count = opp_table->regulator_count; + uV =kmalloc_array (count,sizeof (*uV),GFP_KERNEL );if (!uV) goto put_opp_table;
@@ -1102,6 +1102,9 @@ static bool _opp_supported_by_regulators(struct dev_pm_opp *opp,struct regulator *reg;int i; +if (!opp_table->regulators) +return true; +for (i =0 ; i < opp_table->regulator_count; i++) { reg = opp_table->regulators[i];
@@ -1386,7 +1389,7 @@ static int _allocate_set_opp_data(struct opp_table *opp_table)struct dev_pm_set_opp_data *data;int len, count = opp_table->regulator_count; -if (WARN_ON (!count)) +if (WARN_ON (!opp_table->regulators))return -EINVAL ;/* space for set_opp_data */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 150/352 tee: optee: avoid possible double list_del()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b2d102bd0146d9eb1fa630ca0cd19a15ef2f74c8 ]
This bug occurs when:
- a new request arrives, one thread(let's call it A) is pending in optee_supp_req() with req->busy is initial value false.
- tee-supplicant is killed, then optee_supp_release() is called, this function calls list_del(&req->link), and set supp->ctx to NULL. And it also wake up process A.
- process A continues, it firstly checks supp->ctx which is NULL, then checks req->busy which is false, at last run list_del(&req->link). This triggers double list_del() and results kernel panic.
For solve this problem, we rename req->busy to req->in_queue, and associate it with state of whether req is linked to supp->reqs. So we can just only check req->in_queue to make decision calling list_del() or not.
--- drivers/tee/optee/supp.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/tee/optee/supp.c +7 -6
@@ -19,7 +19,7 @@struct optee_supp_req {struct list_head link; -bool busy; +bool in_queue;u32 func;u32 ret;size_t num_params;
@@ -54,7 +54,6 @@ void optee_supp_release(struct optee_supp *supp)/* Abort all request retrieved by supplicant */ idr_for_each_entry (&supp->idr, req, id) { - req->busy = false;idr_remove (&supp->idr, id); req->ret =TEEC_ERROR_COMMUNICATION ;complete (&req->c);
@@ -63,6 +62,7 @@ void optee_supp_release(struct optee_supp *supp)/* Abort all queued requests */ list_for_each_entry_safe (req, req_tmp, &supp->reqs, link) {list_del (&req->link); + req->in_queue = false; req->ret =TEEC_ERROR_COMMUNICATION ;complete (&req->c); }
@@ -103,6 +103,7 @@ u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,/* Insert the request in the request list */ mutex_lock (&supp->mutex);list_add_tail (&req->link, &supp->reqs); + req->in_queue = true;mutex_unlock (&supp->mutex);/* Tell an eventual waiter there's a new request */
@@ -130,9 +131,10 @@ u32 optee_supp_thrd_req(struct tee_context *ctx, u32 func, size_t num_params,* will serve all requests in a timely manner and * interrupting then wouldn't make sense. */ - interruptable = !req->busy; -if (!req->busy) +if (req->in_queue) {list_del (&req->link); + req->in_queue = false; + } }mutex_unlock (&supp->mutex);
@@ -176,7 +178,7 @@ static struct optee_supp_req *supp_pop_entry(struct optee_supp *supp,return ERR_PTR (-ENOMEM );list_del (&req->link); - req->busy = true; + req->in_queue = false;return req; }
@@ -318,7 +320,6 @@ static struct optee_supp_req *supp_pop_req(struct optee_supp *supp,if ((num_params - nm) != req->num_params)return ERR_PTR (-EINVAL ); - req->busy = false;idr_remove (&supp->idr, id); supp->req_id =-1 ; *num_meta = nm;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 151/352 drm/msm/dsi: fix dsi clock names in DSI 10nm PLL driver
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c1866d44d149a1ea5c303632114fb6aa08cfd263 ]
Fix the dsi clock names in the DSI 10nm PLL driver to match the names in the dispcc driver as those are according to the clock plan of the chipset.
Changes in v2:
- Update the clock diagram with the new clock name
--- drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/gpu/drm/msm/dsi/pll/dsi_pll_10nm.c +4 -4
@@ -17,7 +17,7 @@* | | * | | * +---------+ | +----------+ | +----+ -* dsi0vco_clk ---| out_div |--o--| divl_3_0 |--o--| /8 |-- dsi0pllbyte +* dsi0vco_clk ---| out_div |--o--| divl_3_0 |--o--| /8 |-- dsi0_phy_pll_out_byteclk * +---------+ | +----------+ | +----+ * | | * | | dsi0_pll_by_2_bit_clk
@@ -25,7 +25,7 @@* | | +----+ | |\ dsi0_pclk_mux * | |--| /2 |--o--| \ | * | | +----+ | \ | +---------+ -* | --------------| |--o--| div_7_4 |-- dsi0pll +* | --------------| |--o--| div_7_4 |-- dsi0_phy_pll_out_dsiclk * |------------------------------| / +---------+ * | +-----+ | / * -----------| /4? |--o----------|/
@@ -690,7 +690,7 @@ static int pll_10nm_register(struct dsi_pll_10nm *pll_10nm) hws[num++] = hw; -snprintf (clk_name,32 ,"dsi%dpllbyte" , pll_10nm->id); +snprintf (clk_name,32 ,"dsi%d_phy_pll_out_byteclk" , pll_10nm->id);snprintf (parent,32 ,"dsi%d_pll_bit_clk" , pll_10nm->id);/* DSI Byte clock = VCO_CLK / OUT_DIV / BIT_DIV / 8 */
@@ -739,7 +739,7 @@ static int pll_10nm_register(struct dsi_pll_10nm *pll_10nm) hws[num++] = hw; -snprintf (clk_name,32 ,"dsi%dpll" , pll_10nm->id); +snprintf (clk_name,32 ,"dsi%d_phy_pll_out_dsiclk" , pll_10nm->id);snprintf (parent,32 ,"dsi%d_pclk_mux" , pll_10nm->id);/* PIX CLK DIV : DIV_CTRL_7_4*/
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 152/352 drm/msm: dpu: Only check flush register against pending flushes
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 5f79e03b1f7c1b2cf0019ce6365fe5d52629813d ]
There exists a case where a flush of a plane/dma may have been triggered & started from an async commit. If that plane/dma is subsequently disabled by the next commit, the flush register will continue to hold the flush bit for the disabled plane. Since the bit remains active, pending_kickoff_cnt will never decrement and we'll miss frame_done events.
This patch limits the check of flush_register to include only those bits which have been updated with the latest commit.
Changes in v2:
- None
--- drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/msm/disp/dpu1/dpu_encoder_phys_vid.c +1 -1
@@ -331,7 +331,7 @@ static void dpu_encoder_phys_vid_vblank_irq(void *arg, int irq_idx)if (hw_ctl && hw_ctl->ops.get_flush_register) flush_register = hw_ctl->ops.get_flush_register (hw_ctl); -if (flush_register ==0 ) +if (!(flush_register & hw_ctl->ops.get_pending_flush (hw_ctl))) new_cnt =atomic_add_unless (&phys_enc->pending_kickoff_cnt,-1 ,0 );spin_unlock_irqrestore (phys_enc->enc_spinlock, lock_flags);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 153/352 lightnvm: pblk: fix resubmission of overwritten write err lbas
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c12fa401ac8c94a74aff68bb5736b3f1dc695fa8 ]
Make sure we only look up valid lba addresses on the resubmission path.
If an lba is invalidated in the write buffer, that sector will be submitted to disk (as it is already mapped to a ppa), and that write might fail, resulting in a crash when trying to look up the lba in the mapping table (as the lba is marked as invalid).
--- drivers/lightnvm/pblk-write.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/lightnvm/pblk-write.c +5 -3
@@ -148,9 +148,11 @@ static void pblk_prepare_resubmit(struct pblk *pblk, unsigned int sentry, w_ctx = &entry->w_ctx;/* Check if the lba has been overwritten */ - ppa_l2p =pblk_trans_map_get (pblk, w_ctx->lba); -if (!pblk_ppa_comp (ppa_l2p, entry->cacheline)) - w_ctx->lba =ADDR_EMPTY ; +if (w_ctx->lba !=ADDR_EMPTY ) { + ppa_l2p =pblk_trans_map_get (pblk, w_ctx->lba); +if (!pblk_ppa_comp (ppa_l2p, entry->cacheline)) + w_ctx->lba =ADDR_EMPTY ; + }/* Mark up the entry as submittable again */ flags =READ_ONCE (w_ctx->flags);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 154/352 lightnvm: pblk: add lock protection to list operations
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fde201a466c6ad5efd72cb54fdf2cefa8b6c6ad7 ]
Protect the list_add on the pblk_line_init_bb() error path in case this code is used for some other purpose in the future.
--- drivers/lightnvm/pblk-core.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/lightnvm/pblk-core.c +10 -3
@@ -1295,15 +1295,22 @@ int pblk_line_recov_alloc(struct pblk *pblk, struct pblk_line *line) ret =pblk_line_alloc_bitmaps (pblk, line);if (ret) -return ret; + goto fail;if (!pblk_line_init_bb (pblk, line,0 )) { -list_add (&line->list, &l_mg->free_list); -return -EINTR ; + ret = -EINTR ; + goto fail; }pblk_rl_free_lines_dec (&pblk->rl, line, true);return 0 ; + +fail: +spin_lock (&l_mg->free_lock); +list_add (&line->list, &l_mg->free_list); +spin_unlock (&l_mg->free_lock); + +return ret; }void pblk_line_recov_close (struct pblk *pblk,struct pblk_line *line)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 155/352 i2c-axxia: check for error conditions first
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4f5c85fe3a60ace555d09898166af372547f97fc ]
It was observed that when using seqentional mode contrary to the documentation, the SS bit (which is supposed to only be set if automatic/sequence command completed normally), is sometimes set together with NA (NAK in address phase) causing transfer to falsely be considered successful.
My assumption is that this does not happen during manual mode since the controller is stopping its work the moment it sets NA/ND bit in status register. This is not the case in Automatic/Sequentional mode where it is still working to send STOP condition and the actual status we get depends on the time when the ISR is run.
This patch changes the order of checking status bits in ISR - error conditions are checked first and only if none of them occurred, the transfer may be considered successful. This is required to introduce using of sequentional mode in next patch.
--- drivers/i2c/busses/i2c-axxia.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
drivers/i2c/busses/i2c-axxia.c +16 -16
@@ -296,22 +296,7 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)i2c_int_disable (idev,MST_STATUS_TFL ); } -if (status &MST_STATUS_SCC ) { -/* Stop completed */ -i2c_int_disable (idev, ~MST_STATUS_TSS ); -complete (&idev->msg_complete); - }else if (status &MST_STATUS_SNS ) { -/* Transfer done */ -i2c_int_disable (idev, ~MST_STATUS_TSS ); -if (i2c_m_rd (idev->msg) && idev->msg_xfrd < idev->msg->len) -axxia_i2c_empty_rx_fifo (idev); -complete (&idev->msg_complete); - }else if (status &MST_STATUS_TSS ) { -/* Transfer timeout */ - idev->msg_err = -ETIMEDOUT ; -i2c_int_disable (idev, ~MST_STATUS_TSS ); -complete (&idev->msg_complete); - }else if (unlikely (status &MST_STATUS_ERR )) { +if (unlikely (status &MST_STATUS_ERR )) {/* Transfer error */ i2c_int_disable (idev, ~0 );if (status &MST_STATUS_AL )
@@ -328,6 +313,21 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)readl (idev->base +MST_TX_BYTES_XFRD ), readl(idev->base + MST_TX_XFER));complete (&idev->msg_complete); + }else if (status &MST_STATUS_SCC ) { +/* Stop completed */ +i2c_int_disable (idev, ~MST_STATUS_TSS ); +complete (&idev->msg_complete); + }else if (status &MST_STATUS_SNS ) { +/* Transfer done */ +i2c_int_disable (idev, ~MST_STATUS_TSS ); +if (i2c_m_rd (idev->msg) && idev->msg_xfrd < idev->msg->len) +axxia_i2c_empty_rx_fifo (idev); +complete (&idev->msg_complete); + }else if (status &MST_STATUS_TSS ) { +/* Transfer timeout */ + idev->msg_err = -ETIMEDOUT ; +i2c_int_disable (idev, ~MST_STATUS_TSS ); +complete (&idev->msg_complete); } out:
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 156/352 lightnvm: Fix uninitialized return value in nvm_get_chunk_meta()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 55e58c5e78aad9d3246f57e7718cf5ee7adde9e3 ]
With gcc 4.1:
drivers/lightnvm/core.c: In function ‘nvm_get_bb_meta’:
drivers/lightnvm/core.c:977: warning: ‘ret’ may be used uninitialized in this function
and
drivers/nvme/host/lightnvm.c: In function ‘nvme_nvm_get_chk_meta’:
drivers/nvme/host/lightnvm.c:580: warning: ‘ret’ may be used uninitialized in this function
Indeed, if (for the former) the number of channels or LUNs is zero, or (for both) the passed number of chunks is zero, ret will be returned uninitialized.
Fix this by preinitializing ret to zero.
--- drivers/lightnvm/core.c | 2 +- drivers/nvme/host/lightnvm.c | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-)
drivers/lightnvm/core.c +1 -1
@@ -974,7 +974,7 @@ static int nvm_get_bb_meta(struct nvm_dev *dev, sector_t slba,struct ppa_addr ppa;u8 *blks;int ch, lun, nr_blks; -int ret; +int ret =0 ; ppa.ppa = slba; ppa =dev_to_generic_addr (dev, ppa);
drivers/nvme/host/lightnvm.c +2 -1
@@ -577,7 +577,8 @@ static int nvme_nvm_get_chk_meta(struct nvm_dev *ndev,struct ppa_addr ppa;size_t left = nchks *sizeof (struct nvme_nvm_chk_meta );size_t log_pos, offset, len; -int ret, i, max_len; +int i, max_len; +int ret =0 ;/* * limit requests to maximum 256K to avoid issuing arbitrary large
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 157/352 phy: sun4i-usb: add support for missing USB PHY index
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2659392e5c08dff626e6db1d739adff58a94604d ]
The new Allwinner H6 SoC's USB2 PHY has two holes -- USB1 (which is a 3.0 port with dedicated PHY) and USB2 (which doesn't exist at all).
Add support for this kind of missing USB PHY index.
--- drivers/phy/allwinner/phy-sun4i-usb.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/phy/allwinner/phy-sun4i-usb.c +7 -0
@@ -126,6 +126,7 @@ struct sun4i_usb_phy_cfg {bool dedicated_clocks;bool enable_pmu_unk1;bool phy0_dual_route; +int missing_phys; };struct sun4i_usb_phy_data {
@@ -646,6 +647,9 @@ static struct phy *sun4i_usb_phy_xlate(struct device *dev,if (args->args[0 ] >= data->cfg->num_phys)return ERR_PTR (-ENODEV ); +if (data->cfg->missing_phys &BIT (args->args[0 ])) +return ERR_PTR (-ENODEV ); +return data->phys[args->args[0 ]].phy; }
@@ -741,6 +745,9 @@ static int sun4i_usb_phy_probe(struct platform_device *pdev)struct sun4i_usb_phy *phy = data->phys + i;char name[16 ]; +if (data->cfg->missing_phys &BIT (i)) +continue ; +snprintf (name,sizeof (name),"usb%d_vbus" , i); phy->vbus =devm_regulator_get_optional (dev, name);if (IS_ERR (phy->vbus)) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 158/352 mlxsw: spectrum_acl: Limit priority value
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d7263ab35be25505ab57ebecd93cbc5dba8be717 ]
In Spectrum-2, higher priority value wins and priority valid values are in the range of {1,cap_kvd_size-1}. mlxsw_sp_acl_tcam_priority_get converts from lower-bound priorities alike tc flower to Spectrum-2 HW range. Up until now tc flower did not provide priority 0 or reached the maximal value, however multicast routing does provide priority 0.
Therefore, Change mlxsw_sp_acl_tcam_priority_get to verify priority is in the correct range. Make sure priority is never set to zero and never exceeds the maximal allowed value.
--- drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +3 -2
@@ -95,8 +95,9 @@ int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp,if (!MLXSW_CORE_RES_VALID (mlxsw_sp->core,KVD_SIZE ))return -EIO ; - max_priority =MLXSW_CORE_RES_GET (mlxsw_sp->core,KVD_SIZE ); -if (rulei->priority > max_priority) +/* Priority range is 1..cap_kvd_size-1. */ + max_priority =MLXSW_CORE_RES_GET (mlxsw_sp->core,KVD_SIZE ) -1 ; +if (rulei->priority >= max_priority)return -EINVAL ;/* Unlike in TC, in HW, higher number means higher priority. */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 159/352 udf: Fix BUG on corrupted inode
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d288d95842f1503414b7eebce3773bac3390457e ]
When inode is corrupted so that extent type is invalid, some functions (such as udf_truncate_extents()) will just BUG. Check that extent type is valid when loading the inode to memory.
--- fs/udf/inode.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/udf/inode.c +6 -0
@@ -1357,6 +1357,12 @@ reread: iinfo->i_alloc_type =le16_to_cpu (fe->icbTag.flags) &ICBTAG_FLAG_AD_MASK ; +if (iinfo->i_alloc_type !=ICBTAG_FLAG_AD_SHORT && + iinfo->i_alloc_type !=ICBTAG_FLAG_AD_LONG && + iinfo->i_alloc_type !=ICBTAG_FLAG_AD_IN_ICB ) { + ret = -EIO ; + goto out; + } iinfo->i_unique =0 ; iinfo->i_lenEAttr =0 ; iinfo->i_lenExtents =0 ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 160/352 switchtec: Fix SWITCHTEC_IOCTL_EVENT_IDX_ALL flags overwrite
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e4a7dca5de625018b29417ecc39dc5037d9a5a36 ]
In the ioctl_event_ctl() SWITCHTEC_IOCTL_EVENT_IDX_ALL case, we call event_ctl() several times with the same "ctl" struct. Each call clobbers ctl.flags, which leads to the problem that we may not actually enable or disable all events as the user requested.
Preserve the event flag value with a temporary variable.
--- drivers/pci/switch/switchtec.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/pci/switch/switchtec.c +3 -0
@@ -800,6 +800,7 @@ static int ioctl_event_ctl(struct switchtec_dev *stdev, {int ret;int nr_idxs; +unsigned int event_flags;struct switchtec_ioctl_event_ctl ctl;if (copy_from_user (&ctl, uctl,sizeof (ctl)))
@@ -821,7 +822,9 @@ static int ioctl_event_ctl(struct switchtec_dev *stdev,else return -EINVAL ; + event_flags = ctl.flags;for (ctl.index =0 ; ctl.index < nr_idxs; ctl.index++) { + ctl.flags = event_flags; ret =event_ctl (stdev, &ctl);if (ret <0 )return ret;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 161/352 selftests/bpf: use __bpf_constant_htons in test_prog.c
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a0517a0f7ef23550b4484c37e2b9c2d32abebf64 ]
For some reason, my older GCC (< 4.8) isn't smart enough to optimize the !__builtin_constant_p() branch in bpf_htons, I see:
error: implicit declaration of function '__builtin_bswap16'
Let's use __bpf_constant_htons as suggested by Daniel Borkmann.
I tried to use simple htons, but it produces the following:
test_progs.c:54:17: error: braced-group within expression allowed only inside a function
.eth.h_proto = htons(ETH_P_IP),
--- tools/testing/selftests/bpf/test_progs.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/bpf/test_progs.c +4 -4
@@ -51,10 +51,10 @@ static struct {struct iphdr iph;struct tcphdr tcp; }__packed pkt_v4 = { - .eth.h_proto =bpf_htons (ETH_P_IP ), + .eth.h_proto =__bpf_constant_htons (ETH_P_IP ), .iph.ihl =5 , .iph.protocol =6 , - .iph.tot_len =bpf_htons (MAGIC_BYTES ), + .iph.tot_len =__bpf_constant_htons (MAGIC_BYTES ), .tcp.urg_ptr =123 , };
@@ -64,9 +64,9 @@ static struct {struct ipv6hdr iph;struct tcphdr tcp; }__packed pkt_v6 = { - .eth.h_proto =bpf_htons (ETH_P_IPV6 ), + .eth.h_proto =__bpf_constant_htons (ETH_P_IPV6 ), .iph.nexthdr =6 , - .iph.payload_len =bpf_htons (MAGIC_BYTES ), + .iph.payload_len =__bpf_constant_htons (MAGIC_BYTES ), .tcp.urg_ptr =123 , };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 162/352 ARM: pxa: avoid section mismatch warning
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 88af3209aa0881aa5ffd99664b6080a4be5f24e5 ]
WARNING: vmlinux.o(.text+0x19f90): Section mismatch in reference from the function littleton_init_lcd() to the function .init.text:pxa_set_fb_info() The function littleton_init_lcd() references
the function __init pxa_set_fb_info().
This is often because littleton_init_lcd lacks a __init
annotation or the annotation of pxa_set_fb_info is wrong.
WARNING: vmlinux.o(.text+0xf824): Section mismatch in reference from the function zeus_register_ohci() to the function .init.text:pxa_set_ohci_info() The function zeus_register_ohci() references
the function __init pxa_set_ohci_info().
This is often because zeus_register_ohci lacks a __init
annotation or the annotation of pxa_set_ohci_info is wrong.
WARNING: vmlinux.o(.text+0xf95c): Section mismatch in reference from the function cm_x300_init_u2d() to the function .init.text:pxa3xx_set_u2d_info() The function cm_x300_init_u2d() references
the function __init pxa3xx_set_u2d_info().
This is often because cm_x300_init_u2d lacks a __init
annotation or the annotation of pxa3xx_set_u2d_info is wrong.
--- arch/arm/mach-pxa/cm-x300.c | 2 +- arch/arm/mach-pxa/littleton.c | 2 +- arch/arm/mach-pxa/zeus.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
arch/arm/mach-pxa/cm-x300.c +1 -1
@@ -558,7 +558,7 @@ static struct pxa3xx_u2d_platform_data cm_x300_u2d_platform_data = { .exit = cm_x300_u2d_exit, }; -static void cm_x300_init_u2d (void ) +static void __init cm_x300_init_u2d (void ) {pxa3xx_set_u2d_info (&cm_x300_u2d_platform_data); }
arch/arm/mach-pxa/littleton.c +1 -1
@@ -184,7 +184,7 @@ static struct pxafb_mach_info littleton_lcd_info = { .lcd_conn = LCD_COLOR_TFT_16BPP, }; -static void littleton_init_lcd (void ) +static void __init littleton_init_lcd (void ) {pxa_set_fb_info (NULL , &littleton_lcd_info); }
arch/arm/mach-pxa/zeus.c +1 -1
@@ -576,7 +576,7 @@ static struct pxaohci_platform_data zeus_ohci_platform_data = { .flags = ENABLE_PORT_ALL | POWER_SENSE_LOW, }; -static void zeus_register_ohci (void ) +static void __init zeus_register_ohci (void ) {/* Port 2 is shared between host and client interface. */ UP2OCR =UP2OCR_HXOE |UP2OCR_HXS |UP2OCR_DMPDE |UP2OCR_DPPDE ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 163/352 ASoC: fsl: Fix SND_SOC_EUKREA_TLV320 build error on i.MX8M
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit add6883619a9e3bf9658eaff1a547354131bbcd9 ]
eukrea-tlv320.c machine driver runs on non-DT platforms and include <asm/mach-types.h> header file in order to be able to use some machine_is_eukrea_xxx() macros.
Building it for ARM64 causes the following build error:
sound/soc/fsl/eukrea-tlv320.c:28:10: fatal error: asm/mach-types.h: No such file or directory
Avoid this error by not allowing to build the SND_SOC_EUKREA_TLV320 driver when ARM64 is selected.
This is needed in preparation for the i.MX8M support.
--- sound/soc/fsl/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/fsl/Kconfig +1 -1
@@ -221,7 +221,7 @@ config SND_SOC_PHYCORE_AC97 config SND_SOC_EUKREA_TLV320 tristate "Eukrea TLV320" - depends on ARCH_MXC && I2C + depends on ARCH_MXC && !ARM64 && I2C select SND_SOC_TLV320AIC23_I2C select SND_SOC_IMX_AUDMUX select SND_SOC_IMX_SSI
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 164/352 ARM: mmp: fix timer_init calls
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 12d3a30db4a3b3df5fbadf5974b9cf50544a9950 ]
The change to passing the timer frequency as a function argument was a good idea, but caused a build failure for one user that was missed in the update:
arch/arm/mach-mmp/time.c: In function 'mmp_dt_init_timer':arch/arm/mach-mmp/time.c:242:2: error: implicit declaration of function 'timer_init'; did you mean 'hrtimer_init'? [-Werror=implicit-function-declaration]
Change that as well to fix the build error, and rename the function to put it into a proper namespace and make it clearer what is actually going on.
I saw that the high 6500000 HZ frequency was previously only set with CONFIG_MMP2, but is now also used with MMP (pxa910), so I'm changing that back here. Please make sure that the frequencies are all correct now.
--- arch/arm/mach-mmp/common.h | 2 +- arch/arm/mach-mmp/mmp2.c | 2 +- arch/arm/mach-mmp/pxa168.c | 2 +- arch/arm/mach-mmp/pxa910.c | 2 +- arch/arm/mach-mmp/time.c | 4 ++-- 5 files changed, 6 insertions(+), 6 deletions(-)
arch/arm/mach-mmp/common.h +1 -1
@@ -2,7 +2,7 @@#include <linux/reboot.h> #define ARRAY_AND_SIZE (x) (x), ARRAY_SIZE(x) -extern void timer_init (int irq,unsigned long rate); +extern void mmp_timer_init (int irq,unsigned long rate);extern void __init mmp_map_io (void );extern void mmp_restart (enum reboot_mode ,const char *);
arch/arm/mach-mmp/mmp2.c +1 -1
@@ -134,7 +134,7 @@ void __init mmp2_timer_init(void) clk_rst =APBC_APBCLK |APBC_FNCLK |APBC_FNCLKSEL (1 );__raw_writel (clk_rst,APBC_TIMERS ); -timer_init (IRQ_MMP2_TIMER1 ,6500000 ); +mmp_timer_init (IRQ_MMP2_TIMER1 ,6500000 ); }/* on-chip devices */
arch/arm/mach-mmp/pxa168.c +1 -1
@@ -79,7 +79,7 @@ void __init pxa168_timer_init(void)/* 3.25MHz, bus/functional clock enabled, release reset */ __raw_writel (TIMER_CLK_RST ,APBC_TIMERS ); -timer_init (IRQ_PXA168_TIMER1 ,6500000 ); +mmp_timer_init (IRQ_PXA168_TIMER1 ,3250000 ); }void pxa168_clear_keypad_wakeup (void )
arch/arm/mach-mmp/pxa910.c +1 -1
@@ -116,7 +116,7 @@ void __init pxa910_timer_init(void)__raw_writel (APBC_APBCLK |APBC_RST ,APBC_TIMERS );__raw_writel (TIMER_CLK_RST ,APBC_TIMERS ); -timer_init (IRQ_PXA910_AP1_TIMER1 ); +mmp_timer_init (IRQ_PXA910_AP1_TIMER1 ,3250000 ); }/* on-chip devices */
arch/arm/mach-mmp/time.c +2 -2
@@ -184,7 +184,7 @@ static struct irqaction timer_irq = { .dev_id = &ckevt, }; -void __init timer_init (int irq,unsigned long rate) +void __init mmp_timer_init (int irq,unsigned long rate) {timer_config ();
@@ -239,7 +239,7 @@ void __init mmp_dt_init_timer(void) ret = -ENOMEM ; goto out; } -timer_init (irq, rate); +mmp_timer_init (irq, rate);return ; out:pr_err ("Failed to get timer from device tree with error:%d\n" , ret);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 165/352 fix dma-buf/udmabuf selftest
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6edf2e3710f4ef2555ad7a2681dbeb4a69092b2d ]
This patch fixes the udmabuf selftest. Currently the selftest is broken. I fixed the selftest by setting the F_SEAL_SHRINK seal on the memfd file descriptor which is required by udmabuf and added the test to the selftest Makefile.
--- tools/testing/selftests/Makefile | 1 + tools/testing/selftests/drivers/dma-buf/Makefile | 2 ++ tools/testing/selftests/drivers/dma-buf/udmabuf.c | 11 +++++++++-- 3 files changed, 12 insertions(+), 2 deletions(-)
tools/testing/selftests/Makefile +1 -0
@@ -6,6 +6,7 @@ TARGETS += capabilities TARGETS += cgroup TARGETS += cpufreq TARGETS += cpu-hotplug +TARGETS += drivers/dma-buf TARGETS += efivarfs TARGETS += exec TARGETS += filesystems
tools/testing/selftests/drivers/dma-buf/Makefile +2 -0
@@ -2,4 +2,6 @@ CFLAGS += -I../../../../../usr/include/ TEST_GEN_PROGS := udmabuf +top_srcdir ?=../../../../.. + include ../../lib.mk
tools/testing/selftests/drivers/dma-buf/udmabuf.c +9 -2
@@ -4,7 +4,7 @@#include <unistd.h> #include <string.h> #include <errno.h> -#include <fcntl.h> +#include <linux/fcntl.h> #include <malloc.h> #include <sys/ioctl.h>
@@ -33,12 +33,19 @@ int main(int argc, char *argv[])exit (77 ); } - memfd =memfd_create ("udmabuf-test" ,MFD_CLOEXEC ); + memfd =memfd_create ("udmabuf-test" ,MFD_ALLOW_SEALING );if (memfd <0 ) {printf ("%s: [skip,no-memfd]\n" ,TEST_PREFIX );exit (77 ); } + ret =fcntl (memfd,F_ADD_SEALS ,F_SEAL_SHRINK ); +if (ret <0 ) { +printf ("%s: [skip,fcntl-add-seals]\n" ,TEST_PREFIX ); +exit (77 ); + } + + size =getpagesize () *NUM_PAGES ; ret =ftruncate (memfd, size);if (ret ==-1 ) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 166/352 clk: qcom: Leave mmss noc on for 8998
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 12eced09cd301aa7b1868a67c50a651c2aacd363 ]
Similar to other qcom targets, gcc_mmss_noc_cfg_ahb_clk should not be disabled. Any mmss access depends on this clock, and its been observed that enabling mmssnoc_axi_rpm_clk with rpmcc results in an implicit access to mmss and will crash the system if gcc_mmss_noc_cfg_ahb_clk is disabled.
--- drivers/clk/qcom/gcc-msm8998.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/clk/qcom/gcc-msm8998.c +6 -0
@@ -2042,6 +2042,12 @@ static struct clk_branch gcc_mmss_noc_cfg_ahb_clk = { .hw.init = &(struct clk_init_data){ .name ="gcc_mmss_noc_cfg_ahb_clk" , .ops = &clk_branch2_ops, +/* +* Any access to mmss depends on this clock. +* Gating this clock has been shown to crash the system +* when mmssnoc_axi_rpm_clk is inited in rpmcc. +*/ + .flags =CLK_IS_CRITICAL , }, }, };
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 167/352 f2fs: fix to reorder set_page_dirty and wait_on_page_writeback
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8d64d365aed355b2e2465d19ba61df02462fff4d ]
This patch reorders flow from
- update page
- set_page_dirty
- wait_on_page_writeback
to
- wait_on_page_writeback
- update page
- set_page_dirty
The reason is:
- set_page_dirty will increase reference of dirty page, the reference should be cleared before wait_on_page_writeback to keep its consistency.
- some devices need stable page during page writebacking, so we should not change page's data.
--- fs/f2fs/checkpoint.c | 7 ++++--- fs/f2fs/gc.c | 5 +++-- fs/f2fs/node.c | 5 +++-- fs/f2fs/segment.c | 3 ++- 4 files changed, 12 insertions(+), 8 deletions(-)
fs/f2fs/checkpoint.c +4 -3
@@ -1290,11 +1290,12 @@ static void commit_checkpoint(struct f2fs_sb_info *sbi,struct page *page =f2fs_grab_meta_page (sbi, blk_addr);int err; -memcpy (page_address (page), src,PAGE_SIZE ); -set_page_dirty (page); -f2fs_wait_on_page_writeback (page,META , true);f2fs_bug_on (sbi,PageWriteback (page)); + +memcpy (page_address (page), src,PAGE_SIZE ); + +set_page_dirty (page);if (unlikely (!clear_page_dirty_for_io (page)))f2fs_bug_on (sbi,1 );
fs/f2fs/gc.c +3 -2
@@ -812,8 +812,8 @@ static int move_data_block(struct inode *inode, block_t bidx, } write_page: -set_page_dirty (fio.encrypted_page);f2fs_wait_on_page_writeback (fio.encrypted_page,DATA , true); +set_page_dirty (fio.encrypted_page);if (clear_page_dirty_for_io (fio.encrypted_page))dec_page_count (fio.sbi,F2FS_DIRTY_META );
@@ -907,8 +907,9 @@ static int move_data_page(struct inode *inode, block_t bidx, int gc_type,bool is_dirty =PageDirty (page); retry: -set_page_dirty (page);f2fs_wait_on_page_writeback (page,DATA , true); + +set_page_dirty (page);if (clear_page_dirty_for_io (page)) {inode_dec_dirty_pages (inode);f2fs_remove_dirty_inode (inode);
fs/f2fs/node.c +3 -2
@@ -1598,10 +1598,11 @@ int f2fs_move_node_page(struct page *node_page, int gc_type) .for_reclaim = 0, }; -set_page_dirty (node_page);f2fs_wait_on_page_writeback (node_page,NODE , true); -f2fs_bug_on (F2FS_P_SB (node_page),PageWriteback (node_page)); + +set_page_dirty (node_page); +if (!clear_page_dirty_for_io (node_page)) { err = -EAGAIN ; goto out_page;
fs/f2fs/segment.c +2 -1
@@ -387,8 +387,9 @@ static int __f2fs_commit_inmem_pages(struct inode *inode)if (page->mapping == inode->i_mapping) {trace_f2fs_commit_inmem_page (page,INMEM ); -set_page_dirty (page);f2fs_wait_on_page_writeback (page,DATA , true); + +set_page_dirty (page);if (clear_page_dirty_for_io (page)) {inode_dec_dirty_pages (inode);f2fs_remove_dirty_inode (inode);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 168/352 ipv6: Fix handling of LLA with VRF and sockets bound to VRF
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c2027d1e17582903e368abf5d4838b22a98f2b7b ]
A recent commit allows sockets bound to a VRF to receive ipv6 link local packets. However, it only works for UDP and worse TCP connection attempts to the LLA with the only listener bound to the VRF just hang where as before the client gets a reset and connection refused. Fix by adjusting ir_iif for LL addresses and packets received through a device enslaved to a VRF.
--- net/ipv6/tcp_ipv6.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/ipv6/tcp_ipv6.c +2 -1
@@ -734,6 +734,7 @@ static void tcp_v6_init_req(struct request_sock *req,const struct sock *sk_listener, struct sk_buff *skb) { + bool l3_slave = ipv6_l3mdev_skb(TCP_SKB_CB(skb)->header.h6.flags);struct inet_request_sock *ireq =inet_rsk (req);const struct ipv6_pinfo *np =inet6_sk (sk_listener);
@@ -741,7 +742,7 @@ static void tcp_v6_init_req(struct request_sock *req, ireq->ir_v6_loc_addr =ipv6_hdr (skb)->daddr;/* So that link locals have meaning */ -if (!sk_listener->sk_bound_dev_if && +if ((!sk_listener->sk_bound_dev_if || l3_slave) &&ipv6_addr_type (&ireq->ir_v6_rmt_addr) &IPV6_ADDR_LINKLOCAL ) ireq->ir_iif =tcp_v6_iif (skb);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 169/352 tools: bpftool: fix -Wmissing declaration warnings
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c101189bc9680675a2686bafe908015a07a0da51 ]
Help compiler check arguments for several utility functions used to print items to the console by adding the "printf" attribute when declaring those functions.
Also, declare as "static" two functions that are only used in prog.c.
All of them discovered by compiling bpftool with -Wmissing-format-attribute -Wmissing-declarations.
--- tools/bpf/bpftool/common.c | 4 ++-- tools/bpf/bpftool/json_writer.c | 6 ++++-- tools/bpf/bpftool/prog.c | 4 ++-- tools/bpf/bpftool/xlated_dumper.c | 7 ++++--- 4 files changed, 12 insertions(+), 9 deletions(-)
tools/bpf/bpftool/common.c +2 -2
@@ -58,7 +58,7 @@#define BPF_FS_MAGIC 0xcafe4a11#endif -void p_err (const char *fmt, ...) +void __printf(1, 2) p_err(const char *fmt, ...) { va_list ap;
@@ -76,7 +76,7 @@ void p_err(const char *fmt, ...)va_end (ap); } -void p_info (const char *fmt, ...) +void __printf(1, 2) p_info(const char *fmt, ...) {va_list ap;
tools/bpf/bpftool/json_writer.c +4 -2
@@ -19,6 +19,7 @@#include <malloc.h> #include <inttypes.h> #include <stdint.h> +#include <linux/compiler.h> #include "json_writer.h"
@@ -156,7 +157,8 @@ void jsonw_name(json_writer_t *self, const char *name)putc (' ' , self->out); } -void jsonw_vprintf_enquote (json_writer_t *self,const char *fmt,va_list ap) +void __printf(2, 0) +jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap) {jsonw_eor (self);putc ('"' , self->out);
@@ -164,7 +166,7 @@ void jsonw_vprintf_enquote(json_writer_t *self, const char *fmt, va_list ap)putc ('"' , self->out); } -void jsonw_printf (json_writer_t *self,const char *fmt, ...) +void __printf(2, 3) jsonw_printf(json_writer_t *self, const char *fmt, ...) {va_list ap;
tools/bpf/bpftool/prog.c +2 -2
@@ -84,7 +84,7 @@ static const char * const attach_type_strings[] = { [__MAX_BPF_ATTACH_TYPE] = NULL, }; -enum bpf_attach_type parse_attach_type (const char *str) +static enum bpf_attach_type parse_attach_type (const char *str) {enum bpf_attach_type type;
@@ -713,7 +713,7 @@ struct map_replace {char *name; }; -int map_replace_compar (const void *p1,const void *p2) +static int map_replace_compar (const void *p1,const void *p2) {const struct map_replace *a = p1, *b = p2;
tools/bpf/bpftool/xlated_dumper.c +4 -3
@@ -114,7 +114,7 @@ struct kernel_sym *kernel_syms_search(struct dump_data *dd, sizeof(*dd->sym_mapping), kernel_syms_cmp) : NULL; } -static void print_insn (void *private_data,const char *fmt, ...) +static void __printf(2, 3) print_insn(void *private_data, const char *fmt, ...) {va_list args;
@@ -123,7 +123,7 @@ static void print_insn(void *private_data, const char *fmt, ...)va_end (args); } -static void +static void __printf(2, 3) print_insn_for_graph(void *private_data, const char *fmt, ...) {char buf[64 ], *p;
@@ -154,7 +154,8 @@ print_insn_for_graph(void *private_data, const char *fmt, ...)printf ("%s" , buf); } -static void print_insn_json (void *private_data,const char *fmt, ...) +static void __printf(2, 3) +print_insn_json(void *private_data, const char *fmt, ...) {unsigned int l =strlen (fmt);char chomped_fmt[l];
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 170/352 KVM: PPC: Book3S: Only report KVM_CAP_SPAPR_TCE_VFIO on powernv machines
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 693ac10a88a2219bde553b2e8460dbec97e594e6 ]
The kvm capability KVM_CAP_SPAPR_TCE_VFIO is used to indicate the availability of in kernel tce acceleration for vfio. However it is currently the case that this is only available on a powernv machine, not for a pseries machine.
Thus make this capability dependent on having the cpu feature CPU_FTR_HVMODE.
[[email protected] - fixed compilation for Book E.]
--- arch/powerpc/kvm/powerpc.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/powerpc/kvm/powerpc.c +4 -1
@@ -543,8 +543,11 @@ int kvm_vm_ioctl_check_extension(struct kvm *kvm, long ext)#ifdef CONFIG_PPC_BOOK3S_64 case KVM_CAP_SPAPR_TCE :case KVM_CAP_SPAPR_TCE_64 : -/* fallthrough */ + r =1 ; +break ;case KVM_CAP_SPAPR_TCE_VFIO : + r = !!cpu_has_feature (CPU_FTR_HVMODE ); +break ;case KVM_CAP_PPC_RTAS :case KVM_CAP_PPC_FIXUP_HCALL :case KVM_CAP_PPC_ENABLE_HCALL :
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 171/352 mmc: bcm2835: Recover from MMC_SEND_EXT_CSD
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 07d405769afea5718529fc9e341f0b13b3189b6f ]
If the user issues an "mmc extcsd read", the SD controller receives what it thinks is a SEND_IF_COND command with an unexpected data block. The resulting operations leave the FSM stuck in READWAIT, a state which persists until the MMC framework resets the controller, by which point the root filesystem is likely to have been unmounted.
A less heavyweight solution is to detect the condition and nudge the FSM by asserting the (self-clearing) FORCE_DATA_MODE bit.
--- drivers/mmc/host/bcm2835.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/mmc/host/bcm2835.c +9 -0
@@ -772,6 +772,8 @@ static void bcm2835_finish_command(struct bcm2835_host *host)if (!(sdhsts &SDHSTS_CRC7_ERROR ) || (host->cmd->opcode !=MMC_SEND_OP_COND )) { +u32 edm, fsm; +if (sdhsts &SDHSTS_CMD_TIME_OUT ) { host->cmd->error = -ETIMEDOUT ; }else {
@@ -780,6 +782,13 @@ static void bcm2835_finish_command(struct bcm2835_host *host)bcm2835_dumpregs (host); host->cmd->error = -EILSEQ ; } + edm =readl (host->ioaddr +SDEDM ); + fsm = edm &SDEDM_FSM_MASK ; +if (fsm ==SDEDM_FSM_READWAIT || + fsm ==SDEDM_FSM_WRITESTART1 ) +/* Kick the FSM out of its wait */ +writel (edm |SDEDM_FORCE_DATA_MODE , + host->ioaddr +SDEDM );bcm2835_finish_request (host);return ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 172/352 mmc: bcm2835: reset host on timeout
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f6000a4eb34e6462bc0dd39809c1bb99f9633269 ]
The bcm2835 mmc host tends to lock up for unknown reason so reset it on timeout. The upper mmc block layer tries retransimitting with single blocks which tends to work out after a long wait.
This is better than giving up and leaving the machine broken for no obvious reason.
--- drivers/mmc/host/bcm2835.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mmc/host/bcm2835.c +3 -0
@@ -286,6 +286,7 @@ static void bcm2835_reset(struct mmc_host *mmc)if (host->dma_chan)dmaengine_terminate_sync (host->dma_chan); + host->dma_chan =NULL ;bcm2835_reset_internal (host); }
@@ -846,6 +847,8 @@ static void bcm2835_timeout(struct work_struct *work)dev_err (dev,"timeout waiting for hardware interrupt.\n" );bcm2835_dumpregs (host); +bcm2835_reset (host->mmc); +if (host->data) { host->data->error = -ETIMEDOUT ;bcm2835_finish_data (host);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 173/352 mmc: meson-mx-sdio: check devm_kasprintf for failure
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b0d06f1cb0e2079a3c64fb6e27c19d9a55c723a1 ]
devm_kasprintf() may return NULL on failure of internal allocation thus the assignments to init.name are not safe if not checked. On error meson_mx_mmc_register_clks() returns negative values so -ENOMEM in the (unlikely) failure case of devm_kasprintf() should be fine here.
--- drivers/mmc/host/meson-mx-sdio.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/mmc/host/meson-mx-sdio.c +6 -0
@@ -596,6 +596,9 @@ static int meson_mx_mmc_register_clks(struct meson_mx_mmc_host *host) init.name =devm_kasprintf (host->controller_dev,GFP_KERNEL ,"%s#fixed_factor" ,dev_name (host->controller_dev)); +if (!init.name) +return -ENOMEM ; + init.ops = &clk_fixed_factor_ops; init.flags =0 ; init.parent_names = &clk_fixed_factor_parent;
@@ -612,6 +615,9 @@ static int meson_mx_mmc_register_clks(struct meson_mx_mmc_host *host) clk_div_parent =__clk_get_name (host->fixed_factor_clk); init.name =devm_kasprintf (host->controller_dev,GFP_KERNEL ,"%s#div" ,dev_name (host->controller_dev)); +if (!init.name) +return -ENOMEM ; + init.ops = &clk_divider_ops; init.flags =CLK_SET_RATE_PARENT ; init.parent_names = &clk_div_parent;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 174/352 memstick: Prevent memstick host from getting runtime suspended during card detection
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e03e303edf1c63e6dd455ccd568c74e93ef3ba8c ]
We can use MEMSTICK_POWER_{ON,OFF} along with pm_runtime_{get,put} helpers to let memstick host support runtime pm.
The rpm count may go down to zero before the memstick host powers on, so the host can be runtime suspended.
So before doing card detection, increment the rpm count to avoid the host gets runtime suspended. Balance the rpm count after card detection is done.
--- drivers/memstick/core/memstick.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/memstick/core/memstick.c +3 -0
@@ -18,6 +18,7 @@#include <linux/delay.h> #include <linux/slab.h> #include <linux/module.h> +#include <linux/pm_runtime.h> #define DRIVER_NAME "memstick"
@@ -436,6 +437,7 @@ static void memstick_check(struct work_struct *work)struct memstick_dev *card;dev_dbg (&host->dev,"memstick_check started\n" ); +pm_runtime_get_noresume (host->dev.parent);mutex_lock (&host->lock);if (!host->card) {if (memstick_power_on (host))
@@ -479,6 +481,7 @@ out_power_off: host->set_param (host,MEMSTICK_POWER ,MEMSTICK_POWER_OFF );mutex_unlock (&host->lock); +pm_runtime_put (host->dev.parent);dev_dbg (&host->dev,"memstick_check finished\n" ); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 175/352 mmc: sdhci-of-esdhc: Fix timeout checks
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ea6d027312111c6d96309ad1a684b33cb37e6764 ]
Always check the wait condition before returning timeout.
--- drivers/mmc/host/sdhci-of-esdhc.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/host/sdhci-of-esdhc.c +12 -4
@@ -528,8 +528,12 @@ static void esdhc_clock_enable(struct sdhci_host *host, bool enable)/* Wait max 20 ms */ timeout =ktime_add_ms (ktime_get (),20 ); val =ESDHC_CLOCK_STABLE ; -while (!(sdhci_readl (host,ESDHC_PRSSTAT ) & val)) { -if (ktime_after (ktime_get (), timeout)) { +while (1 ) { +bool timedout =ktime_after (ktime_get (), timeout); + +if (sdhci_readl (host,ESDHC_PRSSTAT ) & val) +break ; +if (timedout) {pr_err ("%s: Internal clock never stabilised.\n" ,mmc_hostname (host->mmc));break ;
@@ -594,8 +598,12 @@ static void esdhc_of_set_clock(struct sdhci_host *host, unsigned int clock)/* Wait max 20 ms */ timeout =ktime_add_ms (ktime_get (),20 ); -while (!(sdhci_readl (host,ESDHC_PRSSTAT ) &ESDHC_CLOCK_STABLE )) { -if (ktime_after (ktime_get (), timeout)) { +while (1 ) { +bool timedout =ktime_after (ktime_get (), timeout); + +if (sdhci_readl (host,ESDHC_PRSSTAT ) &ESDHC_CLOCK_STABLE ) +break ; +if (timedout) {pr_err ("%s: Internal clock never stabilised.\n" ,mmc_hostname (host->mmc));return ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 176/352 mmc: sdhci-omap: Fix timeout checks
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9f0ea0bda1d06120b053bb0c283f54afec59293d ]
Always check the wait condition before returning timeout.
--- drivers/mmc/host/sdhci-omap.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/mmc/host/sdhci-omap.c +12 -4
@@ -220,8 +220,12 @@ static void sdhci_omap_conf_bus_power(struct sdhci_omap_host *omap_host,/* wait 1ms */ timeout =ktime_add_ms (ktime_get (),SDHCI_OMAP_TIMEOUT ); -while (!(sdhci_omap_readl (omap_host,SDHCI_OMAP_HCTL ) &HCTL_SDBP )) { -if (WARN_ON (ktime_after (ktime_get (), timeout))) +while (1 ) { +bool timedout =ktime_after (ktime_get (), timeout); + +if (sdhci_omap_readl (omap_host,SDHCI_OMAP_HCTL ) &HCTL_SDBP ) +break ; +if (WARN_ON (timedout))return ;usleep_range (5 ,10 ); }
@@ -653,8 +657,12 @@ static void sdhci_omap_init_74_clocks(struct sdhci_host *host, u8 power_mode)/* wait 1ms */ timeout =ktime_add_ms (ktime_get (),SDHCI_OMAP_TIMEOUT ); -while (!(sdhci_omap_readl (omap_host,SDHCI_OMAP_STAT ) &INT_CC_EN )) { -if (WARN_ON (ktime_after (ktime_get (), timeout))) +while (1 ) { +bool timedout =ktime_after (ktime_get (), timeout); + +if (sdhci_omap_readl (omap_host,SDHCI_OMAP_STAT ) &INT_CC_EN ) +break ; +if (WARN_ON (timedout))return ;usleep_range (5 ,10 ); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 177/352 mmc: sdhci-xenon: Fix timeout checks
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0e6e7c2ff397e1bbebc882ca3132148aaaef1ddd ]
Always check the wait condition before returning timeout.
--- drivers/mmc/host/sdhci-xenon-phy.c | 10 +++++++--- drivers/mmc/host/sdhci-xenon.c | 10 +++++++--- 2 files changed, 14 insertions(+), 6 deletions(-)
drivers/mmc/host/sdhci-xenon-phy.c +7 -3
@@ -357,9 +357,13 @@ static int xenon_emmc_phy_enable_dll(struct sdhci_host *host)/* Wait max 32 ms */ timeout =ktime_add_ms (ktime_get (),32 ); -while (!(sdhci_readw (host,XENON_SLOT_EXT_PRESENT_STATE ) & -XENON_DLL_LOCK_STATE )) { -if (ktime_after (ktime_get (), timeout)) { +while (1 ) { +bool timedout =ktime_after (ktime_get (), timeout); + +if (sdhci_readw (host,XENON_SLOT_EXT_PRESENT_STATE ) & +XENON_DLL_LOCK_STATE ) +break ; +if (timedout) {dev_err (mmc_dev (host->mmc),"Wait for DLL Lock time-out\n" );return -ETIMEDOUT ; }
drivers/mmc/host/sdhci-xenon.c +7 -3
@@ -34,9 +34,13 @@ static int xenon_enable_internal_clk(struct sdhci_host *host)sdhci_writel (host, reg,SDHCI_CLOCK_CONTROL );/* Wait max 20 ms */ timeout =ktime_add_ms (ktime_get (),20 ); -while (!((reg =sdhci_readw (host,SDHCI_CLOCK_CONTROL )) - &SDHCI_CLOCK_INT_STABLE )) { -if (ktime_after (ktime_get (), timeout)) { +while (1 ) { +bool timedout =ktime_after (ktime_get (), timeout); + + reg =sdhci_readw (host,SDHCI_CLOCK_CONTROL ); +if (reg &SDHCI_CLOCK_INT_STABLE ) +break ; +if (timedout) {dev_err (mmc_dev (host->mmc),"Internal clock never stabilised.\n" );return -ETIMEDOUT ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 178/352 mmc: jz4740: Get CD/WP GPIOs from descriptors
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0c901c0566fb4edc2631c3786e5085a037be91f8 ]
Modifty the JZ4740 driver to retrieve card detect and write protect GPIO pins from GPIO descriptors instead of hard-coded global numbers. Augment the only board file using this in the process and cut down on passed in platform data.
Preserve the code setting the caps2 flags for CD and WP as active low or high since the slot GPIO code currently ignores the gpiolib polarity inversion semantice and uses the raw accessors to read the GPIO lines, but set the right polarity flags in the descriptor table for jz4740.
--- .../mips/include/asm/mach-jz4740/jz4740_mmc.h | 2 -- arch/mips/jz4740/board-qi_lb60.c | 12 ++++++++--- drivers/mmc/host/jz4740_mmc.c | 20 +++++++++---------- 3 files changed, 19 insertions(+), 15 deletions(-)
arch/mips/include/asm/mach-jz4740/jz4740_mmc.h +0 -2
@@ -4,8 +4,6 @@struct jz4740_mmc_platform_data {int gpio_power; -int gpio_card_detect; -int gpio_read_only;unsigned card_detect_active_low:1 ;unsigned read_only_active_low:1 ;unsigned power_active_low:1 ;
arch/mips/jz4740/board-qi_lb60.c +9 -3
@@ -43,7 +43,6 @@#include "clock.h" /* GPIOs */ -#define QI_LB60_GPIO_SD_CD JZ_GPIO_PORTD(0)#define QI_LB60_GPIO_SD_VCC_EN_N JZ_GPIO_PORTD(2)#define QI_LB60_GPIO_KEYOUT (x) (JZ_GPIO_PORTC(10) + (x))
@@ -386,12 +385,18 @@ static struct platform_device qi_lb60_gpio_keys = { };static struct jz4740_mmc_platform_data qi_lb60_mmc_pdata = { - .gpio_card_detect =QI_LB60_GPIO_SD_CD , - .gpio_read_only =-1 , .gpio_power =QI_LB60_GPIO_SD_VCC_EN_N , .power_active_low =1 , }; +static struct gpiod_lookup_table qi_lb60_mmc_gpio_table = { + .dev_id ="jz4740-mmc.0" , + .table = { +GPIO_LOOKUP ("GPIOD" ,0 ,"cd" ,GPIO_ACTIVE_HIGH ), + { }, + }, +}; +/* beeper */ static struct pwm_lookup qi_lb60_pwm_lookup[] = { PWM_LOOKUP("jz4740-pwm", 4, "pwm-beeper", NULL, 0,
@@ -500,6 +505,7 @@ static int __init qi_lb60_init_platform_devices(void)gpiod_add_lookup_table (&qi_lb60_audio_gpio_table);gpiod_add_lookup_table (&qi_lb60_nand_gpio_table);gpiod_add_lookup_table (&qi_lb60_spigpio_gpio_table); +gpiod_add_lookup_table (&qi_lb60_mmc_gpio_table);spi_register_board_info (qi_lb60_spi_board_info,ARRAY_SIZE (qi_lb60_spi_board_info));
drivers/mmc/host/jz4740_mmc.c +10 -10
@@ -983,17 +983,17 @@ static int jz4740_mmc_request_gpios(struct mmc_host *mmc,if (!pdata->read_only_active_low) mmc->caps2 |=MMC_CAP2_RO_ACTIVE_HIGH ; -if (gpio_is_valid (pdata->gpio_card_detect)) { - ret =mmc_gpio_request_cd (mmc, pdata->gpio_card_detect,0 ); -if (ret) -return ret; - } +/* +* Get optional card detect and write protect GPIOs, +* only back out on probe deferral. +*/ + ret =mmc_gpiod_request_cd (mmc,"cd" ,0 , false,0 ,NULL ); +if (ret == -EPROBE_DEFER ) +return ret; -if (gpio_is_valid (pdata->gpio_read_only)) { - ret =mmc_gpio_request_ro (mmc, pdata->gpio_read_only); -if (ret) -return ret; - } + ret =mmc_gpiod_request_ro (mmc,"wp" ,0 , false,0 ,NULL ); +if (ret == -EPROBE_DEFER ) +return ret;return jz4740_mmc_request_gpio (&pdev->dev, pdata->gpio_power,"MMC read only" , true, pdata->power_active_low);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 179/352 usb: renesas_usbhs: add support for RZ/G2E
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1d6e81a288e28d8d0e38e0501a324216f79bba35 ]
HS-USB found in RZ/G2E (a.k.a. r8a774c0) is very similar to the one found in R-Car E3 (a.k.a. r8a77990), as it needs to release the PLL reset by the UGCTRL register like R-Car E3, therefore add r8a774c0 support in a similar fashion to what was done for the r8a77990.
--- drivers/usb/renesas_usbhs/common.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/usb/renesas_usbhs/common.c +4 -0
@@ -539,6 +539,10 @@ static int usbhsc_drvcllbck_notify_hotplug(struct platform_device *pdev)* platform functions */ static const struct of_device_id usbhs_of_match[] = { + { + .compatible ="renesas,usbhs-r8a774c0" , + .data = (void *)USBHS_TYPE_RCAR_GEN3_WITH_PLL , + }, { .compatible ="renesas,usbhs-r8a7790" , .data = (void *)USBHS_TYPE_RCAR_GEN2 ,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 180/352 btrfs: harden agaist duplicate fsid on scanned devices
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a9261d4125c97ce8624e9941b75dee1b43ad5df9 ]
It's not that impossible to imagine that a device OR a btrfs image is copied just by using the dd or the cp command. Which in case both the copies of the btrfs will have the same fsid. If on the system with automount enabled, the copied FS gets scanned.
We have a known bug in btrfs, that we let the device path be changed after the device has been mounted. So using this loop hole the new copied device would appears as if its mounted immediately after it's been copied.
For example:
Initially.. /dev/mmcblk0p4 is mounted as /
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT mmcblk0 179:0 0 29.2G 0 disk |-mmcblk0p4 179:4 0 4G 0 part / |-mmcblk0p2 179:2 0 500M 0 part /boot |-mmcblk0p3 179:3 0 256M 0 part [SWAP] `-mmcblk0p1 179:1 0 256M 0 part /boot/efi
$ btrfs fi show
Label: none uuid: 07892354-ddaa-4443-90ea-f76a06accaba
Total devices 1 FS bytes used 1.40GiB
devid 1 size 4.00GiB used 3.00GiB path /dev/mmcblk0p4Copy mmcblk0 to sda
$ dd if=/dev/mmcblk0 of=/dev/sda
And immediately after the copy completes the change in the device superblock is notified which the automount scans using btrfs device scan and the new device sda becomes the mounted root device.
$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 1 14.9G 0 disk |-sda4 8:4 1 4G 0 part / |-sda2 8:2 1 500M 0 part |-sda3 8:3 1 256M 0 part `-sda1 8:1 1 256M 0 part mmcblk0 179:0 0 29.2G 0 disk |-mmcblk0p4 179:4 0 4G 0 part |-mmcblk0p2 179:2 0 500M 0 part /boot |-mmcblk0p3 179:3 0 256M 0 part [SWAP] `-mmcblk0p1 179:1 0 256M 0 part /boot/efi
$ btrfs fi show /
Label: none uuid: 07892354-ddaa-4443-90ea-f76a06accaba
Total devices 1 FS bytes used 1.40GiB
devid 1 size 4.00GiB used 3.00GiB path /dev/sda4The bug is quite nasty that you can't either unmount /dev/sda4 or /dev/mmcblk0p4. And the problem does not get solved until you take sda out of the system on to another system to change its fsid using the 'btrfstune -u' command.
--- fs/btrfs/volumes.c | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+)
fs/btrfs/volumes.c +29 -0
@@ -850,6 +850,35 @@ static noinline struct btrfs_device *device_list_add(const char *path,return ERR_PTR (-EEXIST ); } +/* +* We are going to replace the device path for a given devid, +* make sure it's the same device if the device is mounted +*/ +if (device->bdev) { +struct block_device *path_bdev; + + path_bdev =lookup_bdev (path); +if (IS_ERR (path_bdev)) { +mutex_unlock (&fs_devices->device_list_mutex); +return ERR_CAST (path_bdev); + } + +if (device->bdev != path_bdev) { +bdput (path_bdev); +mutex_unlock (&fs_devices->device_list_mutex); +btrfs_warn_in_rcu (device->fs_info, +"duplicate device fsid:devid for %pU:%llu old:%s new:%s" , + disk_super->fsid, devid, +rcu_str_deref (device->name), path); +return ERR_PTR (-EEXIST ); + } +bdput (path_bdev); +btrfs_info_in_rcu (device->fs_info, +"device fsid %pU devid %llu moved old:%s new:%s" , + disk_super->fsid, devid, +rcu_str_deref (device->name), path); + } + name =rcu_string_strdup (path,GFP_NOFS );if (!name) {mutex_unlock (&fs_devices->device_list_mutex);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 181/352 btrfs: reada: reorder dev-replace locks before radix tree preload
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ceb21a8db48559fd0809e03c4df9eb37743d9170 ]
The device-replace read lock is going to use rw semaphore in followup commits. The semaphore might sleep which is not possible in the radix tree preload section. The lock nesting is now:
* device replace
* radix tree preload
* readahead spinlock
--- fs/btrfs/reada.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-)
fs/btrfs/reada.c +7 -5
@@ -376,26 +376,28 @@ static struct reada_extent *reada_find_extent(struct btrfs_fs_info *fs_info, goto error; } +/* Insert extent in reada tree + all per-device trees, all or nothing */ +btrfs_dev_replace_read_lock (&fs_info->dev_replace); ret =radix_tree_preload (GFP_KERNEL ); -if (ret) +if (ret) { +btrfs_dev_replace_read_unlock (&fs_info->dev_replace); goto error; + } -/* insert extent in reada_tree + all per-device trees, all or nothing */ -btrfs_dev_replace_read_lock (&fs_info->dev_replace);spin_lock (&fs_info->reada_lock); ret =radix_tree_insert (&fs_info->reada_tree, index, re);if (ret == -EEXIST ) { re_exist =radix_tree_lookup (&fs_info->reada_tree, index); re_exist->refcnt++;spin_unlock (&fs_info->reada_lock); -btrfs_dev_replace_read_unlock (&fs_info->dev_replace);radix_tree_preload_end (); +btrfs_dev_replace_read_unlock (&fs_info->dev_replace); goto error; }if (ret) {spin_unlock (&fs_info->reada_lock); -btrfs_dev_replace_read_unlock (&fs_info->dev_replace);radix_tree_preload_end (); +btrfs_dev_replace_read_unlock (&fs_info->dev_replace); goto error; }radix_tree_preload_end ();
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 182/352 serial: sh-sci: Fix locking in sci_submit_rx()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit dd1f2250da95e87cb3e612858f94b14f99445a7c ]
Some callers of sci_submit_rx() hold the port spinlock, others don't. During fallback to PIO, the driver needs to obtain the port spinlock. If the lock was already held, spinlock recursion is detected, causing a
deadlock: BUG: spinlock recursion on CPU#0.
Fix this by adding a flag parameter to sci_submit_rx() for the caller to indicate the port spinlock is already held, so spinlock recursion can be avoided.
Move the spin_lock_irqsave() up, so all DMA disable steps are protected, which is safe as the recently introduced dmaengine_terminate_async() can be called in atomic context.
--- drivers/tty/serial/sh-sci.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-)
drivers/tty/serial/sh-sci.c +9 -7
@@ -1331,7 +1331,7 @@ static void sci_tx_dma_release(struct sci_port *s)dma_release_channel (chan); } -static void sci_submit_rx (struct sci_port *s) +static void sci_submit_rx (struct sci_port *s,bool port_lock_held) {struct dma_chan *chan = s->chan_rx;struct uart_port *port = &s->port;
@@ -1362,16 +1362,18 @@ static void sci_submit_rx(struct sci_port *s)return ; fail: +/* Switch to PIO */ +if (!port_lock_held) +spin_lock_irqsave (&port->lock, flags);if (i)dmaengine_terminate_async (chan);for (i =0 ; i <2 ; i++) s->cookie_rx[i] = -EINVAL ; s->active_rx = -EINVAL ; -/* Switch to PIO */ -spin_lock_irqsave (&port->lock, flags); s->chan_rx =NULL ;sci_start_rx (port); -spin_unlock_irqrestore (&port->lock, flags); +if (!port_lock_held) +spin_unlock_irqrestore (&port->lock, flags); }static void work_fn_tx (struct work_struct *work)
@@ -1491,7 +1493,7 @@ static enum hrtimer_restart rx_timer_fn(struct hrtimer *t) }if (port->type ==PORT_SCIFA || port->type ==PORT_SCIFB ) -sci_submit_rx (s); +sci_submit_rx (s, true);/* Direct new serial port interrupts back to CPU */ scr =serial_port_in (port,SCSCR );
@@ -1617,7 +1619,7 @@ static void sci_request_dma(struct uart_port *port) s->chan_rx_saved = s->chan_rx = chan;if (port->type ==PORT_SCIFA || port->type ==PORT_SCIFB ) -sci_submit_rx (s); +sci_submit_rx (s, false); } }
@@ -1667,7 +1669,7 @@ static irqreturn_t sci_rx_interrupt(int irq, void *ptr) scr |=SCSCR_RDRQE ; }else { scr &= ~SCSCR_RIE ; -sci_submit_rx (s); +sci_submit_rx (s, false); }serial_port_out (port,SCSCR , scr);/* Clear current interrupt */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 183/352 serial: sh-sci: Resume PIO in sci_rx_interrupt() on DMA failure
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 71ab1c0336c71ace5725740f200beca9667a339f ]
On (H)SCIF, sci_submit_rx() is called in the receive interrupt handler. Hence if DMA submission fails, the interrupt handler should resume handling reception using PIO, else no more data is received.
Make sci_submit_rx() return an error indicator, so the receive interrupt handler can act appropriately.
--- drivers/tty/serial/sh-sci.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
drivers/tty/serial/sh-sci.c +8 -3
@@ -1331,7 +1331,7 @@ static void sci_tx_dma_release(struct sci_port *s)dma_release_channel (chan); } -static void sci_submit_rx (struct sci_port *s,bool port_lock_held) +static int sci_submit_rx (struct sci_port *s,bool port_lock_held) {struct dma_chan *chan = s->chan_rx;struct uart_port *port = &s->port;
@@ -1359,7 +1359,7 @@ static void sci_submit_rx(struct sci_port *s, bool port_lock_held) s->active_rx = s->cookie_rx[0 ];dma_async_issue_pending (chan); -return ; +return 0 ; fail:/* Switch to PIO */
@@ -1374,6 +1374,7 @@ fail:sci_start_rx (port);if (!port_lock_held)spin_unlock_irqrestore (&port->lock, flags); +return -EAGAIN ; }static void work_fn_tx (struct work_struct *work)
@@ -1668,8 +1669,10 @@ static irqreturn_t sci_rx_interrupt(int irq, void *ptr)disable_irq_nosync (irq); scr |=SCSCR_RDRQE ; }else { +if (sci_submit_rx (s, false) <0 ) + goto handle_pio; + scr &= ~SCSCR_RIE ; -sci_submit_rx (s, false); }serial_port_out (port,SCSCR , scr);/* Clear current interrupt */
@@ -1681,6 +1684,8 @@ static irqreturn_t sci_rx_interrupt(int irq, void *ptr)return IRQ_HANDLED ; } + +handle_pio:#endif if (s->rx_trigger >1 && s->rx_fifo_timeout >0 ) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 184/352 tty: serial: samsung: Properly set flags in autoCTS mode
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 31e933645742ee6719d37573a27cce0761dcf92b ]
Commit 391f93f2ec9f ("serial: core: Rework hw-assited flow control support") has changed the way the autoCTS mode is handled.
According to that change, serial drivers which enable H/W autoCTS mode must set UPSTAT_AUTOCTS to prevent the serial core from inadvertently disabling TX. This patch adds proper handling of UPSTAT_AUTOCTS flag.
--- drivers/tty/serial/samsung.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/tty/serial/samsung.c +3 -0
@@ -1365,11 +1365,14 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,wr_regl (port,S3C2410_ULCON , ulcon);wr_regl (port,S3C2410_UBRDIV , quot); + port->status &= ~UPSTAT_AUTOCTS ; + umcon =rd_regl (port,S3C2410_UMCON );if (termios->c_cflag &CRTSCTS ) { umcon |=S3C2410_UMCOM_AFC ;/* Disable RTS when RX FIFO contains 63 bytes */ umcon &= ~S3C2412_UMCON_AFC_8 ; + port->status =UPSTAT_AUTOCTS ; }else { umcon &= ~S3C2410_UMCOM_AFC ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 185/352 perf stat: Fix CSV mode column output for non-cgroup events
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit bc4da38a4789e7819fca4c7723ded0b86aea27c0 ]
When using the -x option, perf stat prints CSV-style output with one event per line. For each event, it prints the count, the unit, the event name, the cgroup, and a bunch of other event specific fields (such as insn per cycles).
When you use CSV-style mode, you expect a normalized output where each event is printed with the same number of fields regardless of what it is so it can easily be imported into a spreadsheet or parsed.
For instance, if an event does not have a unit, then print an empty field for it.
Although this approach was implemented for the unit, it was not for the cgroup.
When mixing cgroup and non-cgroup events, then non-cgroup events would not show an empty field, instead the next field was printed, make columns not line up correctly.
This patch fixes the cgroup output issues by forcing an empty field for non-cgroup events as soon as one event has cgroup.
Before:
<not counted> @ @cycles @foo @ 0 @100.00@@
2531614 @ @cycles @[email protected]@ @
foo cgroup lines up with time_running!
After:
<not counted> @ @cycles @foo @0 @100.00@@
2594834 @ @cycles @ @5287372 @100.00@@
Fields line up.
--- tools/perf/util/stat-display.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
tools/perf/util/stat-display.c +11 -5
@@ -59,6 +59,15 @@ static void print_noise(struct perf_stat_config *config,print_noise_pct (config,stddev_stats (&ps->res_stats[0 ]), avg); } +static void print_cgroup (struct perf_stat_config *config,struct perf_evsel *evsel) +{ +if (nr_cgroups) { +const char *cgrp_name = evsel->cgrp ? evsel->cgrp->name :"" ; +fprintf (config->output,"%s%s" , config->csv_sep, cgrp_name); + } +} + +static void aggr_printout (struct perf_stat_config *config,struct perf_evsel *evsel,int id,int nr) {
@@ -336,8 +345,7 @@ static void abs_printout(struct perf_stat_config *config,fprintf (output,"%-*s" , config->csv_output ?0 :25 ,perf_evsel__name (evsel)); -if (evsel->cgrp) -fprintf (output,"%s%s" , config->csv_sep, evsel->cgrp->name); +print_cgroup (config, evsel); }static bool is_mixed_hw_group (struct perf_evsel *counter)
@@ -431,9 +439,7 @@ static void printout(struct perf_stat_config *config, int id, int nr, config->csv_output ?0 :-25 , perf_evsel__name(counter)); -if (counter->cgrp) -fprintf (config->output,"%s%s" , - config->csv_sep, counter->cgrp->name); +print_cgroup (config, counter);if (!config->csv_output)pm (config, &os,NULL ,NULL ,"" ,0 );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 186/352 perf test: Fix perf_event_attr test failure
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 741dad88dde296999da30332157ca47f0543747d ]
Fix inconsistent use of tabs and spaces error:
# perf test 16 -v
16: Setup struct perf_event_attr :
--- start ---
test child forked, pid 20224
File "/usr/libexec/perf-core/tests/attr.py", line 119
log.warning("expected %s=%s, got %s" % (t, self[t], other[t]))
^
TabError: inconsistent use of tabs and spaces in indentation
test child finished with -1
---- end ----
Setup struct perf_event_attr: FAILED!--- tools/perf/tests/attr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/tests/attr.py +1 -1
@@ -116,7 +116,7 @@ class Event(dict): if not self.has_key(t) or not other.has_key(t): continue if not data_equal(self[t], other[t]): - log.warning("expected %s=%s, got %s" % (t, self[t], other[t])) + log.warning("expected %s=%s, got %s" % (t, self[t], other[t])) # Test file description needs to have following sections: # [config]
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 187/352 perf dso: Fix unchecked usage of strncpy()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fca5085c15255bbde203b7322c15f07ebb12f63e ]
The strncpy() function may leave the destination string buffer unterminated, better use strlcpy() that we have a __weak fallback implementation for systems without it.
This fixes this warning on an Alpine Linux Edge system with gcc 8.2:
In function 'decompress_kmodule',
inlined from 'dso__decompress_kmodule_fd' at util/dso.c:305:9:
util/dso.c:298:3: error: 'strncpy' destination unchanged after copying no bytes [-Werror=stringop-truncation]
strncpy(pathname, tmpbuf, len);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
CC /tmp/build/perf/util/values.o
CC /tmp/build/perf/util/debug.occ1: all warnings being treated as errors
--- tools/perf/util/dso.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/dso.c +1 -1
@@ -295,7 +295,7 @@ static int decompress_kmodule(struct dso *dso, const char *name,unlink (tmpbuf);if (pathname && (fd >=0 )) -strncpy (pathname, tmpbuf, len); +strlcpy (pathname, tmpbuf, len);return fd; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 188/352 perf header: Fix unchecked usage of strncpy()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 7572588085a13d5db02bf159542189f52fdb507e ]
The strncpy() function may leave the destination string buffer unterminated, better use strlcpy() that we have a __weak fallback implementation for systems without it.
This fixes this warning on an Alpine Linux Edge system with gcc 8.2:
util/header.c: In function 'perf_event__synthesize_event_update_unit':
util/header.c:3586:2: error: 'strncpy' output truncated before terminating nul copying as many bytes from a string as its length [-Werror=stringop-truncation]
strncpy(ev->data, evsel->unit, size);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
util/header.c:3579:16: note: length computed here
size_t size = strlen(evsel->unit);
^~~~~~~~~~~~~~~~~~~--- tools/perf/util/header.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/header.c +1 -1
@@ -3544,7 +3544,7 @@ perf_event__synthesize_event_update_unit(struct perf_tool *tool,if (ev ==NULL )return -ENOMEM ; -strncpy (ev->data, evsel->unit, size); +strlcpy (ev->data, evsel->unit, size +1 ); err =process (tool, (union perf_event *)ev,NULL ,NULL );free (ev);return err;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 189/352 btrfs: use tagged writepage to mitigate livelock of snapshot
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3cd24c698004d2f7668e0eb9fc1f096f533c791b ]
Snapshot is expected to be fast. But if there are writers steadily creating dirty pages in our subvolume, the snapshot may take a very long time to complete. To fix the problem, we use tagged writepage for snapshot flusher as we do in the generic write_cache_pages(), so we can omit pages dirtied after the snapshot command.
This does not change the semantics regarding which data get to the snapshot, if there are pages being dirtied during the snapshotting operation. There's a sync called before snapshot is taken in old/new case, any IO in flight just after that may be in the snapshot but this depends on other system effects that might still sync the IO.
We do a simple snapshot speed test on a Intel D-1531 box:
fio --ioengine=libaio --iodepth=32 --bs=4k --rw=write --size=64G --direct=0 --thread=1 --numjobs=1 --time_based --runtime=120 --filename=/mnt/sub/testfile --name=job1 --group_reporting & sleep 5; time btrfs sub snap -r /mnt/sub /mnt/snap; killall fio
original: 1m58sec patched: 6.54sec
This is the best case for this patch since for a sequential write case, we omit nearly all pages dirtied after the snapshot command.
For a multi writers, random write test:
fio --ioengine=libaio --iodepth=32 --bs=4k --rw=randwrite --size=64G --direct=0 --thread=1 --numjobs=4 --time_based --runtime=120 --filename=/mnt/sub/testfile --name=job1 --group_reporting & sleep 5; time btrfs sub snap -r /mnt/sub /mnt/snap; killall fio
original: 15.83sec patched: 10.35sec
The improvement is smaller compared to the sequential write case, since we omit only half of the pages dirtied after snapshot command.
--- fs/btrfs/btrfs_inode.h | 1 + fs/btrfs/ctree.h | 2 +- fs/btrfs/extent_io.c | 17 +++++++++++++++-- fs/btrfs/inode.c | 11 +++++++---- fs/btrfs/ioctl.c | 2 +- 5 files changed, 25 insertions(+), 8 deletions(-)
fs/btrfs/btrfs_inode.h +1 -0
@@ -29,6 +29,7 @@ enum {BTRFS_INODE_IN_DELALLOC_LIST ,BTRFS_INODE_READDIO_NEED_LOCK ,BTRFS_INODE_HAS_PROPS , + BTRFS_INODE_SNAPSHOT_FLUSH, };/* in memory btrfs inode */
fs/btrfs/ctree.h +1 -1
@@ -3141,7 +3141,7 @@ int btrfs_truncate_inode_items(struct btrfs_trans_handle *trans, struct inode *inode, u64 new_size, u32 min_type); -int btrfs_start_delalloc_inodes (struct btrfs_root *root); +int btrfs_start_delalloc_snapshot (struct btrfs_root *root);int btrfs_start_delalloc_roots (struct btrfs_fs_info *fs_info,int nr); int btrfs_set_extent_delalloc(struct inode *inode, u64 start, u64 end, unsigned int extra_bits,
fs/btrfs/extent_io.c +15 -2
@@ -3934,12 +3934,25 @@ static int extent_write_cache_pages(struct address_space *mapping, range_whole =1 ; scanned =1 ; } -if (wbc->sync_mode ==WB_SYNC_ALL ) + +/* +* We do the tagged writepage as long as the snapshot flush bit is set +* and we are the first one who do the filemap_flush() on this inode. +* +* The nr_to_write == LONG_MAX is needed to make sure other flushers do +* not race in and drop the bit. +*/ +if (range_whole && wbc->nr_to_write ==LONG_MAX && +test_and_clear_bit (BTRFS_INODE_SNAPSHOT_FLUSH , + &BTRFS_I (inode)->runtime_flags)) + wbc->tagged_writepages =1 ; + +if (wbc->sync_mode ==WB_SYNC_ALL || wbc->tagged_writepages) tag =PAGECACHE_TAG_TOWRITE ;else tag =PAGECACHE_TAG_DIRTY ; retry: -if (wbc->sync_mode ==WB_SYNC_ALL ) +if (wbc->sync_mode ==WB_SYNC_ALL || wbc->tagged_writepages)tag_pages_for_writeback (mapping, index, end); done_index = index; while (!done && !nr_to_write_done && (index <= end) &&
fs/btrfs/inode.c +7 -4
@@ -9988,7 +9988,7 @@ static struct btrfs_delalloc_work *btrfs_alloc_delalloc_work(struct inode *inode* some fairly slow code that needs optimization. This walks the list * of all the inodes with pending delalloc and forces them to disk. */ -static int start_delalloc_inodes (struct btrfs_root *root,int nr) +static int start_delalloc_inodes (struct btrfs_root *root,int nr,bool snapshot) {struct btrfs_inode *binode;struct inode *inode;
@@ -10016,6 +10016,9 @@ static int start_delalloc_inodes(struct btrfs_root *root, int nr) }spin_unlock (&root->delalloc_lock); +if (snapshot) +set_bit (BTRFS_INODE_SNAPSHOT_FLUSH , + &binode->runtime_flags); work =btrfs_alloc_delalloc_work (inode);if (!work) {iput (inode);
@@ -10049,7 +10052,7 @@ out:return ret; } -int btrfs_start_delalloc_inodes (struct btrfs_root *root) +int btrfs_start_delalloc_snapshot (struct btrfs_root *root) {struct btrfs_fs_info *fs_info = root->fs_info;int ret;
@@ -10057,7 +10060,7 @@ int btrfs_start_delalloc_inodes(struct btrfs_root *root)if (test_bit (BTRFS_FS_STATE_ERROR , &fs_info->fs_state))return -EROFS ; - ret =start_delalloc_inodes (root,-1 ); + ret =start_delalloc_inodes (root,-1 , true);if (ret >0 ) ret =0 ;return ret;
@@ -10086,7 +10089,7 @@ int btrfs_start_delalloc_roots(struct btrfs_fs_info *fs_info, int nr) &fs_info->delalloc_roots);spin_unlock (&fs_info->delalloc_root_lock); - ret =start_delalloc_inodes (root, nr); + ret =start_delalloc_inodes (root, nr, false);btrfs_put_fs_root (root);if (ret <0 ) goto out;
fs/btrfs/ioctl.c +1 -1
@@ -777,7 +777,7 @@ static int create_snapshot(struct btrfs_root *root, struct inode *dir,wait_event (root->subv_writers->wait,percpu_counter_sum (&root->subv_writers->counter) ==0 ); - ret =btrfs_start_delalloc_inodes (root); + ret =btrfs_start_delalloc_snapshot (root);if (ret) goto dec_and_free;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 190/352 perf probe: Fix unchecked usage of strncpy()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit bef0b8970f27da5ca223e522a174d03e2587761d ]
The strncpy() function may leave the destination string buffer unterminated, better use strlcpy() that we have a __weak fallback implementation for systems without it.
In this case the 'target' buffer is coming from a list of build-ids that are expected to have a len of at most (SBUILD_ID_SIZE - 1) chars, so probably we're safe, but since we're using strncpy() here, use strlcpy() instead to provide the intended safety checking without the using the problematic strncpy() function.
This fixes this warning on an Alpine Linux Edge system with gcc 8.2:
util/probe-file.c: In function 'probe_cache__open.isra.5':
util/probe-file.c:427:3: error: 'strncpy' specified bound 41 equals destination size [-Werror=stringop-truncation]
strncpy(sbuildid, target, SBUILD_ID_SIZE);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~cc1: all warnings being treated as errors
--- tools/perf/util/probe-file.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/probe-file.c +1 -1
@@ -424,7 +424,7 @@ static int probe_cache__open(struct probe_cache *pcache, const char *target,if (target &&build_id_cache__cached (target)) {/* This is a cached buildid */ -strncpy (sbuildid, target,SBUILD_ID_SIZE ); +strlcpy (sbuildid, target,SBUILD_ID_SIZE ); dir_name =build_id_cache__linkname (sbuildid,NULL ,0 ); goto found; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 191/352 i2c: sh_mobile: Add support for r8a774c0 (RZ/G2E)
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 51243b73455f2d12cb82abffa7bc9028aec656e0 ]
Similarly to R-Car E3, RZ/G2E doesn't come with automatic transmission registers, as such it is not considered compatible with the existing fallback bindings.
Add SoC specific binding compatibility to allow for later support for automatic transmission.
--- drivers/i2c/busses/i2c-sh_mobile.c | 1 + 1 file changed, 1 insertion(+)
drivers/i2c/busses/i2c-sh_mobile.c +1 -0
@@ -800,6 +800,7 @@ static const struct sh_mobile_dt_config r8a7740_dt_config = {static const struct of_device_id sh_mobile_i2c_dt_ids[] = { { .compatible ="renesas,iic-r8a73a4" , .data = &fast_clock_dt_config }, { .compatible ="renesas,iic-r8a7740" , .data = &r8a7740_dt_config }, + { .compatible ="renesas,iic-r8a774c0" , .data = &fast_clock_dt_config }, { .compatible ="renesas,iic-r8a7790" , .data = &v2_freq_calc_dt_config }, { .compatible ="renesas,iic-r8a7791" , .data = &fast_clock_dt_config }, { .compatible ="renesas,iic-r8a7792" , .data = &fast_clock_dt_config },
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 192/352 bnxt_en: Disable MSIX before re-reserving NQs/CMPL rings.
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 36d65be9a88052cdfc8524eb591baf0e6c878408 ]
When bringing up a device, the code checks to see if the number of MSIX has changed. pci_disable_msix() should be called first before changing the number of reserved NQs/CMPL rings. This ensures that the MSIX vectors associated with the NQs/CMPL rings are still properly mapped when pci_disable_msix() masks the vectors.
This patch will prevent errors when RDMA support is added for the new 57500 chips. When the RDMA driver shuts down, the number of NQs is decreased and we must use the new sequence to prevent MSIX errors.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +11 -8
@@ -7203,23 +7203,26 @@ static void bnxt_clear_int_mode(struct bnxt *bp)int bnxt_reserve_rings (struct bnxt *bp) {int tcs =netdev_get_num_tc (bp->dev); +bool reinit_irq = false;int rc;if (!bnxt_need_reserve_rings (bp))return 0 ; - rc =__bnxt_reserve_rings (bp); -if (rc) { -netdev_err (bp->dev,"ring reservation failure rc: %d\n" , rc); -return rc; - }if (BNXT_NEW_RM (bp) && (bnxt_get_num_msix (bp) != bp->total_irqs)) {bnxt_ulp_irq_stop (bp);bnxt_clear_int_mode (bp); - rc =bnxt_init_int_mode (bp); + reinit_irq = true; + } + rc =__bnxt_reserve_rings (bp); +if (reinit_irq) { +if (!rc) + rc =bnxt_init_int_mode (bp);bnxt_ulp_irq_restart (bp, rc); -if (rc) -return rc; + } +if (rc) { +netdev_err (bp->dev,"ring reservation/IRQ init failure rc: %d\n" , rc); +return rc; }if (tcs && (bp->tx_nr_rings_per_tc * tcs != bp->tx_nr_rings)) {netdev_err (bp->dev,"tx ring reservation failure\n" );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 193/352 KVM: s390: unregister debug feature on failing arch init
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 308c3e6673b012beecb96ef04cc65f4a0e7cdd99 ]
Make sure the debug feature and its allocated resources get released upon unsuccessful architecture initialization.
A related indication of the issue will be reported as kernel message.
Message-Id: <[email protected]>
--- arch/s390/kvm/kvm-s390.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)
arch/s390/kvm/kvm-s390.c +14 -3
@@ -417,19 +417,30 @@ static void kvm_s390_cpu_feat_init(void)int kvm_arch_init (void *opaque) { +int rc; + kvm_s390_dbf =debug_register ("kvm-trace" ,32 ,1 ,7 *sizeof (long ));if (!kvm_s390_dbf)return -ENOMEM ;if (debug_register_view (kvm_s390_dbf, &debug_sprintf_view)) { -debug_unregister (kvm_s390_dbf); -return -ENOMEM ; + rc = -ENOMEM ; + goto out_debug_unreg; }kvm_s390_cpu_feat_init ();/* Register floating interrupt controller interface. */ -return kvm_register_device_ops (&kvm_flic_ops,KVM_DEV_TYPE_FLIC ); + rc =kvm_register_device_ops (&kvm_flic_ops,KVM_DEV_TYPE_FLIC ); +if (rc) { +pr_err ("Failed to register FLIC rc=%d\n" , rc); + goto out_debug_unreg; + } +return 0 ; + +out_debug_unreg: +debug_unregister (kvm_s390_dbf); +return rc; }void kvm_arch_exit (void )
Signature · 1 line
2.19.1
Re: [PATCH 4.20 193/352] KVM: s390: unregister debug feature on failing arch init
Quoted 12 lines · Greg Kroah-Hartman
4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit
308c3e6673b012beecb96ef04cc65f4a0e7cdd99]Make sure the debug feature and its allocated resources get released upon unsuccessful architecture initialization.
A related indication of the issue will be reported as kernel message.
Quoted 7 lines
Signed-off-by Michael Mueller <[email protected]>Reviewed-by Cornelia Huck <[email protected]>Reviewed-by Pierre Morel <[email protected]>Reviewed-by David Hildenbrand <[email protected]>Message-Id: <[email protected]>
Signed-off-by Christian Borntraeger <[email protected]>Signed-off-by Sasha Levin <[email protected]>
It does not hurt, but I explicitly did not cc stable for this patch as kvm_register_device_ops only fails in case of a code error.
Quoted 43 lines
--- arch/s390/kvm/kvm-s390.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-)arch/s390/kvm/kvm-s390.c +14
-3@@ -417,19 +417,30 @@ static void kvm_s390_cpu_feat_init(void)int kvm_arch_init (void *opaque) { +int rc; + kvm_s390_dbf =debug_register ("kvm-trace" ,32 ,1 ,7 *sizeof (long ));if (!kvm_s390_dbf)return -ENOMEM ;if (debug_register_view (kvm_s390_dbf, &debug_sprintf_view)) { -debug_unregister (kvm_s390_dbf); -return -ENOMEM ; + rc = -ENOMEM ; + goto out_debug_unreg; }kvm_s390_cpu_feat_init ();/* Register floating interrupt controller interface. */ -return kvm_register_device_ops (&kvm_flic_ops,KVM_DEV_TYPE_FLIC ); + rc =kvm_register_device_ops (&kvm_flic_ops,KVM_DEV_TYPE_FLIC ); +if (rc) { +pr_err ("Failed to register FLIC rc=%d\n" , rc); + goto out_debug_unreg; + } +return 0 ; + +out_debug_unreg: +debug_unregister (kvm_s390_dbf); +return rc; }void kvm_arch_exit (void )
Greg Kroah-Hartman
maintainerRe: [PATCH 4.20 193/352] KVM: s390: unregister debug feature on failing arch init
Quoted 22 lines · Christian Borntraeger
Quoted 12 lines · Greg Kroah-Hartman
4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit
308c3e6673b012beecb96ef04cc65f4a0e7cdd99]Make sure the debug feature and its allocated resources get released upon unsuccessful architecture initialization.
A related indication of the issue will be reported as kernel message.
Quoted 7 lines
Signed-off-by Michael Mueller <[email protected]>Reviewed-by Cornelia Huck <[email protected]>Reviewed-by Pierre Morel <[email protected]>Reviewed-by David Hildenbrand <[email protected]>Message-Id: <[email protected]>
Signed-off-by Christian Borntraeger <[email protected]>Signed-off-by Sasha Levin <[email protected]>
Quoted 2 lines
It does not hurt, but I explicitly did not cc stable for this patch as
kvm_register_device_opsonly fails in case of a code error.
Fair enough, I've dropped it from all trees now, thanks.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 194/352 tools/power/x86/intel_pstate_tracer: Fix non root execution for post processing a trace file
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 663546903c835fe46308b1b1e53d32d1f2b33da9 ]
This script is supposed to be allowed to run with regular user privileges if a previously captured trace is being post processed.
Commit fbe313884d7d (tools/power/x86/intel_pstate_tracer: Free the trace buffer memory) introduced a bug that breaks that option.
Commit 35459105deb2 (tools/power/x86/intel_pstate_tracer: Add optional setting of trace buffer memory allocation) moved the code but kept the bug.
This patch fixes the issue.
--- tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
tools/power/x86/intel_pstate_tracer/intel_pstate_tracer.py +2 -2
@@ -585,9 +585,9 @@ current_max_cpu = 0 read_trace_data(filename) -clear_trace_file() -# Free the memory if interval: + clear_trace_file() + # Free the memory free_trace_buffer() if graph_data_present == False:
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 195/352 pinctrl: rza1: Handle devm_kasprintf() failure cases
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit db221412cd2014506642967155698825ad80f6b6 ]
devm_kasprintf() may return NULL on failure of internal allocation thus the assignments are not safe if not checked. On error rza1_pinctrl_register() respectively rza1_parse_gpiochip() return negative values so -ENOMEM in the (unlikely) failure case of devm_kasprintf() should be fine here.
--- drivers/pinctrl/pinctrl-rza1.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/pinctrl/pinctrl-rza1.c +5 -0
@@ -1225,6 +1225,9 @@ static int rza1_parse_gpiochip(struct rza1_pinctrl *rza1_pctl, chip->base =-1 ; chip->label =devm_kasprintf (rza1_pctl->dev,GFP_KERNEL ,"%pOFn" , np); +if (!chip->label) +return -ENOMEM ; + chip->ngpio = of_args.args[2 ]; chip->of_node = np; chip->parent = rza1_pctl->dev;
@@ -1326,6 +1329,8 @@ static int rza1_pinctrl_register(struct rza1_pinctrl *rza1_pctl) pins[i].number = i; pins[i].name =devm_kasprintf (rza1_pctl->dev,GFP_KERNEL ,"P%u-%u" , port, pin); +if (!pins[i].name) +return -ENOMEM ;if (i %RZA1_PINS_PER_PORT ==0 ) {/*
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 196/352 mac80211: Properly handle SKB with radiotap only
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8020919a9b99d6c990dc6a50e8215e291fbbe5a6 ]
The monitor interface Rx handling of SKBs that contain only radiotap information was buggy as it tried to access the SKB assuming it contains a frame.
To fix this, check the RX_FLAG_NO_PSDU flag in the Rx status (indicting that the SKB contains only radiotap information), and do not perform data path specific processing when the flag is set.
--- net/mac80211/rx.c | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-)
net/mac80211/rx.c +17 -9
@@ -753,6 +753,7 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,struct ieee80211_sub_if_data *monitor_sdata =rcu_dereference (local->monitor_sdata);bool only_monitor = false; +unsigned int min_head_len;if (status->flag &RX_FLAG_RADIOTAP_HE ) rtap_space +=sizeof (struct ieee80211_radiotap_he );
@@ -766,6 +767,8 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb, rtap_space +=sizeof (*rtap) + rtap->len + rtap->pad; } + min_head_len = rtap_space; +/* * First, we may need to make a copy of the skb because * (1) we need to modify it for radiotap (if not present), and
@@ -775,18 +778,23 @@ ieee80211_rx_monitor(struct ieee80211_local *local, struct sk_buff *origskb,* the SKB because it has a bad FCS/PLCP checksum. */ -if (ieee80211_hw_check (&local->hw,RX_INCLUDES_FCS )) { -if (unlikely (origskb->len <=FCS_LEN )) { -/* driver bug */ -WARN_ON (1 ); -dev_kfree_skb (origskb); -return NULL ; +if (!(status->flag &RX_FLAG_NO_PSDU )) { +if (ieee80211_hw_check (&local->hw,RX_INCLUDES_FCS )) { +if (unlikely (origskb->len <=FCS_LEN + rtap_space)) { +/* driver bug */ +WARN_ON (1 ); +dev_kfree_skb (origskb); +return NULL ; + } + present_fcs_len =FCS_LEN ; } - present_fcs_len =FCS_LEN ; + +/* also consider the hdr->frame_control */ + min_head_len +=2 ; } -/* ensure hdr->frame_control and vendor radiotap data are in skb head */ -if (!pskb_may_pull (origskb,2 + rtap_space)) { +/* ensure that the expected data elements are in skb head */ +if (!pskb_may_pull (origskb, min_head_len)) {dev_kfree_skb (origskb);return NULL ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 197/352 livepatch: check kzalloc return values
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 5f30b2e823484ce6a79f2b59901b6351c15effa6 ]
kzalloc() return should always be checked - notably in example code where this may be seen as reference. On failure of allocation in livepatch_fix1_dummy_alloc() respectively dummy_alloc() previous allocation is freed (thanks to Petr Mladek <[email protected]> for catching this) and NULL returned.
--- samples/livepatch/livepatch-shadow-fix1.c | 5 +++++ samples/livepatch/livepatch-shadow-mod.c | 4 ++++ 2 files changed, 9 insertions(+)
samples/livepatch/livepatch-shadow-fix1.c +5 -0
@@ -89,6 +89,11 @@ struct dummy *livepatch_fix1_dummy_alloc(void)* pointer to handle resource release. */ leak =kzalloc (sizeof (int ),GFP_KERNEL ); +if (!leak) { +kfree (d); +return NULL ; + } +klp_shadow_alloc (d,SV_LEAK ,sizeof (leak),GFP_KERNEL , shadow_leak_ctor, leak);
samples/livepatch/livepatch-shadow-mod.c +4 -0
@@ -118,6 +118,10 @@ noinline struct dummy *dummy_alloc(void)/* Oops, forgot to save leak! */ leak =kzalloc (sizeof (int ),GFP_KERNEL ); +if (!leak) { +kfree (d); +return NULL ; + }pr_info ("%s: dummy @ %p, expires @ %lx\n" , __func__, d, d->jiffies_expire);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 198/352 arm64: KVM: Skip MMIO insn after emulation
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0d640732dbebed0f10f18526de21652931f0b2f2 ]
When we emulate an MMIO instruction, we advance the CPU state within decode_hsr(), before emulating the instruction effects.
Having this logic in decode_hsr() is opaque, and advancing the state before emulation is problematic. It gets in the way of applying consistent single-step logic, and it prevents us from being able to fail an MMIO instruction with a synchronous exception.
Clean this up by only advancing the CPU state *after* the effects of the instruction are emulated.
--- virt/kvm/arm/mmio.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
virt/kvm/arm/mmio.c +6 -5
@@ -117,6 +117,12 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run)vcpu_set_reg (vcpu, vcpu->arch.mmio_decode.rt, data); } +/* +* The MMIO instruction is emulated and should not be re-executed +* in the guest. +*/ +kvm_skip_instr (vcpu,kvm_vcpu_trap_il_is32bit (vcpu)); +return 0 ; }
@@ -144,11 +150,6 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len) vcpu->arch.mmio_decode.sign_extend = sign_extend; vcpu->arch.mmio_decode.rt = rt; -/* -* The MMIO instruction is emulated and should not be re-executed -* in the guest. -*/ -kvm_skip_instr (vcpu,kvm_vcpu_trap_il_is32bit (vcpu));return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 199/352 usb: musb: dsps: fix otg state machine
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6010abf2c2c0e382d7e8ee44bd11f343aae90cce ]
Due to lack of ID pin interrupt event on AM335x devices, the musb dsps driver uses polling to detect usb device attach for dual-role port.
But in the case if a micro-A cable adapter is attached without a USB device attached to the cable, the musb state machine gets stuck in a_wait_vrise state waiting for the MUSB_CONNECT interrupt which won't happen due to the usb device is not attached. The state is stuck in a_wait_vrise even after the micro-A cable is detached, which could cause VBUS retention if then the dual-role port is attached to a host port.
To fix the problem, make a_wait_vrise as a transient state, then move the state to either a_wait_bcon for host port or a_idle state for dual-role port, if no usb device is attached to the port.
--- drivers/usb/musb/musb_dsps.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/usb/musb/musb_dsps.c +7 -2
@@ -227,8 +227,13 @@ static int dsps_check_status(struct musb *musb, void *unused)switch (musb->xceiv->otg->state) {case OTG_STATE_A_WAIT_VRISE : -dsps_mod_timer_optional (glue); -break ; +if (musb->port_mode ==MUSB_HOST ) { + musb->xceiv->otg->state =OTG_STATE_A_WAIT_BCON ; +dsps_mod_timer_optional (glue); +break ; + } +/* fall through */ +case OTG_STATE_A_WAIT_BCON :/* keep VBUS on for host-only mode */ if (musb->port_mode ==MUSB_HOST ) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 200/352 usb: musb: dsps: fix runtime pm for peripheral mode
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 54578ee883e34d2d1c518d48f1c1e2dd3f387188 ]
Since the runtime PM support was added in musb, dsps relies on the timer calling otg_timer() to activate the usb subsystem. However the driver doesn't enable the timer for peripheral port, then the peripheral port is unable to be enumerated by a host if the other usb port is disabled or in peripheral mode too.
So let's start the timer for peripheral port too.
--- drivers/usb/musb/musb_dsps.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
drivers/usb/musb/musb_dsps.c +9 -3
@@ -181,9 +181,11 @@ static void dsps_musb_enable(struct musb *musb)musb_writel (reg_base, wrp->epintr_set, epmask);musb_writel (reg_base, wrp->coreintr_set, coremask); -/* start polling for ID change in dual-role idle mode */ -if (musb->xceiv->otg->state ==OTG_STATE_B_IDLE && - musb->port_mode ==MUSB_OTG ) +/* +* start polling for runtime PM active and idle, +* and for ID change in dual-role idle mode. +*/ +if (musb->xceiv->otg->state ==OTG_STATE_B_IDLE )dsps_mod_timer (glue,-1 ); }
@@ -254,6 +256,10 @@ static int dsps_check_status(struct musb *musb, void *unused) musb->xceiv->otg->state =OTG_STATE_A_IDLE ;MUSB_HST_MODE (musb); } + +if (musb->port_mode ==MUSB_PERIPHERAL ) + skip_session =1 ; +if (!(devctl &MUSB_DEVCTL_SESSION ) && !skip_session)musb_writeb (mregs,MUSB_DEVCTL ,MUSB_DEVCTL_SESSION );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 201/352 perf header: Fix up argument to ctime()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0afcf29bab35d3785204cd9bd51693b231ad7181 ]
Reducing this noise when cross building to the Android NDK:
util/header.c: In function 'perf_header__fprintf_info':
util/header.c:2710:45: warning: pointer targets in passing argument 1 of 'ctime' differ in signedness [-Wpointer-sign]
fprintf(fp, "# captured on : %s", ctime(&st.st_ctime));
^
In file included from util/../perf.h:5:0,
from util/evlist.h:11,
from util/header.c:22:
/opt/android-ndk-r15c/platforms/android-26/arch-arm/usr/include/time.h:81:14: note: expected 'const time_t *' but argument is of type 'long unsigned int *'
extern char* ctime(const time_t*) __LIBC_ABI_PUBLIC__;
^--- tools/perf/util/header.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
tools/perf/util/header.c +3 -1
@@ -2659,6 +2659,7 @@ int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)struct perf_header *header = &session->header;int fd =perf_data__fd (session->data);struct stat st; +time_t stctime;int ret, bit; hd.fp = fp;
@@ -2668,7 +2669,8 @@ int perf_header__fprintf_info(struct perf_session *session, FILE *fp, bool full)if (ret ==-1 )return -1 ; -fprintf (fp,"# captured on : %s" ,ctime (&st.st_ctime)); + stctime = st.st_ctime; +fprintf (fp,"# captured on : %s" ,ctime (&stctime));fprintf (fp,"# header version : %u\n" , header->version);fprintf (fp,"# data offset : %" PRIu64"\n" , header->data_offset);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 202/352 perf tools: Cast off_t to s64 to avoid warning on bionic libc
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 866053bb644f754d1a93aaa9db9998fecf7a8978 ]
To avoid this warning:
CC /tmp/build/perf/util/s390-cpumsf.o
util/s390-cpumsf.c: In function 's390_cpumsf_samples':
util/s390-cpumsf.c:508:3: warning: format '%llx' expects argument of type 'long long unsigned int', but argument 4 has type 'off_t' [-Wformat=]
pr_err("[%#08" PRIx64 "] Invalid AUX trailer entry TOD clock base\n",
^
Now the various Android cross toolchains used in the perf tools container test builds are all clean and we can remove this:
export EXTRA_MAKE_ARGS="WERROR=0"
--- tools/perf/util/s390-cpumsf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/util/s390-cpumsf.c +1 -1
@@ -506,7 +506,7 @@ static int s390_cpumsf_samples(struct s390_cpumsf_queue *sfq, u64 *ts) aux_ts =get_trailer_time (buf);if (!aux_ts) {pr_err ("[%#08" PRIx64"] Invalid AUX trailer entry TOD clock base\n" , - sfq->buffer->data_offset); + (s64 )sfq->buffer->data_offset); aux_ts = ~0ULL ; goto out; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 203/352 percpu: convert spin_lock_irq to spin_lock_irqsave.
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6ab7d47bcbf0144a8cb81536c2cead4cde18acfe ]
Quoted 1 line
From Michael Cree:
"Bisection lead to commit b38d08f3181c ("percpu: restructure
locking") as being the cause of lockups at initial boot on the kernel built for generic Alpha.
On a suggestion by Tejun Heo that:
So, the only thing I can think of is that it's calling spin_unlock_irq() while irq handling isn't set up yet. Can you please try the followings?
1. Convert all spin_[un]lock_irq() to spin_lock_irqsave/unlock_irqrestore()."
--- mm/percpu-km.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
mm/percpu-km.c +3 -2
@@ -50,6 +50,7 @@ static struct pcpu_chunk *pcpu_create_chunk(gfp_t gfp)const int nr_pages = pcpu_group_sizes[0 ] >>PAGE_SHIFT ;struct pcpu_chunk *chunk;struct page *pages; +unsigned long flags;int i; chunk =pcpu_alloc_chunk (gfp);
@@ -68,9 +69,9 @@ static struct pcpu_chunk *pcpu_create_chunk(gfp_t gfp) chunk->data = pages; chunk->base_addr =page_address (pages) - pcpu_group_offsets[0 ]; -spin_lock_irq (&pcpu_lock); +spin_lock_irqsave (&pcpu_lock, flags);pcpu_chunk_populated (chunk,0 , nr_pages, false); -spin_unlock_irq (&pcpu_lock); +spin_unlock_irqrestore (&pcpu_lock, flags);pcpu_stats_chunk_alloc ();trace_percpu_create_chunk (chunk->base_addr);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 204/352 net: hns3: fix error handling int the hns3_get_vector_ring_chain
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit cda69d244585bc4497d3bb878c22fe2b6ad647c1 ]
When hns3_get_vector_ring_chain() failed in the hns3_nic_init_vector_data(), it should do the error handling instead of return directly.
Also, cur_chain should be freed instead of chain and head->next should be set to NULL in error handling of hns3_get_vector_ring_chain.
This patch fixes them.
--- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +3 -2
@@ -2783,9 +2783,10 @@ err_free_chain: cur_chain = head->next;while (cur_chain) { chain = cur_chain->next; -devm_kfree (&pdev->dev, chain); +devm_kfree (&pdev->dev, cur_chain); cur_chain = chain; } + head->next =NULL ;return -ENOMEM ; }
@@ -2876,7 +2877,7 @@ static int hns3_nic_init_vector_data(struct hns3_nic_priv *priv) ret =hns3_get_vector_ring_chain (tqp_vector, &vector_ring_chain);if (ret) -return ret; + goto map_ring_fail; ret = h->ae_algo->ops->map_ring_to_vector (h, tqp_vector->vector_irq, &vector_ring_chain);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 205/352 net: hns3: fix incomplete uninitialization of IRQ in the hns3_nic_uninit_vector_data()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ae6017a71115ebc4e5c1a3f0f451319ab3f5c447 ]
In the hns3_nic_uninit_vector_data(), the procedure of uninitializing the tqp_vector's IRQ has not set affinity_notify to NULL and changes its init flag. This patch fixes it. And for simplificaton, local variable tqp_vector is used instead of priv->tqp_vector[i].
--- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +6 -6
@@ -2971,12 +2971,12 @@ static int hns3_nic_uninit_vector_data(struct hns3_nic_priv *priv)hns3_free_vector_ring_chain (tqp_vector, &vector_ring_chain); -if (priv->tqp_vector[i].irq_init_flag ==HNS3_VECTOR_INITED ) { - (void )irq_set_affinity_hint ( - priv->tqp_vector[i].vector_irq, -NULL ); -free_irq (priv->tqp_vector[i].vector_irq, - &priv->tqp_vector[i]); +if (tqp_vector->irq_init_flag ==HNS3_VECTOR_INITED ) { +irq_set_affinity_notifier (tqp_vector->vector_irq, +NULL ); +irq_set_affinity_hint (tqp_vector->vector_irq,NULL ); +free_irq (tqp_vector->vector_irq, tqp_vector); + tqp_vector->irq_init_flag =HNS3_VECTOR_NOT_INITED ; } priv->ring_data[i].ring->irq_init_flag =HNS3_VECTOR_NOT_INITED ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 206/352 drm/amd/display: Add retry to read ddc_clock pin
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit bd4905a9583c760da31ded7256dca6f71483c3dc ]
[WHY]
On customer board, there is one pluse (1v , < 1ms) on DDC_CLK pin when plug / unplug DP cable. Driver will read it and config DP to HDMI/DVI dongle.
[HOW]
If there is a real dongle, DDC_CLK should be always pull high. Try to read again to recovery this special case. Retry times = 3. Need additional 3ms to detect DP passive dongle(3 failures)
--- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-)
drivers/gpu/drm/amd/display/dc/core/dc_link.c +17 -6
@@ -332,7 +332,7 @@ bool dc_link_is_dp_sink_present(struct dc_link *link) {enum gpio_result gpio_result;uint32_t clock_pin =0 ; - +uint8_t retry =0 ;struct ddc *ddc; enum connector_id connector_id =
@@ -361,11 +361,22 @@ bool dc_link_is_dp_sink_present(struct dc_link *link)return present; } -/* Read GPIO: DP sink is present if both clock and data pins are zero */ -/* [anaumov] in DAL2, there was no check for GPIO failure */ - - gpio_result =dal_gpio_get_value (ddc->pin_clock, &clock_pin); -ASSERT (gpio_result ==GPIO_RESULT_OK ); +/* +* Read GPIO: DP sink is present if both clock and data pins are zero +* +* [W/A] plug-unplug DP cable, sometimes customer board has +* one short pulse on clk_pin(1V, < 1ms). DP will be config to HDMI/DVI +* then monitor can't br light up. Add retry 3 times +* But in real passive dongle, it need additional 3ms to detect +*/ +do { + gpio_result =dal_gpio_get_value (ddc->pin_clock, &clock_pin); +ASSERT (gpio_result ==GPIO_RESULT_OK ); +if (clock_pin) +udelay (1000 ); +else +break ; + }while (retry++ <3 ); present = (gpio_result ==GPIO_RESULT_OK ) && !clock_pin;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 207/352 drm/amd/display: Wait edp HPD to high in detect_sink
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0a6414e75d231ee1bb7ffb2f5eb246b682a884cd ]
[Why]
In 99% user case, edp will be post by vbios.
In 1% / current case: Lenovo don't light up edp panel in vbios post stage, vbios won't be lit up. Thus in dal when we init DCN 10 hw, we power up edp, then we start detect_sink, but internal time is too short, when we detect it, HPD is still low, so we don't detect the edp, and edp shows black.
[How]
When we init hw, we wait edp HPD to high after power up edp.
--- drivers/gpu/drm/amd/display/dc/core/dc_link.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/gpu/drm/amd/display/dc/core/dc_link.c +3 -0
@@ -208,6 +208,9 @@ bool dc_link_detect_sink(struct dc_link *link, enum dc_connection_type *type)return true; } +if (link->connector_signal ==SIGNAL_TYPE_EDP ) + link->dc->hwss.edp_wait_for_hpd_ready (link, true); +/* todo: may need to lock gpio access */ hpd_pin =get_hpd_gpio (link->ctx->dc_bios, link->link_id, link->ctx->gpio_service);if (hpd_pin ==NULL )
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 208/352 Bluetooth: hci_bcm: Handle deferred probing for the clock supply
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 28ac03b9ac3f784c2f048a910c8d0a7a87483b66 ]
On some systems that actually have the bluetooth controller wired up with an extra clock signal, it's possible the bluetooth controller probes before the clock provider. clk_get would return a defer probe error, which was not handled by this driver.
Handle this properly, so that these systems can work reliably.
--- drivers/bluetooth/hci_bcm.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/bluetooth/hci_bcm.c +4 -0
@@ -907,6 +907,10 @@ static int bcm_get_resources(struct bcm_device *dev) dev->clk =devm_clk_get (dev->dev,NULL ); +/* Handle deferred probing */ +if (dev->clk ==ERR_PTR (-EPROBE_DEFER )) +return PTR_ERR (dev->clk); + dev->device_wakeup =devm_gpiod_get_optional (dev->dev,"device-wakeup" ,GPIOD_OUT_LOW );if (IS_ERR (dev->device_wakeup))
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 209/352 drm/amd/display: fix YCbCr420 blank color
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 12750d1647f118496f1da727146f255f5e44d500 ]
[Why]
YCbCr420 packing format uses two chanels for luma, and 1 channel for both chroma component. Our previous implementation did not account for this and results in every other pixel having very high luma value, showing greyish color instead of black.
YCbCr444 = <Y1, Cb1, Cr1>; <Y2, Cb2, Cr2> .....
YCbCr420 = <Y1, Y2, Cb1>; <Y3, Y4, Cr1> .....
[How]
Program the second channel with the black color value for luma as well.
--- .../drm/amd/display/dc/dce110/dce110_hw_sequencer.c | 11 ++++++++++- .../gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c | 9 +++++++++ 2 files changed, 19 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c +10 -1
@@ -1268,10 +1268,19 @@ static void program_scaler(const struct dc *dc, pipe_ctx->plane_res.scl_data.lb_params.depth, &pipe_ctx->stream->bit_depth_params); -if (pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color) +if (pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color) { +/* +* The way 420 is packed, 2 channels carry Y component, 1 channel +* alternate between Cb and Cr, so both channels need the pixel +* value for Y +*/ +if (pipe_ctx->stream->timing.pixel_encoding ==PIXEL_ENCODING_YCBCR420 ) + color.color_r_cr = color.color_g_y; + pipe_ctx->stream_res.tg->funcs->set_overscan_blank_color ( pipe_ctx->stream_res.tg, &color); + } pipe_ctx->plane_res.xfm->funcs->transform_set_scaler (pipe_ctx->plane_res.xfm, &pipe_ctx->plane_res.scl_data);
drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c +9 -0
@@ -2165,6 +2165,15 @@ static void dcn10_blank_pixel_data( color_space = stream->output_color_space;color_space_to_black_color (dc, color_space, &black_color); +/* +* The way 420 is packed, 2 channels carry Y component, 1 channel +* alternate between Cb and Cr, so both channels need the pixel +* value for Y +*/ +if (stream->timing.pixel_encoding ==PIXEL_ENCODING_YCBCR420 ) + black_color.color_r_cr = black_color.color_g_y; + +if (stream_res->tg->funcs->set_blank_color) stream_res->tg->funcs->set_blank_color( stream_res->tg,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 210/352 powerpc/uaccess: fix warning/error with access_ok()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 05a4ab823983d9136a460b7b5e0d49ee709a6f86 ]
With the following piece of code, the following compilation warning is encountered:
if (_IOC_DIR(ioc) != _IOC_NONE) {
int verify = _IOC_DIR(ioc) & _IOC_READ ? VERIFY_WRITE : VERIFY_READ;
if (!access_ok(verify, ioarg, _IOC_SIZE(ioc))) {drivers/platform/test/dev.c: In function 'my_ioctl':drivers/platform/test/dev.c:219:7: warning: unused variable 'verify' [-Wunused-variable]
int verify = _IOC_DIR(ioc) & _IOC_READ ? VERIFY_WRITE : VERIFY_READ;
This patch fixes it by referencing 'type' in the macro allthough doing nothing with it.
--- arch/powerpc/include/asm/uaccess.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/include/asm/uaccess.h +1 -1
@@ -63,7 +63,7 @@ static inline int __access_ok(unsigned long addr, unsigned long size,#endif #define access_ok (type, addr, size) \ - (__chk_user_ptr(addr), \ + (__chk_user_ptr(addr), (void)(type), \ __access_ok((__force unsigned long)(addr), (size), get_fs()))/*
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 211/352 mac80211: fix radiotap vendor presence bitmap handling
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit efc38dd7d5fa5c8cdd0c917c5d00947aa0539443 ]
Due to the alignment handling, it actually matters where in the code we add the 4 bytes for the presence bitmap to the length; the first field is the timestamp with 8 byte alignment so we need to add the space for the extra vendor namespace presence bitmap *before* we do any alignment for the fields.
Move the presence bitmap length accounting to the right place to fix the alignment for the data properly.
--- net/mac80211/rx.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
net/mac80211/rx.c +3 -2
@@ -143,6 +143,9 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,/* allocate extra bitmaps */ if (status->chains) len +=4 *hweight8 (status->chains); +/* vendor presence bitmap */ +if (status->flag &RX_FLAG_RADIOTAP_VENDOR_DATA ) + len +=4 ;if (ieee80211_have_rx_timestamp (status)) { len =ALIGN (len,8 );
@@ -207,8 +210,6 @@ ieee80211_rx_radiotap_hdrlen(struct ieee80211_local *local,if (status->flag &RX_FLAG_RADIOTAP_VENDOR_DATA ) {struct ieee80211_vendor_radiotap *rtap = (void *)skb->data; -/* vendor presence bitmap */ - len +=4 ;/* alignment for fixed 6-byte vendor data header */ len =ALIGN (len,2 );/* vendor data header */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 212/352 xfrm6_tunnel: Fix spi check in __xfrm6_tunnel_alloc_spi
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fa89a4593b927b3f59c3b69379f31d3b22272e4e ]
gcc warn this:
net/ipv6/xfrm6_tunnel.c:143 __xfrm6_tunnel_alloc_spi() warn:
always true condition '(spi <= 4294967295) => (0-u32max <= u32max)'
'spi' is u32, which always not greater than XFRM6_TUNNEL_SPI_MAX because of wrap around. So the second forloop will never reach.
--- net/ipv6/xfrm6_tunnel.c | 3 +++ 1 file changed, 3 insertions(+)
net/ipv6/xfrm6_tunnel.c +3 -0
@@ -144,6 +144,9 @@ static u32 __xfrm6_tunnel_alloc_spi(struct net *net, xfrm_address_t *saddr) index =__xfrm6_tunnel_spi_check (net, spi);if (index >=0 ) goto alloc_spi; + +if (spi ==XFRM6_TUNNEL_SPI_MAX ) +break ; }for (spi =XFRM6_TUNNEL_SPI_MIN ; spi < xfrm6_tn->spi; spi++) { index =__xfrm6_tunnel_spi_check (net, spi);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 213/352 mlxsw: spectrum: Properly cleanup LAG uppers when removing port from LAG
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit be2d6f421f680e01d58f7cd452646e0d8586d49b ]
When a LAG device or a VLAN device on top of it is enslaved to a bridge, the driver propagates the CHANGEUPPER event to the LAG's slaves.
This causes each physical port to increase the reference count of the internal representation of the bridge port by calling mlxsw_sp_port_bridge_join().
However, when a port is removed from a LAG, the corresponding leave() function is not called and the reference count is not decremented. This leads to ugly hacks such as mlxsw_sp_bridge_port_should_destroy() that try to understand if the bridge port should be destroyed even when its reference count is not 0.
Instead, make sure that when a port is unlinked from a LAG it would see the same events as if the LAG (or its uppers) were unlinked from a bridge.
The above is achieved by walking the LAG's uppers when a port is unlinked and calling mlxsw_sp_port_bridge_leave() for each upper that is enslaved to a bridge.
--- .../net/ethernet/mellanox/mlxsw/spectrum.c | 23 ++++++++++++++++ .../mellanox/mlxsw/spectrum_switchdev.c | 27 +------------------ 2 files changed, 24 insertions(+), 26 deletions(-)
drivers/net/ethernet/mellanox/mlxsw/spectrum.c +23 -0
@@ -4298,6 +4298,25 @@ void mlxsw_sp_port_dev_put(struct mlxsw_sp_port *mlxsw_sp_port)dev_put (mlxsw_sp_port->dev); } +static void +mlxsw_sp_port_lag_uppers_cleanup (struct mlxsw_sp_port *mlxsw_sp_port, +struct net_device *lag_dev) +{ +struct net_device *br_dev =netdev_master_upper_dev_get (lag_dev); +struct net_device *upper_dev; +struct list_head *iter; + +if (netif_is_bridge_port (lag_dev)) +mlxsw_sp_port_bridge_leave (mlxsw_sp_port, lag_dev, br_dev); + +netdev_for_each_upper_dev_rcu (lag_dev, upper_dev, iter) { +if (!netif_is_bridge_port (upper_dev)) +continue ; + br_dev =netdev_master_upper_dev_get (upper_dev); +mlxsw_sp_port_bridge_leave (mlxsw_sp_port, upper_dev, br_dev); + } +} +static int mlxsw_sp_lag_create (struct mlxsw_sp *mlxsw_sp,u16 lag_id) {char sldr_pl[MLXSW_REG_SLDR_LEN ];
@@ -4490,6 +4509,10 @@ static void mlxsw_sp_port_lag_leave(struct mlxsw_sp_port *mlxsw_sp_port,/* Any VLANs configured on the port are no longer valid */ mlxsw_sp_port_vlan_flush (mlxsw_sp_port); +/* Make the LAG and its directly linked uppers leave bridges they +* are memeber in +*/ +mlxsw_sp_port_lag_uppers_cleanup (mlxsw_sp_port, lag_dev);if (lag->ref_count ==1 )mlxsw_sp_lag_destroy (mlxsw_sp, lag_id);
drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +1 -26
@@ -292,30 +292,6 @@ mlxsw_sp_bridge_port_destroy(struct mlxsw_sp_bridge_port *bridge_port)kfree (bridge_port); } -static bool -mlxsw_sp_bridge_port_should_destroy (const struct mlxsw_sp_bridge_port * - bridge_port) -{ -struct net_device *dev = bridge_port->dev; -struct mlxsw_sp *mlxsw_sp; - -if (is_vlan_dev (dev)) - mlxsw_sp =mlxsw_sp_lower_get (vlan_dev_real_dev (dev)); -else - mlxsw_sp =mlxsw_sp_lower_get (dev); - -/* In case ports were pulled from out of a bridged LAG, then -* it's possible the reference count isn't zero, yet the bridge -* port should be destroyed, as it's no longer an upper of ours. -*/ -if (!mlxsw_sp &&list_empty (&bridge_port->vlans_list)) -return true; -else if (bridge_port->ref_count ==0 ) -return true; -else -return false; -} -static struct mlxsw_sp_bridge_port *mlxsw_sp_bridge_port_get (struct mlxsw_sp_bridge *bridge,struct net_device *brport_dev)
@@ -353,8 +329,7 @@ static void mlxsw_sp_bridge_port_put(struct mlxsw_sp_bridge *bridge, {struct mlxsw_sp_bridge_device *bridge_device; - bridge_port->ref_count--; -if (!mlxsw_sp_bridge_port_should_destroy (bridge_port)) +if (--bridge_port->ref_count !=0 )return ; bridge_device = bridge_port->bridge_device;mlxsw_sp_bridge_port_destroy (bridge_port);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 214/352 scsi: smartpqi: correct host serial num for ssa
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b2346b5030cf9458f30a84028d9fe904b8c942a7 ]
--- drivers/scsi/smartpqi/smartpqi_init.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/smartpqi/smartpqi_init.c +3 -0
@@ -640,6 +640,7 @@ struct bmic_host_wellness_driver_version {u8 driver_version_tag[2 ];__le16 driver_version_length;char driver_version[32 ]; +u8 dont_write_tag[2 ];u8 end_tag[2 ]; };
@@ -669,6 +670,8 @@ static int pqi_write_driver_version_to_host_wellness(strncpy (buffer->driver_version,"Linux " DRIVER_VERSION ,sizeof (buffer->driver_version) -1 ); buffer->driver_version[sizeof (buffer->driver_version) -1 ] ='\0' ; + buffer->dont_write_tag[0 ] ='D' ; + buffer->dont_write_tag[1 ] ='W' ; buffer->end_tag[0 ] ='Z' ; buffer->end_tag[1 ] ='Z' ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 215/352 scsi: smartpqi: correct volume status
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 7ff44499bafbd376115f0bb6b578d980f56ee13b ]
- fix race condition when a unit is deleted after an RLL, and before we have gotten the LV_STATUS page of the unit.
- In this case we will get a standard inquiry, rather than the desired page. This will result in a unit presented which no longer exists.
- If we ask for LV_STATUS, insure we get LV_STATUS
--- drivers/scsi/smartpqi/smartpqi_init.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/scsi/smartpqi/smartpqi_init.c +3 -0
@@ -1168,6 +1168,9 @@ static void pqi_get_volume_status(struct pqi_ctrl_info *ctrl_info,if (rc) goto out; +if (vpd->page_code !=CISS_VPD_LV_STATUS ) + goto out; + page_length = offsetof(struct ciss_vpd_logical_volume_status , volume_status) + vpd->page_length;if (page_length <sizeof (*vpd))
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 216/352 scsi: smartpqi: increase fw status register read timeout
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 65111785acccb836ec75263b03b0e33f21e74f47 ]
Problem:
- during the driver initialization, driver will poll fw for KERNEL_UP in a 30 seconds timeout.
- if the firmware is not ready after 30 seconds,
driver will not be loaded.
Fix:
- change timeout from 30 seconds to 3 minutes.
--- drivers/scsi/smartpqi/smartpqi_sis.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/scsi/smartpqi/smartpqi_sis.c +1 -1
@@ -59,7 +59,7 @@#define SIS_CTRL_KERNEL_UP 0x80#define SIS_CTRL_KERNEL_PANIC 0x100 -#define SIS_CTRL_READY_TIMEOUT_SECS 30 +#define SIS_CTRL_READY_TIMEOUT_SECS 180#define SIS_CTRL_READY_RESUME_TIMEOUT_SECS 90#define SIS_CTRL_READY_POLL_INTERVAL_MSECS 10
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 217/352 cw1200: Fix concurrency use-after-free bugs in cw1200_hw_scan()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4f68ef64cd7feb1220232bd8f501d8aad340a099 ]
The function cw1200_bss_info_changed() and cw1200_hw_scan() can be concurrently executed.
The two functions both access a possible shared variable "frame.skb".
This shared variable is freed by dev_kfree_skb() in cw1200_upload_beacon(), which is called by cw1200_bss_info_changed(). The free operation is protected by a mutex lock "priv->conf_mutex" in cw1200_bss_info_changed().
In cw1200_hw_scan(), this shared variable is accessed without the protection of the mutex lock "priv->conf_mutex".
Thus, concurrency use-after-free bugs may occur.
To fix these bugs, the original calls to mutex_lock(&priv->conf_mutex) and mutex_unlock(&priv->conf_mutex) are moved to the places, which can protect the accesses to the shared variable.
--- drivers/net/wireless/st/cw1200/scan.c | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-)
drivers/net/wireless/st/cw1200/scan.c +6 -7
@@ -78,6 +78,10 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,if (req->n_ssids >WSM_SCAN_MAX_NUM_OF_SSIDS )return -EINVAL ; +/* will be unlocked in cw1200_scan_work() */ +down (&priv->scan.lock); +mutex_lock (&priv->conf_mutex); + frame.skb =ieee80211_probereq_get (hw, priv->vif->addr,NULL ,0 , req->ie_len);if (!frame.skb)
@@ -86,19 +90,15 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,if (req->ie_len)skb_put_data (frame.skb, req->ie, req->ie_len); -/* will be unlocked in cw1200_scan_work() */ -down (&priv->scan.lock); -mutex_lock (&priv->conf_mutex); - ret =wsm_set_template_frame (priv, &frame);if (!ret) {/* Host want to be the probe responder. */ ret =wsm_set_probe_responder (priv, true); }if (ret) { +dev_kfree_skb (frame.skb);mutex_unlock (&priv->conf_mutex);up (&priv->scan.lock); -dev_kfree_skb (frame.skb);return ret; }
@@ -120,10 +120,9 @@ int cw1200_hw_scan(struct ieee80211_hw *hw, ++priv->scan.n_ssids; } -mutex_unlock (&priv->conf_mutex); -if (frame.skb)dev_kfree_skb (frame.skb); +mutex_unlock (&priv->conf_mutex);queue_work (priv->workqueue, &priv->scan.work);return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 218/352 net: hns3: add max vector number check for pf
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 75edb610860fda65ceedb017fc69afabd2806b8b ]
Each pf supports max 64 vectors and 128 tqps. For 2p/4p core scenario, there may be more than 64 cpus online. So the result of min_t(u16, num_Online_cpus(), tqp_num) may be more than 64. This patch adds check for the vector number.
--- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +4 -0
@@ -2902,6 +2902,8 @@ map_ring_fail:static int hns3_nic_alloc_vector_data (struct hns3_nic_priv *priv) { +#define HNS3_VECTOR_PF_MAX_NUM 64 +struct hnae3_handle *h = priv->ae_handle;struct hns3_enet_tqp_vector *tqp_vector;struct hnae3_vector_info *vector;
@@ -2914,6 +2916,8 @@ static int hns3_nic_alloc_vector_data(struct hns3_nic_priv *priv)/* RSS size, cpu online and vector_num should be the same */ /* Should consider 2p/4p later */ vector_num =min_t (u16,num_online_cpus (), tqp_num); + vector_num =min_t (u16, vector_num,HNS3_VECTOR_PF_MAX_NUM ); + vector =devm_kcalloc (&pdev->dev, vector_num,sizeof (*vector),GFP_KERNEL );if (!vector)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 219/352 net: hns3: fix the descriptor index when get rss type
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 31a16f99e02c2e0b40a5fb05d66f5e56721027e2 ]
Driver gets rss information from the last descriptor of the packet. When driver handle the rss type, ring->next_to_clean indicates the first descriptor of next packet.
This patch fix the descriptor index with "ring->next_to_clean - 1".
--- drivers/net/ethernet/hisilicon/hns3/hns3_enet.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/net/ethernet/hisilicon/hns3/hns3_enet.c +8 -1
@@ -2332,9 +2332,16 @@ static bool hns3_parse_vlan_tag(struct hns3_enet_ring *ring,static void hns3_set_rx_skb_rss_type (struct hns3_enet_ring *ring,struct sk_buff *skb) { -struct hns3_desc *desc = &ring->desc[ring->next_to_clean];struct hnae3_handle *handle = ring->tqp->handle;enum pkt_hash_types rss_type; +struct hns3_desc *desc; +int last_bd; + +/* When driver handle the rss type, ring->next_to_clean indicates the +* first descriptor of next packet, need -1 here. +*/ + last_bd = (ring->next_to_clean -1 + ring->desc_num) % ring->desc_num; + desc = &ring->desc[last_bd];if (le32_to_cpu (desc->rx.rss_hash)) rss_type = handle->kinfo.rss_type;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 220/352 net: hns3: dont restore rules when flow director is disabled
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8edc2285b7285c5fbffe438dc8113260d3e76656 ]
When user disables flow director, all the rules will be disabled. But when reset happens, it will restore all the rules again. It's not reasonable. This patch fixes it by add flow director status check before restore fules.
--- drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/net/ethernet/hisilicon/hns3/hns3pf/hclge_main.c +4 -0
@@ -4339,6 +4339,10 @@ static int hclge_restore_fd_entries(struct hnae3_handle *handle)if (!hnae3_dev_fd_supported (hdev))return -EOPNOTSUPP ; +/* if fd is disabled, should not restore it when reset */ +if (!hdev->fd_cfg.fd_en) +return 0 ; +hlist_for_each_entry_safe (rule, node, &hdev->fd_rule_list, rule_node) { ret =hclge_config_action (hdev,HCLGE_FD_STAGE_1 , rule);if (!ret)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 221/352 powerpc/perf: Fix thresholding counter data for unknown type
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 17cfccc91545682513541924245abb876d296063 ]
MMCRA[34:36] and MMCRA[38:44] expose the thresholding counter value. Thresholding counter can be used to count latency cycles such as load miss to reload. But threshold counter value is not relevant when the sampled instruction type is unknown or reserved. Patch to fix the thresholding counter value to zero when sampled instruction type is unknown or reserved.
--- arch/powerpc/perf/isa207-common.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/powerpc/perf/isa207-common.c +6 -1
@@ -226,8 +226,13 @@ void isa207_get_mem_weight(u64 *weight)u64 mmcra =mfspr (SPRN_MMCRA );u64 exp =MMCRA_THR_CTR_EXP (mmcra);u64 mantissa =MMCRA_THR_CTR_MANT (mmcra); +u64 sier =mfspr (SPRN_SIER ); +u64 val = (sier &ISA207_SIER_TYPE_MASK ) >>ISA207_SIER_TYPE_SHIFT ; - *weight = mantissa << (2 * exp); +if (val ==0 || val ==7 ) + *weight =0 ; +else + *weight = mantissa << (2 * exp); }int isa207_get_constraint (u64 event,unsigned long *maskp,unsigned long *valp)
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 222/352 iwlwifi: mvm: fix setting HE ppe FW config
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 189b8d441b0f7825f0b4278851c52afaa0515ed2 ]
The FW expects to get the ppe value for each NSS-BW pair in the same format as in the he phy capabilities IE, which means that a value of 0 implies ppe should be used for BPSK (mcs 0). If there are no PPE thresholds in the IE, or if for some NSS-RU pair there's no threshold set for it (this could happen because it's a variable-sized field), it means no PPE should not be used for that pair, so the value sent to FW should be 7 which corresponds to "none".
--- drivers/net/wireless/intel/iwlwifi/fw/api/mac.h | 2 +- drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-)
drivers/net/wireless/intel/iwlwifi/fw/api/mac.h +1 -1
@@ -442,7 +442,7 @@ struct iwl_he_backoff_conf {* Support for Nss x BW (or RU) matrix: * (0=SISO, 1=MIMO2) x (0-20MHz, 1-40MHz, 2-80MHz, 3-160MHz) * Each entry contains 2 QAM thresholds for 8us and 16us: -* 0=BPSK, 1=QPSK, 2=16QAM, 3=64QAM, 4=256QAM, 5=1024QAM, 6/7=RES +* 0=BPSK, 1=QPSK, 2=16QAM, 3=64QAM, 4=256QAM, 5=1024QAM, 6=RES, 7=NONE * i.e. QAM_th1 < QAM_th2 such if TX uses QAM_tx: * QAM_tx < QAM_th1 --> PPE=0us * QAM_th1 <= QAM_tx < QAM_th2 --> PPE=8us
drivers/net/wireless/intel/iwlwifi/mvm/mac80211.c +7 -1
@@ -2005,7 +2005,13 @@ static void iwl_mvm_cfg_he_sta(struct iwl_mvm *mvm,if (sta->he_cap.he_cap_elem.mac_cap_info[4 ] &IEEE80211_HE_MAC_CAP4_BQR ) sta_ctxt_cmd.htc_flags |=cpu_to_le32 (IWL_HE_HTC_BQR_SUPP ); -/* If PPE Thresholds exist, parse them into a FW-familiar format */ +/* +* Initialize the PPE thresholds to "None" (7), as described in Table +* 9-262ac of 80211.ax/D3.0. +*/ +memset (&sta_ctxt_cmd.pkt_ext,7 ,sizeof (sta_ctxt_cmd.pkt_ext)); + +/* If PPE Thresholds exist, parse them into a FW-familiar format. */ if (sta->he_cap.he_cap_elem.phy_cap_info[6 ] &IEEE80211_HE_PHY_CAP6_PPE_THRESHOLD_PRESENT ) { u8 nss = (sta->he_cap.ppe_thres[0] &
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 223/352 powerpc/powernv/ioda: Allocate indirect TCE levels of cached userspace addresses on demand
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit bdbf649efe21173cae63b4b71db84176420f9039 ]
The powernv platform maintains 2 TCE tables for VFIO - a hardware TCE table and a table with userspace addresses; the latter is used for marking pages dirty when corresponging TCEs are unmapped from the hardware table.
a68bd1267b72 ("powerpc/powernv/ioda: Allocate indirect TCE levels on demand") enabled on-demand allocation of the hardware table, however it missed the other table so it has still been fully allocated at the boot time. This fixes the issue by allocating a single level, just like we do for the hardware table.
--- arch/powerpc/platforms/powernv/pci-ioda-tce.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/powerpc/platforms/powernv/pci-ioda-tce.c +1 -1
@@ -299,7 +299,7 @@ long pnv_pci_ioda2_table_alloc_pages(int nid, __u64 bus_offset,if (alloc_userspace_copy) { offset =0 ; uas =pnv_pci_ioda2_table_do_alloc_pages (nid, level_shift, - levels, tce_table_size, &offset, + tmplevels, tce_table_size, &offset, &total_allocated_uas);if (!uas) goto free_tces_exit;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 224/352 mlx5: update timecounter at least twice per counter overflow
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 5d8678365c90b9ce1fd2243ff5ea562609f6cec1 ]
The timecounter needs to be updated at least once in half of the cyclecounter interval to prevent timecounter_cyc2time() interpreting a new timestamp as an old value and causing a backward jump.
This would be an issue if the timecounter multiplier was so small that the update interval would not be limited by the 64-bit overflow in multiplication.
Shorten the calculated interval to make sure the timecounter is updated in time even when the system clock is slowed down by up to 10%, the multiplier is increased by up to 10%, and the scheduled overflow check is late by 15%.
--- drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/lib/clock.c +2 -2
@@ -511,14 +511,14 @@ void mlx5_init_clock(struct mlx5_core_dev *mdev) ktime_to_ns(ktime_get_real()));/* Calculate period in seconds to call the overflow watchdog - to make -* sure counter is checked at least once every wrap around. +* sure counter is checked at least twice every wrap around. * The period is calculated as the minimum between max HW cycles count * (The clock source mask) and max amount of cycles that can be * multiplied by clock multiplier where the result doesn't exceed * 64bits. */ overflow_cycles =div64_u64 (~0ULL >>1 , clock->cycles.mult); - overflow_cycles =min (overflow_cycles, clock->cycles.mask >>1 ); + overflow_cycles =min (overflow_cycles,div_u64 (clock->cycles.mask,3 )); ns =cyclecounter_cyc2ns (&clock->cycles, overflow_cycles, frac, &frac);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 225/352 drbd: narrow rcu_read_lock in drbd_sync_handshake
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d29e89e34952a9ad02c77109c71a80043544296e ]
So far there was the possibility that we called genlmsg_new(GFP_NOIO)/mutex_lock() while holding an rcu_read_lock().
This included cases like:
drbd_sync_handshake (acquire the RCU lock)
drbd_asb_recover_1p
drbd_khelper
drbd_bcast_event
genlmsg_new(GFP_NOIO) --> may sleepdrbd_sync_handshake (acquire the RCU lock)
drbd_asb_recover_1p
drbd_khelper
notify_helper
genlmsg_new(GFP_NOIO) --> may sleepdrbd_sync_handshake (acquire the RCU lock)
drbd_asb_recover_1p
drbd_khelper
notify_helper
mutex_lock --> may sleepWhile using GFP_ATOMIC whould have been possible in the first two cases, the real fix is to narrow the rcu_read_lock.
--- drivers/block/drbd/drbd_receiver.c | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-)
drivers/block/drbd/drbd_receiver.c +6 -5
@@ -3364,7 +3364,7 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,enum drbd_conns rv =C_MASK ;enum drbd_disk_state mydisk;struct net_conf *nc; -int hg, rule_nr, rr_conflict, tentative; +int hg, rule_nr, rr_conflict, tentative, always_asbp; mydisk = device->state.disk;if (mydisk ==D_NEGOTIATING )
@@ -3415,8 +3415,12 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,rcu_read_lock (); nc =rcu_dereference (peer_device->connection->net_conf); + always_asbp = nc->always_asbp; + rr_conflict = nc->rr_conflict; + tentative = nc->tentative; +rcu_read_unlock (); -if (hg ==100 || (hg ==-100 && nc->always_asbp)) { +if (hg ==100 || (hg ==-100 && always_asbp)) {int pcount = (device->state.role ==R_PRIMARY ) + (peer_role ==R_PRIMARY );int forced = (hg ==-100 );
@@ -3455,9 +3459,6 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,"Sync from %s node\n" , (hg < 0) ? "peer" : "this"); } - rr_conflict = nc->rr_conflict; - tentative = nc->tentative; -rcu_read_unlock ();if (hg ==-100 ) {/* FIXME this log message is not correct if we end up here
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 226/352 drbd: disconnect, if the wrong UUIDs are attached on a connected peer
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b17b59602b6dcf8f97a7dc7bc489a48388d7063a ]
With "on-no-data-accessible suspend-io", DRBD requires the next attach or connect to be to the very same data generation uuid tag it lost last.
If we first lost connection to the peer, then later lost connection to our own disk, we would usually refuse to re-connect to the peer, because it presents the wrong data set.
However, if the peer first connects without a disk,
and then attached its disk, we accepted that same wrong data set, which would be "unexpected" by any user of that DRBD and cause "undefined results" (read: very likely data corruption).
The fix is to forcefully disconnect as soon as we notice that the peer attached to the "wrong" dataset.
--- drivers/block/drbd/drbd_receiver.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/block/drbd/drbd_receiver.c +1 -1
@@ -4143,7 +4143,7 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_infokfree (device->p_uuid); device->p_uuid = p_uuid; -if (device->state.conn <C_CONNECTED && +if ((device->state.conn <C_CONNECTED || device->state.pdsk ==D_DISKLESS ) && device->state.disk <D_INCONSISTENT && device->state.role ==R_PRIMARY && (device->ed_uuid & ~((u64 )1 )) != (p_uuid[UI_CURRENT ] & ~((u64 )1 ))) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 227/352 drbd: skip spurious timeout (ping-timeo) when failing promote
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9848b6ddd8c92305252f94592c5e278574e7a6ac ]
If you try to promote a Secondary while connected to a Primary and allow-two-primaries is NOT set, we will wait for "ping-timeout" to give this node a chance to detect a dead primary,
in case the cluster manager noticed faster than we did.
But if we then are *still* connected to a Primary, we fail (after an additional timeout of ping-timout).
This change skips the spurious second timeout.
Most people won't notice really,
since "ping-timeout" by default is half a second.
But in some installations, ping-timeout may be 10 or 20 seconds or more, and spuriously delaying the error return becomes annoying.
--- drivers/block/drbd/drbd_nl.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)
drivers/block/drbd/drbd_nl.c +8 -7
@@ -668,14 +668,15 @@ drbd_set_role(struct drbd_device *const device, enum drbd_role new_role, int forif (rv ==SS_TWO_PRIMARIES ) {/* Maybe the peer is detected as dead very soon... retry at most once more in this case. */ -int timeo; -rcu_read_lock (); - nc =rcu_dereference (connection->net_conf); - timeo = nc ? (nc->ping_timeo +1 ) *HZ /10 :1 ; -rcu_read_unlock (); -schedule_timeout_interruptible (timeo); -if (try < max_tries) +if (try < max_tries) { +int timeo; try = max_tries -1 ; +rcu_read_lock (); + nc =rcu_dereference (connection->net_conf); + timeo = nc ? (nc->ping_timeo +1 ) *HZ /10 :1 ; +rcu_read_unlock (); +schedule_timeout_interruptible (timeo); + }continue ; }if (rv <SS_SUCCESS ) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 228/352 drbd: Avoid Clang warning about pointless switch statment
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a52c5a16cf19d8a85831bb1b915a221dd4ffae3c ]
There are several warnings from Clang about no case statement matching the constant 0:
In file included from drivers/block/drbd/drbd_receiver.c:48:
In file included from drivers/block/drbd/drbd_int.h:48:
In file included from ./include/linux/drbd_genl_api.h:54:
In file included from ./include/linux/genl_magic_struct.h:236:./include/linux/drbd_genl.h:321:1: warning: no case matching constant switch condition '0'
GENL_struct(DRBD_NLA_HELPER, 24, drbd_helper_info, ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ./include/linux/genl_magic_struct.h:220:10: note: expanded from macro 'GENL_struct'
switch (0) {
^Silence this warning by adding a 'case 0:' statement. Additionally, adjust the alignment of the statements in the ct_assert_unique macro to avoid a checkpatch warning.
This solution was originally sent by Arnd Bergmann with a default case
statement: https://lore.kernel.org/patchwork/patch/756723/
--- include/linux/genl_magic_struct.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
include/linux/genl_magic_struct.h +4 -1
@@ -191,6 +191,7 @@ static inline void ct_assert_unique_operations(void) {switch (0 ) {#include GENL_MAGIC_INCLUDE_FILE +case 0 : ; } }
@@ -209,6 +210,7 @@ static inline void ct_assert_unique_top_level_attributes(void) {switch (0 ) {#include GENL_MAGIC_INCLUDE_FILE +case 0 : ; } }
@@ -218,7 +220,8 @@ static inline void ct_assert_unique_top_level_attributes(void) static inline void ct_assert_unique_ ## s_name ## _attributes(void) \ { \ switch (0) { \ - s_fields \ + s_fields \ + case 0: \ ; \ } \ }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 229/352 ath10k: fix kernel panic due to use after free
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 553a7cca769d551f1317186760631487c47e23bf ]
This issue arise in a race condition between ath10k_sta_state() and ath10k_htt_fetch_peer_stats(), explained in below scenario
Steps:
1. In ath10k_sta_state(), arsta->tx_stats get deallocated before peer deletion when the station moves from IEEE80211_STA_NONE to IEEE80211_STA_NOTEXIST state.
2. Meanwhile ath10k receive HTT_T2H_MSG_TYPE_PEER_STATS message. In ath10k_htt_fetch_peer_stats(), arsta->tx_stats get accessed after the peer validation check.
Since arsta->tx_stats get freed before the peer deletion [1]. ath10k_htt_fetch_peer_stats() ended up in "use after free" situation.
Fixed this issue by moving the arsta->tx_stats free handling after the peer deletion. so that ath10k_htt_fetch_peer_stats() will not end up in "use after free" situation.
Kernel Panic:
Unable to handle kernel NULL pointer dereference at virtual address 00000286 pgd = d8754000 [00000286] *pgd=00000000 Internal error: Oops: 5 [#1] PREEMPT SMP ARM ... CPU: 0 PID: 6245 Comm: hostapd Not tainted task: dc44cac0 ti: d4a38000 task.ti: d4a38000 PC is at kmem_cache_alloc+0x7c/0x114 LR is at ath10k_sta_state+0x190/0xd58 [ath10k_core] pc : [<c02bdc50>] lr : [<bf916b78>] psr: 20000013
sp : d4a39b88 ip : 00000000 fp : 00000001
r10: 00000000 r9 : 1d3bc000 r8 : 00000dc0
r7 : 000080d0 r6 : d4a38000 r5 : dd401b00 r4 : 00000286 r3 : 00000000 r2 : d4a39ba0 r1 : 000080d0 r0 : dd401b00
Flags: nzCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c5787d Table: 5a75406a DAC: 00000015 Process hostapd (pid: 6245, stack limit = 0xd4a38238)
Stack: (0xd4a39b88 to 0xd4a3a000)
...
[<c02bdc50>] (kmem_cache_alloc) from [<bf916b78>] (ath10k_sta_state+0x190/0xd58 [ath10k_core]) [<bf916b78>] (ath10k_sta_state [ath10k_core]) from [<bf870d4c>] (sta_info_insert_rcu+0x418/0x61c [mac80211]) [<bf870d4c>] (sta_info_insert_rcu [mac80211]) from [<bf88634c>] (ieee80211_add_station+0xf0/0x134 [mac80211]) [<bf88634c>] (ieee80211_add_station [mac80211]) from [<bf83f3c4>] (nl80211_new_station+0x330/0x36c [cfg80211]) [<bf83f3c4>] (nl80211_new_station [cfg80211]) from [<bf6c4040>] (extack_doit+0x2c/0x74 [compat]) [<bf6c4040>] (extack_doit [compat]) from [<c05c285c>] (genl_rcv_msg+0x274/0x30c) [<c05c285c>] (genl_rcv_msg) from [<c05c1d98>] (netlink_rcv_skb+0x58/0xac)
[<c05c1d98>] (netlink_rcv_skb) from [<c05c25d4>] (genl_rcv+0x20/0x34)
[<c05c25d4>] (genl_rcv) from [<c05c1750>] (netlink_unicast+0x11c/0x204)
[<c05c1750>] (netlink_unicast) from [<c05c1be0>] (netlink_sendmsg+0x30c/0x370)
[<c05c1be0>] (netlink_sendmsg) from [<c0587e90>] (sock_sendmsg+0x70/0x84)
[<c0587e90>] (sock_sendmsg) from [<c058970c>] (___sys_sendmsg.part.3+0x188/0x228) [<c058970c>] (___sys_sendmsg.part.3) from [<c058a594>] (__sys_sendmsg+0x4c/0x70) [<c058a594>] (__sys_sendmsg) from [<c0208c80>] (ret_fast_syscall+0x0/0x44)
Code: ebfffec1 e1a04000 ea00001b e5953014 (e7940003)
ath10k_pci 0000:01:00.0: SWBA overrun on vdev 0, skipped old beacon
Hardware tested: QCA9984
Firmware tested: 10.4-3.6.0.1-00004
--- drivers/net/wireless/ath/ath10k/mac.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/net/wireless/ath/ath10k/mac.c +5 -5
@@ -6387,11 +6387,6 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,"mac vdev %d peer delete %pM sta %pK (sta gone)\n" , arvif->vdev_id, sta->addr, sta); -if (ath10k_debug_is_extd_tx_stats_enabled (ar)) { -kfree (arsta->tx_stats); - arsta->tx_stats =NULL ; - } -if (sta->tdls) { ret = ath10k_mac_tdls_peer_update(ar, arvif->vdev_id, sta,
@@ -6431,6 +6426,11 @@ static int ath10k_sta_state(struct ieee80211_hw *hw, }spin_unlock_bh (&ar->data_lock); +if (ath10k_debug_is_extd_tx_stats_enabled (ar)) { +kfree (arsta->tx_stats); + arsta->tx_stats =NULL ; + } +for (i =0 ; i <ARRAY_SIZE (sta->txq); i++)ath10k_mac_txq_unref (ar, sta->txq[i]);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 230/352 ath10k: fix tx_stats memory leak
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 386f97e3b201d18578abb0e7037b85a1ae50c0a3 ]
Memory of tx_stats was allocated when a STA was added. But it's not freed if the STA failed to be added to driver. This issue could be seen in MDK3 attack case when STA number reached the limit.
Tested: QCA9984 with firmware ver 10.4-3.9.0.1-00005
--- drivers/net/wireless/ath/ath10k/mac.c | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-)
drivers/net/wireless/ath/ath10k/mac.c +13 -9
@@ -6293,15 +6293,6 @@ static int ath10k_sta_state(struct ieee80211_hw *hw, ar->num_stations +1 , ar->max_num_stations, ar->num_peers + 1, ar->max_num_peers); -if (ath10k_debug_is_extd_tx_stats_enabled (ar)) { - arsta->tx_stats =kzalloc (sizeof (*arsta->tx_stats), -GFP_KERNEL ); -if (!arsta->tx_stats) { - ret = -ENOMEM ; - goto exit; - } - } - num_tdls_stations =ath10k_mac_tdls_vif_stations_count (hw, vif); num_tdls_vifs =ath10k_mac_tdls_vifs_count (hw);
@@ -6323,12 +6314,22 @@ static int ath10k_sta_state(struct ieee80211_hw *hw, goto exit; } +if (ath10k_debug_is_extd_tx_stats_enabled (ar)) { + arsta->tx_stats =kzalloc (sizeof (*arsta->tx_stats), +GFP_KERNEL ); +if (!arsta->tx_stats) { + ret = -ENOMEM ; + goto exit; + } + } + ret =ath10k_peer_create (ar, vif, sta, arvif->vdev_id, sta->addr, peer_type);if (ret) {ath10k_warn (ar,"failed to add peer %pM for vdev %d when adding a new sta: %i\n" , sta->addr, arvif->vdev_id, ret);ath10k_mac_dec_num_stations (arvif, sta); +kfree (arsta->tx_stats); goto exit; }
@@ -6341,6 +6342,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,spin_unlock_bh (&ar->data_lock);ath10k_peer_delete (ar, arvif->vdev_id, sta->addr);ath10k_mac_dec_num_stations (arvif, sta); +kfree (arsta->tx_stats); ret = -ENOENT ; goto exit; }
@@ -6361,6 +6363,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw,ath10k_peer_delete (ar, arvif->vdev_id, sta->addr);ath10k_mac_dec_num_stations (arvif, sta); +kfree (arsta->tx_stats); goto exit; }
@@ -6372,6 +6375,7 @@ static int ath10k_sta_state(struct ieee80211_hw *hw, sta->addr, arvif->vdev_id, ret);ath10k_peer_delete (ar, arvif->vdev_id, sta->addr);ath10k_mac_dec_num_stations (arvif, sta); +kfree (arsta->tx_stats);if (num_tdls_stations !=0 ) goto exit;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 231/352 drm/amd/display: validate extended dongle caps
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 99b922f9ed6a6313c0d2247cde8aa1e4a0bd67e4 ]
[why]
Some dongle doesn't have a valid extended dongle caps, but we still set the extended dongle caps to be valid. This causes validation fails for all timing.
[how]
If no dp_hdmi_max_pixel_clk is provided,
don't use extended dongle caps.
--- drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c +2 -1
@@ -2240,7 +2240,8 @@ static void get_active_converter_info(translate_dpcd_max_bpc ( hdmi_color_caps.bits.MAX_BITS_PER_COLOR_COMPONENT); - link->dpcd_caps.dongle_caps.extendedCapValid = true; +if (link->dpcd_caps.dongle_caps.dp_hdmi_max_pixel_clk !=0 ) + link->dpcd_caps.dongle_caps.extendedCapValid = true; }break ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 232/352 video: clps711x-fb: release disp device node in probe()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit fdac751355cd76e049f628afe6acb8ff4b1399f7 ]
clps711x_fb_probe() increments refcnt of disp device node by of_parse_phandle() and leaves it undecremented on both successful and error paths.
Found by Linux Driver Verification project (linuxtesting.org).
--- drivers/video/fbdev/clps711x-fb.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/video/fbdev/clps711x-fb.c +4 -1
@@ -287,14 +287,17 @@ static int clps711x_fb_probe(struct platform_device *pdev) } ret =of_get_fb_videomode (disp, &cfb->mode,OF_USE_NATIVE_MODE ); -if (ret) +if (ret) { +of_node_put (disp); goto out_fb_release; + }of_property_read_u32 (disp,"ac-prescale" , &cfb->ac_prescale); cfb->cmap_invert =of_property_read_bool (disp,"cmap-invert" ); ret =of_property_read_u32 (disp,"bits-per-pixel" , &info->var.bits_per_pixel); +of_node_put (disp);if (ret) goto out_fb_release;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 233/352 md: fix raid10 hang issue caused by barrier
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e820d55cb99dd93ac2dc949cf486bb187e5cd70d ]
When both regular IO and resync IO happen at the same time, and if we also need to split regular. Then we can see tasks hang due to barrier.
1. resync thread
[ 1463.757205] INFO: task md1_resync:5215 blocked for more than 480 seconds. [ 1463.757207] Not tainted 4.19.5-1-default #1 [ 1463.757209] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1463.757212] md1_resync D 0 5215 2 0x80000000 [ 1463.757216] Call Trace: [ 1463.757223] ? __schedule+0x29a/0x880 [ 1463.757231] ? raise_barrier+0x8d/0x140 [raid10] [ 1463.757236] schedule+0x78/0x110 [ 1463.757243] raise_barrier+0x8d/0x140 [raid10] [ 1463.757248] ? wait_woken+0x80/0x80 [ 1463.757257] raid10_sync_request+0x1f6/0x1e30 [raid10] [ 1463.757265] ? _raw_spin_unlock_irq+0x22/0x40 [ 1463.757284] ? is_mddev_idle+0x125/0x137 [md_mod] [ 1463.757302] md_do_sync.cold.78+0x404/0x969 [md_mod] [ 1463.757311] ? wait_woken+0x80/0x80 [ 1463.757336] ? md_rdev_init+0xb0/0xb0 [md_mod] [ 1463.757351] md_thread+0xe9/0x140 [md_mod] [ 1463.757358] ? _raw_spin_unlock_irqrestore+0x2e/0x60 [ 1463.757364] ? __kthread_parkme+0x4c/0x70 [ 1463.757369] kthread+0x112/0x130 [ 1463.757374] ? kthread_create_worker_on_cpu+0x40/0x40 [ 1463.757380] ret_from_fork+0x3a/0x50
2. regular IO
[ 1463.760679] INFO: task kworker/0:8:5367 blocked for more than 480 seconds. [ 1463.760683] Not tainted 4.19.5-1-default #1 [ 1463.760684] "echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message. [ 1463.760687] kworker/0:8 D 0 5367 2 0x80000000 [ 1463.760718] Workqueue: md submit_flushes [md_mod] [ 1463.760721] Call Trace: [ 1463.760731] ? __schedule+0x29a/0x880 [ 1463.760741] ? wait_barrier+0xdd/0x170 [raid10] [ 1463.760746] schedule+0x78/0x110 [ 1463.760753] wait_barrier+0xdd/0x170 [raid10] [ 1463.760761] ? wait_woken+0x80/0x80 [ 1463.760768] raid10_write_request+0xf2/0x900 [raid10] [ 1463.760774] ? wait_woken+0x80/0x80 [ 1463.760778] ? mempool_alloc+0x55/0x160 [ 1463.760795] ? md_write_start+0xa9/0x270 [md_mod] [ 1463.760801] ? try_to_wake_up+0x44/0x470 [ 1463.760810] raid10_make_request+0xc1/0x120 [raid10] [ 1463.760816] ? wait_woken+0x80/0x80 [ 1463.760831] md_handle_request+0x121/0x190 [md_mod] [ 1463.760851] md_make_request+0x78/0x190 [md_mod] [ 1463.760860] generic_make_request+0x1c6/0x470 [ 1463.760870] raid10_write_request+0x77a/0x900 [raid10] [ 1463.760875] ? wait_woken+0x80/0x80 [ 1463.760879] ? mempool_alloc+0x55/0x160 [ 1463.760895] ? md_write_start+0xa9/0x270 [md_mod] [ 1463.760904] raid10_make_request+0xc1/0x120 [raid10] [ 1463.760910] ? wait_woken+0x80/0x80 [ 1463.760926] md_handle_request+0x121/0x190 [md_mod] [ 1463.760931] ? _raw_spin_unlock_irq+0x22/0x40 [ 1463.760936] ? finish_task_switch+0x74/0x260 [ 1463.760954] submit_flushes+0x21/0x40 [md_mod]
So resync io is waiting for regular write io to complete to decrease nr_pending (conf->barrier++ is called before waiting). The regular write io splits another bio after call wait_barrier which call nr_pending++, then the splitted bio would continue with raid10_write_request -> wait_barrier, so the splitted bio has to wait for barrier to be zero, then deadlock happens as follows.
resync io regular io
raise_barrier
wait_barrier generic_make_request wait_barrier
To resolve the issue, we need to call allow_barrier to decrease nr_pending before generic_make_request since regular IO is not issued to underlying devices, and wait_barrier is called again to ensure no internal IO happening.
--- drivers/md/raid10.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/md/raid10.c +4 -0
@@ -1209,7 +1209,9 @@ static void raid10_read_request(struct mddev *mddev, struct bio *bio,struct bio *split =bio_split (bio, max_sectors, gfp, &conf->bio_split);bio_chain (split, bio); +allow_barrier (conf);generic_make_request (bio); +wait_barrier (conf); bio = split; r10_bio->master_bio = bio; r10_bio->sectors = max_sectors;
@@ -1514,7 +1516,9 @@ retry_write:struct bio *split =bio_split (bio, r10_bio->sectors,GFP_NOIO , &conf->bio_split);bio_chain (split, bio); +allow_barrier (conf);generic_make_request (bio); +wait_barrier (conf); bio = split; r10_bio->master_bio = bio; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 234/352 fbdev: fbmem: behave better with small rotated displays and many CPUs
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit f75df8d4b4fabfad7e3cba2debfad12741c6fde7 ]
Blitting an image with "negative" offsets is not working since there is no clipping. It hopefully just crashes. For the bootup logo, there is protection so that blitting does not happen as the image is drawn further and further to the right (ROTATE_UR) or further and further down (ROTATE_CW). There is however no protection when drawing in the opposite directions (ROTATE_UD and ROTATE_CCW).
Add back this protection.
The regression is 20-odd years old but the mindless warning-killing mentality displayed in commit 34bdb666f4b2 ("fbdev: fbmem: remove positive test on unsigned values") is also to blame, methinks.
--- drivers/video/fbdev/core/fbmem.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/video/fbdev/core/fbmem.c +6 -2
@@ -436,7 +436,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image, image->dx += image->width +8 ; } }else if (rotate ==FB_ROTATE_UD ) { -for (x =0 ; x < num; x++) { +u32 dx = image->dx; + +for (x =0 ; x < num && image->dx <= dx; x++) { info->fbops->fb_imageblit (info, image); image->dx -= image->width +8 ; }
@@ -448,7 +450,9 @@ static void fb_do_show_logo(struct fb_info *info, struct fb_image *image, image->dy += image->height +8 ; } }else if (rotate ==FB_ROTATE_CCW ) { -for (x =0 ; x < num; x++) { +u32 dy = image->dy; + +for (x =0 ; x < num && image->dy <= dy; x++) { info->fbops->fb_imageblit (info, image); image->dy -= image->height +8 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 235/352 i40e: define proper net_device::neigh_priv_len
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 31389b53b3e0b535867af9090a5d19ec64768d55 ]
Out of bound read reported by KASan.
i40iw_net_event() reads unconditionally 16 bytes from neigh->primary_key while the memory allocated for "neighbour" struct is evaluated in neigh_alloc() as
tbl->entry_size + dev->neigh_priv_len
where "dev" is a net_device.
But the driver does not setup dev->neigh_priv_len and we read beyond the neigh entry allocated memory, so the patch in the next mail fixes this.
--- drivers/net/ethernet/intel/i40e/i40e_main.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/ethernet/intel/i40e/i40e_main.c +3 -0
@@ -12339,6 +12339,9 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)ether_addr_copy (netdev->dev_addr, mac_addr);ether_addr_copy (netdev->perm_addr, mac_addr); +/* i40iw_net_event() reads 16 bytes from neigh->primary_key */ + netdev->neigh_priv_len =sizeof (u32) *4 ; + netdev->priv_flags |=IFF_UNICAST_FLT ; netdev->priv_flags |=IFF_SUPP_NOFCS ;/* Setup netdev TC information */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 236/352 ice: Do not enable NAPI on q_vectors that have no rings
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit eec903769b4ea476591ffff73bb7359f14f38c51 ]
If ice driver has q_vectors w/ active NAPI that has no rings, then this will result in a divide by zero error. To correct it I am updating the driver code so that we only support NAPI on q_vectors that have 1 or more rings allocated to them.
See commit 13a8cd191a2b ("i40e: Do not enable NAPI on q_vectors that have no rings") for detail.
--- drivers/net/ethernet/intel/ice/ice_main.c | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-)
drivers/net/ethernet/intel/ice/ice_main.c +12 -4
@@ -2563,8 +2563,12 @@ static void ice_napi_enable_all(struct ice_vsi *vsi)if (!vsi->netdev)return ; -for (q_idx =0 ; q_idx < vsi->num_q_vectors; q_idx++) -napi_enable (&vsi->q_vectors[q_idx]->napi); +for (q_idx =0 ; q_idx < vsi->num_q_vectors; q_idx++) { +struct ice_q_vector *q_vector = vsi->q_vectors[q_idx]; + +if (q_vector->rx.ring || q_vector->tx.ring) +napi_enable (&q_vector->napi); + } }/**
@@ -2931,8 +2935,12 @@ static void ice_napi_disable_all(struct ice_vsi *vsi)if (!vsi->netdev)return ; -for (q_idx =0 ; q_idx < vsi->num_q_vectors; q_idx++) -napi_disable (&vsi->q_vectors[q_idx]->napi); +for (q_idx =0 ; q_idx < vsi->num_q_vectors; q_idx++) { +struct ice_q_vector *q_vector = vsi->q_vectors[q_idx]; + +if (q_vector->rx.ring || q_vector->tx.ring) +napi_disable (&q_vector->napi); + } }/**
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 237/352 igb: Fix an issue that PME is not enabled during runtime suspend
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 1fb3a7a75e2efcc83ef21f2434069cddd6fae6f5 ]
I210 ethernet card doesn't wakeup when a cable gets plugged. It's because its PME is not set.
Since commit 42eca2302146 ("PCI: Don't touch card regs after runtime suspend D3"), if the PCI state is saved, pci_pm_runtime_suspend() stops calling pci_finish_runtime_suspend(), which enables the PCI PME.
To fix the issue, let's not to save PCI states when it's runtime suspend, to let the PCI subsystem enables PME.
--- drivers/net/ethernet/intel/igb/igb_main.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/ethernet/intel/igb/igb_main.c +5 -3
@@ -8770,9 +8770,11 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake,rtnl_unlock ();#ifdef CONFIG_PM - retval =pci_save_state (pdev); -if (retval) -return retval; +if (!runtime) { + retval =pci_save_state (pdev); +if (retval) +return retval; + }#endif status =rd32 (E1000_STATUS );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 238/352 ACPI/APEI: Clear GHES block_status before panic()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 98cff8b23ed1c763a029ee81ea300df0d153d07d ]
In __ghes_panic() clear the block status in the APEI generic error status block for that generic hardware error source before calling panic() to prevent a second panic() in the crash kernel for exactly the same fatal error.
Otherwise ghes_probe(), running in the crash kernel, would see an unhandled error in the APEI generic error status block and panic again, thereby precluding any crash dump.
--- drivers/acpi/apei/ghes.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/acpi/apei/ghes.c +2 -0
@@ -691,6 +691,8 @@ static void __ghes_panic(struct ghes *ghes) {__ghes_print_estatus (KERN_EMERG , ghes->generic, ghes->estatus); +ghes_clear_estatus (ghes); +/* reboot to log the error! */ if (!panic_timeout) panic_timeout = ghes_panic_timeout;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 239/352 fbdev: fbcon: Fix unregister crash when more than one framebuffer
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2122b40580dd9d0620398739c773d07a7b7939d0 ]
When unregistering fbdev using unregister_framebuffer(), any bound console will unbind automatically. This is working fine if this is the only framebuffer, resulting in a switch to the dummy console. However if there is a fb0 and I unregister fb1 having a bound console, I eventually get a crash. The fastest way for me to trigger the crash is to do a reboot, resulting in this splat:
[ 76.478825] WARNING: CPU: 0 PID: 527 at linux/kernel/workqueue.c:1442 __queue_work+0x2d4/0x41c [ 76.478849] Modules linked in: raspberrypi_hwmon gpio_backlight backlight bcm2835_rng rng_core [last unloaded: tinydrm] [ 76.478916] CPU: 0 PID: 527 Comm: systemd-udevd Not tainted 4.20.0-rc4+ #4 [ 76.478933] Hardware name: BCM2835 [ 76.478949] Backtrace: [ 76.478995] [<c010d388>] (dump_backtrace) from [<c010d670>] (show_stack+0x20/0x24) [ 76.479022] r6:00000000 r5:c0bc73be r4:00000000 r3:6fb5bf81 [ 76.479060] [<c010d650>] (show_stack) from [<c08e82f4>] (dump_stack+0x20/0x28) [ 76.479102] [<c08e82d4>] (dump_stack) from [<c0120070>] (__warn+0xec/0x12c) [ 76.479134] [<c011ff84>] (__warn) from [<c01201e4>] (warn_slowpath_null+0x4c/0x58) [ 76.479165] r9:c0eb6944 r8:00000001 r7:c0e927f8 r6:c0bc73be r5:000005a2 r4:c0139e84 [ 76.479197] [<c0120198>] (warn_slowpath_null) from [<c0139e84>] (__queue_work+0x2d4/0x41c) [ 76.479222] r6:d7666a00 r5:c0e918ee r4:dbc4e700 [ 76.479251] [<c0139bb0>] (__queue_work) from [<c013a02c>] (queue_work_on+0x60/0x88) [ 76.479281] r10:c0496bf8 r9:00000100 r8:c0e92ae0 r7:00000001 r6:d9403700 r5:d7666a00 [ 76.479298] r4:20000113 [ 76.479348] [<c0139fcc>] (queue_work_on) from [<c0496c28>] (cursor_timer_handler+0x30/0x54) [ 76.479374] r7:d8a8fabc r6:c0e08088 r5:d8afdc5c r4:d8a8fabc [ 76.479413] [<c0496bf8>] (cursor_timer_handler) from [<c0178744>] (call_timer_fn+0x100/0x230) [ 76.479435] r4:c0e9192f r3:d758a340 [ 76.479465] [<c0178644>] (call_timer_fn) from [<c0178980>] (expire_timers+0x10c/0x12c) [ 76.479495] r10:40000000 r9:c0e9192f r8:c0e92ae0 r7:d8afdccc r6:c0e19280 r5:c0496bf8 [ 76.479513] r4:d8a8fabc [ 76.479541] [<c0178874>] (expire_timers) from [<c0179630>] (run_timer_softirq+0xa8/0x184) [ 76.479570] r9:00000001 r8:c0e19280 r7:00000000 r6:c0e08088 r5:c0e1a3e0 r4:c0e19280 [ 76.479603] [<c0179588>] (run_timer_softirq) from [<c0102404>] (__do_softirq+0x1ac/0x3fc) [ 76.479632] r10:c0e91680 r9:d8afc020 r8:0000000a r7:00000100 r6:00000001 r5:00000002 [ 76.479650] r4:c0eb65ec [ 76.479686] [<c0102258>] (__do_softirq) from [<c0124d10>] (irq_exit+0xe8/0x168) [ 76.479716] r10:d8d1a9b0 r9:d8afc000 r8:00000001 r7:d949c000 r6:00000000 r5:c0e8b3f0 [ 76.479734] r4:00000000 [ 76.479764] [<c0124c28>] (irq_exit) from [<c016b72c>] (__handle_domain_irq+0x94/0xb0) [ 76.479793] [<c016b698>] (__handle_domain_irq) from [<c01021dc>] (bcm2835_handle_irq+0x3c/0x48) [ 76.479823] r8:d8afdebc r7:d8afddfc r6:ffffffff r5:c0e089f8 r4:d8afddc8 r3:d8afddc8 [ 76.479851] [<c01021a0>] (bcm2835_handle_irq) from [<c01019f0>] (__irq_svc+0x70/0x98)
The problem is in the console rebinding in fbcon_fb_unbind(). It uses the virtual console index as the new framebuffer index to bind the console(s) to. The correct way is to use the con2fb_map lookup table to find the framebuffer index.
--- drivers/video/fbdev/core/fbcon.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/video/fbdev/core/fbcon.c +1 -1
@@ -3064,7 +3064,7 @@ static int fbcon_fb_unbind(int idx)for (i = first_fb_vc; i <= last_fb_vc; i++) {if (con2fb_map[i] != idx && con2fb_map[i] !=-1 ) { - new_idx = i; + new_idx = con2fb_map[i];break ; } }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 240/352 bpf: sk_msg, zap ingress queue on psock down
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a136678c0bdbb650daff5df5eec1dab960e074a7 ]
In addition to releasing any cork'ed data on a psock when the psock is removed we should also release any skb's in the ingress work queue. Otherwise the skb's eventually get free'd but late in the tear down process so we see the WARNING due to non-zero sk_forward_alloc.
void sk_stream_kill_queues(struct sock *sk)
{
...
WARN_ON(sk->sk_forward_alloc);
...}
--- net/core/skmsg.c | 1 + 1 file changed, 1 insertion(+)
net/core/skmsg.c +1 -0
@@ -575,6 +575,7 @@ void sk_psock_drop(struct sock *sk, struct sk_psock *psock) {rcu_assign_sk_user_data (sk,NULL );sk_psock_cork_free (psock); +sk_psock_zap_ingress (psock);sk_psock_restore_proto (sk, psock);write_lock_bh (&sk->sk_callback_lock);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 241/352 powerpc/mm: Fix reporting of kernel execute faults on the 8xx
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ffca395b11c4a5a6df6d6345f794b0e3d578e2d0 ]
On the 8xx, no-execute is set via PPP bits in the PTE. Therefore a no-exec fault generates DSISR_PROTFAULT error bits, not DSISR_NOEXEC_OR_G.
This patch adds DSISR_PROTFAULT in the test mask.
--- arch/powerpc/mm/fault.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/powerpc/mm/fault.c +3 -1
@@ -226,7 +226,9 @@ static int mm_fault_error(struct pt_regs *regs, unsigned long addr,static bool bad_kernel_fault (bool is_exec,unsigned long error_code,unsigned long address) { -if (is_exec && (error_code & (DSISR_NOEXEC_OR_G |DSISR_KEYFAULT ))) { +/* NX faults set DSISR_PROTFAULT on the 8xx, DSISR_NOEXEC_OR_G on others */ +if (is_exec && (error_code & (DSISR_NOEXEC_OR_G |DSISR_KEYFAULT | +DSISR_PROTFAULT ))) { printk_ratelimited(KERN_CRIT "kernel tried to execute" " exec-protected page (%lx) -" "exploit attempt? (uid: %d)\n",
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 242/352 bpf: sk_msg, fix socket data_ready events
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 552de91068828daef50a227a665068cf8dde835e ]
When a skb verdict program is in-use and either another BPF program redirects to that socket or the new SK_PASS support is used the data_ready callback does not wake up application. Instead because the stream parser/verdict is using the sk data_ready callback we wake up the stream parser/verdict block.
Fix this by adding a helper to check if the stream parser block is enabled on the sk and if so call the saved pointer which is the upper layers wake up function.
This fixes application stalls observed when an application is waiting for data in a blocking read().
--- include/linux/skmsg.h | 8 ++++++++ net/core/skmsg.c | 6 +++--- net/ipv4/tcp_bpf.c | 2 +- 3 files changed, 12 insertions(+), 4 deletions(-)
include/linux/skmsg.h +8 -0
@@ -416,6 +416,14 @@ static inline void sk_psock_put(struct sock *sk, struct sk_psock *psock)sk_psock_drop (sk, psock); } +static inline void sk_psock_data_ready (struct sock *sk,struct sk_psock *psock) +{ +if (psock->parser.enabled) + psock->parser.saved_data_ready (sk); +else + sk->sk_data_ready (sk); +} +static inline void psock_set_prog (struct bpf_prog **pprog,struct bpf_prog *prog) {
net/core/skmsg.c +3 -3
@@ -406,7 +406,7 @@ static int sk_psock_skb_ingress(struct sk_psock *psock, struct sk_buff *skb) msg->skb = skb;sk_psock_queue_msg (psock, msg); - sk->sk_data_ready (sk); +sk_psock_data_ready (sk, psock);return copied; }
@@ -739,7 +739,7 @@ static int sk_psock_strp_parse(struct strparser *strp, struct sk_buff *skb) }/* Called with socket lock held. */ -static void sk_psock_data_ready (struct sock *sk) +static void sk_psock_strp_data_ready (struct sock *sk) {struct sk_psock *psock;
@@ -787,7 +787,7 @@ void sk_psock_start_strp(struct sock *sk, struct sk_psock *psock)return ; parser->saved_data_ready = sk->sk_data_ready; - sk->sk_data_ready = sk_psock_data_ready; + sk->sk_data_ready = sk_psock_strp_data_ready; sk->sk_write_space = sk_psock_write_space; parser->enabled = true; }
net/ipv4/tcp_bpf.c +1 -1
@@ -198,7 +198,7 @@ static int bpf_tcp_ingress(struct sock *sk, struct sk_psock *psock, msg->sg.start = i; msg->sg.size -= apply_bytes;sk_psock_queue_msg (psock, tmp); - sk->sk_data_ready (sk); +sk_psock_data_ready (sk, psock); }else {sk_msg_free (sk, tmp);kfree (tmp);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 243/352 pinctrl: meson: meson8: fix the GPIO function for the GPIOAO pins
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 42f9b48cc5402be11d2364275eb18c257d2a79e8 ]
The GPIOAO pins (as well as the two exotic GPIO_BSD_EN and GPIO_TEST_N) only belong to the pin controller in the AO domain. With the current definition these pins cannot be referred to in .dts files as group (which is possible on GXBB and GXL for example).
Add a separate "gpio_aobus" function to fix the mapping between the pin controller and the GPIO pins in the AO domain. This is similar to how the GXBB and GXL drivers implement this functionality.
--- drivers/pinctrl/meson/pinctrl-meson8.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/pinctrl/meson/pinctrl-meson8.c +3 -0
@@ -807,7 +807,9 @@ static const char * const gpio_groups[] = {"BOOT_5" ,"BOOT_6" ,"BOOT_7" ,"BOOT_8" ,"BOOT_9" ,"BOOT_10" ,"BOOT_11" ,"BOOT_12" ,"BOOT_13" ,"BOOT_14" , "BOOT_15", "BOOT_16", "BOOT_17", "BOOT_18", +}; +static const char *const gpio_aobus_groups[] = {"GPIOAO_0" ,"GPIOAO_1" ,"GPIOAO_2" ,"GPIOAO_3" ,"GPIOAO_4" ,"GPIOAO_5" ,"GPIOAO_6" ,"GPIOAO_7" , "GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
@@ -1030,6 +1032,7 @@ static struct meson_pmx_func meson8_cbus_functions[] = { };static struct meson_pmx_func meson8_aobus_functions[] = { +FUNCTION (gpio_aobus),FUNCTION (uart_ao),FUNCTION (remote),FUNCTION (i2c_slave_ao),
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 244/352 pinctrl: meson: meson8b: fix the GPIO function for the GPIOAO pins
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 2b745ac3cceb8fc1d9985990c8241a821ea97e53 ]
The GPIOAO pins (as well as the two exotic GPIO_BSD_EN and GPIO_TEST_N) only belong to the pin controller in the AO domain. With the current definition these pins cannot be referred to in .dts files as group (which is possible on GXBB and GXL for example).
Add a separate "gpio_aobus" function to fix the mapping between the pin controller and the GPIO pins in the AO domain. This is similar to how the GXBB and GXL drivers implement this functionality.
--- drivers/pinctrl/meson/pinctrl-meson8b.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
drivers/pinctrl/meson/pinctrl-meson8b.c +8 -5
@@ -646,16 +646,18 @@ static const char * const gpio_groups[] = {"BOOT_10" ,"BOOT_11" ,"BOOT_12" ,"BOOT_13" ,"BOOT_14" ,"BOOT_15" ,"BOOT_16" ,"BOOT_17" ,"BOOT_18" , -"GPIOAO_0" ,"GPIOAO_1" ,"GPIOAO_2" ,"GPIOAO_3" , -"GPIOAO_4" ,"GPIOAO_5" ,"GPIOAO_6" ,"GPIOAO_7" , -"GPIOAO_8" ,"GPIOAO_9" ,"GPIOAO_10" ,"GPIOAO_11" , -"GPIOAO_12" ,"GPIOAO_13" ,"GPIO_BSD_EN" ,"GPIO_TEST_N" , -"DIF_0_P" ,"DIF_0_N" ,"DIF_1_P" ,"DIF_1_N" ,"DIF_2_P" ,"DIF_2_N" ,"DIF_3_P" ,"DIF_3_N" ,"DIF_4_P" ,"DIF_4_N" }; +static const char *const gpio_aobus_groups[] = { +"GPIOAO_0" ,"GPIOAO_1" ,"GPIOAO_2" ,"GPIOAO_3" , +"GPIOAO_4" ,"GPIOAO_5" ,"GPIOAO_6" ,"GPIOAO_7" , +"GPIOAO_8" ,"GPIOAO_9" ,"GPIOAO_10" ,"GPIOAO_11" , +"GPIOAO_12" ,"GPIOAO_13" ,"GPIO_BSD_EN" ,"GPIO_TEST_N" +}; +static const char *const sd_a_groups[] = {"sd_d0_a" ,"sd_d1_a" ,"sd_d2_a" ,"sd_d3_a" ,"sd_clk_a" , "sd_cmd_a"
@@ -871,6 +873,7 @@ static struct meson_pmx_func meson8b_cbus_functions[] = { };static struct meson_pmx_func meson8b_aobus_functions[] = { +FUNCTION (gpio_aobus),FUNCTION (uart_ao),FUNCTION (uart_ao_b),FUNCTION (i2c_slave_ao),
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 245/352 KVM: x86: svm: report MSR_IA32_MCG_EXT_CTL as unsupported
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e87555e550cef4941579cd879759a7c0dee24e68 ]
AMD doesn't seem to implement MSR_IA32_MCG_EXT_CTL and svm code in kvm knows nothing about it, however, this MSR is among emulated_msrs and thus returned with KVM_GET_MSR_INDEX_LIST. The consequent KVM_GET_MSRS, of course, fails.
Report the MSR as unsupported to not confuse userspace.
--- arch/x86/kvm/svm.c | 7 +++++++ 1 file changed, 7 insertions(+)
arch/x86/kvm/svm.c +7 -0
@@ -5836,6 +5836,13 @@ static bool svm_cpu_has_accelerated_tpr(void)static bool svm_has_emulated_msr (int index) { +switch (index) { +case MSR_IA32_MCG_EXT_CTL : +return false; +default : +break ; + } +return true; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 246/352 powerpc/fadump: Do not allow hot-remove memory from fadump reserved area.
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0db6896ff6332ba694f1e61b93ae3b2640317633 ]
For fadump to work successfully there should not be any holes in reserved memory ranges where kernel has asked firmware to move the content of old kernel memory in event of crash. Now that fadump uses CMA for reserved area, this memory area is now not protected from hot-remove operations unless it is cma allocated. Hence, fadump service can fail to re-register after the hot-remove operation, if hot-removed memory belongs to fadump reserved region. To avoid this make sure that memory from fadump reserved area is not hot-removable if fadump is registered.
However, if user still wants to remove that memory, he can do so by manually stopping fadump service before hot-remove operation.
--- arch/powerpc/include/asm/fadump.h | 2 +- arch/powerpc/kernel/fadump.c | 10 ++++++++-- arch/powerpc/platforms/pseries/hotplug-memory.c | 7 +++++-- 3 files changed, 14 insertions(+), 5 deletions(-)
arch/powerpc/include/asm/fadump.h +1 -1
@@ -200,7 +200,7 @@ struct fad_crash_memory_ranges {unsigned long long size; }; -extern int is_fadump_boot_memory_area (u64 addr,ulong size); +extern int is_fadump_memory_area (u64 addr,ulong size);extern int early_init_dt_scan_fw_dump (unsigned long node,const char *uname,int depth,void *data);extern int fadump_reserve_mem (void );
arch/powerpc/kernel/fadump.c +8 -2
@@ -118,13 +118,19 @@ int __init early_init_dt_scan_fw_dump(unsigned long node,/* * If fadump is registered, check if the memory provided -* falls within boot memory area. +* falls within boot memory area and reserved memory area. */ -int is_fadump_boot_memory_area (u64 addr,ulong size) +int is_fadump_memory_area (u64 addr,ulong size) { +u64 d_start = fw_dump.reserve_dump_area_start; +u64 d_end = d_start + fw_dump.reserve_dump_area_size; +if (!fw_dump.dump_registered)return 0 ; +if (((addr + size) > d_start) && (addr <= d_end)) +return 1 ; +return (addr + size) >RMA_START && addr <= fw_dump.boot_memory_size; }
arch/powerpc/platforms/pseries/hotplug-memory.c +5 -2
@@ -355,8 +355,11 @@ static bool lmb_is_removable(struct drmem_lmb *lmb) phys_addr = lmb->base_addr;#ifdef CONFIG_FA_DUMP -/* Don't hot-remove memory that falls in fadump boot memory area */ -if (is_fadump_boot_memory_area (phys_addr, block_sz)) +/* +* Don't hot-remove memory that falls in fadump boot memory area +* and memory that is reserved for capturing old kernel memory. +*/ +if (is_fadump_memory_area (phys_addr, block_sz))return false;#endif
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 247/352 selftests: kvm: report failed stage when exit reason is unexpected
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b85c32dd27495075380350fcd5d614a6b45311b8 ]
When we get a report like
==== Test Assertion Failure ====
x86_64/state_test.c:157: run->exit_reason == KVM_EXIT_IO pid=955 tid=955 - Success
1 0x0000000000401350: main at state_test.c:154
2 0x00007fc31c9e9412: ?? ??:0
3 0x000000000040159d: _start at ??:?Unexpected exit reason: 8 (SHUTDOWN),
it is not obvious which particular stage failed. Add the info.
--- tools/testing/selftests/kvm/x86_64/evmcs_test.c | 4 ++-- tools/testing/selftests/kvm/x86_64/state_test.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
tools/testing/selftests/kvm/x86_64/evmcs_test.c +2 -2
@@ -113,8 +113,8 @@ int main(int argc, char *argv[])for (stage =1 ;; stage++) {_vcpu_run (vm,VCPU_ID );TEST_ASSERT (run->exit_reason ==KVM_EXIT_IO , -"Unexpected exit reason: %u (%s),\n" , - run->exit_reason, +"Stage %d: unexpected exit reason: %u (%s),\n" , + stage, run->exit_reason,exit_reason_str (run->exit_reason));memset (®s1,0 ,sizeof (regs1));
tools/testing/selftests/kvm/x86_64/state_test.c +2 -2
@@ -152,8 +152,8 @@ int main(int argc, char *argv[])for (stage =1 ;; stage++) {_vcpu_run (vm,VCPU_ID );TEST_ASSERT (run->exit_reason ==KVM_EXIT_IO , -"Unexpected exit reason: %u (%s),\n" , - run->exit_reason, +"Stage %d: unexpected exit reason: %u (%s),\n" , + stage, run->exit_reason,exit_reason_str (run->exit_reason));memset (®s1,0 ,sizeof (regs1));
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 248/352 kvm: Change offset in kvm_write_guest_offset_cached to unsigned
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 7a86dab8cf2f0fdf508f3555dddfc236623bff60 ]
Since the offset is added directly to the hva from the gfn_to_hva_cache, a negative offset could result in an out of bounds write. The existing BUG_ON only checks for addresses beyond the end of the gfn_to_hva_cache, not for addresses before the start of the gfn_to_hva_cache.
Note that all current call sites have non-negative offsets.
--- include/linux/kvm_host.h | 3 ++- virt/kvm/kvm_main.c | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-)
include/linux/kvm_host.h +2 -1
@@ -694,7 +694,8 @@ int kvm_write_guest(struct kvm *kvm, gpa_t gpa, const void *data,int kvm_write_guest_cached (struct kvm *kvm,struct gfn_to_hva_cache *ghc,void *data,unsigned long len);int kvm_write_guest_offset_cached (struct kvm *kvm,struct gfn_to_hva_cache *ghc, -void *data,int offset,unsigned long len); +void *data,unsigned int offset, +unsigned long len);int kvm_gfn_to_hva_cache_init (struct kvm *kvm,struct gfn_to_hva_cache *ghc,gpa_t gpa,unsigned long len);int kvm_clear_guest_page (struct kvm *kvm,gfn_t gfn,int offset,int len);
virt/kvm/kvm_main.c +2 -1
@@ -1965,7 +1965,8 @@ int kvm_gfn_to_hva_cache_init(struct kvm *kvm, struct gfn_to_hva_cache *ghc,EXPORT_SYMBOL_GPL (kvm_gfn_to_hva_cache_init);int kvm_write_guest_offset_cached (struct kvm *kvm,struct gfn_to_hva_cache *ghc, -void *data,int offset,unsigned long len) +void *data,unsigned int offset, +unsigned long len) {struct kvm_memslots *slots =kvm_memslots (kvm);int r;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 249/352 NFS: nfs_compare_mount_options always compare auth flavors.
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 594d1644cd59447f4fceb592448d5cd09eb09b5e ]
This patch removes the check from nfs_compare_mount_options to see if a `sec' option was passed for the current mount before comparing auth flavors and instead just always compares auth flavors.
Consider the following scenario:
You have a server with the address 192.168.1.1 and two exports /export/a and /export/b. The first export supports sys' and krb5' security, the second just `sys'.
Assume you start with no mounts from the server.
The following results in EIOs being returned as the kernel nfs client incorrectly thinks it can share the underlying `struct nfs_server's:
$ mkdir /tmp/{a,b}
$ sudo mount -t nfs -o vers=3,sec=krb5 192.168.1.1:/export/a /tmp/a
$ sudo mount -t nfs -o vers=3 192.168.1.1:/export/b /tmp/b
$ df >/dev/null
df: ‘/tmp/b’: Input/output error--- fs/nfs/super.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
fs/nfs/super.c +1 -2
@@ -2409,8 +2409,7 @@ static int nfs_compare_mount_options(const struct super_block *s, const struct n goto Ebusy;if (a->acdirmax != b->acdirmax) goto Ebusy; -if (b->auth_info.flavor_len >0 && - clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor) +if (clnt_a->cl_auth->au_flavor != clnt_b->cl_auth->au_flavor) goto Ebusy;return 1 ; Ebusy:
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 250/352 perf build: Dont unconditionally link the libbfd feature test to -liberty and -lz
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 14541b1e7e723859ff2c75c6fc10cdbbec6b8c34 ]
Current libbfd feature test unconditionally links against -liberty and -lz. While it's required on some systems (e.g. opensuse), it's completely unnecessary on the others, where only -lbdf is sufficient (debian). This patch streamlines (and renames) the following feature checks:
feature-libbfd - only link against -lbfd (debian),
see commit 2cf9040714f3 ("perf tools: Fix bfd dependency libraries detection")
feature-libbfd-liberty - link against -lbfd and -liberty
feature-libbfd-liberty-z - link against -lbfd, -liberty and -lz (opensuse),
see commit 280e7c48c3b8 ("perf tools: fix BFD detection on opensuse")
(feature-liberty{,-z} were renamed to feature-libbfd-liberty{,z} for clarity)
The main motivation is to fix this feature test for bpftool which is currently broken on debian (libbfd feature shows OFF, but we still unconditionally link against -lbfd and it works).
Tested on debian with only -lbfd installed (without -liberty); I'd appreciate if somebody on the other systems can test this new detection method.
--- tools/build/Makefile.feature | 4 ++-- tools/build/feature/Makefile | 10 ++++---- tools/perf/Makefile.config | 44 +++++++++++++++++++----------------- 3 files changed, 30 insertions(+), 28 deletions(-)
tools/build/Makefile.feature +2 -2
@@ -80,8 +80,8 @@ FEATURE_TESTS_EXTRA := \ cplus-demangle \ hello \ libbabeltrace \ - liberty \ - liberty-z \ + libbfd-liberty \ + libbfd-liberty-z \ libunwind-debug-frame \ libunwind-debug-frame-arm \ libunwind-debug-frame-aarch64 \
tools/build/feature/Makefile +5 -5
@@ -16,8 +16,8 @@ FILES= \ test-libbfd.bin \ test-disassembler-four-args.bin \ test-reallocarray.bin \ - test-liberty.bin \ - test-liberty-z.bin \ + test-libbfd-liberty.bin \ + test-libbfd-liberty-z.bin \ test-cplus-demangle.bin \ test-libelf.bin \ test-libelf-getphdrnum.bin \
@@ -204,7 +204,7 @@ $(OUTPUT)test-libpython-version.bin: $(BUILD) $(OUTPUT)test-libbfd.bin: - $(BUILD) -DPACKAGE='"perf"' -lbfd -lz -liberty -ldl + $(BUILD) -DPACKAGE='"perf"' -lbfd -ldl $(OUTPUT)test-disassembler-four-args.bin: $(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes
@@ -212,10 +212,10 @@ $(OUTPUT)test-disassembler-four-args.bin: $(OUTPUT)test-reallocarray.bin: $(BUILD) -$(OUTPUT)test-liberty.bin: +$(OUTPUT)test-libbfd-liberty.bin: $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c -DPACKAGE='"perf"' $(LDFLAGS) -lbfd -ldl -liberty -$(OUTPUT)test-liberty-z.bin: +$(OUTPUT)test-libbfd-liberty-z.bin: $(CC) $(CFLAGS) -Wall -Werror -o $@ test-libbfd.c -DPACKAGE='"perf"' $(LDFLAGS) -lbfd -ldl -liberty -lz $(OUTPUT)test-cplus-demangle.bin:
tools/perf/Makefile.config +23 -21
65 lines not on this page · raw message
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 251/352 hwmon: (lm80) fix a missing check of the status of SMBus read
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit c9c63915519b1def7043b184680f33c24cd49d7b ]
If lm80_read_value() fails, it returns a negative number instead of the correct read data. Therefore, we should avoid using the data if it fails.
The fix checks if lm80_read_value() fails, and if so, returns with the error number.
--- drivers/hwmon/lm80.c | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-)
drivers/hwmon/lm80.c +10 -5
@@ -360,9 +360,11 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,struct i2c_client *client = data->client;unsigned long min, val;u8 reg; -int err =kstrtoul (buf,10 , &val); -if (err <0 ) -return err; +int rv; + + rv =kstrtoul (buf,10 , &val); +if (rv <0 ) +return rv;/* Save fan_min */ mutex_lock (&data->update_lock);
@@ -390,8 +392,11 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,return -EINVAL ; } - reg = (lm80_read_value (client,LM80_REG_FANDIV ) & - ~(3 << (2 * (nr +1 )))) | (data->fan_div[nr] << (2 * (nr +1 ))); + rv =lm80_read_value (client,LM80_REG_FANDIV ); +if (rv <0 ) +return rv; + reg = (rv & ~(3 << (2 * (nr +1 )))) + | (data->fan_div[nr] << (2 * (nr +1 )));lm80_write_value (client,LM80_REG_FANDIV , reg);/* Restore fan_min */
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 252/352 hwmon: (lm80) fix a missing check of bus read in lm80 probe
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9aa3aa15f4c2f74f47afd6c5db4b420fadf3f315 ]
In lm80_probe(), if lm80_read_value() fails, it returns a negative error number which is stored to data->fan[f_min] and will be further used. We should avoid using the data if the read fails.
The fix checks if lm80_read_value() fails, and if so, returns with the error number.
--- drivers/hwmon/lm80.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/hwmon/lm80.c +9 -2
@@ -628,6 +628,7 @@ static int lm80_probe(struct i2c_client *client,struct device *dev = &client->dev;struct device *hwmon_dev;struct lm80_data *data; +int rv; data =devm_kzalloc (dev,sizeof (struct lm80_data ),GFP_KERNEL );if (!data)
@@ -640,8 +641,14 @@ static int lm80_probe(struct i2c_client *client,lm80_init_client (client);/* A few vars need to be filled upon startup */ - data->fan[f_min][0 ] =lm80_read_value (client,LM80_REG_FAN_MIN (1 )); - data->fan[f_min][1 ] =lm80_read_value (client,LM80_REG_FAN_MIN (2 )); + rv =lm80_read_value (client,LM80_REG_FAN_MIN (1 )); +if (rv <0 ) +return rv; + data->fan[f_min][0 ] = rv; + rv =lm80_read_value (client,LM80_REG_FAN_MIN (2 )); +if (rv <0 ) +return rv; + data->fan[f_min][1 ] = rv; hwmon_dev =devm_hwmon_device_register_with_groups (dev, client->name, data, lm80_groups);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 253/352 seq_buf: Make seq_buf_puts() null-terminate the buffer
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0464ed24380905d640030d368cd84a4e4d1e15e2 ]
Currently seq_buf_puts() will happily create a non null-terminated string for you in the buffer. This is particularly dangerous if the buffer is on the stack.
For example:
char buf[8];
char secret = "secret";
struct seq_buf s;
seq_buf_init(&s, buf, sizeof(buf));
seq_buf_puts(&s, "foo");
printk("Message is %s\n", buf);Can result in:
Message is fooªªªªªsecret
We could require all users to memset() their buffer to zero before use. But that seems likely to be forgotten and lead to bugs.
Instead we can change seq_buf_puts() to always leave the buffer in a null-terminated state.
The only downside is that this makes the buffer 1 character smaller for seq_buf_puts(), but that seems like a good trade off.
--- lib/seq_buf.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
lib/seq_buf.c +5 -1
@@ -144,9 +144,13 @@ int seq_buf_puts(struct seq_buf *s, const char *str)WARN_ON (s->size ==0 ); +/* Add 1 to len for the trailing null byte which must be there */ + len +=1 ; +if (seq_buf_can_fit (s, len)) {memcpy (s->buffer + s->len, str, len); - s->len += len; +/* Don't count the trailing null byte against the capacity */ + s->len += len -1 ;return 0 ; }seq_buf_set_overflow (s);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 254/352 crypto: ux500 - Use proper enum in cryp_set_dma_transfer
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9d880c5945c748d8edcac30965f3349a602158c4 ]
Clang warns when one enumerated type is implicitly converted to another:
drivers/crypto/ux500/cryp/cryp_core.c:559:5: warning: implicit conversion from enumeration type 'enum dma_data_direction' to different enumeration type 'enum dma_transfer_direction' [-Wenum-conversion]
direction, DMA_CTRL_ACK);
^~~~~~~~~
drivers/crypto/ux500/cryp/cryp_core.c:583:5: warning: implicit
conversion from enumeration type 'enum dma_data_direction' to different
enumeration type 'enum dma_transfer_direction' [-Wenum-conversion]
direction,
^~~~~~~~~2 warnings generated.
dmaengine_prep_slave_sg expects an enum from dma_transfer_direction. Because we know the value of the dma_data_direction enum from the switch statement, we can just use the proper value from dma_transfer_direction so there is no more conversion.
DMA_TO_DEVICE = DMA_MEM_TO_DEV = 1DMA_FROM_DEVICE = DMA_DEV_TO_MEM = 2
--- drivers/crypto/ux500/cryp/cryp_core.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/crypto/ux500/cryp/cryp_core.c +2 -2
@@ -556,7 +556,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx, desc =dmaengine_prep_slave_sg (channel, ctx->device->dma.sg_src, ctx->device->dma.sg_src_len, - direction,DMA_CTRL_ACK ); +DMA_MEM_TO_DEV ,DMA_CTRL_ACK );break ;case DMA_FROM_DEVICE :
@@ -580,7 +580,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx, desc =dmaengine_prep_slave_sg (channel, ctx->device->dma.sg_dst, ctx->device->dma.sg_dst_len, - direction, +DMA_DEV_TO_MEM ,DMA_CTRL_ACK |DMA_PREP_INTERRUPT );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 255/352 crypto: ux500 - Use proper enum in hash_set_dma_transfer
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 5ac93f808338f4dd465402e91869702eb87db241 ]
Clang warns when one enumerated type is implicitly converted to another:
drivers/crypto/ux500/hash/hash_core.c:169:4: warning: implicit conversion from enumeration type 'enum dma_data_direction' to different enumeration type 'enum dma_transfer_direction' [-Wenum-conversion]
direction, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
^~~~~~~~~1 warning generated.
dmaengine_prep_slave_sg expects an enum from dma_transfer_direction. We know that the only direction supported by this function is DMA_TO_DEVICE because of the check at the top of this function so we can just use the equivalent value from dma_transfer_direction.
DMA_TO_DEVICE = DMA_MEM_TO_DEV = 1
--- drivers/crypto/ux500/hash/hash_core.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/crypto/ux500/hash/hash_core.c +1 -1
@@ -166,7 +166,7 @@ static int hash_set_dma_transfer(struct hash_ctx *ctx, struct scatterlist *sg, __func__); desc =dmaengine_prep_slave_sg (channel, ctx->device->dma.sg, ctx->device->dma.sg_len, - direction,DMA_CTRL_ACK |DMA_PREP_INTERRUPT ); +DMA_MEM_TO_DEV ,DMA_CTRL_ACK |DMA_PREP_INTERRUPT );if (!desc) {dev_err (ctx->device->dev,"%s: dmaengine_prep_slave_sg() failed!\n" , __func__);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 256/352 MIPS: ralink: Select CONFIG_CPU_MIPSR2_IRQ_VI on MT7620/8
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0b15394475e3bcaf35ca4bf22fc55d56df67224e ]
Testing has shown, that when using mainline U-Boot on MT7688 based boards, the system may hang or crash while mounting the root-fs. The main issue here is that mainline U-Boot configures EBase to a value near the end of system memory. And with CONFIG_CPU_MIPSR2_IRQ_VI disabled, trap_init() will not allocate a new area to place the exception handler. The original value will be used and the handler will be copied to this location, which might already be used by some userspace application.
The MT7688 supports VI - its config3 register is 0x00002420, so VInt (Bit 5) is set. But without setting CONFIG_CPU_MIPSR2_IRQ_VI this bit will not be evaluated to result in "cpu_has_vi" being set. This patch now selects CONFIG_CPU_MIPSR2_IRQ_VI on MT7620/8 which results trap_init() to allocate some memory for the exception handler.
Please note that this issue was not seen with the Mediatek U-Boot version, as it does not touch EBase (stays at default of 0x8000.0000). This is strictly also not correct as the kernel (_text) resides here.
--- arch/mips/ralink/Kconfig | 1 + 1 file changed, 1 insertion(+)
arch/mips/ralink/Kconfig +1 -0
@@ -38,6 +38,7 @@ choice config SOC_MT7620 bool "MT7620/8" + select CPU_MIPSR2_IRQ_VI select HW_HAS_PCI config SOC_MT7621
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 257/352 cifs: check ntwrk_buf_start for NULL before dereferencing it
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 59a63e479ce36a3f24444c3a36efe82b78e4a8e0 ]
RHBZ: 1021460
There is an issue where when multiple threads open/close the same directory ntwrk_buf_start might end up being NULL, causing the call to smbCalcSize later to oops with a NULL deref.
The real bug is why this happens and why this can become NULL for an open cfile, which should not be allowed.
This patch tries to avoid a oops until the time when we fix the underlying issue.
--- fs/cifs/readdir.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
fs/cifs/readdir.c +8 -1
@@ -655,7 +655,14 @@ find_cifs_entry(const unsigned int xid, struct cifs_tcon *tcon, loff_t pos,/* scan and find it */ int i;char *cur_ent; -char *end_of_smb = cfile->srch_inf.ntwrk_buf_start + +char *end_of_smb; + +if (cfile->srch_inf.ntwrk_buf_start ==NULL ) { +cifs_dbg (VFS ,"ntwrk_buf_start is NULL during readdir\n" ); +return -EIO ; + } + + end_of_smb = cfile->srch_inf.ntwrk_buf_start + server->ops->calc_smb_size ( cfile->srch_inf.ntwrk_buf_start, server);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 258/352 f2fs: fix use-after-free issue when accessing sbi->stat_info
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 60aa4d5536ab7fe32433ca1173bd9d6633851f27 ]
iput() on sbi->node_inode can update sbi->stat_info in the below context, if the f2fs_write_checkpoint() has failed with error.
f2fs_balance_fs_bg+0x1ac/0x1ec f2fs_write_node_pages+0x4c/0x260 do_writepages+0x80/0xbc __writeback_single_inode+0xdc/0x4ac writeback_single_inode+0x9c/0x144 write_inode_now+0xc4/0xec iput+0x194/0x22c f2fs_put_super+0x11c/0x1e8 generic_shutdown_super+0x70/0xf4 kill_block_super+0x2c/0x5c kill_f2fs_super+0x44/0x50 deactivate_locked_super+0x60/0x8c deactivate_super+0x68/0x74 cleanup_mnt+0x40/0x78
Fix this by moving f2fs_destroy_stats() further below iput() in both f2fs_put_super() and f2fs_fill_super() paths.
--- fs/f2fs/super.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-)
fs/f2fs/super.c +15 -12
@@ -1058,9 +1058,6 @@ static void f2fs_put_super(struct super_block *sb)f2fs_write_checkpoint (sbi, &cpc); } -/* f2fs_write_checkpoint can update stat informaion */ -f2fs_destroy_stats (sbi); -/* * normally superblock is clean, so we need to release this. * In addition, EIO will skip do checkpoint, we need this as well.
@@ -1080,6 +1077,12 @@ static void f2fs_put_super(struct super_block *sb)iput (sbi->node_inode);iput (sbi->meta_inode); +/* +* iput() can update stat information, if f2fs_write_checkpoint() +* above failed with error. +*/ +f2fs_destroy_stats (sbi); +/* destroy f2fs internal modules */ f2fs_destroy_node_manager (sbi);f2fs_destroy_segment_manager (sbi);
@@ -3256,30 +3259,30 @@ try_onemore:f2fs_build_gc_manager (sbi); + err =f2fs_build_stats (sbi); +if (err) + goto free_nm; +/* get an inode for node space */ sbi->node_inode =f2fs_iget (sb,F2FS_NODE_INO (sbi));if (IS_ERR (sbi->node_inode)) {f2fs_msg (sb,KERN_ERR ,"Failed to read node inode" ); err =PTR_ERR (sbi->node_inode); - goto free_nm; + goto free_stats; } - err =f2fs_build_stats (sbi); -if (err) - goto free_node_inode; -/* read root inode and dentry */ root =f2fs_iget (sb,F2FS_ROOT_INO (sbi));if (IS_ERR (root)) {f2fs_msg (sb,KERN_ERR ,"Failed to read root inode" ); err =PTR_ERR (root); - goto free_stats; + goto free_node_inode; }if (!S_ISDIR (root->i_mode) || !root->i_blocks || !root->i_size || !root->i_nlink) {iput (root); err = -EINVAL ; - goto free_stats; + goto free_node_inode; } sb->s_root =d_make_root (root);/* allocate root dentry */
@@ -3403,12 +3406,12 @@ free_meta: free_root_inode:dput (sb->s_root); sb->s_root =NULL ; -free_stats: -f2fs_destroy_stats (sbi); free_node_inode:f2fs_release_ino_entry (sbi, true);truncate_inode_pages_final (NODE_MAPPING (sbi));iput (sbi->node_inode); +free_stats: +f2fs_destroy_stats (sbi); free_nm:f2fs_destroy_node_manager (sbi); free_sm:
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 259/352 um: Avoid marking pages with "changed protection"
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8892d8545f2d0342b9c550defbfb165db237044b ]
Changing protection is a very high cost operation in UML because in addition to an extra syscall it also interrupts mmap merge sequences generated by the tlb.
While the condition is not particularly common it is worth avoiding.
--- arch/um/include/asm/pgtable.h | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
arch/um/include/asm/pgtable.h +8 -1
@@ -197,12 +197,17 @@ static inline pte_t pte_mkold(pte_t pte)static inline pte_t pte_wrprotect (pte_t pte) { -pte_clear_bits (pte, _PAGE_RW); +if (likely (pte_get_bits (pte, _PAGE_RW))) +pte_clear_bits (pte, _PAGE_RW); +else +return pte;return (pte_mknewprot (pte)); }static inline pte_t pte_mkread (pte_t pte) { +if (unlikely (pte_get_bits (pte, _PAGE_USER))) +return pte;pte_set_bits (pte, _PAGE_USER);return (pte_mknewprot (pte)); }
@@ -221,6 +226,8 @@ static inline pte_t pte_mkyoung(pte_t pte)static inline pte_t pte_mkwrite (pte_t pte) { +if (unlikely (pte_get_bits (pte, _PAGE_RW))) +return pte;pte_set_bits (pte, _PAGE_RW);return (pte_mknewprot (pte)); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 260/352 niu: fix missing checks of niu_pci_eeprom_read
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 26fd962bde0b15e54234fe762d86bc0349df1de4 ]
niu_pci_eeprom_read() may fail, so we should check its return value before using the read data.
--- drivers/net/ethernet/sun/niu.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/net/ethernet/sun/niu.c +8 -2
@@ -8100,6 +8100,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end) start +=3 ; prop_len =niu_pci_eeprom_read (np, start +4 ); +if (prop_len <0 ) +return prop_len; err =niu_pci_vpd_get_propname (np, start +5 , namebuf,64 );if (err <0 )return err;
@@ -8144,8 +8146,12 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)netif_printk (np, probe,KERN_DEBUG , np->dev,"VPD_SCAN: Reading in property [%s] len[%d]\n" , namebuf, prop_len); -for (i =0 ; i < prop_len; i++) - *prop_buf++ =niu_pci_eeprom_read (np, off + i); +for (i =0 ; i < prop_len; i++) { + err =niu_pci_eeprom_read (np, off + i); +if (err >=0 ) + *prop_buf = err; + ++prop_buf; + } } start += len;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 261/352 f2fs: fix sbi->extent_list corruption issue
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e4589fa545e0020dbbc3c9bde35f35f949901392 ]
When there is a failure in f2fs_fill_super() after/during the recovery of fsync'd nodes, it frees the current sbi and retries again. This time the mount is successful, but the files that got recovered before retry, still holds the extent tree, whose extent nodes list is corrupted since sbi and sbi->extent_list is freed up. The list_del corruption issue is observed when the file system is getting unmounted and when those recoverd files extent node is being freed up in the below context.
list_del corruption. prev->next should be fffffff1e1ef5480, but was (null) <...>
kernel BUG at kernel/msm-4.14/lib/list_debug.c:53!
lr : __list_del_entry_valid+0x94/0xb4 pc : __list_del_entry_valid+0x94/0xb4 <...> Call trace: __list_del_entry_valid+0x94/0xb4 __release_extent_node+0xb0/0x114 __free_extent_tree+0x58/0x7c f2fs_shrink_extent_tree+0xdc/0x3b0 f2fs_leave_shrinker+0x28/0x7c f2fs_put_super+0xfc/0x1e0 generic_shutdown_super+0x70/0xf4 kill_block_super+0x2c/0x5c kill_f2fs_super+0x44/0x50 deactivate_locked_super+0x60/0x8c deactivate_super+0x68/0x74 cleanup_mnt+0x40/0x78 __cleanup_mnt+0x1c/0x28 task_work_run+0x48/0xd0 do_notify_resume+0x678/0xe98 work_pending+0x8/0x14
Fix this by not creating extents for those recovered files if shrinker is not registered yet. Once mount is successful and shrinker is registered, those files can have extents again.
--- fs/f2fs/f2fs.h | 11 ++++++++++- fs/f2fs/shrinker.c | 2 +- 2 files changed, 11 insertions(+), 2 deletions(-)
fs/f2fs/f2fs.h +10 -1
@@ -2673,10 +2673,19 @@ static inline bool is_dot_dotdot(const struct qstr *str)static inline bool f2fs_may_extent_tree (struct inode *inode) { -if (!test_opt (F2FS_I_SB (inode),EXTENT_CACHE ) || +struct f2fs_sb_info *sbi =F2FS_I_SB (inode); + +if (!test_opt (sbi,EXTENT_CACHE ) ||is_inode_flag_set (inode,FI_NO_EXTENT ))return false; +/* +* for recovered files during mount do not create extents +* if shrinker is not registered. +*/ +if (list_empty (&sbi->s_list)) +return false; +return S_ISREG (inode->i_mode); }
fs/f2fs/shrinker.c +1 -1
@@ -135,6 +135,6 @@ void f2fs_leave_shrinker(struct f2fs_sb_info *sbi)f2fs_shrink_extent_tree (sbi,__count_extent_cache (sbi));spin_lock (&f2fs_list_lock); -list_del (&sbi->s_list); +list_del_init (&sbi->s_list);spin_unlock (&f2fs_list_lock); }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 262/352 cgroup: fix parsing empty mount option string
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit e250d91d65750a0c0c62483ac4f9f357e7317617 ]
This fixes the case where all mount options specified are consumed by an LSM and all that's left is an empty string. In this case cgroupfs should accept the string and not fail.
How to reproduce (with SELinux enabled):
# umount /sys/fs/cgroup/unified
# mount -o context=system_u:object_r:cgroup_t:s0 -t cgroup2 cgroup2 /sys/fs/cgroup/unified
mount: /sys/fs/cgroup/unified: wrong fs type, bad option, bad superblock on cgroup2, missing codepage or helper program, or other error.
# dmesg | tail -n 1
[ 31.575952] cgroup: cgroup2: unknown option ""--- kernel/cgroup/cgroup.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/cgroup/cgroup.c +1 -1
@@ -1744,7 +1744,7 @@ static int parse_cgroup_root_flags(char *data, unsigned int *root_flags) *root_flags =0 ; -if (!data) +if (!data || *data =='\0' )return 0 ;while ((token =strsep (&data,"," )) !=NULL ) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 263/352 perf python: Do not force closing original perf descriptor in evlist.get_pollfd()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit a389aece97938966616ce0336466b98b0351ef10 ]
Ondřej reported that when compiled with python3, the python extension regresses in evlist.get_pollfd function behaviour.
The evlist.get_pollfd function creates file objects from evlist's fds and returns them in a list. The python3 version also sets them to 'close the original descriptor' when the object dies (is closed), by passing True via the 'closefd' arg in the PyFile_FromFd call.
The python's closefd doc says:
If closefd is False, the underlying file descriptor will be kept open when the file is closed.
That's why the following line in python3 closes all evlist fds:
evlist.get_pollfd()
the returned list is immediately destroyed and that takes down the original events fds.
Passing closefd as False to PyFile_FromFd to fix this.
--- tools/perf/util/python.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/util/python.c +2 -1
@@ -939,7 +939,8 @@ static PyObject *pyrf_evlist__get_pollfd(struct pyrf_evlist *pevlist, file =PyFile_FromFile (fp,"perf" ,"r" ,NULL );#else - file =PyFile_FromFd (evlist->pollfd.entries[i].fd,"perf" ,"r" ,-1 ,NULL ,NULL ,NULL ,1 ); + file =PyFile_FromFd (evlist->pollfd.entries[i].fd,"perf" ,"r" ,-1 , +NULL ,NULL ,NULL ,0 );#endif if (file ==NULL ) goto free_list;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 264/352 scripts/decode_stacktrace: only strip base path when a prefix of the path
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 67a28de47faa83585dd644bd4c31e5a1d9346c50 ]
Running something like:
decodecode vmlinux .
leads to interested results where not only the leading "." gets stripped from the displayed paths, but also anywhere in the string, displaying something like:
kvm_vcpu_check_block (arch/arm64/kvm/virt/kvm/kvm_mainc:2141)
which doesn't help further processing.
Fix it by only stripping the base path if it is a prefix of the path.
--- scripts/decode_stacktrace.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/decode_stacktrace.sh +1 -1
@@ -78,7 +78,7 @@ parse_symbol() { fi # Strip out the base of the path - code=${code//$basepath/""} + code=${code//^$basepath/""} # In the case of inlines, move everything to same line code=${code//$'\n'/' '}
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 265/352 arch/sh/boards/mach-kfr2r09/setup.c: fix struct mtd_oob_ops build warning
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 440e7b379f91acd245d5c8de94d533f40f5dffb3 ]
arch/sh/boards/mach-kfr2r09/setup.c does not need to #include <mtd/onenand.h>, and doing so causes a build warning, so drop that header file.
In file included from ../arch/sh/boards/mach-kfr2r09/setup.c:28:../include/linux/mtd/onenand.h:225:12: warning: 'struct mtd_oob_ops' declared inside parameter list will not be visible outside of this definition or declaration
struct mtd_oob_ops *ops);
--- arch/sh/boards/mach-kfr2r09/setup.c | 1 - 1 file changed, 1 deletion(-)
arch/sh/boards/mach-kfr2r09/setup.c +0 -1
@@ -25,7 +25,6 @@#include <linux/memblock.h> #include <linux/mfd/tmio.h> #include <linux/mmc/host.h> -#include <linux/mtd/onenand.h> #include <linux/mtd/physmap.h> #include <linux/platform_data/lv5207lp.h> #include <linux/platform_device.h>
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 266/352 ocfs2: dont clear bh uptodate for block read
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 70306d9dce75abde855cefaf32b3f71eed8602a3 ]
For sync io read in ocfs2_read_blocks_sync(), first clear bh uptodate flag and submit the io, second wait io done, last check whether bh uptodate, if not return io error.
If two sync io for the same bh were issued, it could be the first io done and set uptodate flag, but just before check that flag, the second io came in and cleared uptodate, then ocfs2_read_blocks_sync() for the first io will return IO error.
Indeed it's not necessary to clear uptodate flag, as the io end handler end_buffer_read_sync() will set or clear it based on io succeed or failed.
The following message was found from a nfs server but the underlying storage returned no error.
[4106438.567376] (nfsd,7146,3):ocfs2_get_suballoc_slot_bit:2780 ERROR: read block 1238823695 failed -5 [4106438.567569] (nfsd,7146,3):ocfs2_get_suballoc_slot_bit:2812 ERROR: status = -5 [4106438.567611] (nfsd,7146,3):ocfs2_test_inode_bit:2894 ERROR: get alloc slot and bit failed -5 [4106438.567643] (nfsd,7146,3):ocfs2_test_inode_bit:2932 ERROR: status = -5 [4106438.567675] (nfsd,7146,3):ocfs2_get_dentry:94 ERROR: test inode bit failed -5
Same issue in non sync read ocfs2_read_blocks(), fixed it as well.
--- fs/ocfs2/buffer_head_io.c | 2 -- 1 file changed, 2 deletions(-)
fs/ocfs2/buffer_head_io.c +0 -2
@@ -161,7 +161,6 @@ int ocfs2_read_blocks_sync(struct ocfs2_super *osb, u64 block,#endif } -clear_buffer_uptodate (bh);get_bh (bh);/* for end_buffer_read_sync() */ bh->b_end_io = end_buffer_read_sync;submit_bh (REQ_OP_READ ,0 , bh);
@@ -341,7 +340,6 @@ int ocfs2_read_blocks(struct ocfs2_caching_info *ci, u64 block, int nr,continue ; } -clear_buffer_uptodate (bh);get_bh (bh);/* for end_buffer_read_sync() */ if (validate)set_buffer_needs_validate (bh);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 267/352 ocfs2: improve ocfs2 Makefile
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9e6aea22802b5684c7e1d69822aeb0844dd01953 ]
Included file path was hard-wired in the ocfs2 makefile, which might causes some confusion when compiling ocfs2 as an external module.
Say if we compile ocfs2 module as following.
cp -r /kernel/tree/fs/ocfs2 /other/dir/ocfs2
cd /other/dir/ocfs2
make -C /path/to/kernel_source M=pwd modules
Acutally, the compiler wil try to find included file in /kernel/tree/fs/ocfs2, rather than the directory /other/dir/ocfs2.
To fix this little bug, we introduce the var $(src) provided by kbuild. $(src) means the absolute path of the running kbuild file.
--- fs/ocfs2/Makefile | 2 +- fs/ocfs2/dlm/Makefile | 2 +- fs/ocfs2/dlmfs/Makefile | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
fs/ocfs2/Makefile +1 -1
@@ -1,5 +1,5 @@ # SPDX-License-Identifier: GPL-2.0 -ccflags-y := -Ifs/ocfs2 +ccflags-y := -I$(src) obj-$(CONFIG_OCFS2_FS) += \ ocfs2.o \
fs/ocfs2/dlm/Makefile +1 -1
@@ -1,4 +1,4 @@ -ccflags-y := -Ifs/ocfs2 +ccflags-y := -I$(src)/.. obj-$(CONFIG_OCFS2_FS_O2CB) += ocfs2_dlm.o
fs/ocfs2/dlmfs/Makefile +1 -1
@@ -1,4 +1,4 @@ -ccflags-y := -Ifs/ocfs2 +ccflags-y := -I$(src)/.. obj-$(CONFIG_OCFS2_FS) += ocfs2_dlmfs.o
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 268/352 mm/page_alloc.c: dont call kasan_free_pages() at deferred mem init
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3c0c12cc8f00ca5f81acb010023b8eb13e9a7004 ]
When CONFIG_KASAN is enabled on large memory SMP systems, the deferrred pages initialization can take a long time. Below were the reported init times on a 8-socket 96-core 4TB IvyBridge system.
1) Non-debug kernel without CONFIG_KASAN
[ 8.764222] node 1 initialised, 132086516 pages in 7027ms
2) Debug kernel with CONFIG_KASAN
[ 146.288115] node 1 initialised, 132075466 pages in 143052ms
So the page init time in a debug kernel was 20X of the non-debug kernel. The long init time can be problematic as the page initialization is done with interrupt disabled. In this particular case, it caused the appearance of following warning messages as well as NMI backtraces of all the cores that were doing the initialization.
[ 68.240049] rcu: INFO: rcu_sched detected stalls on CPUs/tasks: [ 68.241000] rcu: 25-...0: (100 ticks this GP) idle=b72/1/0x4000000000000000 softirq=915/915 fqs=16252 [ 68.241000] rcu: 44-...0: (95 ticks this GP) idle=49a/1/0x4000000000000000 softirq=788/788 fqs=16253 [ 68.241000] rcu: 54-...0: (104 ticks this GP) idle=03a/1/0x4000000000000000 softirq=721/825 fqs=16253 [ 68.241000] rcu: 60-...0: (103 ticks this GP) idle=cbe/1/0x4000000000000000 softirq=637/740 fqs=16253 [ 68.241000] rcu: 72-...0: (105 ticks this GP) idle=786/1/0x4000000000000000 softirq=536/641 fqs=16253 [ 68.241000] rcu: 84-...0: (99 ticks this GP) idle=292/1/0x4000000000000000 softirq=537/537 fqs=16253 [ 68.241000] rcu: 111-...0: (104 ticks this GP) idle=bde/1/0x4000000000000000 softirq=474/476 fqs=16253 [ 68.241000] rcu: (detected by 13, t=65018 jiffies, g=249, q=2)
The long init time was mainly caused by the call to kasan_free_pages() to poison the newly initialized pages. On a 4TB system, we are talking about almost 500GB of memory probably on the same node.
In reality, we may not need to poison the newly initialized pages before they are ever allocated. So KASAN poisoning of freed pages before the completion of deferred memory initialization is now disabled. Those pages will be properly poisoned when they are allocated or freed after deferred pages initialization is done.
With this change, the new page initialization time became:
[ 21.948010] node 1 initialised, 132075466 pages in 18702ms
This was still about double the non-debug kernel time, but was much better than before.
--- mm/page_alloc.c | 37 +++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-)
mm/page_alloc.c +29 -8
@@ -294,6 +294,32 @@ EXPORT_SYMBOL(nr_online_nodes);int page_group_by_mobility_disabled__read_mostly ;#ifdef CONFIG_DEFERRED_STRUCT_PAGE_INIT +/* +* During boot we initialize deferred pages on-demand, as needed, but once +* page_alloc_init_late() has finished, the deferred pages are all initialized, +* and we can permanently disable that path. +*/ +static DEFINE_STATIC_KEY_TRUE (deferred_pages); + +/* +* Calling kasan_free_pages() only after deferred memory initialization +* has completed. Poisoning pages during deferred memory init will greatly +* lengthen the process and cause problem in large memory systems as the +* deferred pages initialization is done with interrupt disabled. +* +* Assuming that there will be no reference to those newly initialized +* pages before they are ever allocated, this should have no effect on +* KASAN memory tracking as the poison will be properly inserted at page +* allocation time. The only corner case is when pages are allocated by +* on-demand allocation and then freed again before the deferred pages +* initialization is done, but this is not likely to happen. +*/ +static inline void kasan_free_nondeferred_pages (struct page *page,int order) +{ +if (!static_branch_unlikely (&deferred_pages)) +kasan_free_pages (page, order); +} +/* Returns true if the struct page for the pfn is uninitialised */ static inline bool __meminit early_page_uninitialised (unsigned long pfn) {
@@ -335,6 +361,8 @@ defer_init(int nid, unsigned long pfn, unsigned long end_pfn) return false; }#else +#define kasan_free_nondeferred_pages (p, o) kasan_free_pages(p, o) +static inline bool early_page_uninitialised (unsigned long pfn) {return false;
@@ -1037,7 +1065,7 @@ static __always_inline bool free_pages_prepare(struct page *page,arch_free_page (page, order);kernel_poison_pages (page,1 << order,0 );kernel_map_pages (page,1 << order,0 ); -kasan_free_pages (page, order); +kasan_free_nondeferred_pages (page, order);return true; }
@@ -1605,13 +1633,6 @@ static int __init deferred_init_memmap(void *data)return 0 ; } -/* -* During boot we initialize deferred pages on-demand, as needed, but once -* page_alloc_init_late() has finished, the deferred pages are all initialized, -* and we can permanently disable that path. -*/ -static DEFINE_STATIC_KEY_TRUE (deferred_pages); -/* * If this zone has deferred pages, try to grow it by initializing enough * deferred pages to satisfy the allocation specified by order, rounded up to
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 269/352 zram: fix lockdep warning of free block handling
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 3c9959e025472122a61faebb208525cf26b305d1 ]
Patch series "zram idle page writeback", v3.
Inherently, swap device has many idle pages which are rare touched since it was allocated. It is never problem if we use storage device as swap. However, it's just waste for zram-swap.
This patchset supports zram idle page writeback feature.
* Admin can define what is idle page "no access since X time ago"
* Admin can define when zram should writeback them
* Admin can define when zram should stop writeback to prevent wearout
Details are in each patch's description.
This patch (of 7):
================================
WARNING: inconsistent lock state
4.19.0+ #390 Not tainted
--------------------------------
inconsistent {SOFTIRQ-ON-W} -> {IN-SOFTIRQ-W} usage.
zram_verify/2095 [HC0[0]:SC1[1]:HE1:SE0] takes:
00000000b1828693 (&(&zram->bitmap_lock)->rlock){+.?.}, at: put_entry_bdev+0x1e/0x50 {SOFTIRQ-ON-W} state was registered at:
_raw_spin_lock+0x2c/0x40
zram_make_request+0x755/0xdc9
generic_make_request+0x373/0x6a0
submit_bio+0x6c/0x140
__swap_writepage+0x3a8/0x480
shrink_page_list+0x1102/0x1a60
shrink_inactive_list+0x21b/0x3f0
shrink_node_memcg.constprop.99+0x4f8/0x7e0
shrink_node+0x7d/0x2f0
do_try_to_free_pages+0xe0/0x300
try_to_free_pages+0x116/0x2b0
__alloc_pages_slowpath+0x3f4/0xf80
__alloc_pages_nodemask+0x2a2/0x2f0
__handle_mm_fault+0x42e/0xb50
handle_mm_fault+0x55/0xb0
__do_page_fault+0x235/0x4b0
page_fault+0x1e/0x30
irq event stamp: 228412
hardirqs last enabled at (228412): [<ffffffff98245846>] __slab_free+0x3e6/0x600
hardirqs last disabled at (228411): [<ffffffff98245625>] __slab_free+0x1c5/0x600
softirqs last enabled at (228396): [<ffffffff98e0031e>] __do_softirq+0x31e/0x427
softirqs last disabled at (228403): [<ffffffff98072051>] irq_exit+0xd1/0xe0other info that might help us debug this:
Possible unsafe locking scenario:
CPU0
----
lock(&(&zram->bitmap_lock)->rlock);
<Interrupt>
lock(&(&zram->bitmap_lock)->rlock);*** DEADLOCK ***
no locks held by zram_verify/2095.
stack backtrace: CPU: 5 PID: 2095 Comm: zram_verify Not tainted 4.19.0+ #390 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-1 04/01/2014 Call Trace: <IRQ> dump_stack+0x67/0x9b print_usage_bug+0x1bd/0x1d3 mark_lock+0x4aa/0x540 __lock_acquire+0x51d/0x1300 lock_acquire+0x90/0x180 _raw_spin_lock+0x2c/0x40 put_entry_bdev+0x1e/0x50 zram_free_page+0xf6/0x110 zram_slot_free_notify+0x42/0xa0 end_swap_bio_read+0x5b/0x170 blk_update_request+0x8f/0x340 scsi_end_request+0x2c/0x1e0 scsi_io_completion+0x98/0x650 blk_done_softirq+0x9e/0xd0 __do_softirq+0xcc/0x427 irq_exit+0xd1/0xe0 do_IRQ+0x93/0x120 common_interrupt+0xf/0xf </IRQ>
With writeback feature, zram_slot_free_notify could be called in softirq context by end_swap_bio_read. However, bitmap_lock is not aware of that so lockdep yell out:
get_entry_bdev spin_lock(bitmap->lock); irq softirq end_swap_bio_read zram_slot_free_notify zram_slot_lock <-- deadlock prone zram_free_page put_entry_bdev spin_lock(bitmap->lock); <-- deadlock prone
With akpm's suggestion (i.e. bitmap operation is already atomic), we could remove bitmap lock. It might fail to find a empty slot if serious contention happens. However, it's not severe problem because huge page writeback has already possiblity to fail if there is severe memory pressure. Worst case is just keeping the incompressible in memory, not storage.
The other problem is zram_slot_lock in zram_slot_slot_free_notify. To make it safe is this patch introduces zram_slot_trylock where zram_slot_free_notify uses it. Although it's rare to be contented, this patch adds new debug stat "miss_free" to keep monitoring how often it happens.
--- drivers/block/zram/zram_drv.c | 38 +++++++++++++++++++---------------- drivers/block/zram/zram_drv.h | 2 +- 2 files changed, 22 insertions(+), 18 deletions(-)
drivers/block/zram/zram_drv.c +21 -17
@@ -53,6 +53,11 @@ static size_t huge_class_size;static void zram_free_page (struct zram *zram,size_t index); +static int zram_slot_trylock (struct zram *zram,u32 index) +{ +return bit_spin_trylock (ZRAM_LOCK , &zram->table[index].value); +} +static void zram_slot_lock (struct zram *zram,u32 index) {bit_spin_lock (ZRAM_LOCK , &zram->table[index].value);
@@ -401,7 +406,6 @@ static ssize_t backing_dev_store(struct device *dev, goto out;reset_bdev (zram); -spin_lock_init (&zram->bitmap_lock); zram->old_block_size = old_block_size; zram->bdev = bdev;
@@ -445,29 +449,24 @@ out:static unsigned long get_entry_bdev (struct zram *zram) { -unsigned long entry; - -spin_lock (&zram->bitmap_lock); +unsigned long blk_idx =1 ; +retry:/* skip 0 bit to confuse zram.handle = 0 */ - entry =find_next_zero_bit (zram->bitmap, zram->nr_pages,1 ); -if (entry == zram->nr_pages) { -spin_unlock (&zram->bitmap_lock); + blk_idx =find_next_zero_bit (zram->bitmap, zram->nr_pages, blk_idx); +if (blk_idx == zram->nr_pages)return 0 ; - } -set_bit (entry, zram->bitmap); -spin_unlock (&zram->bitmap_lock); +if (test_and_set_bit (blk_idx, zram->bitmap)) + goto retry; -return entry; +return blk_idx; }static void put_entry_bdev (struct zram *zram,unsigned long entry) {int was_set; -spin_lock (&zram->bitmap_lock); was_set =test_and_clear_bit (entry, zram->bitmap); -spin_unlock (&zram->bitmap_lock);WARN_ON_ONCE (!was_set); }
@@ -888,9 +887,10 @@ static ssize_t debug_stat_show(struct device *dev,down_read (&zram->init_lock); ret =scnprintf (buf,PAGE_SIZE , -"version: %d\n%8llu\n" , +"version: %d\n%8llu %8llu\n" , version, - (u64 )atomic64_read (&zram->stats.writestall)); + (u64 )atomic64_read (&zram->stats.writestall), + (u64 )atomic64_read (&zram->stats.miss_free));up_read (&zram->init_lock);return ret;
@@ -1402,10 +1402,14 @@ static void zram_slot_free_notify(struct block_device *bdev, zram = bdev->bd_disk->private_data; -zram_slot_lock (zram, index); +atomic64_inc (&zram->stats.notify_free); +if (!zram_slot_trylock (zram, index)) { +atomic64_inc (&zram->stats.miss_free); +return ; + } +zram_free_page (zram, index);zram_slot_unlock (zram, index); -atomic64_inc (&zram->stats.notify_free); } static int zram_rw_page(struct block_device *bdev, sector_t sector,
drivers/block/zram/zram_drv.h +1 -1
@@ -79,6 +79,7 @@ struct zram_stats {atomic64_t pages_stored;/* no. of pages currently stored */ atomic_long_t max_used_pages;/* no. of maximum pages stored */ atomic64_t writestall;/* no. of write slow paths */ +atomic64_t miss_free;/* no. of missed free */ };struct zram {
@@ -110,7 +111,6 @@ struct zram {unsigned int old_block_size;unsigned long *bitmap;unsigned long nr_pages; -spinlock_t bitmap_lock;#endif #ifdef CONFIG_ZRAM_MEMORY_TRACKING struct dentry *debugfs_dir;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 270/352 isdn: hisax: hfc_pci: Fix a possible concurrency use-after-free bug in HFCPCI_l1hw()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 7418e6520f22a2e35815122fa5a53d5bbfa2c10f ]
In drivers/isdn/hisax/hfc_pci.c, the functions hfcpci_interrupt() and HFCPCI_l1hw() may be concurrently executed.
HFCPCI_l1hw()
line 1173: if (!cs->tx_skb)
hfcpci_interrupt()
line 942: spin_lock_irqsave();
line 1066: dev_kfree_skb_irq(cs->tx_skb);
Thus, a possible concurrency use-after-free bug may occur in HFCPCI_l1hw().
To fix these bugs, the calls to spin_lock_irqsave() and spin_unlock_irqrestore() are added in HFCPCI_l1hw(), to protect the access to cs->tx_skb.
--- drivers/isdn/hisax/hfc_pci.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/isdn/hisax/hfc_pci.c +2 -0
@@ -1170,11 +1170,13 @@ HFCPCI_l1hw(struct PStack *st, int pr, void *arg)if (cs->debug &L1_DEB_LAPD )debugl1 (cs,"-> PH_REQUEST_PULL" );#endif +spin_lock_irqsave (&cs->lock, flags);if (!cs->tx_skb) {test_and_clear_bit (FLG_L1_PULL_REQ , &st->l1.Flags); st->l1.l1l2 (st,PH_PULL |CONFIRM ,NULL ); }else test_and_set_bit (FLG_L1_PULL_REQ , &st->l1.Flags); +spin_unlock_irqrestore (&cs->lock, flags);break ;case (HW_RESET |REQUEST ):spin_lock_irqsave (&cs->lock, flags);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 271/352 gdrom: fix a memory leak bug
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 093c48213ee37c3c3ff1cf5ac1aa2a9d8bc66017 ]
In probe_gdrom(), the buffer pointed by 'gd.cd_info' is allocated through kzalloc() and is used to hold the information of the gdrom device. To register and unregister the device, the pointer 'gd.cd_info' is passed to the functions register_cdrom() and unregister_cdrom(), respectively. However, this buffer is not freed after it is used, which can cause a memory leak bug.
This patch simply frees the buffer 'gd.cd_info' in exit_gdrom() to fix the above issue.
--- drivers/cdrom/gdrom.c | 1 + 1 file changed, 1 insertion(+)
drivers/cdrom/gdrom.c +1 -0
@@ -873,6 +873,7 @@ static void __exit exit_gdrom(void)platform_device_unregister (pd);platform_driver_unregister (&gdrom_driver);kfree (gd.toc); +kfree (gd.cd_info); }module_init (init_gdrom);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 272/352 fsl/fman: Use GFP_ATOMIC in {memac,tgec}_add_hash_mac_address()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0d9c9a238faf925823bde866182c663b6d734f2e ]
These functions are called from atomic context:
[ 9.150239] BUG: sleeping function called from invalid context at /home/scott/git/linux/mm/slab.h:421 [ 9.158159] in_atomic(): 1, irqs_disabled(): 0, pid: 4432, name: ip [ 9.163128] CPU: 8 PID: 4432 Comm: ip Not tainted 4.20.0-rc2-00169-g63d86876f324 #29 [ 9.163130] Call Trace: [ 9.170701] [c0000002e899a980] [c0000000009c1068] .dump_stack+0xa8/0xec (unreliable) [ 9.177140] [c0000002e899aa10] [c00000000007a7b4] .___might_sleep+0x138/0x164 [ 9.184440] [c0000002e899aa80] [c0000000001d5bac] .kmem_cache_alloc_trace+0x238/0x30c [ 9.191216] [c0000002e899ab40] [c00000000065ea1c] .memac_add_hash_mac_address+0x104/0x198 [ 9.199464] [c0000002e899abd0] [c00000000065a788] .set_multi+0x1c8/0x218 [ 9.206242] [c0000002e899ac80] [c0000000006615ec] .dpaa_set_rx_mode+0xdc/0x17c [ 9.213544] [c0000002e899ad00] [c00000000083d2b0] .__dev_set_rx_mode+0x80/0xd4 [ 9.219535] [c0000002e899ad90] [c00000000083d334] .dev_set_rx_mode+0x30/0x54 [ 9.225271] [c0000002e899ae10] [c00000000083d4a0] .__dev_open+0x148/0x1c8 [ 9.230751] [c0000002e899aeb0] [c00000000083d934] .__dev_change_flags+0x19c/0x1e0 [ 9.230755] [c0000002e899af60] [c00000000083d9a4] .dev_change_flags+0x2c/0x80 [ 9.242752] [c0000002e899aff0] [c0000000008554ec] .do_setlink+0x350/0xf08 [ 9.248228] [c0000002e899b170] [c000000000857ad0] .rtnl_newlink+0x588/0x7e0 [ 9.253965] [c0000002e899b740] [c000000000852424] .rtnetlink_rcv_msg+0x3e0/0x498 [ 9.261440] [c0000002e899b820] [c000000000884790] .netlink_rcv_skb+0x134/0x14c [ 9.267607] [c0000002e899b8e0] [c000000000851840] .rtnetlink_rcv+0x18/0x2c [ 9.274558] [c0000002e899b950] [c000000000883c8c] .netlink_unicast+0x214/0x318 [ 9.281163] [c0000002e899ba00] [c000000000884220] .netlink_sendmsg+0x348/0x444 [ 9.287076] [c0000002e899bae0] [c00000000080d13c] .sock_sendmsg+0x2c/0x54 [ 9.287080] [c0000002e899bb50] [c0000000008106c0] .___sys_sendmsg+0x2d0/0x2d8 [ 9.298375] [c0000002e899bd30] [c000000000811a80] .__sys_sendmsg+0x5c/0xb0 [ 9.303939] [c0000002e899be20] [c0000000000006b0] system_call+0x60/0x6c
--- drivers/net/ethernet/freescale/fman/fman_memac.c | 2 +- drivers/net/ethernet/freescale/fman/fman_tgec.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/ethernet/freescale/fman/fman_memac.c +1 -1
@@ -928,7 +928,7 @@ int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr) hash =get_mac_addr_hash_code (addr) &HASH_CTRL_ADDR_MASK ;/* Create element to be added to the driver hash table */ - hash_entry =kmalloc (sizeof (*hash_entry),GFP_KERNEL ); + hash_entry =kmalloc (sizeof (*hash_entry),GFP_ATOMIC );if (!hash_entry)return -ENOMEM ; hash_entry->addr = addr;
drivers/net/ethernet/freescale/fman/fman_tgec.c +1 -1
@@ -553,7 +553,7 @@ int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr) hash = (crc >>TGEC_HASH_MCAST_SHIFT ) &TGEC_HASH_ADR_MSK ;/* Create element to be added to the driver hash table */ - hash_entry =kmalloc (sizeof (*hash_entry),GFP_KERNEL ); + hash_entry =kmalloc (sizeof (*hash_entry),GFP_ATOMIC );if (!hash_entry)return -ENOMEM ; hash_entry->addr = addr;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 273/352 block/swim3: Fix -EBUSY error when re-opening device after unmount
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 296dcc40f2f2e402facf7cd26cf3f2c8f4b17d47 ]
When the block device is opened with FMODE_EXCL, ref_count is set to -1. This value doesn't get reset when the device is closed which means the device cannot be opened again. Fix this by checking for refcount <= 0 in the release method.
--- drivers/block/swim3.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/block/swim3.c +5 -1
@@ -995,7 +995,11 @@ static void floppy_release(struct gendisk *disk, fmode_t mode)struct swim3 __iomem *sw = fs->swim3;mutex_lock (&swim3_mutex); -if (fs->ref_count >0 && --fs->ref_count ==0 ) { +if (fs->ref_count >0 ) + --fs->ref_count; +else if (fs->ref_count ==-1 ) + fs->ref_count =0 ; +if (fs->ref_count ==0 ) {swim3_action (fs,MOTOR_OFF );out_8 (&sw->control_bic,0xff );swim3_select (fs,RELAX );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 274/352 thermal: bcm2835: enable hwmon explicitly
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit d56c19d07e0bc3ceff366a49b7d7a2440c967b1b ]
By defaul of-based thermal driver do not enable hwmon. This patch does this explicitly, so that the temperature can be read through the common hwmon sysfs.
--- drivers/thermal/broadcom/bcm2835_thermal.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/thermal/broadcom/bcm2835_thermal.c +11 -0
@@ -18,6 +18,8 @@#include <linux/platform_device.h> #include <linux/thermal.h> +#include "../thermal_hwmon.h" +#define BCM2835_TS_TSENSCTL 0x00#define BCM2835_TS_TSENSSTAT 0x04
@@ -266,6 +268,15 @@ static int bcm2835_thermal_probe(struct platform_device *pdev)platform_set_drvdata (pdev, tz); +/* +* Thermal_zone doesn't enable hwmon as default, +* enable it here +*/ + tz->tzp->no_hwmon = false; + err =thermal_add_hwmon_sysfs (tz); +if (err) + goto err_tz; +bcm2835_thermal_debugfs (pdev);return 0 ;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 275/352 kdb: Dont back trace on a cpu that didnt round up
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 162bc7f5afd75b72acbe3c5f3488ef7e64a3fe36 ]
If you have a CPU that fails to round up and then run 'btc' you'll end up crashing in kdb becaue we dereferenced NULL. Let's add a check. It's wise to also set the task to NULL when leaving the debugger so that if we fail to round up on a later entry into the debugger we won't backtrace a stale task.
--- kernel/debug/debug_core.c | 4 ++++ kernel/debug/kdb/kdb_bt.c | 11 ++++++++++- kernel/debug/kdb/kdb_debugger.c | 7 ------- 3 files changed, 14 insertions(+), 8 deletions(-)
kernel/debug/debug_core.c +4 -0
@@ -535,6 +535,8 @@ return_normal: arch_kgdb_ops.correct_hw_break ();if (trace_on)tracing_on (); + kgdb_info[cpu].debuggerinfo =NULL ; + kgdb_info[cpu].task =NULL ; kgdb_info[cpu].exception_state &= ~(DCPU_WANT_MASTER |DCPU_IS_SLAVE ); kgdb_info[cpu].enter_kgdb--;
@@ -667,6 +669,8 @@ kgdb_restore:if (trace_on)tracing_on (); + kgdb_info[cpu].debuggerinfo =NULL ; + kgdb_info[cpu].task =NULL ; kgdb_info[cpu].exception_state &= ~(DCPU_WANT_MASTER |DCPU_IS_SLAVE ); kgdb_info[cpu].enter_kgdb--;
kernel/debug/kdb/kdb_bt.c +10 -1
@@ -186,7 +186,16 @@ kdb_bt(int argc, const char **argv)kdb_printf ("btc: cpu status: " );kdb_parse ("cpu\n" );for_each_online_cpu (cpu) { -sprintf (buf,"btt 0x%px\n" ,KDB_TSK (cpu)); +void *kdb_tsk =KDB_TSK (cpu); + +/* If a CPU failed to round up we could be here */ +if (!kdb_tsk) { +kdb_printf ("WARNING: no task for cpu %ld\n" , + cpu); +continue ; + } + +sprintf (buf,"btt 0x%px\n" , kdb_tsk);kdb_parse (buf);touch_nmi_watchdog (); }
kernel/debug/kdb/kdb_debugger.c +0 -7
@@ -118,13 +118,6 @@ int kdb_stub(struct kgdb_state *ks)kdb_bp_remove ();KDB_STATE_CLEAR (DOING_SS );KDB_STATE_SET (PAGER ); -/* zero out any offline cpu data */ -for_each_present_cpu (i) { -if (!cpu_online (i)) { - kgdb_info[i].debuggerinfo =NULL ; - kgdb_info[i].task =NULL ; - } - }if (ks->err_code ==DIE_OOPS || reason ==KDB_REASON_OOPS ) { ks->pass_exception =1 ;KDB_FLAG_SET (CATASTROPHIC );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 276/352 thermal: tsens: qcom: do not create duplicate regmap debugfs entries
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 4ab248b3b10a58e379e2d32333fff99ea5ca256c ]
Regmap would use device name to create debugfs entries. If the device has multiple regmaps it is recommended to use name field in regmap_config. Fix this by providing name to the regmap configs correctly.
Without this patch we would see below error on DB820c.
qcom-tsens 4a9000.thermal-sensor: Failed to create 4a9000.thermal-sensor debugfs directory
--- drivers/thermal/qcom/tsens-common.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/thermal/qcom/tsens-common.c +10 -2
@@ -114,6 +114,14 @@ int get_temp_common(struct tsens_device *tmdev, int id, int *temp) }static const struct regmap_config tsens_config = { + .name ="tm" , + .reg_bits =32 , + .val_bits =32 , + .reg_stride =4 , +}; + +static const struct regmap_config tsens_srot_config = { + .name ="srot" , .reg_bits =32 , .val_bits =32 , .reg_stride =4 ,
@@ -139,8 +147,8 @@ int __init init_common(struct tsens_device *tmdev)if (IS_ERR (srot_base))return PTR_ERR (srot_base); - tmdev->srot_map =devm_regmap_init_mmio (tmdev->dev, - srot_base, &tsens_config); + tmdev->srot_map =devm_regmap_init_mmio (tmdev->dev, srot_base, + &tsens_srot_config);if (IS_ERR (tmdev->srot_map))return PTR_ERR (tmdev->srot_map);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 277/352 PCI: imx: Enable MSI from downstream components
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 75cb8d20c112aba70f23d98e3f8d0a38ace16006 ]
The MSI Enable bit in the MSI Capability (PCIe r4.0, sec 7.7.1.2) controls whether a Function can request service using MSI.
i.MX6 Root Ports implement the MSI Capability and may use MSI to request service for events like PME, hotplug, AER, etc. In addition, on i.MX6, the MSI Enable bit controls delivery of MSI interrupts from components below the Root Port.
Prior to f3fdfc4ac3a2 ("PCI: Remove host driver Kconfig selection of CONFIG_PCIEPORTBUS"), enabling CONFIG_PCI_IMX6 automatically also enabled CONFIG_PCIEPORTBUS, and when portdrv claimed the Root Ports, it set the MSI Enable bit so it could use PME, hotplug, AER, etc. As a side effect, that also enabled delivery of MSI interrupts from downstream components.
The imx6q-pcie driver itself does not depend on portdrv, so set MSI Enable in imx6q-pcie so MSI from downstream components works even if nobody uses MSI for the Root Port events.
--- drivers/pci/controller/dwc/pci-imx6.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
drivers/pci/controller/dwc/pci-imx6.c +10 -0
@@ -67,6 +67,7 @@ struct imx6_pcie {#define PHY_PLL_LOCK_WAIT_USLEEP_MAX 200/* PCIe Root Complex registers (memory-mapped) */ +#define PCIE_RC_IMX6_MSI_CAP 0x50#define PCIE_RC_LCR 0x7c#define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN1 0x1#define PCIE_RC_LCR_MAX_LINK_SPEEDS_GEN2 0x2
@@ -840,6 +841,7 @@ static int imx6_pcie_probe(struct platform_device *pdev)struct resource *dbi_base;struct device_node *node = dev->of_node;int ret; +u16 val; imx6_pcie =devm_kzalloc (dev,sizeof (*imx6_pcie),GFP_KERNEL );if (!imx6_pcie)
@@ -981,6 +983,14 @@ static int imx6_pcie_probe(struct platform_device *pdev)if (ret <0 )return ret; +if (pci_msi_enabled ()) { + val =dw_pcie_readw_dbi (pci,PCIE_RC_IMX6_MSI_CAP + +PCI_MSI_FLAGS ); + val |=PCI_MSI_FLAGS_ENABLE ; +dw_pcie_writew_dbi (pci,PCIE_RC_IMX6_MSI_CAP +PCI_MSI_FLAGS , + val); + } +return 0 ; }
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 278/352 block/swim3: Fix regression on PowerBook G3
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 427c5ce4417cba0801fbf79c8525d1330704759c ]
As of v4.20, the swim3 driver crashes when loaded on a PowerBook G3 (Wallstreet).
MacIO PCI driver attached to Gatwick chipset
MacIO PCI driver attached to Heathrow chipset
swim3 0.00015000:floppy: [fd0] SWIM3 floppy controller in media bay
0.00013020:ch-a: ttyS0 at MMIO 0xf3013020 (irq = 16, base_baud = 230400) is a Z85c30 ESCC - Serial port 0.00013000:ch-b: ttyS1 at MMIO 0xf3013000 (irq = 17, base_baud = 230400) is a Z85c30 ESCC - Infrared port
macio: fixed media-bay irq on gatwick
macio: fixed left floppy irqs
swim3 1.00015000:floppy: [fd1] Couldn't request interrupt
Unable to handle kernel paging request for data at address 0x00000024 Faulting instruction address: 0xc02652f8 Oops: Kernel access of bad area, sig: 11 [#1] BE SMP NR_CPUS=2 PowerMac Modules linked in: CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.20.0 #2 NIP: c02652f8 LR: c026915c CTR: c0276d1c REGS: df43ba10 TRAP: 0300 Not tainted (4.20.0) MSR: 00009032 <EE,ME,IR,DR,RI> CR: 28228288 XER: 00000100 DAR: 00000024 DSISR: 40000000
GPR00: c026915c df43bac0 df439060 c0731524 df494700 00000000 c06e1c08 00000001
GPR08: 00000001 00000000 df5ff220 00001032 28228282 00000000 c0004ca4 00000000
GPR16: 00000000 00000000 00000000 c073144c dfffe064 c0731524 00000120 c0586108
GPR24: c073132c c073143c c073143c 00000000 c0731524 df67cd70 df494700 00000001 NIP [c02652f8] blk_mq_free_rqs+0x28/0xf8
LR [c026915c] blk_mq_sched_tags_teardown+0x58/0x84
Call Trace: [df43bac0] [c0045f50] flush_workqueue_prep_pwqs+0x178/0x1c4 (unreliable) [df43bae0] [c026915c] blk_mq_sched_tags_teardown+0x58/0x84 [df43bb00] [c02697f0] blk_mq_exit_sched+0x9c/0xb8 [df43bb20] [c0252794] elevator_exit+0x84/0xa4 [df43bb40] [c0256538] blk_exit_queue+0x30/0x50 [df43bb50] [c0256640] blk_cleanup_queue+0xe8/0x184 [df43bb70] [c034732c] swim3_attach+0x330/0x5f0 [df43bbb0] [c034fb24] macio_device_probe+0x58/0xec [df43bbd0] [c032ba88] really_probe+0x1e4/0x2f4 [df43bc00] [c032bd28] driver_probe_device+0x64/0x204 [df43bc20] [c0329ac4] bus_for_each_drv+0x60/0xac [df43bc50] [c032b824] __device_attach+0xe8/0x160 [df43bc80] [c032ab38] bus_probe_device+0xa0/0xbc [df43bca0] [c0327338] device_add+0x3d8/0x630 [df43bcf0] [c0350848] macio_add_one_device+0x444/0x48c [df43bd50] [c03509f8] macio_pci_add_devices+0x168/0x1bc [df43bd90] [c03500ec] macio_pci_probe+0xc0/0x10c [df43bda0] [c02ad884] pci_device_probe+0xd4/0x184 [df43bdd0] [c032ba88] really_probe+0x1e4/0x2f4 [df43be00] [c032bd28] driver_probe_device+0x64/0x204 [df43be20] [c032bfcc] __driver_attach+0x104/0x108 [df43be40] [c0329a00] bus_for_each_dev+0x64/0xb4 [df43be70] [c032add8] bus_add_driver+0x154/0x238 [df43be90] [c032ca24] driver_register+0x84/0x148 [df43bea0] [c0004aa0] do_one_initcall+0x40/0x188 [df43bf00] [c0690100] kernel_init_freeable+0x138/0x1d4 [df43bf30] [c0004cbc] kernel_init+0x18/0x10c [df43bf40] [c00121e4] ret_from_kernel_thread+0x14/0x1c Instruction dump: 5484d97e 4bfff4f4 9421ffe0 7c0802a6 bf410008 7c9e2378 90010024 8124005c 2f890000 419e0078 81230004 7c7c1b78 <81290024> 2f890000 419e0064 81440000 ---[ end trace 12025ab921a9784c ]---
Reverting commit 8ccb8cb1892b ("swim3: convert to blk-mq") resolves the problem.
That commit added a struct blk_mq_tag_set to struct floppy_state and initialized it with a blk_mq_init_sq_queue() call. Unfortunately, there is a memset() in swim3_add_device() that subsequently clears the floppy_state struct. That means fs->tag_set->ops is a NULL pointer, and it gets dereferenced by blk_mq_free_rqs() which gets called in the request_irq() error path. Move the memset() to fix this bug.
BTW, the request_irq() failure for the left mediabay floppy (fd1) is not a regression. I don't know why it happens. The right media bay floppy (fd0) works fine however.
--- drivers/block/swim3.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-)
drivers/block/swim3.c +3 -4
@@ -1091,8 +1091,6 @@ static int swim3_add_device(struct macio_dev *mdev, int index)struct floppy_state *fs = &floppy_states[index];int rc = -EBUSY ; -/* Do this first for message macros */ -memset (fs,0 ,sizeof (*fs)); fs->mdev = mdev; fs->index = index;
@@ -1192,14 +1190,15 @@ static int swim3_attach(struct macio_dev *mdev,return rc; } - fs = &floppy_states[floppy_count]; - disk =alloc_disk (1 );if (disk ==NULL ) { rc = -ENOMEM ; goto out_unregister; } + fs = &floppy_states[floppy_count]; +memset (fs,0 ,sizeof (*fs)); + disk->queue =blk_mq_init_sq_queue (&fs->tag_set, &swim3_mq_ops,2 ,BLK_MQ_F_SHOULD_MERGE );if (IS_ERR (disk->queue)) {
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 279/352 thermal: generic-adc: Fix adc to temp interpolation
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 9d216211fded20fff301d0317af3238d8383634c ]
First correct the edge case to return the last element if we're outside the range, rather than at the last element, so that interpolation is not omitted for points between the two last entries in the table.
Then correct the formula to perform linear interpolation based the two points surrounding the read ADC value. The indices for temp are kept as "hi" and "lo" to pair with the adc indices, but there's no requirement that the temperature is provided in descendent order. mult_frac() is used to prevent issues with overflowing the int.
--- drivers/thermal/thermal-generic-adc.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/thermal/thermal-generic-adc.c +8 -4
@@ -26,7 +26,7 @@ struct gadc_thermal_info {static int gadc_thermal_adc_to_temp (struct gadc_thermal_info *gti,int val) { -int temp, adc_hi, adc_lo; +int temp, temp_hi, temp_lo, adc_hi, adc_lo;int i;for (i =0 ; i < gti->nlookup_table; i++) {
@@ -36,13 +36,17 @@ static int gadc_thermal_adc_to_temp(struct gadc_thermal_info *gti, int val)if (i ==0 ) { temp = gti->lookup_table[0 ]; - }else if (i >= (gti->nlookup_table -1 )) { + }else if (i >= gti->nlookup_table) { temp = gti->lookup_table[2 * (gti->nlookup_table -1 )]; }else { adc_hi = gti->lookup_table[2 * i -1 ]; adc_lo = gti->lookup_table[2 * i +1 ]; - temp = gti->lookup_table[2 * i]; - temp -= ((val - adc_lo) *1000 ) / (adc_hi - adc_lo); + + temp_hi = gti->lookup_table[2 * i -2 ]; + temp_lo = gti->lookup_table[2 * i]; + + temp = temp_hi +mult_frac (temp_lo - temp_hi, val - adc_hi, + adc_lo - adc_hi); }return temp;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 280/352 HID: lenovo: Add checks to fix of_led_classdev_register
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 6ae16dfb61bce538d48b7fe98160fada446056c5 ]
In lenovo_probe_tpkbd(), the function of_led_classdev_register() could return an error value that is unchecked. The fix adds these checks.
--- drivers/hid/hid-lenovo.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/hid/hid-lenovo.c +8 -2
@@ -743,7 +743,9 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev) data_pointer->led_mute.brightness_get = lenovo_led_brightness_get_tpkbd; data_pointer->led_mute.brightness_set = lenovo_led_brightness_set_tpkbd; data_pointer->led_mute.dev = dev; -led_classdev_register (dev, &data_pointer->led_mute); + ret =led_classdev_register (dev, &data_pointer->led_mute); +if (ret <0 ) + goto err; data_pointer->led_micmute.name = name_micmute; data_pointer->led_micmute.brightness_get =
@@ -751,7 +753,11 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev) data_pointer->led_micmute.brightness_set = lenovo_led_brightness_set_tpkbd; data_pointer->led_micmute.dev = dev; -led_classdev_register (dev, &data_pointer->led_micmute); + ret =led_classdev_register (dev, &data_pointer->led_micmute); +if (ret <0 ) { +led_classdev_unregister (&data_pointer->led_mute); + goto err; + }lenovo_features_set_tpkbd (hdev);
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 281/352 arm64/sve: ptrace: Fix SVE_PT_REGS_OFFSET definition
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit ee1b465b303591d3a04d403122bbc0d7026520fb ]
SVE_PT_REGS_OFFSET is supposed to indicate the offset for skipping over the ptrace NT_ARM_SVE header (struct user_sve_header) to the start of the SVE register data proper.
However, currently SVE_PT_REGS_OFFSET is defined in terms of struct sve_context, which is wrong: that structure describes the SVE header in the signal frame, not in the ptrace regset.
This patch fixes the definition to use the ptrace header structure struct user_sve_header instead.
By good fortune, the two structures are the same size anyway, so there is no functional or ABI change.
--- arch/arm64/include/uapi/asm/ptrace.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm64/include/uapi/asm/ptrace.h +1 -1
@@ -131,7 +131,7 @@ struct user_sve_header {/* Offset from the start of struct user_sve_header to the register data */ #define SVE_PT_REGS_OFFSET \ - ((sizeof(struct sve_context) + (SVE_VQ_BYTES - 1)) \ + ((sizeof(struct user_sve_header) + (SVE_VQ_BYTES - 1)) \ / SVE_VQ_BYTES * SVE_VQ_BYTES)/*
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 282/352 fs/proc/base.c: use ns_capable instead of capable for timerslack_ns
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8da0b4f692c6d90b09c91f271517db746a22ff67 ]
Access to timerslack_ns is controlled by a process having CAP_SYS_NICE in its effective capability set, but the current check looks in the root namespace instead of the process' user namespace. Since a process is allowed to do other activities controlled by CAP_SYS_NICE inside a namespace, it should also be able to adjust timerslack_ns.
--- fs/proc/base.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
fs/proc/base.c +9 -3
@@ -2356,10 +2356,13 @@ static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,return -ESRCH ;if (p != current) { -if (!capable (CAP_SYS_NICE )) { +rcu_read_lock (); +if (!ns_capable (__task_cred (p)->user_ns,CAP_SYS_NICE )) { +rcu_read_unlock (); count = -EPERM ; goto out; } +rcu_read_unlock (); err =security_task_setscheduler (p);if (err) {
@@ -2392,11 +2395,14 @@ static int timerslack_ns_show(struct seq_file *m, void *v)return -ESRCH ;if (p != current) { - -if (!capable (CAP_SYS_NICE )) { +rcu_read_lock (); +if (!ns_capable (__task_cred (p)->user_ns,CAP_SYS_NICE )) { +rcu_read_unlock (); err = -EPERM ; goto out; } +rcu_read_unlock (); + err =security_task_getscheduler (p);if (err) goto out;
Signature · 1 line
2.19.1
Re: [PATCH 4.20 282/352] fs/proc/base.c: use ns_capable instead of capable for timerslack_ns
Quoted 2 lines · Greg Kroah-Hartman
4.20-stable review patch. If anyone has any objections, please let me know.
No objection. But I think of this as a feature addition rather than a fix for something. As a feature that we now allow something we previously did not does this qualify for a backport to stable?
It is probably no more harmful in this instance than adding PCI IDs to a driver. So I am not worried. I am curious the current guidelines are.
In most cases a small relaxation of permissions like this requires a lot of bug fixing as typically code protected by capable(CAP_XXX) has been written and tested assuming a trusted root user. Those bug fixes are many times too large for a stable backport.
Eric
Quoted 71 lines
------------------
[ Upstream commit
8da0b4f692c6d90b09c91f271517db746a22ff67]Access to
timerslack_nsis controlled by a process havingCAP_SYS_NICEin its effective capability set, but the current check looks in the root namespace instead of the process' user namespace. Since a process is allowed to do other activities controlled byCAP_SYS_NICEinside a namespace, it should also be able to adjusttimerslack_ns.Signed-off-by Benjamin Gordon <[email protected]>Cc John Stultz <[email protected]>Cc "Eric W. Biederman" <[email protected]>Cc Kees Cook <[email protected]>Cc "Serge E. Hallyn" <[email protected]>Cc Thomas Gleixner <[email protected]>Cc Arjan van de Ven <[email protected]>Cc Oren Laadan <[email protected]>Cc Ruchi Kandoi <[email protected]>Cc Rom Lemarchand <[email protected]>Cc Todd Kjos <[email protected]>Cc Colin Cross <[email protected]>Cc Nick Kralevich <[email protected]>Cc Dmitry Shmidt <[email protected]>Cc Elliott Hughes <[email protected]>Cc Alexey Dobriyan <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/proc/base.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)fs/proc/base.c +9
-3@@ -2356,10 +2356,13 @@ static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,return -ESRCH ;if (p != current) { -if (!capable (CAP_SYS_NICE )) { +rcu_read_lock (); +if (!ns_capable (__task_cred (p)->user_ns,CAP_SYS_NICE )) { +rcu_read_unlock (); count = -EPERM ; goto out; } +rcu_read_unlock (); err =security_task_setscheduler (p);if (err) {@@ -2392,11 +2395,14 @@ static int timerslack_ns_show(struct seq_file *m, void *v)return -ESRCH ;if (p != current) { - -if (!capable (CAP_SYS_NICE )) { +rcu_read_lock (); +if (!ns_capable (__task_cred (p)->user_ns,CAP_SYS_NICE )) { +rcu_read_unlock (); err = -EPERM ; goto out; } +rcu_read_unlock (); + err =security_task_getscheduler (p);if (err) goto out;
Re: [PATCH 4.20 282/352] fs/proc/base.c: use ns_capable instead of capable for timerslack_ns
Quoted 8 lines · Eric W. Biederman
Quoted 2 lines · Greg Kroah-Hartman
4.20-stable review patch. If anyone has any objections, please let me know.
No objection. But I think of this as a feature addition rather than a fix for something. As a feature that we now allow something we previously did not does this qualify for a backport to stable?
Hi,
I had the exact same thought when I saw this this morning, and was planning on replying tonight.
Quoted 83 lines
It is probably no more harmful in this instance than adding PCI IDs to a driver. So I am not worried. I am curious the current guidelines are.
In most cases a small relaxation of permissions like this requires a lot of bug fixing as typically code protected by
capable(CAP_XXX)has been written and tested assuming a trusted root user. Those bug fixes are many times too large for a stable backport.Eric
Quoted 71 lines
------------------
[ Upstream commit
8da0b4f692c6d90b09c91f271517db746a22ff67]Access to
timerslack_nsis controlled by a process havingCAP_SYS_NICEin its effective capability set, but the current check looks in the root namespace instead of the process' user namespace. Since a process is allowed to do other activities controlled byCAP_SYS_NICEinside a namespace, it should also be able to adjusttimerslack_ns.Signed-off-by Benjamin Gordon <[email protected]>Cc John Stultz <[email protected]>Cc "Eric W. Biederman" <[email protected]>Cc Kees Cook <[email protected]>Cc "Serge E. Hallyn" <[email protected]>Cc Thomas Gleixner <[email protected]>Cc Arjan van de Ven <[email protected]>Cc Oren Laadan <[email protected]>Cc Ruchi Kandoi <[email protected]>Cc Rom Lemarchand <[email protected]>Cc Todd Kjos <[email protected]>Cc Colin Cross <[email protected]>Cc Nick Kralevich <[email protected]>Cc Dmitry Shmidt <[email protected]>Cc Elliott Hughes <[email protected]>Cc Alexey Dobriyan <[email protected]>Signed-off-by Andrew Morton <[email protected]>Signed-off-by Linus Torvalds <[email protected]>Signed-off-by Sasha Levin <[email protected]>--- fs/proc/base.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)fs/proc/base.c +9
-3@@ -2356,10 +2356,13 @@ static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,return -ESRCH ;if (p != current) { -if (!capable (CAP_SYS_NICE )) { +rcu_read_lock (); +if (!ns_capable (__task_cred (p)->user_ns,CAP_SYS_NICE )) { +rcu_read_unlock (); count = -EPERM ; goto out; } +rcu_read_unlock (); err =security_task_setscheduler (p);if (err) {@@ -2392,11 +2395,14 @@ static int timerslack_ns_show(struct seq_file *m, void *v)return -ESRCH ;if (p != current) { - -if (!capable (CAP_SYS_NICE )) { +rcu_read_lock (); +if (!ns_capable (__task_cred (p)->user_ns,CAP_SYS_NICE )) { +rcu_read_unlock (); err = -EPERM ; goto out; } +rcu_read_unlock (); + err =security_task_getscheduler (p);if (err) goto out;
Greg Kroah-Hartman
maintainerRe: [PATCH 4.20 282/352] fs/proc/base.c: use ns_capable instead of capable for timerslack_ns
In reply to Eric W. BiedermanQuoted 9 lines · Eric W. Biederman
Quoted 2 lines · Greg Kroah-Hartman
4.20-stable review patch. If anyone has any objections, please let me know.
No objection. But I think of this as a feature addition rather than a fix for something. As a feature that we now allow something we previously did not does this qualify for a backport to stable?
Quoted 8 lines
It is probably no more harmful in this instance than adding PCI IDs to a driver. So I am not worried. I am curious the current guidelines are.
In most cases a small relaxation of permissions like this requires a lot of bug fixing as typically code protected by
capable(CAP_XXX)has been written and tested assuming a trusted root user. Those bug fixes are many times too large for a stable backport.
Fair enough, patch is now dropped, thanks for the review.
greg k-h
Greg Kroah-Hartman
maintainerPATCH 283/352 kernel/hung_task.c: break RCU locks based on jiffies
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 304ae42739b108305f8d7b3eb3c1aec7c2b643a9 ]
check_hung_uninterruptible_tasks() is currently calling rcu_lock_break() for every 1024 threads. But check_hung_task() is very slow if printk() was called, and is very fast otherwise.
If many threads within some 1024 threads called printk(), the RCU grace period might be extended enough to trigger RCU stall warnings. Therefore, calling rcu_lock_break() for every some fixed jiffies will be safer.
--- kernel/hung_task.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
kernel/hung_task.c +4 -4
@@ -34,7 +34,7 @@ int __read_mostly sysctl_hung_task_check_count = PID_MAX_LIMIT;* is disabled during the critical section. It also controls the size of * the RCU grace period. So it needs to be upper-bound. */ -#define HUNG_TASK_BATCHING 1024 +#define HUNG_TASK_LOCK_BREAK (HZ / 10)/* * Zero means infinite timeout - no checking done:
@@ -173,7 +173,7 @@ static bool rcu_lock_break(struct task_struct *g, struct task_struct *t)static void check_hung_uninterruptible_tasks (unsigned long timeout) {int max_count = sysctl_hung_task_check_count; -int batch_count =HUNG_TASK_BATCHING ; +unsigned long last_break = jiffies;struct task_struct *g, *t;/*
@@ -188,10 +188,10 @@ static void check_hung_uninterruptible_tasks(unsigned long timeout)for_each_process_thread (g, t) {if (!max_count--) goto unlock; -if (!--batch_count) { - batch_count =HUNG_TASK_BATCHING ; +if (time_after (jiffies, last_break +HUNG_TASK_LOCK_BREAK )) {if (!rcu_lock_break (g, t)) goto unlock; + last_break = jiffies; }/* use "==" to skip the TASK_KILLABLE tasks waiting on NFS */ if (t->state ==TASK_UNINTERRUPTIBLE )
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 284/352 proc/sysctl: fix return error for proc_doulongvec_minmax()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 09be178400829dddc1189b50a7888495dd26aa84 ]
If the number of input parameters is less than the total parameters, an EINVAL error will be returned.
For example, we use proc_doulongvec_minmax to pass up to two parameters with kern_table:
{
.procname = "monitor_signals", .data = &monitor_sigs, .maxlen = 2*sizeof(unsigned long), .mode = 0644, .proc_handler = proc_doulongvec_minmax,
},
Reproduce:
When passing two parameters, it's work normal. But passing only one parameter, an error "Invalid argument"(EINVAL) is returned.
[root@cl150 ~]# echo 1 2 > /proc/sys/kernel/monitor_signals [root@cl150 ~]# cat /proc/sys/kernel/monitor_signals
1 2
[root@cl150 ~]# echo 3 > /proc/sys/kernel/monitor_signals -bash: echo: write error: Invalid argument [root@cl150 ~]# echo $?
1
[root@cl150 ~]# cat /proc/sys/kernel/monitor_signals
3 2
[root@cl150 ~]#
The following is the result after apply this patch. No error is returned when the number of input parameters is less than the total parameters.
[root@cl150 ~]# echo 1 2 > /proc/sys/kernel/monitor_signals [root@cl150 ~]# cat /proc/sys/kernel/monitor_signals
1 2
[root@cl150 ~]# echo 3 > /proc/sys/kernel/monitor_signals [root@cl150 ~]# echo $?
0
[root@cl150 ~]# cat /proc/sys/kernel/monitor_signals
3 2
[root@cl150 ~]#
There are three processing functions dealing with digital parameters, __do_proc_dointvec/__do_proc_douintvec/__do_proc_doulongvec_minmax.
This patch deals with __do_proc_doulongvec_minmax, just as __do_proc_dointvec does, adding a check for parameters 'left'. In __do_proc_douintvec, its code implementation explicitly does not support multiple inputs.
static int __do_proc_douintvec(...){
...
/*
* Arrays are not supported, keep this simple. *Do not* add
* support for them.
*/
if (vleft != 1) {
*lenp = 0;
return -EINVAL;
}
...
}So, just __do_proc_doulongvec_minmax has the problem. And most use of proc_doulongvec_minmax/proc_doulongvec_ms_jiffies_minmax just have one parameter.
--- kernel/sysctl.c | 2 ++ 1 file changed, 2 insertions(+)
kernel/sysctl.c +2 -0
@@ -2779,6 +2779,8 @@ static int __do_proc_doulongvec_minmax(void *data, struct ctl_table *table, intbool neg; left -=proc_skip_spaces (&p); +if (!left) +break ; err = proc_get_long(&p, &left, &val, &neg, proc_wspace_sep,
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 285/352 kernel/hung_task.c: force console verbose before panic
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 168e06f7937d96c7222037d8a05565e8a6eb00fe ]
Based on commit 401c636a0eeb ("kernel/hung_task.c: show all hung tasks before panic"), we could get the call stack of hung task.
However, if the console loglevel is not high, we still can not see the useful panic information in practice, and in most cases users don't set console loglevel to high level.
This patch is to force console verbose before system panic, so that the real useful information can be seen in the console, instead of being like the following, which doesn't have hung task information.
INFO: task init:1 blocked for more than 120 seconds.
Tainted: G U W 4.19.0-quilt-2e5dc0ac-g51b6c21d76cc #1
"echo 0 > /proc/sys/kernel/hung_task_timeout_secs" disables this message.
Kernel panic - not syncing: hung_task: blocked tasks
CPU: 2 PID: 479 Comm: khungtaskd Tainted: G U W 4.19.0-quilt-2e5dc0ac-g51b6c21d76cc #1
Call Trace:
dump_stack+0x4f/0x65
panic+0xde/0x231
watchdog+0x290/0x410
kthread+0x12c/0x150
ret_from_fork+0x35/0x40
reboot: panic mode set: p,w
Kernel Offset: 0x34000000 from 0xffffffff81000000 (relocation range: 0xffffffff80000000-0xffffffffbfffffff)--- kernel/hung_task.c | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-)
kernel/hung_task.c +5 -7
@@ -112,8 +112,11 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout)trace_sched_process_hang (t); -if (!sysctl_hung_task_warnings && !sysctl_hung_task_panic) -return ; +if (sysctl_hung_task_panic) { +console_verbose (); + hung_task_show_lock = true; + hung_task_call_panic = true; + }/* * Ok, the task did not get scheduled for more than 2 minutes,
@@ -135,11 +138,6 @@ static void check_hung_task(struct task_struct *t, unsigned long timeout) }touch_nmi_watchdog (); - -if (sysctl_hung_task_panic) { - hung_task_show_lock = true; - hung_task_call_panic = true; - } }/*
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 286/352 fs/epoll: drop ovflist branch prediction
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 76699a67f3041ff4c7af6d6ee9be2bfbf1ffb671 ]
The ep->ovflist is a secondary ready-list to temporarily store events that might occur when doing sproc without holding the ep->wq.lock. This accounts for every time we check for ready events and also send events back to userspace; both callbacks, particularly the latter because of copy_to_user, can account for a non-trivial time.
As such, the unlikely() check to see if the pointer is being used, seems both misleading and sub-optimal. In fact, we go to an awful lot of trouble to sync both lists, and populating the ovflist is far from an uncommon scenario.
For example, profiling a concurrent epoll_wait(2) benchmark, with CONFIG_PROFILE_ANNOTATED_BRANCHES shows that for a two threads a 33% incorrect rate was seen; and when incrementally increasing the number of epoll instances (which is used, for example for multiple queuing load balancing models), up to a 90% incorrect rate was seen.
Similarly, by deleting the prediction, 3% throughput boost was seen across incremental threads.
--- fs/eventpoll.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/eventpoll.c +1 -1
@@ -1154,7 +1154,7 @@ static int ep_poll_callback(wait_queue_entry_t *wait, unsigned mode, int sync, v* semantics). All the events that happen during that period of time are * chained in ep->ovflist and requeued later on. */ -if (unlikely (ep->ovflist !=EP_UNACTIVE_PTR )) { +if (ep->ovflist !=EP_UNACTIVE_PTR ) {if (epi->next ==EP_UNACTIVE_PTR ) { epi->next = ep->ovflist; ep->ovflist = epi;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 287/352 exec: load_script: dont blindly truncate shebang string
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 8099b047ecc431518b9bb6bdbba3549bbecdc343 ]
load_script() simply truncates bprm->buf and this is very wrong if the length of shebang string exceeds BINPRM_BUF_SIZE-2. This can silently truncate i_arg or (worse) we can execute the wrong binary if buf[2:126] happens to be the valid executable path.
Change load_script() to return ENOEXEC if it can't find '\n' or zero in bprm->buf. Note that '\0' can come from either prepare_binprm()->memset() or from kernel_read(), we do not care.
--- fs/binfmt_script.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
fs/binfmt_script.c +7 -3
@@ -42,10 +42,14 @@ static int load_script(struct linux_binprm *bprm)fput (bprm->file); bprm->file =NULL ; - bprm->buf[BINPRM_BUF_SIZE -1 ] ='\0' ; -if ((cp =strchr (bprm->buf,'\n' )) ==NULL ) - cp = bprm->buf+BINPRM_BUF_SIZE -1 ; +for (cp = bprm->buf+2 ;; cp++) { +if (cp >= bprm->buf +BINPRM_BUF_SIZE ) +return -ENOEXEC ; +if (!*cp || (*cp =='\n' )) +break ; + } *cp ='\0' ; +while (cp > bprm->buf) { cp--;if ((*cp ==' ' ) || (*cp =='\t' ))
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 288/352 kernel/kcov.c: mark write_comp_data() as notrace
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 634724431607f6f46c495dfef801a1c8b44a96d9 ]
Since __sanitizer_cov_trace_const_cmp4 is marked as notrace, the function called from __sanitizer_cov_trace_const_cmp4 shouldn't be traceable either. ftrace_graph_caller() gets called every time func write_comp_data() gets called if it isn't marked 'notrace'. This is the backtrace from gdb:
#0 ftrace_graph_caller () at ../arch/arm64/kernel/entry-ftrace.S:179 #1 0xffffff8010201920 in ftrace_caller () at ../arch/arm64/kernel/entry-ftrace.S:151 #2 0xffffff8010439714 in write_comp_data (type=5, arg1=0, arg2=0, ip=18446743524224276596) at ../kernel/kcov.c:116 #3 0xffffff8010439894 in __sanitizer_cov_trace_const_cmp4 (arg1=<optimized out>, arg2=<optimized out>) at ../kernel/kcov.c:188 #4 0xffffff8010201874 in prepare_ftrace_return (self_addr=18446743524226602768, parent=0xffffff801014b918, frame_pointer=18446743524223531344) at ./include/generated/atomic-instrumented.h:27 #5 0xffffff801020194c in ftrace_graph_caller () at ../arch/arm64/kernel/entry-ftrace.S:182
Rework so that write_comp_data() that are called from __sanitizer_cov_trace_*_cmp*() are marked as 'notrace'.
Commit 903e8ff86753 ("kernel/kcov.c: mark funcs in __sanitizer_cov_trace_pc() as notrace") missed to mark write_comp_data() as 'notrace'. When that patch was
created gcc-7 was used. In lib/Kconfig.debug
config KCOV_ENABLE_COMPARISONS
depends on $(cc-option,-fsanitize-coverage=trace-cmp)
That code path isn't hit with gcc-7. However, it were that with gcc-8.
--- kernel/kcov.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/kcov.c +1 -1
@@ -112,7 +112,7 @@ void notrace __sanitizer_cov_trace_pc(void)EXPORT_SYMBOL (__sanitizer_cov_trace_pc);#ifdef CONFIG_KCOV_ENABLE_COMPARISONS -static void write_comp_data (u64 type,u64 arg1,u64 arg2,u64 ip) +static void notrace write_comp_data(u64 type, u64 arg1, u64 arg2, u64 ip) {struct task_struct *t;u64 *area;
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 289/352 scripts/gdb: fix lx-version string output
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit b058809bfc8faeb7b7cae047666e23375a060059 ]
A bug is present in GDB which causes early string termination when parsing variables. This has been reported [0], but we should ensure that we can support at least basic printing of the core kernel strings.
For current gdb version (has been tested with 7.3 and 8.1), 'lx-version' only prints one character.
(gdb) lx-version
L(gdb)
This can be fixed by casting 'linux_banner' as (char *).
(gdb) lx-version
Linux version 4.19.0-rc1+ (changbin@acer) (gcc version 7.3.0 (Ubuntu 7.3.0-16ubuntu3)) #21 SMP Sat Sep 1 21:43:30 CST 2018
[0] https://sourceware.org/bugzilla/show_bug.cgi?id=20077
--- scripts/gdb/linux/proc.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
scripts/gdb/linux/proc.py +1 -1
@@ -41,7 +41,7 @@ class LxVersion(gdb.Command): def invoke(self, arg, from_tty): # linux_banner should contain a newline - gdb.write(gdb.parse_and_eval("linux_banner").string()) + gdb.write(gdb.parse_and_eval("(char *)linux_banner").string()) LxVersion()
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 290/352 xprtrdma: Dont wake pending tasks until disconnect is done
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
[ Upstream commit 0c0829bcf51aef713806e49b8ea2bac7962f54e2 ]
Transport disconnect processing does a "wake pending tasks" at various points.
Suppose an RPC Reply is being processed. The RPC task that Reply goes with is waiting on the pending queue. If a disconnect wake-up happens before reply processing is done, that reply, even if it is good, is thrown away, and the RPC has to be sent again.
This window apparently does not exist for socket transports because there is a lock held while a reply is being received which prevents the wake-up call until after reply processing is done.
To resolve this, all RPC replies being processed on an RPC-over-RDMA transport have to complete before pending tasks are awoken due to a transport disconnect.
Callers that already hold the transport write lock may invoke ->ops->close directly. Others use a generic helper that schedules a close when the write lock can be taken safely.
--- net/sunrpc/xprtrdma/backchannel.c | 13 +++++++------ net/sunrpc/xprtrdma/svc_rdma_backchannel.c | 8 +++++--- net/sunrpc/xprtrdma/transport.c | 17 ++++++++++------- net/sunrpc/xprtrdma/verbs.c | 1 - net/sunrpc/xprtrdma/xprt_rdma.h | 1 + 5 files changed, 23 insertions(+), 17 deletions(-)
net/sunrpc/xprtrdma/backchannel.c +7 -6
@@ -193,14 +193,15 @@ static int rpcrdma_bc_marshal_reply(struct rpc_rqst *rqst)*/ int xprt_rdma_bc_send_reply (struct rpc_rqst *rqst) { -struct rpcrdma_xprt *r_xprt =rpcx_to_rdmax (rqst->rq_xprt); +struct rpc_xprt *xprt = rqst->rq_xprt; +struct rpcrdma_xprt *r_xprt =rpcx_to_rdmax (xprt);struct rpcrdma_req *req =rpcr_to_rdmar (rqst);int rc; -if (!xprt_connected (rqst->rq_xprt)) - goto drop_connection; +if (!xprt_connected (xprt)) +return -ENOTCONN ; -if (!xprt_request_get_cong (rqst->rq_xprt, rqst)) +if (!xprt_request_get_cong (xprt, rqst))return -EBADSLT ; rc =rpcrdma_bc_marshal_reply (rqst);
@@ -216,7 +217,7 @@ failed_marshal:if (rc != -ENOTCONN )return rc; drop_connection: -xprt_disconnect_done (rqst->rq_xprt); +xprt_rdma_close (xprt);return -ENOTCONN ; }
@@ -339,7 +340,7 @@ void rpcrdma_bc_receive_call(struct rpcrdma_xprt *r_xprt, out_overflow:pr_warn ("RPC/RDMA backchannel overflow\n" ); -xprt_disconnect_done (xprt); +xprt_force_disconnect (xprt);/* This receive buffer gets reposted automatically * when the connection is re-established. */
net/sunrpc/xprtrdma/svc_rdma_backchannel.c +5 -3
@@ -200,11 +200,10 @@ rpcrdma_bc_send_request(struct svcxprt_rdma *rdma, struct rpc_rqst *rqst)svc_rdma_send_ctxt_put (rdma, ctxt); goto drop_connection; } -return rc; +return 0 ; drop_connection:dprintk ("svcrdma: failed to send bc call\n" ); -xprt_disconnect_done (xprt);return -ENOTCONN ; }
@@ -225,8 +224,11 @@ xprt_rdma_bc_send_request(struct rpc_rqst *rqst) ret = -ENOTCONN ; rdma = container_of(sxprt, struct svcxprt_rdma, sc_xprt); -if (!test_bit (XPT_DEAD , &sxprt->xpt_flags)) +if (!test_bit (XPT_DEAD , &sxprt->xpt_flags)) { ret =rpcrdma_bc_send_request (rdma, rqst); +if (ret == -ENOTCONN ) +svc_close_xprt (sxprt); + }mutex_unlock (&sxprt->xpt_mutex);
net/sunrpc/xprtrdma/transport.c +10 -7
@@ -437,8 +437,7 @@ out1:* Caller holds @xprt's send lock to prevent activity on this * transport while the connection is torn down. */ -static void -xprt_rdma_close (struct rpc_xprt *xprt) +void xprt_rdma_close (struct rpc_xprt *xprt) {struct rpcrdma_xprt *r_xprt =rpcx_to_rdmax (xprt);struct rpcrdma_ep *ep = &r_xprt->rx_ep;
@@ -449,13 +448,13 @@ xprt_rdma_close(struct rpc_xprt *xprt)if (test_and_clear_bit (RPCRDMA_IAF_REMOVING , &ia->ri_flags)) {xprt_clear_connected (xprt);rpcrdma_ia_remove (ia); -return ; + goto out; } +if (ep->rep_connected == -ENODEV )return ;if (ep->rep_connected >0 ) xprt->reestablish_timeout =0 ; -xprt_disconnect_done (xprt);rpcrdma_ep_disconnect (ep, ia);/* Prepare @xprt for the next connection by reinitializing
@@ -463,6 +462,10 @@ xprt_rdma_close(struct rpc_xprt *xprt)*/ r_xprt->rx_buf.rb_credits =1 ; xprt->cwnd =RPC_CWNDSHIFT ; + +out: + ++xprt->connect_cookie; +xprt_disconnect_done (xprt); }/**
@@ -713,7 +716,7 @@ xprt_rdma_send_request(struct rpc_rqst *rqst)#endif /* CONFIG_SUNRPC_BACKCHANNEL */ if (!xprt_connected (xprt)) - goto drop_connection; +return -ENOTCONN ;if (!xprt_request_get_cong (xprt, rqst))return -EBADSLT ;
@@ -745,8 +748,8 @@ failed_marshal:if (rc != -ENOTCONN )return rc; drop_connection: -xprt_disconnect_done (xprt); -return -ENOTCONN ;/* implies disconnect */ +xprt_rdma_close (xprt); +return -ENOTCONN ; }void xprt_rdma_print_stats (struct rpc_xprt *xprt,struct seq_file *seq)
net/sunrpc/xprtrdma/verbs.c +0 -1
@@ -316,7 +316,6 @@ rpcrdma_cm_event_handler(struct rdma_cm_id *id, struct rdma_cm_event *event) ep->rep_connected = -EAGAIN ; goto disconnected;case RDMA_CM_EVENT_DISCONNECTED : - ++xprt->connect_cookie; ep->rep_connected = -ECONNABORTED ; disconnected:xprt_force_disconnect (xprt);
net/sunrpc/xprtrdma/xprt_rdma.h +1 -0
@@ -653,6 +653,7 @@ static inline void rpcrdma_set_xdrlen(struct xdr_buf *xdr, size_t len)extern unsigned int xprt_rdma_max_inline_read;void xprt_rdma_format_addresses (struct rpc_xprt *xprt,struct sockaddr *sap);void xprt_rdma_free_addresses (struct rpc_xprt *xprt); +void xprt_rdma_close (struct rpc_xprt *xprt);void xprt_rdma_print_stats (struct rpc_xprt *xprt,struct seq_file *seq);int xprt_rdma_init (void );void xprt_rdma_cleanup (void );
Signature · 1 line
2.19.1
Greg Kroah-Hartman
maintainerPATCH 291/352 thermal: hwmon: inline helpers when CONFIG_THERMAL_HWMON is not set
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eduardo Valentin <[email protected]>
commit 03334ba8b425b2ad275c8f390cf83c7b081c3095 upstream.
Avoid warnings like this:
thermal_hwmon.h:29:1: warning: ‘thermal_remove_hwmon_sysfs’ defined but not used [-Wunused-function]
thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
--- drivers/thermal/thermal_hwmon.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/thermal/thermal_hwmon.h +2 -2
@@ -19,13 +19,13 @@int thermal_add_hwmon_sysfs (struct thermal_zone_device *tz);void thermal_remove_hwmon_sysfs (struct thermal_zone_device *tz);#else -static int +static inline int thermal_add_hwmon_sysfs (struct thermal_zone_device *tz) {return 0 ; } -static void +static inline void thermal_remove_hwmon_sysfs (struct thermal_zone_device *tz) { }
Greg Kroah-Hartman
maintainerPATCH 292/352 dccp: fool proof ccid_hc_[rt]x_parse_options()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 9b1f19d810e92d6cdc68455fbc22d9f961a58ce1 ]
Similarly to commit 276bdb82dedb ("dccp: check ccid before dereferencing") it is wise to test for a NULL ccid.
kasan: CONFIG_KASAN_INLINE enabled
kasan: GPF could be caused by NULL-ptr deref or user memory access
general protection fault: 0000 [#1] PREEMPT SMP KASAN CPU: 1 PID: 16 Comm: ksoftirqd/1 Not tainted 5.0.0-rc3+ #37 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 RIP: 0010:ccid_hc_tx_parse_options net/dccp/ccid.h:205 [inline] RIP: 0010:dccp_parse_options+0x8d9/0x12b0 net/dccp/options.c:233 Code: c5 0f b6 75 b3 80 38 00 0f 85 d6 08 00 00 48 b9 00 00 00 00 00 fc ff df 48 8b 45 b8 4c 8b b8 f8 07 00 00 4c 89 f8 48 c1 e8 03 <80> 3c 08 00 0f 85 95 08 00 00 48 b8 00 00 00 00 00 fc ff df 4d 8b kobject: 'loop5' (0000000080f78fc1): kobject_uevent_env RSP: 0018:ffff8880a94df0b8 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff8880858ac723 RCX: dffffc0000000000 RDX: 0000000000000100 RSI: 0000000000000007 RDI: 0000000000000001 RBP: ffff8880a94df140 R08: 0000000000000001 R09: ffff888061b83a80 R10: ffffed100c370752 R11: ffff888061b83a97 R12: 0000000000000026 R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff8880ae700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f0defa33518 CR3: 000000008db5e000 CR4: 00000000001406e0 kobject: 'loop5' (0000000080f78fc1): fill_kobj_path: path = '/devices/virtual/block/loop5' DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: dccp_rcv_state_process+0x2b6/0x1af6 net/dccp/input.c:654 dccp_v4_do_rcv+0x100/0x190 net/dccp/ipv4.c:688 sk_backlog_rcv include/net/sock.h:936 [inline] __sk_receive_skb+0x3a9/0xea0 net/core/sock.c:473 dccp_v4_rcv+0x10cb/0x1f80 net/dccp/ipv4.c:880 ip_protocol_deliver_rcu+0xb6/0xa20 net/ipv4/ip_input.c:208 ip_local_deliver_finish+0x23b/0x390 net/ipv4/ip_input.c:234 NF_HOOK include/linux/netfilter.h:289 [inline] NF_HOOK include/linux/netfilter.h:283 [inline] ip_local_deliver+0x1f0/0x740 net/ipv4/ip_input.c:255 dst_input include/net/dst.h:450 [inline] ip_rcv_finish+0x1f4/0x2f0 net/ipv4/ip_input.c:414 NF_HOOK include/linux/netfilter.h:289 [inline] NF_HOOK include/linux/netfilter.h:283 [inline] ip_rcv+0xed/0x620 net/ipv4/ip_input.c:524 __netif_receive_skb_one_core+0x160/0x210 net/core/dev.c:4973 __netif_receive_skb+0x2c/0x1c0 net/core/dev.c:5083 process_backlog+0x206/0x750 net/core/dev.c:5923 napi_poll net/core/dev.c:6346 [inline] net_rx_action+0x76d/0x1930 net/core/dev.c:6412 __do_softirq+0x30b/0xb11 kernel/softirq.c:292 run_ksoftirqd kernel/softirq.c:654 [inline] run_ksoftirqd+0x8e/0x110 kernel/softirq.c:646 smpboot_thread_fn+0x6ab/0xa10 kernel/smpboot.c:164 kthread+0x357/0x430 kernel/kthread.c:246 ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:352 Modules linked in: ---[ end trace 58a0ba03bea2c376 ]--- RIP: 0010:ccid_hc_tx_parse_options net/dccp/ccid.h:205 [inline] RIP: 0010:dccp_parse_options+0x8d9/0x12b0 net/dccp/options.c:233 Code: c5 0f b6 75 b3 80 38 00 0f 85 d6 08 00 00 48 b9 00 00 00 00 00 fc ff df 48 8b 45 b8 4c 8b b8 f8 07 00 00 4c 89 f8 48 c1 e8 03 <80> 3c 08 00 0f 85 95 08 00 00 48 b8 00 00 00 00 00 fc ff df 4d 8b RSP: 0018:ffff8880a94df0b8 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffff8880858ac723 RCX: dffffc0000000000 RDX: 0000000000000100 RSI: 0000000000000007 RDI: 0000000000000001 RBP: ffff8880a94df140 R08: 0000000000000001 R09: ffff888061b83a80 R10: ffffed100c370752 R11: ffff888061b83a97 R12: 0000000000000026 R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000000 FS: 0000000000000000(0000) GS:ffff8880ae700000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f0defa33518 CR3: 0000000009871000 CR4: 00000000001406e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
--- net/dccp/ccid.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/dccp/ccid.h +2 -2
@@ -202,7 +202,7 @@ static inline void ccid_hc_tx_packet_recstatic inline int ccid_hc_tx_parse_options (struct ccid *ccid,struct sock *sk,u8 pkt,u8 opt,u8 *val,u8 len) { -if (ccid->ccid_ops->ccid_hc_tx_parse_options ==NULL ) +if (!ccid || !ccid->ccid_ops->ccid_hc_tx_parse_options)return 0 ;return ccid->ccid_ops->ccid_hc_tx_parse_options (sk, pkt, opt, val, len); }
@@ -214,7 +214,7 @@ static inline int ccid_hc_tx_parse_optiostatic inline int ccid_hc_rx_parse_options (struct ccid *ccid,struct sock *sk,u8 pkt,u8 opt,u8 *val,u8 len) { -if (ccid->ccid_ops->ccid_hc_rx_parse_options ==NULL ) +if (!ccid || !ccid->ccid_ops->ccid_hc_rx_parse_options)return 0 ;return ccid->ccid_ops->ccid_hc_rx_parse_options (sk, pkt, opt, val, len); }
Greg Kroah-Hartman
maintainerPATCH 293/352 enic: fix checksum validation for IPv6
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Govindarajulu Varadarajan <[email protected]>
[ Upstream commit 7596175e99b3d4bce28022193efd954c201a782a ]
In case of IPv6 pkts, ipv4_csum_ok is 0. Because of this, driver does not set skb->ip_summed. So IPv6 rx checksum is not offloaded.
--- drivers/net/ethernet/cisco/enic/enic_main.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/ethernet/cisco/enic/enic_main.c +2 -1
@@ -1434,7 +1434,8 @@ static void enic_rq_indicate_buf(struct* csum is correct or is zero. */ if ((netdev->features &NETIF_F_RXCSUM ) && !csum_not_calc && - tcp_udp_csum_ok && ipv4_csum_ok && outer_csum_ok) { + tcp_udp_csum_ok && outer_csum_ok && + (ipv4_csum_ok || ipv6)) { skb->ip_summed =CHECKSUM_UNNECESSARY ; skb->csum_level = encap; }
Greg Kroah-Hartman
maintainerPATCH 294/352 lib/test_rhashtable: Make test_insert_dup() allocate its hash table dynamically
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
[ Upstream commit fc42a689c4c097859e5bd37b5ea11b60dc426df6 ]
The test_insert_dup() function from lib/test_rhashtable.c passes a pointer to a stack object to rhltable_init(). Allocate the hash table dynamically to avoid that the following is reported with object debugging enabled:
ODEBUG: object (ptrval) is on stack (ptrval), but NOT annotated.
WARNING: CPU: 0 PID: 1 at lib/debugobjects.c:368 __debug_object_init+0x312/0x480 Modules linked in: EIP: __debug_object_init+0x312/0x480 Call Trace: ? debug_object_init+0x1a/0x20 ? __init_work+0x16/0x30 ? rhashtable_init+0x1e1/0x460 ? sched_clock_cpu+0x57/0xe0 ? rhltable_init+0xb/0x20 ? test_insert_dup+0x32/0x20f ? trace_hardirqs_on+0x38/0xf0 ? ida_dump+0x10/0x10 ? jhash+0x130/0x130 ? my_hashfn+0x30/0x30 ? test_rht_init+0x6aa/0xab4 ? ida_dump+0x10/0x10 ? test_rhltable+0xc5c/0xc5c ? do_one_initcall+0x67/0x28e ? trace_hardirqs_off+0x22/0xe0 ? restore_all_kernel+0xf/0x70 ? trace_hardirqs_on_thunk+0xc/0x10 ? restore_all_kernel+0xf/0x70 ? kernel_init_freeable+0x142/0x213 ? rest_init+0x230/0x230 ? kernel_init+0x10/0x110 ? schedule_tail_wrapper+0x9/0xc ? ret_from_fork+0x19/0x24
--- lib/test_rhashtable.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-)
lib/test_rhashtable.c +15 -8
@@ -541,38 +541,45 @@ static unsigned int __init print_ht(strustatic int __init test_insert_dup (struct test_obj_rhl *rhl_test_objects,int cnt,bool slow) { -struct rhltable rhlt; +struct rhltable *rhlt;unsigned int i, ret;const char *key;int err =0 ; - err =rhltable_init (&rhlt, &test_rht_params_dup); -if (WARN_ON (err)) + rhlt =kmalloc (sizeof (*rhlt),GFP_KERNEL ); +if (WARN_ON (!rhlt)) +return -EINVAL ; + + err =rhltable_init (rhlt, &test_rht_params_dup); +if (WARN_ON (err)) { +kfree (rhlt);return err; + }for (i =0 ; i < cnt; i++) { rhl_test_objects[i].value.tid = i; - key =rht_obj (&rhlt.ht, &rhl_test_objects[i].list_node.rhead); + key =rht_obj (&rhlt->ht, &rhl_test_objects[i].list_node.rhead); key += test_rht_params_dup.key_offset;if (slow) { - err =PTR_ERR (rhashtable_insert_slow (&rhlt.ht, key, + err =PTR_ERR (rhashtable_insert_slow (&rhlt->ht, key, &rhl_test_objects[i].list_node.rhead));if (err == -EAGAIN ) err =0 ; }else - err =rhltable_insert (&rhlt, + err =rhltable_insert (rhlt, &rhl_test_objects[i].list_node, test_rht_params_dup);if (WARN (err,"error %d on element %d/%d (%s)\n" , err, i, cnt, slow?"slow" :"fast" )) goto skip_print; } - ret =print_ht (&rhlt); + ret =print_ht (rhlt);WARN (ret != cnt,"missing rhltable elements (%d != %d, %s)\n" , ret, cnt, slow?"slow" :"fast" ); skip_print: -rhltable_destroy (&rhlt); +rhltable_destroy (rhlt); +kfree (rhlt);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 295/352 net: dp83640: expire old TX-skb
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Andrzej Siewior <[email protected]>
[ Upstream commit 53bc8d2af08654659abfadfd3e98eb9922ff787c ]
During sendmsg() a cloned skb is saved via dp83640_txtstamp() in ->tx_queue. After the NIC sends this packet, the PHY will reply with a timestamp for that TX packet. If the cable is pulled at the right time I don't see that packet. It might gets flushed as part of queue shutdown on NIC's side.
Once the link is up again then after the next sendmsg() we enqueue another skb in dp83640_txtstamp() and have two on the list. Then the PHY will send a reply and decode_txts() attaches it to the first skb on the list.
No crash occurs since refcounting works but we are one packet behind. linuxptp/ptp4l usually closes the socket and opens a new one (in such a timeout case) so those "stale" replies never get there. However it does not resume normal operation anymore.
Purge old skbs in decode_txts().
--- drivers/net/phy/dp83640.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-)
drivers/net/phy/dp83640.c +10 -3
@@ -898,14 +898,14 @@ static void decode_txts(struct dp83640_p struct phy_txts *phy_txts) {struct skb_shared_hwtstamps shhwtstamps; +struct dp83640_skb_info *skb_info;struct sk_buff *skb; -u64 ns;u8 overflow; +u64 ns;/* We must already have the skb that triggered this. */ - +again: skb =skb_dequeue (&dp83640->tx_queue); -if (!skb) {pr_debug ("have timestamp but tx_queue empty\n" );return ;
@@ -920,6 +920,11 @@ static void decode_txts(struct dp83640_p }return ; } + skb_info = (struct dp83640_skb_info *)skb->cb; +if (time_after (jiffies, skb_info->tmo)) { +kfree_skb (skb); + goto again; + } ns =phy2txts (phy_txts);memset (&shhwtstamps,0 ,sizeof (shhwtstamps));
@@ -1472,6 +1477,7 @@ static bool dp83640_rxtstamp(struct phy_static void dp83640_txtstamp (struct phy_device *phydev,struct sk_buff *skb,int type) { +struct dp83640_skb_info *skb_info = (struct dp83640_skb_info *)skb->cb;struct dp83640_private *dp83640 = phydev->priv;switch (dp83640->hwts_tx_en) {
@@ -1484,6 +1490,7 @@ static void dp83640_txtstamp(struct phy_/* fall through */ case HWTSTAMP_TX_ON :skb_shinfo (skb)->tx_flags |=SKBTX_IN_PROGRESS ; + skb_info->tmo = jiffies +SKB_TIMESTAMP_TIMEOUT ;skb_queue_tail (&dp83640->tx_queue, skb);break ;
Greg Kroah-Hartman
maintainerPATCH 296/352 net: dsa: Fix lockdep false positive splat
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Marc Zyngier <[email protected]>
[ Upstream commit c8101f7729daee251f4f6505f9d135ec08e1342f ]
Creating a macvtap on a DSA-backed interface results in the following splat when lockdep is enabled:
[ 19.638080] IPv6: ADDRCONF(NETDEV_CHANGE): lan0: link becomes ready
[ 23.041198] device lan0 entered promiscuous mode
[ 23.043445] device eth0 entered promiscuous mode
[ 23.049255]
[ 23.049557] ============================================
[ 23.055021] WARNING: possible recursive locking detected
[ 23.060490] 5.0.0-rc3-00013-g56c857a1b8d3 #118 Not tainted
[ 23.066132] --------------------------------------------
[ 23.071598] ip/2861 is trying to acquire lock:
[ 23.076171] 00000000f61990cb (_xmit_ETHER){+...}, at: dev_set_rx_mode+0x1c/0x38
[ 23.083693]
[ 23.083693] but task is already holding lock:
[ 23.089696] 00000000ecf0c3b4 (_xmit_ETHER){+...}, at: dev_uc_add+0x24/0x70
[ 23.096774]
[ 23.096774] other info that might help us debug this:
[ 23.103494] Possible unsafe locking scenario:
[ 23.103494]
[ 23.109584] CPU0
[ 23.112093] ----
[ 23.114601] lock(_xmit_ETHER);
[ 23.117917] lock(_xmit_ETHER);
[ 23.121233]
[ 23.121233] *** DEADLOCK ***
[ 23.121233]
[ 23.127325] May be due to missing lock nesting notation
[ 23.127325]
[ 23.134315] 2 locks held by ip/2861:
[ 23.137987] #0: 000000003b766c72 (rtnl_mutex){+.+.}, at: rtnetlink_rcv_msg+0x338/0x4e0
[ 23.146231] #1: 00000000ecf0c3b4 (_xmit_ETHER){+...}, at: dev_uc_add+0x24/0x70
[ 23.153757]
[ 23.153757] stack backtrace:
[ 23.158243] CPU: 0 PID: 2861 Comm: ip Not tainted 5.0.0-rc3-00013-g56c857a1b8d3 #118
[ 23.166212] Hardware name: Globalscale Marvell ESPRESSOBin Board (DT)
[ 23.172843] Call trace:
[ 23.175358] dump_backtrace+0x0/0x188
[ 23.179116] show_stack+0x14/0x20
[ 23.182524] dump_stack+0xb4/0xec
[ 23.185928] __lock_acquire+0x123c/0x1860
[ 23.190048] lock_acquire+0xc8/0x248
[ 23.193724] _raw_spin_lock_bh+0x40/0x58
[ 23.197755] dev_set_rx_mode+0x1c/0x38
[ 23.201607] dev_set_promiscuity+0x3c/0x50
[ 23.205820] dsa_slave_change_rx_flags+0x5c/0x70
[ 23.210567] __dev_set_promiscuity+0x148/0x1e0
[ 23.215136] __dev_set_rx_mode+0x74/0x98
[ 23.219167] dev_uc_add+0x54/0x70
[ 23.222575] macvlan_open+0x170/0x1d0
[ 23.226336] __dev_open+0xe0/0x160
[ 23.229830] __dev_change_flags+0x16c/0x1b8
[ 23.234132] dev_change_flags+0x20/0x60
[ 23.238074] do_setlink+0x2d0/0xc50
[ 23.241658] __rtnl_newlink+0x5f8/0x6e8
[ 23.245601] rtnl_newlink+0x50/0x78
[ 23.249184] rtnetlink_rcv_msg+0x360/0x4e0
[ 23.253397] netlink_rcv_skb+0xe8/0x130
[ 23.257338] rtnetlink_rcv+0x14/0x20
[ 23.261012] netlink_unicast+0x190/0x210
[ 23.265043] netlink_sendmsg+0x288/0x350
[ 23.269075] sock_sendmsg+0x18/0x30
[ 23.272659] ___sys_sendmsg+0x29c/0x2c8
[ 23.276602] __sys_sendmsg+0x60/0xb8
[ 23.280276] __arm64_sys_sendmsg+0x1c/0x28
[ 23.284488] el0_svc_common+0xd8/0x138
[ 23.288340] el0_svc_handler+0x24/0x80
[ 23.292192] el0_svc+0x8/0xcThis looks fairly harmless (no actual deadlock occurs), and is fixed in a similar way to c6894dec8ea9 ("bridge: fix lockdep addr_list_lock false positive splat") by putting the addr_list_lock in its own lockdep class.
--- net/dsa/master.c | 4 ++++ 1 file changed, 4 insertions(+)
net/dsa/master.c +4 -0
@@ -179,6 +179,8 @@ static const struct attribute_group dsa_ .attrs = dsa_slave_attrs, }; +static struct lock_class_key dsa_master_addr_list_lock_key; +int dsa_master_setup (struct net_device *dev,struct dsa_port *cpu_dp) {int ret;
@@ -190,6 +192,8 @@ int dsa_master_setup(struct net_device *wmb (); dev->dsa_ptr = cpu_dp; +lockdep_set_class (&dev->addr_list_lock, + &dsa_master_addr_list_lock_key); ret =dsa_master_ethtool_setup (dev);if (ret)
Greg Kroah-Hartman
maintainerPATCH 297/352 net: dsa: Fix NULL checking in dsa_slave_set_eee()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 00670cb8a73b10b10d3c40f045c15411715e4465 ]
This function can't succeed if dp->pl is NULL. It will Oops inside the call to return phylink_ethtool_get_eee(dp->pl, e);
--- net/dsa/slave.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/dsa/slave.c +2 -2
@@ -639,7 +639,7 @@ static int dsa_slave_set_eee(struct net_int ret;/* Port's PHY and MAC both need to be EEE capable */ -if (!dev->phydev && !dp->pl) +if (!dev->phydev || !dp->pl)return -ENODEV ;if (!ds->ops->set_mac_eee)
@@ -659,7 +659,7 @@ static int dsa_slave_get_eee(struct net_int ret;/* Port's PHY and MAC both need to be EEE capable */ -if (!dev->phydev && !dp->pl) +if (!dev->phydev || !dp->pl)return -ENODEV ;if (!ds->ops->get_mac_eee)
Greg Kroah-Hartman
maintainerPATCH 298/352 net: dsa: mv88e6xxx: Fix counting of ATU violations
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Lunn <[email protected]>
[ Upstream commit 75c05a74e745ae7d663b04d75777af80ada2233c ]
The ATU port vector contains a bit per port of the switch. The code wrongly used it as a port number, and incremented a port counter. This resulted in the wrong interfaces counter being incremented, and potentially going off the end of the array of ports.
Fix this by using the source port ID for the violation, which really is a port number.
--- drivers/net/dsa/mv88e6xxx/global1_atu.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-)
drivers/net/dsa/mv88e6xxx/global1_atu.c +12 -9
@@ -314,6 +314,7 @@ static irqreturn_t mv88e6xxx_g1_atu_prob {struct mv88e6xxx_chip *chip = dev_id;struct mv88e6xxx_atu_entry entry; +int spid;int err;u16 val;
@@ -336,6 +337,8 @@ static irqreturn_t mv88e6xxx_g1_atu_probif (err) goto out; + spid = entry.state; +if (val &MV88E6XXX_G1_ATU_OP_AGE_OUT_VIOLATION ) { dev_err_ratelimited(chip->dev, "ATU age out violation for %pM\n",
@@ -344,23 +347,23 @@ static irqreturn_t mv88e6xxx_g1_atu_probif (val &MV88E6XXX_G1_ATU_OP_MEMBER_VIOLATION ) {dev_err_ratelimited (chip->dev, -"ATU member violation for %pM portvec %x\n" , - entry.mac, entry.portvec); - chip->ports[entry.portvec].atu_member_violation++; +"ATU member violation for %pM portvec %x spid %d\n" , + entry.mac, entry.portvec, spid); + chip->ports[spid].atu_member_violation++; }if (val &MV88E6XXX_G1_ATU_OP_MISS_VIOLATION ) {dev_err_ratelimited (chip->dev, -"ATU miss violation for %pM portvec %x\n" , - entry.mac, entry.portvec); - chip->ports[entry.portvec].atu_miss_violation++; +"ATU miss violation for %pM portvec %x spid %d\n" , + entry.mac, entry.portvec, spid); + chip->ports[spid].atu_miss_violation++; }if (val &MV88E6XXX_G1_ATU_OP_FULL_VIOLATION ) {dev_err_ratelimited (chip->dev, -"ATU full violation for %pM portvec %x\n" , - entry.mac, entry.portvec); - chip->ports[entry.portvec].atu_full_violation++; +"ATU full violation for %pM portvec %x spid %d\n" , + entry.mac, entry.portvec, spid); + chip->ports[spid].atu_full_violation++; }mutex_unlock (&chip->reg_lock);
Greg Kroah-Hartman
maintainerPATCH 299/352 net: dsa: slave: Dont propagate flag changes on down slave interfaces
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Rundong Ge <[email protected]>
[ Upstream commit 17ab4f61b8cd6f9c38e9d0b935d86d73b5d0d2b5 ]
The unbalance of master's promiscuity or allmulti will happen after ifdown and ifup a slave interface which is in a bridge.
When we ifdown a slave interface , both the 'dsa_slave_close' and 'dsa_slave_change_rx_flags' will clear the master's flags. The flags of master will be decrease twice.
In the other hand, if we ifup the slave interface again, since the slave's flags were cleared the 'dsa_slave_open' won't set the master's flag, only 'dsa_slave_change_rx_flags' that triggered by 'br_add_if' will set the master's flags. The flags of master is increase once.
Only propagating flag changes when a slave interface is up makes sure this does not happen. The 'vlan_dev_change_rx_flags' had the same problem and was fixed, and changes here follows that fix.
--- net/dsa/slave.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-)
net/dsa/slave.c +8 -5
@@ -140,11 +140,14 @@ static int dsa_slave_close(struct net_destatic void dsa_slave_change_rx_flags (struct net_device *dev,int change) {struct net_device *master =dsa_slave_to_master (dev); - -if (change &IFF_ALLMULTI ) -dev_set_allmulti (master, dev->flags &IFF_ALLMULTI ?1 :-1 ); -if (change &IFF_PROMISC ) -dev_set_promiscuity (master, dev->flags &IFF_PROMISC ?1 :-1 ); +if (dev->flags &IFF_UP ) { +if (change &IFF_ALLMULTI ) +dev_set_allmulti (master, + dev->flags &IFF_ALLMULTI ?1 :-1 ); +if (change &IFF_PROMISC ) +dev_set_promiscuity (master, + dev->flags &IFF_PROMISC ?1 :-1 ); + } }static void dsa_slave_set_rx_mode (struct net_device *dev)
Greg Kroah-Hartman
maintainerPATCH 300/352 net: systemport: Fix WoL with password after deep sleep
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Florian Fainelli <[email protected]>
[ Upstream commit 8dfb8d2cceb76b74ad5b58cc65c75994329b4d5e ]
Broadcom STB chips support a deep sleep mode where all register contents are lost. Because we were stashing the MagicPacket password into some of these registers a suspend into that deep sleep then a resumption would not lead to being able to wake-up from MagicPacket with password again.
Fix this by keeping a software copy of the password and program it during suspend.
--- drivers/net/ethernet/broadcom/bcmsysport.c | 25 ++++++++++--------------- drivers/net/ethernet/broadcom/bcmsysport.h | 2 ++ 2 files changed, 12 insertions(+), 15 deletions(-)
drivers/net/ethernet/broadcom/bcmsysport.c +10 -15
@@ -520,7 +520,6 @@ static void bcm_sysport_get_wol(struct n struct ethtool_wolinfo *wol) {struct bcm_sysport_priv *priv =netdev_priv (dev); -u32 reg; wol->supported =WAKE_MAGIC |WAKE_MAGICSECURE |WAKE_FILTER ; wol->wolopts = priv->wolopts;
@@ -528,11 +527,7 @@ static void bcm_sysport_get_wol(struct nif (!(priv->wolopts &WAKE_MAGICSECURE ))return ; -/* Return the programmed SecureOn password */ - reg =umac_readl (priv,UMAC_PSW_MS ); -put_unaligned_be16 (reg, &wol->sopass[0 ]); - reg =umac_readl (priv,UMAC_PSW_LS ); -put_unaligned_be32 (reg, &wol->sopass[2 ]); +memcpy (wol->sopass, priv->sopass,sizeof (priv->sopass)); } static int bcm_sysport_set_wol(struct net_device *dev,
@@ -548,13 +543,8 @@ static int bcm_sysport_set_wol(struct neif (wol->wolopts & ~supported)return -EINVAL ; -/* Program the SecureOn password */ -if (wol->wolopts &WAKE_MAGICSECURE ) { -umac_writel (priv,get_unaligned_be16 (&wol->sopass[0 ]), -UMAC_PSW_MS ); -umac_writel (priv,get_unaligned_be32 (&wol->sopass[2 ]), -UMAC_PSW_LS ); - } +if (wol->wolopts &WAKE_MAGICSECURE ) +memcpy (priv->sopass, wol->sopass,sizeof (priv->sopass));/* Flag the device and relevant IRQ as wakeup capable */ if (wol->wolopts) {
@@ -2592,13 +2582,18 @@ static int bcm_sysport_suspend_to_wol(stunsigned int index, i =0 ;u32 reg; -/* Password has already been programmed */ reg =umac_readl (priv,UMAC_MPD_CTRL );if (priv->wolopts & (WAKE_MAGIC |WAKE_MAGICSECURE )) reg |=MPD_EN ; reg &= ~PSW_EN ; -if (priv->wolopts &WAKE_MAGICSECURE ) +if (priv->wolopts &WAKE_MAGICSECURE ) { +/* Program the SecureOn password */ +umac_writel (priv,get_unaligned_be16 (&priv->sopass[0 ]), +UMAC_PSW_MS ); +umac_writel (priv,get_unaligned_be32 (&priv->sopass[2 ]), +UMAC_PSW_LS ); reg |=PSW_EN ; + }umac_writel (priv, reg,UMAC_MPD_CTRL );if (priv->wolopts &WAKE_FILTER ) {
drivers/net/ethernet/broadcom/bcmsysport.h +2 -0
@@ -12,6 +12,7 @@#define __BCM_SYSPORT_H#include <linux/bitmap.h> +#include <linux/ethtool.h> #include <linux/if_vlan.h> #include <linux/net_dim.h>
@@ -778,6 +779,7 @@ struct bcm_sysport_priv { unsigned int crc_fwd:1;u16 rev;u32 wolopts; +u8 sopass[SOPASS_MAX ]; unsigned int wol_irq_disabled:1;/* MIB related fields */
Greg Kroah-Hartman
maintainerPATCH 301/352 rds: fix refcount bug in rds_sock_addref
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 6fa19f5637a6c22bc0999596bcc83bdcac8a4fa6 ]
syzbot was able to catch a bug in rds [1]
The issue here is that the socket might be found in a hash table but that its refcount has already be set to 0 by another cpu.
We need to use refcount_inc_not_zero() to be safe here.
[1]
refcount_t: increment on 0; use-after-free.
WARNING: CPU: 1 PID: 23129 at lib/refcount.c:153 refcount_inc_checked lib/refcount.c:153 [inline] WARNING: CPU: 1 PID: 23129 at lib/refcount.c:153 refcount_inc_checked+0x61/0x70 lib/refcount.c:151 Kernel panic - not syncing: panic_on_warn set ... CPU: 1 PID: 23129 Comm: syz-executor3 Not tainted 5.0.0-rc4+ #53 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+0x1db/0x2d0 lib/dump_stack.c:113 panic+0x2cb/0x65c kernel/panic.c:214 __warn.cold+0x20/0x48 kernel/panic.c:571 report_bug+0x263/0x2b0 lib/bug.c:186 fixup_bug arch/x86/kernel/traps.c:178 [inline] fixup_bug arch/x86/kernel/traps.c:173 [inline] do_error_trap+0x11b/0x200 arch/x86/kernel/traps.c:271 do_invalid_op+0x37/0x50 arch/x86/kernel/traps.c:290 invalid_op+0x14/0x20 arch/x86/entry/entry_64.S:973 RIP: 0010:refcount_inc_checked lib/refcount.c:153 [inline] RIP: 0010:refcount_inc_checked+0x61/0x70 lib/refcount.c:151 Code: 1d 51 63 c8 06 31 ff 89 de e8 eb 1b f2 fd 84 db 75 dd e8 a2 1a f2 fd 48 c7 c7 60 9f 81 88 c6 05 31 63 c8 06 01 e8 af 65 bb fd <0f> 0b eb c1 90 66 2e 0f 1f 84 00 00 00 00 00 55 48 89 e5 41 54 49 RSP: 0018:ffff8880a0cbf1e8 EFLAGS: 00010282 RAX: 0000000000000000 RBX: 0000000000000000 RCX: ffffc90006113000 RDX: 000000000001047d RSI: ffffffff81685776 RDI: 0000000000000005 RBP: ffff8880a0cbf1f8 R08: ffff888097c9e100 R09: ffffed1015ce5021 R10: ffffed1015ce5020 R11: ffff8880ae728107 R12: ffff8880723c20c0 R13: ffff8880723c24b0 R14: dffffc0000000000 R15: ffffed1014197e64 sock_hold include/net/sock.h:647 [inline] rds_sock_addref+0x19/0x20 net/rds/af_rds.c:675 rds_find_bound+0x97c/0x1080 net/rds/bind.c:82 rds_recv_incoming+0x3be/0x1430 net/rds/recv.c:362 rds_loop_xmit+0xf3/0x2a0 net/rds/loop.c:96 rds_send_xmit+0x1355/0x2a10 net/rds/send.c:355 rds_sendmsg+0x323c/0x44e0 net/rds/send.c:1368 sock_sendmsg_nosec net/socket.c:621 [inline] sock_sendmsg+0xdd/0x130 net/socket.c:631 __sys_sendto+0x387/0x5f0 net/socket.c:1788 __do_sys_sendto net/socket.c:1800 [inline] __se_sys_sendto net/socket.c:1796 [inline] __x64_sys_sendto+0xe1/0x1a0 net/socket.c:1796 do_syscall_64+0x1a3/0x800 arch/x86/entry/common.c:290 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x458089 Code: 6d b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00 00 66 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 3b b7 fb ff c3 66 2e 0f 1f 84 00 00 00 00 RSP: 002b:00007fc266df8c78 EFLAGS: 00000246 ORIG_RAX: 000000000000002c RAX: ffffffffffffffda RBX: 0000000000000006 RCX: 0000000000458089 RDX: 0000000000000000 RSI: 00000000204b3fff RDI: 0000000000000005 RBP: 000000000073bf00 R08: 00000000202b4000 R09: 0000000000000010 R10: 0000000000000000 R11: 0000000000000246 R12: 00007fc266df96d4 R13: 00000000004c56e4 R14: 00000000004d94a8 R15: 00000000ffffffff
--- net/rds/bind.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
net/rds/bind.c +3 -3
@@ -78,10 +78,10 @@ struct rds_sock *rds_find_bound(const st__rds_create_bind_key (key, addr, port, scope_id);rcu_read_lock (); rs =rhashtable_lookup (&bind_hash_table, key, ht_parms); -if (rs && !sock_flag (rds_rs_to_sk (rs),SOCK_DEAD )) -rds_sock_addref (rs); -else +if (rs && (sock_flag (rds_rs_to_sk (rs),SOCK_DEAD ) || + !refcount_inc_not_zero (&rds_rs_to_sk (rs)->sk_refcnt))) rs =NULL ; +rcu_read_unlock (); rdsdebug("returning rs %p for %pI6c:%u\n", rs, addr,
Greg Kroah-Hartman
maintainerPATCH 302/352 Revert "net: phy: marvell: avoid pause mode on SGMII-to-Copper for 88e151x"
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Russell King <[email protected]>
[ Upstream commit c14f07c6211cc01d52ed92cce1fade5071b8d197 ]
This reverts commit 6623c0fba10ef45b64ca213ad5dec926f37fa9a0.
The original diagnosis was incorrect: it appears that the NIC had PHY polling mode enabled, which meant that it overwrote the PHYs advertisement register during negotiation.
--- drivers/net/phy/marvell.c | 12 ------------ 1 file changed, 12 deletions(-)
drivers/net/phy/marvell.c +0 -12
@@ -847,8 +847,6 @@ static int m88e1510_config_init(struct p/* SGMII-to-Copper mode initialization */ if (phydev->interface ==PHY_INTERFACE_MODE_SGMII ) { -u32 pause; -/* Select page 18 */ err =marvell_set_page (phydev,18 );if (err <0 )
@@ -871,16 +869,6 @@ static int m88e1510_config_init(struct p err =marvell_set_page (phydev,MII_MARVELL_COPPER_PAGE );if (err <0 )return err; - -/* There appears to be a bug in the 88e1512 when used in -* SGMII to copper mode, where the AN advertisement register -* clears the pause bits each time a negotiation occurs. -* This means we can never be truely sure what was advertised, -* so disable Pause support. -*/ - pause = SUPPORTED_Pause | SUPPORTED_Asym_Pause; - phydev->supported &= ~pause; - phydev->advertising &= ~pause; }return m88e1318_config_init (phydev);
Greg Kroah-Hartman
maintainerPATCH 303/352 rxrpc: bad unlock balance in rxrpc_recvmsg
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 6dce3c20ac429e7a651d728e375853370c796e8d ]
When either "goto wait_interrupted;" or "goto wait_error;" paths are taken, socket lock has already been released.
This patch fixes following syzbot splat :
WARNING: bad unlock balance detected!
5.0.0-rc4+ #59 Not tainted
-------------------------------------
syz-executor223/8256 is trying to release lock (sk_lock-AF_RXRPC) at:
[<ffffffff86651353>] rxrpc_recvmsg+0x6d3/0x3099 net/rxrpc/recvmsg.c:598 but there are no more locks to release!
other info that might help us debug this:
1 lock held by syz-executor223/8256:
#0: 00000000fa9ed0f4 (slock-AF_RXRPC){+...}, at: spin_lock_bh include/linux/spinlock.h:334 [inline] #0: 00000000fa9ed0f4 (slock-AF_RXRPC){+...}, at: release_sock+0x20/0x1c0 net/core/sock.c:2798
stack backtrace: CPU: 1 PID: 8256 Comm: syz-executor223 Not tainted 5.0.0-rc4+ #59 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+0x172/0x1f0 lib/dump_stack.c:113 print_unlock_imbalance_bug kernel/locking/lockdep.c:3391 [inline] print_unlock_imbalance_bug.cold+0x114/0x123 kernel/locking/lockdep.c:3368 __lock_release kernel/locking/lockdep.c:3601 [inline] lock_release+0x67e/0xa00 kernel/locking/lockdep.c:3860 sock_release_ownership include/net/sock.h:1471 [inline] release_sock+0x183/0x1c0 net/core/sock.c:2808 rxrpc_recvmsg+0x6d3/0x3099 net/rxrpc/recvmsg.c:598 sock_recvmsg_nosec net/socket.c:794 [inline] sock_recvmsg net/socket.c:801 [inline] sock_recvmsg+0xd0/0x110 net/socket.c:797 __sys_recvfrom+0x1ff/0x350 net/socket.c:1845 __do_sys_recvfrom net/socket.c:1863 [inline] __se_sys_recvfrom net/socket.c:1859 [inline] __x64_sys_recvfrom+0xe1/0x1a0 net/socket.c:1859 do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290 entry_SYSCALL_64_after_hwframe+0x49/0xbe RIP: 0033:0x446379 Code: e8 2c b3 02 00 48 83 c4 18 c3 0f 1f 80 00 00 00 00 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 0f 83 2b 09 fc ff c3 66 2e 0f 1f 84 00 00 00 00 RSP: 002b:00007fe5da89fd98 EFLAGS: 00000246 ORIG_RAX: 000000000000002d RAX: ffffffffffffffda RBX: 00000000006dbc28 RCX: 0000000000446379 RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000003 RBP: 00000000006dbc20 R08: 0000000000000000 R09: 0000000000000000 R10: 0000000000000000 R11: 0000000000000246 R12: 00000000006dbc2c R13: 0000000000000000 R14: 0000000000000000 R15: 20c49ba5e353f7cf
--- net/rxrpc/recvmsg.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
net/rxrpc/recvmsg.c +2 -1
@@ -596,6 +596,7 @@ error_requeue_call: } error_no_call:release_sock (&rx->sk); +error_trace:trace_rxrpc_recvmsg (call, rxrpc_recvmsg_return,0 ,0 ,0 , ret);return ret;
@@ -604,7 +605,7 @@ wait_interrupted: wait_error:finish_wait (sk_sleep (&rx->sk), &wait); call =NULL ; - goto error_no_call; + goto error_trace; }/**
Greg Kroah-Hartman
maintainerPATCH 304/352 sctp: check and update stream->out_curr when allocating stream_out
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit cfe4bd7a257f6d6f81d3458d8c9d9ec4957539e6 ]
Now when using stream reconfig to add out streams, stream->out will get re-allocated, and all old streams' information will be copied to the new ones and the old ones will be freed.
So without stream->out_curr updated, next time when trying to send from stream->out_curr stream, a panic would be caused.
This patch is to check and update stream->out_curr when allocating stream_out.
v1->v2:
- define fa_index() to get elem index from stream->out_curr.v2->v3:
- repost with no change.
--- net/sctp/stream.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+)
net/sctp/stream.c +20 -0
@@ -84,6 +84,19 @@ static void fa_zero(struct flex_array *f } } +static size_t fa_index (struct flex_array *fa,void *elem,size_t count) +{ +size_t index =0 ; + +while (count--) { +if (elem ==flex_array_get (fa, index)) +break ; + index++; + } + +return index; +} +/* Migrates chunks from stream queues to new stream queues if needed, * but not across associations. Also, removes those chunks to streams * higher than the new max.
@@ -147,6 +160,13 @@ static int sctp_stream_alloc_out(structif (stream->out) {fa_copy (out, stream->out,0 ,min (outcnt, stream->outcnt)); +if (stream->out_curr) { +size_t index =fa_index (stream->out, stream->out_curr, + stream->outcnt); + +BUG_ON (index == stream->outcnt); + stream->out_curr =flex_array_get (out, index); + }fa_free (stream->out); }
Greg Kroah-Hartman
maintainerPATCH 305/352 sctp: walk the list of asoc safely
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Greg Kroah-Hartman <[email protected]>
[ Upstream commit ba59fb0273076637f0add4311faa990a5eec27c0 ]
In sctp_sendmesg(), when walking the list of endpoint associations, the association can be dropped from the list, making the list corrupt. Properly handle this by using list_for_each_entry_safe()
--- net/sctp/socket.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
net/sctp/socket.c +2 -2
@@ -2027,7 +2027,7 @@ static int sctp_sendmsg(struct sock *sk,struct sctp_endpoint *ep =sctp_sk (sk)->ep;struct sctp_transport *transport =NULL ;struct sctp_sndrcvinfo _sinfo, *sinfo; -struct sctp_association *asoc; +struct sctp_association *asoc, *tmp;struct sctp_cmsgs cmsgs;union sctp_addr *daddr;bool new = false;
@@ -2053,7 +2053,7 @@ static int sctp_sendmsg(struct sock *sk,/* SCTP_SENDALL process */ if ((sflags &SCTP_SENDALL ) &&sctp_style (sk,UDP )) { -list_for_each_entry (asoc, &ep->asocs, asocs) { +list_for_each_entry_safe (asoc, tmp, &ep->asocs, asocs) { err =sctp_sendmsg_check_sflags (asoc, sflags, msg, msg_len);if (err ==0 )
Greg Kroah-Hartman
maintainerPATCH 306/352 skge: potential memory corruption in skge_get_regs()
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Dan Carpenter <[email protected]>
[ Upstream commit 294c149a209c6196c2de85f512b52ef50f519949 ]
The "p" buffer is 0x4000 bytes long. B3_RI_WTO_R1 is 0x190. The value of "regs->len" is in the 1-0x4000 range. The bug here is that "regs->len - B3_RI_WTO_R1" can be a negative value which would lead to memory corruption and an abrupt crash.
--- drivers/net/ethernet/marvell/skge.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/marvell/skge.c +4 -2
@@ -152,8 +152,10 @@ static void skge_get_regs(struct net_devmemset (p,0 , regs->len);memcpy_fromio (p, io,B3_RAM_ADDR ); -memcpy_fromio (p +B3_RI_WTO_R1 , io +B3_RI_WTO_R1 , - regs->len -B3_RI_WTO_R1 ); +if (regs->len >B3_RI_WTO_R1 ) { +memcpy_fromio (p +B3_RI_WTO_R1 , io +B3_RI_WTO_R1 , + regs->len -B3_RI_WTO_R1 ); + } }/* Wake on Lan only supported on Yukon chips with rev 1 or above */
Greg Kroah-Hartman
maintainerPATCH 307/352 virtio_net: Account for tx bytes and packets on sending xdp_frames
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Toshiaki Makita <[email protected]>
[ Upstream commit 546f28974d771b124fb0bf7b551b343888cf0419 ]
Previously virtnet_xdp_xmit() did not account for device tx counters, which caused confusions.
To be consistent with SKBs, account them on freeing xdp_frames.
--- drivers/net/virtio_net.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-)
drivers/net/virtio_net.c +16 -4
@@ -502,6 +502,8 @@ static int virtnet_xdp_xmit(struct net_dstruct bpf_prog *xdp_prog;struct send_queue *sq;unsigned int len; +int packets =0 ; +int bytes =0 ;int drops =0 ;int kicks =0 ;int ret, err;
@@ -525,10 +527,18 @@ static int virtnet_xdp_xmit(struct net_d/* Free up any pending old buffers before queueing new ones. */ while ((ptr =virtqueue_get_buf (sq->vq, &len)) !=NULL ) { -if (likely (is_xdp_frame (ptr))) -xdp_return_frame (ptr_to_xdp (ptr)); -else -napi_consume_skb (ptr, false); +if (likely (is_xdp_frame (ptr))) { +struct xdp_frame *frame =ptr_to_xdp (ptr); + + bytes += frame->len; +xdp_return_frame (frame); + }else { +struct sk_buff *skb = ptr; + + bytes += skb->len; +napi_consume_skb (skb, false); + } + packets++; }for (i =0 ; i < n; i++) {
@@ -548,6 +558,8 @@ static int virtnet_xdp_xmit(struct net_d } out:u64_stats_update_begin (&sq->stats.syncp); + sq->stats.bytes += bytes; + sq->stats.packets += packets; sq->stats.xdp_tx += n; sq->stats.xdp_tx_drops += drops; sq->stats.kicks += kicks;
Greg Kroah-Hartman
maintainerPATCH 308/352 bnxt_en: Disable interrupts when allocating CP rings or NQs.
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Michael Chan <[email protected]>
[ Upstream commit 5e66e35aab335b83d9ffb220d8a3a13986a7a60e ]
When calling firmware to allocate a CP ring or NQ, an interrupt associated with that ring may be generated immediately before the doorbell is even setup after the firmware call returns. When servicing the interrupt, the driver may crash when trying to access the doorbell.
Fix it by disabling interrupt on that vector until the doorbell is set up.
--- drivers/net/ethernet/broadcom/bnxt/bnxt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/net/ethernet/broadcom/bnxt/bnxt.c +7 -1
@@ -4903,12 +4903,18 @@ static int bnxt_hwrm_ring_alloc(struct bstruct bnxt_cp_ring_info *cpr = &bnapi->cp_ring;struct bnxt_ring_struct *ring = &cpr->cp_ring_struct;u32 map_idx = ring->map_idx; +unsigned int vector; + vector = bp->irq_tbl[map_idx].vector; +disable_irq_nosync (vector); rc =hwrm_ring_alloc_send_msg (bp, ring, type, map_idx); -if (rc) +if (rc) { +enable_irq (vector); goto err_out; + }bnxt_set_db (bp, &cpr->cp_db, type, map_idx, ring->fw_ring_id);bnxt_db_nq (bp, &cpr->cp_db, cpr->cp_raw_cons); +enable_irq (vector); bp->grp_info[i].cp_fw_ring_id = ring->fw_ring_id;if (!i) {
Greg Kroah-Hartman
maintainerPATCH 309/352 net: cls_flower: Remove filter from mask before freeing it
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Petr Machata <[email protected]>
[ Upstream commit c1f7e02979edd7a3a3e69fe04be60b1d650dc8a7 ]
In fl_change(), when adding a new rule (i.e. fold == NULL), a driver may reject the new rule, for example due to resource exhaustion. By that point, the new rule was already assigned a mask, and it was added to that mask's hash table. The clean-up path that's invoked as a result of the rejection however neglects to undo the hash table addition, and proceeds to free the new rule, thus leaving a dangling pointer in the hash table.
Fix by removing fnew from the mask's hash table before it is freed.
--- net/sched/cls_flower.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
net/sched/cls_flower.c +5 -1
@@ -1257,7 +1257,7 @@ static int fl_change(struct net *net, stif (!tc_skip_hw (fnew->flags)) { err =fl_hw_replace_filter (tp, fnew, extack);if (err) - goto errout_mask; + goto errout_mask_ht; }if (!tc_in_hw (fnew->flags))
@@ -1287,6 +1287,10 @@ static int fl_change(struct net *net, stkfree (mask);return 0 ; +errout_mask_ht: +rhashtable_remove_fast (&fnew->mask->ht, &fnew->ht_node, + fnew->mask->filter_ht_params); + errout_mask:fl_mask_put (head, fnew->mask, false);
Greg Kroah-Hartman
maintainerPATCH 310/352 net: dsa: b53: Fix for failure when irq is not defined in dt
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arun Parameswaran <[email protected]>
[ Upstream commit 39841cc1cbb69344539c98a1fa9d858ed124c7ba ]
Fixes the issues with non BCM58XX chips in the b53 driver failing, when the irq is not specified in the device tree.
Removed the check for BCM58XX in b53_srab_prepare_irq(), so the 'port->irq' will be set to '-EXIO' if the irq is not specified in the device tree.
--- drivers/net/dsa/b53/b53_srab.c | 3 --- 1 file changed, 3 deletions(-)
drivers/net/dsa/b53/b53_srab.c +0 -3
@@ -511,9 +511,6 @@ static void b53_srab_prepare_irq(struct/* Clear all pending interrupts */ writel (0xffffffff , priv->regs +B53_SRAB_INTR ); -if (dev->pdata && dev->pdata->chip_id !=BCM58XX_DEVICE_ID ) -return ; -for (i =0 ; i <B53_N_PORTS ; i++) { port = &priv->port_intrs[i];
Greg Kroah-Hartman
maintainerPATCH 311/352 net/mlx5e: Use the inner headers to determine tc/pedit offload limitation on decap flows
In reply to Greg Kroah-Hartman4.20-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guy Shattah <[email protected]>
[ Upstream commit 1651925d403e077e3fc86f961905e27c6810e132 ]
In packets that need to be decaped the internal headers have to be checked, not the external ones.
--- drivers/net/ethernet/mellanox/mlx5/core/en_tc.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c +7 -2
@@ -2133,6 +2133,7 @@ static bool csum_offload_supported(strucstatic bool modify_header_match_supported (struct mlx5_flow_spec *spec,struct tcf_exts *exts, +u32 match_actions,struct netlink_ext_ack *extack) {const struct tc_action *a;
@@ -2143,7 +2144,11 @@ static bool modify_header_match_supporteu16 ethertype;int nkeys, i; - headers_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, outer_headers); +if (match_actions &MLX5_FLOW_CONTEXT_ACTION_DECAP ) + headers_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, inner_headers); +else + headers_v =MLX5_ADDR_OF (fte_match_param, spec->match_value, outer_headers); + ethertype =MLX5_GET (fte_match_set_lyr_2_4, headers_v, ethertype);/* for non-IP we only re-write MACs, so we're okay */
@@ -2200,7 +2205,7 @@ static bool actions_match_supported(struif (actions &MLX5_FLOW_CONTEXT_ACTION_MOD_HDR )return modify_header_match_supported (&parse_attr->spec, exts, - extack); + actions, extack);return true; }