5.3.4-stable review
Subsystems (8)
Greg Kroah-Hartman
maintainerPATCH 141/344 media: dvb-frontends: use ida for pll number
In reply to Greg Kroah-HartmanFrom: Sean Young <[email protected]>
[ Upstream commit c268e7adea52be0093de1164c425f3c8d8927770 ]
KASAN: global-out-of-bounds Read in dvb_pll_attach
Syzbot reported global-out-of-bounds Read in dvb_pll_attach, while accessing id[dvb_pll_devcount], because dvb_pll_devcount was 65, that is more than size of 'id' which is DVB_PLL_MAX(64).
Rather than increasing dvb_pll_devcount every time, use ida so that numbers are allocated correctly. This does mean that no more than 64 devices can be attached at the same time, but this is more than sufficient.
usb 1-1: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
dvbdev: DVB: registering new adapter (774 Friio White ISDB-T USB2.0) usb 1-1: media controller created
dvbdev: dvb_create_media_entity: media entity 'dvb-demux' registered. tc90522 0-0018: Toshiba TC90522 attached.
usb 1-1: DVB: registering adapter 0 frontend 0 (Toshiba TC90522 ISDB-T module)...
dvbdev: dvb_create_media_entity: media entity 'Toshiba TC90522 ISDB-T module' registered.
==================================================================
BUG: KASAN: global-out-of-bounds in dvb_pll_attach+0x6c5/0x830 drivers/media/dvb-frontends/dvb-pll.c:798 Read of size 4 at addr ffffffff89c9e5e0 by task kworker/0:1/12 CPU: 0 PID: 12 Comm: kworker/0:1 Not tainted 5.2.0-rc6+ #13 Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011 Workqueue: usb_hub_wq hub_event Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0xca/0x13e lib/dump_stack.c:113 print_address_description+0x67/0x231 mm/kasan/report.c:188 __kasan_report.cold+0x1a/0x32 mm/kasan/report.c:317 kasan_report+0xe/0x20 mm/kasan/common.c:614 dvb_pll_attach+0x6c5/0x830 drivers/media/dvb-frontends/dvb-pll.c:798 dvb_pll_probe+0xfe/0x174 drivers/media/dvb-frontends/dvb-pll.c:877 i2c_device_probe+0x790/0xaa0 drivers/i2c/i2c-core-base.c:389 really_probe+0x281/0x660 drivers/base/dd.c:509 driver_probe_device+0x104/0x210 drivers/base/dd.c:670 __device_attach_driver+0x1c2/0x220 drivers/base/dd.c:777 bus_for_each_drv+0x15c/0x1e0 drivers/base/bus.c:454 __device_attach+0x217/0x360 drivers/base/dd.c:843 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:514 device_add+0xae6/0x16f0 drivers/base/core.c:2111 i2c_new_client_device+0x5b3/0xc40 drivers/i2c/i2c-core-base.c:778 i2c_new_device+0x19/0x50 drivers/i2c/i2c-core-base.c:821 dvb_module_probe+0xf9/0x220 drivers/media/dvb-core/dvbdev.c:985 friio_tuner_attach+0x125/0x1d0 drivers/media/usb/dvb-usb-v2/gl861.c:536 dvb_usbv2_adapter_frontend_init drivers/media/usb/dvb-usb-v2/dvb_usb_core.c:675 [inline] dvb_usbv2_adapter_init drivers/media/usb/dvb-usb-v2/dvb_usb_core.c:804 [inline] dvb_usbv2_init drivers/media/usb/dvb-usb-v2/dvb_usb_core.c:865 [inline] dvb_usbv2_probe.cold+0x24dc/0x255d drivers/media/usb/dvb-usb-v2/dvb_usb_core.c:980 usb_probe_interface+0x305/0x7a0 drivers/usb/core/driver.c:361 really_probe+0x281/0x660 drivers/base/dd.c:509 driver_probe_device+0x104/0x210 drivers/base/dd.c:670 __device_attach_driver+0x1c2/0x220 drivers/base/dd.c:777 bus_for_each_drv+0x15c/0x1e0 drivers/base/bus.c:454 __device_attach+0x217/0x360 drivers/base/dd.c:843 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:514 device_add+0xae6/0x16f0 drivers/base/core.c:2111 usb_set_configuration+0xdf6/0x1670 drivers/usb/core/message.c:2023 generic_probe+0x9d/0xd5 drivers/usb/core/generic.c:210 usb_probe_device+0x99/0x100 drivers/usb/core/driver.c:266 really_probe+0x281/0x660 drivers/base/dd.c:509 driver_probe_device+0x104/0x210 drivers/base/dd.c:670 __device_attach_driver+0x1c2/0x220 drivers/base/dd.c:777 bus_for_each_drv+0x15c/0x1e0 drivers/base/bus.c:454 __device_attach+0x217/0x360 drivers/base/dd.c:843 bus_probe_device+0x1e4/0x290 drivers/base/bus.c:514 device_add+0xae6/0x16f0 drivers/base/core.c:2111 usb_new_device.cold+0x8c1/0x1016 drivers/usb/core/hub.c:2534 hub_port_connect drivers/usb/core/hub.c:5089 [inline] hub_port_connect_change drivers/usb/core/hub.c:5204 [inline] port_event drivers/usb/core/hub.c:5350 [inline] hub_event+0x1ada/0x3590 drivers/usb/core/hub.c:5432 process_one_work+0x905/0x1570 kernel/workqueue.c:2269 process_scheduled_works kernel/workqueue.c:2331 [inline] worker_thread+0x7ab/0xe20 kernel/workqueue.c:2417 kthread+0x30b/0x410 kernel/kthread.c:255 ret_from_fork+0x24/0x30 arch/x86/entry/entry_64.S:352 The buggy address belongs to the variable: id+0x100/0x120 Memory state around the buggy address: ffffffff89c9e480: fa fa fa fa 00 00 fa fa fa fa fa fa 00 00 00 00 ffffffff89c9e500: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Quoted 1 line
ffffffff89c9e580: 00 00 00 00 00 00 00 00 00 00 00 00 fa fa fa fa
^
ffffffff89c9e600: 04 fa fa fa fa fa fa fa 04 fa fa fa fa fa fa fa
ffffffff89c9e680: 04 fa fa fa fa fa fa fa 04 fa fa fa fa fa fa fa
==================================================================
--- drivers/media/dvb-frontends/dvb-pll.c | 40 ++++++++++++++++----------- 1 file changed, 24 insertions(+), 16 deletions(-)
drivers/media/dvb-frontends/dvb-pll.c +24 -16
@@ -9,6 +9,7 @@#include <linux/slab.h> #include <linux/module.h> +#include <linux/idr.h> #include <linux/dvb/frontend.h> #include <asm/types.h>
@@ -34,8 +35,7 @@ struct dvb_pll_priv { };#define DVB_PLL_MAX 64 - -static unsigned int dvb_pll_devcount; +static DEFINE_IDA (pll_ida);static int debug;module_param (debug, int,0644 );
@@ -787,6 +787,7 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,struct dvb_pll_priv *priv =NULL ;int ret;const struct dvb_pll_desc *desc; +int nr; b1 =kmalloc (1 ,GFP_KERNEL );if (!b1)
@@ -795,9 +796,14 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, b1[0 ] =0 ; msg.buf = b1; -if ((id[dvb_pll_devcount] >DVB_PLL_UNDEFINED ) && - (id[dvb_pll_devcount] <ARRAY_SIZE (pll_list))) - pll_desc_id = id[dvb_pll_devcount]; + nr =ida_simple_get (&pll_ida,0 ,DVB_PLL_MAX ,GFP_KERNEL ); +if (nr <0 ) { +kfree (b1); +return NULL ; + } + +if (id[nr] >DVB_PLL_UNDEFINED && id[nr] <ARRAY_SIZE (pll_list)) + pll_desc_id = id[nr];BUG_ON (pll_desc_id <1 || pll_desc_id >=ARRAY_SIZE (pll_list));
@@ -808,24 +814,20 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr, fe->ops.i2c_gate_ctrl (fe,1 ); ret =i2c_transfer (i2c, &msg,1 ); -if (ret !=1 ) { -kfree (b1); -return NULL ; - } +if (ret !=1 ) + goto out;if (fe->ops.i2c_gate_ctrl) fe->ops.i2c_gate_ctrl (fe,0 ); } priv =kzalloc (sizeof (struct dvb_pll_priv ),GFP_KERNEL ); -if (!priv) { -kfree (b1); -return NULL ; - } +if (!priv) + goto out; priv->pll_i2c_address = pll_addr; priv->i2c = i2c; priv->pll_desc = desc; - priv->nr = dvb_pll_devcount++; + priv->nr = nr;memcpy (&fe->ops.tuner_ops, &dvb_pll_tuner_ops,sizeof (struct dvb_tuner_ops ));
@@ -858,6 +860,11 @@ struct dvb_frontend *dvb_pll_attach(struct dvb_frontend *fe, int pll_addr,kfree (b1);return fe; +out: +kfree (b1); +ida_simple_remove (&pll_ida, nr); + +return NULL ; }EXPORT_SYMBOL (dvb_pll_attach);
@@ -894,9 +901,10 @@ dvb_pll_probe(struct i2c_client *client, const struct i2c_device_id *id)static int dvb_pll_remove (struct i2c_client *client) { -struct dvb_frontend *fe; +struct dvb_frontend *fe =i2c_get_clientdata (client); +struct dvb_pll_priv *priv = fe->tuner_priv; - fe =i2c_get_clientdata (client); +ida_simple_remove (&pll_ida, priv->nr);dvb_pll_release (fe);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 142/344 posix-cpu-timers: Sanitize bogus WARNONS
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit 692117c1f7a6770ed41dd8f277cd9fed1dfb16f1 ]
Warning when p == NULL and then proceeding and dereferencing p does not make any sense as the kernel will crash with a NULL pointer dereference right away.
Bailing out when p == NULL and returning an error code does not cure the underlying problem which caused p to be NULL. Though it might allow to do proper debugging.
Same applies to the clock id check in set_process_cpu_timer().
Clean them up and make them return without trying to do further damage.
--- kernel/time/posix-cpu-timers.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-)
kernel/time/posix-cpu-timers.c +13 -7
@@ -375,7 +375,8 @@ static int posix_cpu_timer_del(struct k_itimer *timer)struct sighand_struct *sighand;struct task_struct *p = timer->it.cpu.task; -WARN_ON_ONCE (p ==NULL ); +if (WARN_ON_ONCE (!p)) +return -EINVAL ;/* * Protect against sighand release/switch in exit/exec and process/
@@ -580,7 +581,8 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,u64 old_expires, new_expires, old_incr, val;int ret; -WARN_ON_ONCE (p ==NULL ); +if (WARN_ON_ONCE (!p)) +return -EINVAL ;/* * Use the to_ktime conversion because that clamps the maximum
@@ -715,10 +717,11 @@ static int posix_cpu_timer_set(struct k_itimer *timer, int timer_flags,static void posix_cpu_timer_get (struct k_itimer *timer,struct itimerspec64 *itp) { -u64 now;struct task_struct *p = timer->it.cpu.task; +u64 now; -WARN_ON_ONCE (p ==NULL ); +if (WARN_ON_ONCE (!p)) +return ;/* * Easy part: convert the reload time.
@@ -1000,12 +1003,13 @@ static void check_process_timers(struct task_struct *tsk,*/ static void posix_cpu_timer_rearm (struct k_itimer *timer) { +struct task_struct *p = timer->it.cpu.task;struct sighand_struct *sighand;unsigned long flags; -struct task_struct *p = timer->it.cpu.task;u64 now; -WARN_ON_ONCE (p ==NULL ); +if (WARN_ON_ONCE (!p)) +return ;/* * Fetch the current sample and update the timer's expiry time.
@@ -1202,7 +1206,9 @@ void set_process_cpu_timer(struct task_struct *tsk, unsigned int clock_idx,u64 now;int ret; -WARN_ON_ONCE (clock_idx ==CPUCLOCK_SCHED ); +if (WARN_ON_ONCE (clock_idx >=CPUCLOCK_SCHED )) +return ; + ret =cpu_timer_sample_group (clock_idx, tsk, &now);if (oldval && ret != -EINVAL ) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 143/344 media: dvb-core: fix a memory leak bug
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit fcd5ce4b3936242e6679875a4d3c3acfc8743e15 ]
In dvb_create_media_entity(), 'dvbdev->entity' is allocated through kzalloc(). Then, 'dvbdev->pads' is allocated through kcalloc(). However, if kcalloc() fails, the allocated 'dvbdev->entity' is not deallocated, leading to a memory leak bug. To fix this issue, free 'dvbdev->entity' before returning -ENOMEM.
--- drivers/media/dvb-core/dvbdev.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/media/dvb-core/dvbdev.c +3 -1
@@ -339,8 +339,10 @@ static int dvb_create_media_entity(struct dvb_device *dvbdev,if (npads) { dvbdev->pads =kcalloc (npads,sizeof (*dvbdev->pads),GFP_KERNEL ); -if (!dvbdev->pads) +if (!dvbdev->pads) { +kfree (dvbdev->entity);return -ENOMEM ; + } }switch (type) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 144/344 EDAC/amd64: Support more than two controllers for chip selects handling
In reply to Greg Kroah-HartmanFrom: Yazen Ghannam <[email protected]>
[ Upstream commit d971e28e2ce4696fcc32998c8aced5e47701fffe ]
The struct chip_select array that's used for saving chip select bases and masks is fixed at length of two. There should be one struct chip_select for each controller, so this array should be increased to support systems that may have more than two controllers.
Increase the size of the struct chip_select array to eight, which is the largest number of controllers per die currently supported on AMD systems.
Fix number of DIMMs and Chip Select bases/masks on Family17h, because AMD Family 17h systems support 2 DIMMs, 4 CS bases, and 2 CS masks per channel.
Also, carve out the Family 17h+ reading of the bases/masks into a separate function. This effectively reverts the original bases/masks reading code to before Family 17h support was added.
--- drivers/edac/amd64_edac.c | 123 +++++++++++++++++++++----------------- drivers/edac/amd64_edac.h | 5 +- 2 files changed, 71 insertions(+), 57 deletions(-)
drivers/edac/amd64_edac.c +68 -55
@@ -810,7 +810,7 @@ static void debug_display_dimm_sizes_df(struct amd64_pvt *pvt, u8 ctrl)edac_printk (KERN_DEBUG ,EDAC_MC ,"UMC%d chip selects:\n" , ctrl); -for (dimm =0 ; dimm <4 ; dimm++) { +for (dimm =0 ; dimm <2 ; dimm++) { size0 =0 ; cs0 = dimm *2 ;
@@ -942,89 +942,102 @@ static void prep_chip_selects(struct amd64_pvt *pvt) }else if (pvt->fam ==0x15 && pvt->model ==0x30 ) { pvt->csels[0 ].b_cnt = pvt->csels[1 ].b_cnt =4 ; pvt->csels[0 ].m_cnt = pvt->csels[1 ].m_cnt =2 ; + }else if (pvt->fam >=0x17 ) { +int umc; + +for_each_umc (umc) { + pvt->csels[umc].b_cnt =4 ; + pvt->csels[umc].m_cnt =2 ; + } + }else { pvt->csels[0 ].b_cnt = pvt->csels[1 ].b_cnt =8 ; pvt->csels[0 ].m_cnt = pvt->csels[1 ].m_cnt =4 ; } } +static void read_umc_base_mask (struct amd64_pvt *pvt) +{ +u32 umc_base_reg, umc_mask_reg; +u32 base_reg, mask_reg; +u32 *base, *mask; +int cs, umc; + +for_each_umc (umc) { + umc_base_reg =get_umc_base (umc) +UMCCH_BASE_ADDR ; + +for_each_chip_select (cs, umc, pvt) { + base = &pvt->csels[umc].csbases[cs]; + + base_reg = umc_base_reg + (cs *4 ); + +if (!amd_smn_read (pvt->mc_node_id, base_reg, base)) +edac_dbg (0 ," DCSB%d[%d]=0x%08x reg: 0x%x\n" , + umc, cs, *base, base_reg); + } + + umc_mask_reg =get_umc_base (umc) +UMCCH_ADDR_MASK ; + +for_each_chip_select_mask (cs, umc, pvt) { + mask = &pvt->csels[umc].csmasks[cs]; + + mask_reg = umc_mask_reg + (cs *4 ); + +if (!amd_smn_read (pvt->mc_node_id, mask_reg, mask)) +edac_dbg (0 ," DCSM%d[%d]=0x%08x reg: 0x%x\n" , + umc, cs, *mask, mask_reg); + } + } +} +/* * Function 2 Offset F10_DCSB0; read in the DCS Base and DCS Mask registers */ static void read_dct_base_mask (struct amd64_pvt *pvt) { -int base_reg0, base_reg1, mask_reg0, mask_reg1, cs; +int cs;prep_chip_selects (pvt); -if (pvt->umc) { - base_reg0 =get_umc_base (0 ) +UMCCH_BASE_ADDR ; - base_reg1 =get_umc_base (1 ) +UMCCH_BASE_ADDR ; - mask_reg0 =get_umc_base (0 ) +UMCCH_ADDR_MASK ; - mask_reg1 =get_umc_base (1 ) +UMCCH_ADDR_MASK ; - }else { - base_reg0 =DCSB0 ; - base_reg1 =DCSB1 ; - mask_reg0 =DCSM0 ; - mask_reg1 =DCSM1 ; - } +if (pvt->umc) +return read_umc_base_mask (pvt);for_each_chip_select (cs,0 , pvt) { -int reg0 = base_reg0 + (cs *4 ); -int reg1 = base_reg1 + (cs *4 ); +int reg0 =DCSB0 + (cs *4 ); +int reg1 =DCSB1 + (cs *4 );u32 *base0 = &pvt->csels[0 ].csbases[cs];u32 *base1 = &pvt->csels[1 ].csbases[cs]; -if (pvt->umc) { -if (!amd_smn_read (pvt->mc_node_id, reg0, base0)) -edac_dbg (0 ," DCSB0[%d]=0x%08x reg: 0x%x\n" , - cs, *base0, reg0); - -if (!amd_smn_read (pvt->mc_node_id, reg1, base1)) -edac_dbg (0 ," DCSB1[%d]=0x%08x reg: 0x%x\n" , - cs, *base1, reg1); - }else { -if (!amd64_read_dct_pci_cfg (pvt,0 , reg0, base0)) -edac_dbg (0 ," DCSB0[%d]=0x%08x reg: F2x%x\n" , - cs, *base0, reg0); +if (!amd64_read_dct_pci_cfg (pvt,0 , reg0, base0)) +edac_dbg (0 ," DCSB0[%d]=0x%08x reg: F2x%x\n" , + cs, *base0, reg0); -if (pvt->fam ==0xf ) -continue ; +if (pvt->fam ==0xf ) +continue ; -if (!amd64_read_dct_pci_cfg (pvt,1 , reg0, base1)) -edac_dbg (0 ," DCSB1[%d]=0x%08x reg: F2x%x\n" , - cs, *base1, (pvt->fam ==0x10 ) ? reg1 - : reg0); - } +if (!amd64_read_dct_pci_cfg (pvt,1 , reg0, base1)) +edac_dbg (0 ," DCSB1[%d]=0x%08x reg: F2x%x\n" , + cs, *base1, (pvt->fam ==0x10 ) ? reg1 + : reg0); }for_each_chip_select_mask (cs,0 , pvt) { -int reg0 = mask_reg0 + (cs *4 ); -int reg1 = mask_reg1 + (cs *4 ); +int reg0 =DCSM0 + (cs *4 ); +int reg1 =DCSM1 + (cs *4 );u32 *mask0 = &pvt->csels[0 ].csmasks[cs];u32 *mask1 = &pvt->csels[1 ].csmasks[cs]; -if (pvt->umc) { -if (!amd_smn_read (pvt->mc_node_id, reg0, mask0)) -edac_dbg (0 ," DCSM0[%d]=0x%08x reg: 0x%x\n" , - cs, *mask0, reg0); - -if (!amd_smn_read (pvt->mc_node_id, reg1, mask1)) -edac_dbg (0 ," DCSM1[%d]=0x%08x reg: 0x%x\n" , - cs, *mask1, reg1); - }else { -if (!amd64_read_dct_pci_cfg (pvt,0 , reg0, mask0)) -edac_dbg (0 ," DCSM0[%d]=0x%08x reg: F2x%x\n" , - cs, *mask0, reg0); +if (!amd64_read_dct_pci_cfg (pvt,0 , reg0, mask0)) +edac_dbg (0 ," DCSM0[%d]=0x%08x reg: F2x%x\n" , + cs, *mask0, reg0); -if (pvt->fam ==0xf ) -continue ; +if (pvt->fam ==0xf ) +continue ; -if (!amd64_read_dct_pci_cfg (pvt,1 , reg0, mask1)) -edac_dbg (0 ," DCSM1[%d]=0x%08x reg: F2x%x\n" , - cs, *mask1, (pvt->fam ==0x10 ) ? reg1 - : reg0); - } +if (!amd64_read_dct_pci_cfg (pvt,1 , reg0, mask1)) +edac_dbg (0 ," DCSM1[%d]=0x%08x reg: F2x%x\n" , + cs, *mask1, (pvt->fam ==0x10 ) ? reg1 + : reg0); } }
drivers/edac/amd64_edac.h +3 -2
@@ -96,6 +96,7 @@/* Hardware limit on ChipSelect rows per MC and processors per system */ #define NUM_CHIPSELECTS 8#define DRAM_RANGES 8 +#define NUM_CONTROLLERS 8#define ON true#define OFF false
@@ -351,8 +352,8 @@ struct amd64_pvt {u32 dbam0;/* DRAM Base Address Mapping reg for DCT0 */ u32 dbam1;/* DRAM Base Address Mapping reg for DCT1 */ -/* one for each DCT */ -struct chip_select csels[2 ]; +/* one for each DCT/UMC */ +struct chip_select csels[NUM_CONTROLLERS ];/* DRAM base and limit pairs F1x[78,70,68,60,58,50,48,40] */ struct dram_range ranges[DRAM_RANGES ];
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 145/344 cpufreq: imx-cpufreq-dt: Add i.MX8MN support
In reply to Greg Kroah-HartmanFrom: Anson Huang <[email protected]>
[ Upstream commit 75c000c4bcbe2b0eb82baf90c7dd75c7380cc3fd ]
i.MX8MN has different speed grading definition as below, it has 4 bits to define speed grading, add support for it.
SPEED_GRADE[3:0] MHz
0000 2300
0001 2200
0010 2100
0011 2000
0100 1900
0101 1800
0110 1700
0111 1600
1000 1500
1001 1400
1010 1300
1011 1200
1100 1100
1101 1000
1110 900
1111 800--- drivers/cpufreq/imx-cpufreq-dt.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-)
drivers/cpufreq/imx-cpufreq-dt.c +7 -1
@@ -16,6 +16,7 @@#define OCOTP_CFG3_SPEED_GRADE_SHIFT 8#define OCOTP_CFG3_SPEED_GRADE_MASK (0x3 << 8) +#define IMX8MN_OCOTP_CFG3_SPEED_GRADE_MASK (0xf << 8)#define OCOTP_CFG3_MKT_SEGMENT_SHIFT 6#define OCOTP_CFG3_MKT_SEGMENT_MASK (0x3 << 6)
@@ -34,7 +35,12 @@ static int imx_cpufreq_dt_probe(struct platform_device *pdev)if (ret)return ret; - speed_grade = (cell_value &OCOTP_CFG3_SPEED_GRADE_MASK ) >>OCOTP_CFG3_SPEED_GRADE_SHIFT ; +if (of_machine_is_compatible ("fsl,imx8mn" )) + speed_grade = (cell_value &IMX8MN_OCOTP_CFG3_SPEED_GRADE_MASK ) + >>OCOTP_CFG3_SPEED_GRADE_SHIFT ; +else + speed_grade = (cell_value &OCOTP_CFG3_SPEED_GRADE_MASK ) + >>OCOTP_CFG3_SPEED_GRADE_SHIFT ; mkt_segment = (cell_value &OCOTP_CFG3_MKT_SEGMENT_MASK ) >>OCOTP_CFG3_MKT_SEGMENT_SHIFT ;/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 146/344 libperf: Fix alignment trap with xyarray contents in perf stat
In reply to Greg Kroah-HartmanFrom: Gerald BAEZA <[email protected]>
[ Upstream commit d9c5c083416500e95da098c01be092b937def7fa ]
Following the patch 'perf stat: Fix --no-scale', an alignment trap happens in process_counter_values() on ARMv7 platforms due to the attempt to copy non 64 bits aligned double words (pointed by 'count') via a NEON vectored instruction ('vld1' with 64 bits alignment constraint).
This patch sets a 64 bits alignment constraint on 'contents[]' field in 'struct xyarray' since the 'count' pointer used above points to such a structure.
--- tools/perf/util/xyarray.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
tools/perf/util/xyarray.h +2 -1
@@ -2,6 +2,7 @@#ifndef _PERF_XYARRAY_H_#define _PERF_XYARRAY_H_ 1 +#include <linux/compiler.h> #include <sys/types.h> struct xyarray {
@@ -10,7 +11,7 @@ struct xyarray {size_t entries;size_t max_x;size_t max_y; -char contents[]; +char contents[]__aligned(8) ; };struct xyarray *xyarray__new (int xlen,int ylen,size_t entry_size);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 147/344 EDAC/amd64: Recognize DRAM device type ECC capability
In reply to Greg Kroah-HartmanFrom: Yazen Ghannam <[email protected]>
[ Upstream commit f8be8e5680225ac9caf07d4545f8529b7395327f ]
AMD Family 17h systems support x4 and x16 DRAM devices. However, the device type is not checked when setting mci.edac_ctl_cap.
Set the appropriate capability flag based on the device type.
Default to x8 DRAM device when neither the x4 or x16 bits are set.
[ bp: reverse cpk_en check to save an indentation level. ]
--- drivers/edac/amd64_edac.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/edac/amd64_edac.c +12 -2
@@ -3150,12 +3150,15 @@ static bool ecc_enabled(struct pci_dev *F3, u16 nid)static inline void f17h_determine_edac_ctl_cap (struct mem_ctl_info *mci,struct amd64_pvt *pvt) { -u8 i, ecc_en =1 , cpk_en =1 ; +u8 i, ecc_en =1 , cpk_en =1 , dev_x4 =1 , dev_x16 =1 ;for_each_umc (i) {if (pvt->umc[i].sdp_ctrl &UMC_SDP_INIT ) { ecc_en &= !!(pvt->umc[i].umc_cap_hi &UMC_ECC_ENABLED ); cpk_en &= !!(pvt->umc[i].umc_cap_hi &UMC_ECC_CHIPKILL_CAP ); + + dev_x4 &= !!(pvt->umc[i].dimm_cfg &BIT (6 )); + dev_x16 &= !!(pvt->umc[i].dimm_cfg &BIT (7 )); } }
@@ -3163,8 +3166,15 @@ f17h_determine_edac_ctl_cap(struct mem_ctl_info *mci, struct amd64_pvt *pvt)if (ecc_en) { mci->edac_ctl_cap |=EDAC_FLAG_SECDED ; -if (cpk_en) +if (!cpk_en) +return ; + +if (dev_x4) mci->edac_ctl_cap |=EDAC_FLAG_S4ECD4ED ; +else if (dev_x16) + mci->edac_ctl_cap |=EDAC_FLAG_S16ECD16ED ; +else + mci->edac_ctl_cap |=EDAC_FLAG_S8ECD8ED ; } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 148/344 EDAC/amd64: Decode syndrome before translating address
In reply to Greg Kroah-HartmanFrom: Yazen Ghannam <[email protected]>
[ Upstream commit 8a2eaab7daf03b23ac902481218034ae2fae5e16 ]
AMD Family 17h systems currently require address translation in order to report the system address of a DRAM ECC error. This is currently done before decoding the syndrome information. The syndrome information does not depend on the address translation, so the proper EDAC csrow/channel reporting can function without the address. However, the syndrome information will not be decoded if the address translation fails.
Decode the syndrome information before doing the address translation. The syndrome information is architecturally defined in MCA_SYND and can be considered robust. The address translation is system-specific and may fail on newer systems without proper updates to the translation algorithm.
--- drivers/edac/amd64_edac.c | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-)
drivers/edac/amd64_edac.c +7 -7
@@ -2550,13 +2550,6 @@ static void decode_umc_error(int node_id, struct mce *m) err.channel =find_umc_channel (m); -if (umc_normaddr_to_sysaddr (m->addr, pvt->mc_node_id, err.channel, &sys_addr)) { - err.err_code =ERR_NORM_ADDR ; - goto log_error; - } - -error_address_to_page_and_offset (sys_addr, &err); -if (!(m->status &MCI_STATUS_SYNDV )) { err.err_code =ERR_SYND ; goto log_error;
@@ -2573,6 +2566,13 @@ static void decode_umc_error(int node_id, struct mce *m) err.csrow = m->synd &0x7 ; +if (umc_normaddr_to_sysaddr (m->addr, pvt->mc_node_id, err.channel, &sys_addr)) { + err.err_code =ERR_NORM_ADDR ; + goto log_error; + } + +error_address_to_page_and_offset (sys_addr, &err); + log_error:__log_ecc_error (mci, &err, ecc_type); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 149/344 ARM: at91: move platform-specific asm-offset.h to arch/arm/mach-at91
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit 9fac85a6db8999922f2cd92dfe2e83e063b31a94 ]
<generated/at91_pm_data-offsets.h> is only generated and included by arch/arm/mach-at91/, so it does not need to reside in the globally visible include/generated/.
I renamed it to arch/arm/mach-at91/pm_data-offsets.h since the prefix 'at91_' is just redundant in mach-at91/.
My main motivation of this change is to avoid the race condition for the parallel build (-j) when CONFIG_IKHEADERS is enabled.
When it is enabled, all the headers under include/ are archived into kernel/kheaders_data.tar.xz and exposed in the sysfs.
In the parallel build, we have no idea in which order files are built.
- If at91_pm_data-offsets.h is built before kheaders_data.tar.xz, the header will be included in the archive. Probably nobody will use it, but it is harmless except that it will increase the archive size needlessly.
- If kheaders_data.tar.xz is built before at91_pm_data-offsets.h, the header will not be included in the archive. However, in the next build, the archive will be re-generated to include the newly-found at91_pm_data-offsets.h. This is not nice from the build system point of view.
- If at91_pm_data-offsets.h and kheaders_data.tar.xz are built at the same time, the corrupted header might be included in the archive, which does not look nice either.
This commit fixes the race.
--- arch/arm/mach-at91/.gitignore | 1 + arch/arm/mach-at91/Makefile | 5 +++-- arch/arm/mach-at91/pm_suspend.S | 2 +- 3 files changed, 5 insertions(+), 3 deletions(-) create mode 100644 arch/arm/mach-at91/.gitignore
arch/arm/mach-at91/.gitignore new file +1 -0
@@ -0,0 +1 @@ +pm_data-offsets.h
arch/arm/mach-at91/Makefile +3 -2
@@ -19,9 +19,10 @@ ifeq ($(CONFIG_PM_DEBUG),y) CFLAGS_pm.o += -DDEBUG endif -include/generated/at91_pm_data-offsets.h: arch/arm/mach-at91/pm_data-offsets.s FORCE +$(obj)/pm_data-offsets.h: $(obj)/pm_data-offsets.s FORCE $(call filechk,offsets,__PM_DATA_OFFSETS_H__) -arch/arm/mach-at91/pm_suspend.o: include/generated/at91_pm_data-offsets.h +$(obj)/pm_suspend.o: $(obj)/pm_data-offsets.h targets += pm_data-offsets.s +clean-files += pm_data-offsets.h
arch/arm/mach-at91/pm_suspend.S +1 -1
@@ -10,7 +10,7 @@ #include <linux/linkage.h> #include <linux/clk/at91_pmc.h> #include "pm.h" -#include "generated/at91_pm_data-offsets.h" +#include "pm_data-offsets.h" #define SRAMC_SELF_FRESH_ACTIVE 0x01 #define SRAMC_SELF_FRESH_EXIT 0x00
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 150/344 soc: renesas: rmobile-sysc: Set GENPD_FLAG_ALWAYS_ON for always-on domain
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit af0bc634728c0bc6a3f66f911f227d5c6396db88 ]
Currently the R-Mobile "always-on" PM Domain is implemented by returning -EBUSY from the generic_pm_domain.power_off() callback, and doing nothing in the generic_pm_domain.power_on() callback. However, this means the PM Domain core code is not aware of the semantics of this special domain, leading to boot warnings like the following on SH/R-Mobile SoCs:
sh_cmt e6130000.timer: PM domain c5 will not be powered off
Fix this by making the always-on nature of the domain explicit instead, by setting the GENPD_FLAG_ALWAYS_ON flag. This removes the need for the domain to provide power control callbacks.
--- drivers/soc/renesas/rmobile-sysc.c | 31 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 15 deletions(-)
drivers/soc/renesas/rmobile-sysc.c +16 -15
@@ -48,12 +48,8 @@ struct rmobile_pm_domain *to_rmobile_pd(struct generic_pm_domain *d)static int rmobile_pd_power_down (struct generic_pm_domain *genpd) {struct rmobile_pm_domain *rmobile_pd =to_rmobile_pd (genpd); -unsigned int mask; +unsigned int mask =BIT (rmobile_pd->bit_shift); -if (rmobile_pd->bit_shift == ~0 ) -return -EBUSY ; - - mask =BIT (rmobile_pd->bit_shift);if (rmobile_pd->suspend) {int ret = rmobile_pd->suspend ();
@@ -80,14 +76,10 @@ static int rmobile_pd_power_down(struct generic_pm_domain *genpd)static int __rmobile_pd_power_up (struct rmobile_pm_domain *rmobile_pd) { -unsigned int mask; +unsigned int mask =BIT (rmobile_pd->bit_shift);unsigned int retry_count;int ret =0 ; -if (rmobile_pd->bit_shift == ~0 ) -return 0 ; - - mask =BIT (rmobile_pd->bit_shift);if (__raw_readl (rmobile_pd->base +PSTR ) & mask)return ret;
@@ -122,11 +114,15 @@ static void rmobile_init_pm_domain(struct rmobile_pm_domain *rmobile_pd)struct dev_power_governor *gov = rmobile_pd->gov; genpd->flags |=GENPD_FLAG_PM_CLK |GENPD_FLAG_ACTIVE_WAKEUP ; - genpd->power_off = rmobile_pd_power_down; - genpd->power_on = rmobile_pd_power_up; - genpd->attach_dev = cpg_mstp_attach_dev; - genpd->detach_dev = cpg_mstp_detach_dev; -__rmobile_pd_power_up (rmobile_pd); + genpd->attach_dev = cpg_mstp_attach_dev; + genpd->detach_dev = cpg_mstp_detach_dev; + +if (!(genpd->flags &GENPD_FLAG_ALWAYS_ON )) { + genpd->power_off = rmobile_pd_power_down; + genpd->power_on = rmobile_pd_power_up; +__rmobile_pd_power_up (rmobile_pd); + } +pm_genpd_init (genpd, gov ? : &simple_qos_governor, false); }
@@ -270,6 +266,11 @@ static void __init rmobile_setup_pm_domain(struct device_node *np,break ;case PD_NORMAL : +if (pd->bit_shift == ~0 ) { +/* Top-level always-on domain */ +pr_debug ("PM domain %s is always-on domain\n" , name); + pd->genpd.flags |=GENPD_FLAG_ALWAYS_ON ; + }break ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 151/344 soc: renesas: Enable ARM_ERRATA_754322 for affected Cortex-A9
In reply to Greg Kroah-HartmanFrom: Geert Uytterhoeven <[email protected]>
[ Upstream commit 2eced4607a1e6f51f928ae3e521fe02be5cb7d23 ]
ARM Erratum 754322 affects Cortex-A9 revisions r2p* and r3p*.
Automatically enable support code to mitigate the erratum when compiling a kernel for any of the affected Renesas SoCs:
- RZ/A1: r3p0,
- R-Mobile A1: r2p4,
- R-Car M1A: r2p2-00rel0,
- R-Car H1: r3p0,
- SH-Mobile AG5: r2p2.
EMMA Mobile EV2 (r1p3) and RZ/A2 (r4p1) are not affected.
--- drivers/soc/renesas/Kconfig | 5 +++++ 1 file changed, 5 insertions(+)
drivers/soc/renesas/Kconfig +5 -0
@@ -55,6 +55,7 @@ config ARCH_EMEV2 config ARCH_R7S72100 bool "RZ/A1H (R7S72100)" + select ARM_ERRATA_754322 select PM select PM_GENERIC_DOMAINS select RENESAS_OSTM
@@ -78,6 +79,7 @@ config ARCH_R8A73A4 config ARCH_R8A7740 bool "R-Mobile A1 (R8A77400)" select ARCH_RMOBILE + select ARM_ERRATA_754322 select RENESAS_INTC_IRQPIN config ARCH_R8A7743
@@ -105,10 +107,12 @@ config ARCH_R8A77470 config ARCH_R8A7778 bool "R-Car M1A (R8A77781)" select ARCH_RCAR_GEN1 + select ARM_ERRATA_754322 config ARCH_R8A7779 bool "R-Car H1 (R8A77790)" select ARCH_RCAR_GEN1 + select ARM_ERRATA_754322 select HAVE_ARM_SCU if SMP select HAVE_ARM_TWD if SMP select SYSC_R8A7779
@@ -152,6 +156,7 @@ config ARCH_R9A06G032 config ARCH_SH73A0 bool "SH-Mobile AG5 (R8A73A00)" select ARCH_RMOBILE + select ARM_ERRATA_754322 select HAVE_ARM_SCU if SMP select HAVE_ARM_TWD if SMP select RENESAS_INTC_IRQPIN
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 152/344 PM / devfreq: Fix kernel oops on governor module load
In reply to Greg Kroah-HartmanFrom: Ezequiel Garcia <[email protected]>
[ Upstream commit 7544fd7f384591038646d3cd9efb311ab4509e24 ]
A bit unexpectedly (but still documented), request_module may return a positive value, in case of a modprobe error. This is currently causing issues in the devfreq framework.
When a request_module exits with a positive value, we currently return that via ERR_PTR. However, because the value is positive, it's not a ERR_VALUE proper, and is therefore treated as a valid struct devfreq_governor pointer, leading to a kernel oops.
Fix this by returning -EINVAL if request_module returns a positive value.
--- drivers/devfreq/devfreq.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/devfreq/devfreq.c +1 -1
@@ -254,7 +254,7 @@ static struct devfreq_governor *try_then_request_governor(const char *name)/* Restore previous state before return */ mutex_lock (&devfreq_list_lock);if (err) -return ERR_PTR (err); +return (err <0 ) ?ERR_PTR (err) :ERR_PTR (-EINVAL ); governor =find_devfreq_governor (name); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 153/344 ARM: OMAP2+: move platform-specific asm-offset.h to arch/arm/mach-omap2
In reply to Greg Kroah-HartmanFrom: Masahiro Yamada <[email protected]>
[ Upstream commit ccf4975dca233b1d6a74752d6ab35c239edc0d58 ]
<generated/ti-pm-asm-offsets.h> is only generated and included by arch/arm/mach-omap2/, so it does not need to reside in the globally visible include/generated/.
I renamed it to arch/arm/mach-omap2/pm-asm-offsets.h since the prefix 'ti-' is just redundant in mach-omap2/.
My main motivation of this change is to avoid the race condition for the parallel build (-j) when CONFIG_IKHEADERS is enabled.
When it is enabled, all the headers under include/ are archived into kernel/kheaders_data.tar.xz and exposed in the sysfs.
In the parallel build, we have no idea in which order files are built.
- If ti-pm-asm-offsets.h is built before kheaders_data.tar.xz, the header will be included in the archive. Probably nobody will use it, but it is harmless except that it will increase the archive size needlessly.
- If kheaders_data.tar.xz is built before ti-pm-asm-offsets.h, the header will not be included in the archive. However, in the next build, the archive will be re-generated to include the newly-found ti-pm-asm-offsets.h. This is not nice from the build system point of view.
- If ti-pm-asm-offsets.h and kheaders_data.tar.xz are built at the same time, the corrupted header might be included in the archive, which does not look nice either.
This commit fixes the race.
--- arch/arm/mach-omap2/.gitignore | 1 + arch/arm/mach-omap2/Makefile | 5 +++-- arch/arm/mach-omap2/sleep33xx.S | 2 +- arch/arm/mach-omap2/sleep43xx.S | 2 +- 4 files changed, 6 insertions(+), 4 deletions(-) create mode 100644 arch/arm/mach-omap2/.gitignore
arch/arm/mach-omap2/.gitignore new file +1 -0
@@ -0,0 +1 @@ +pm-asm-offsets.h
arch/arm/mach-omap2/Makefile +3 -2
@@ -223,9 +223,10 @@ obj-y += omap_phy_internal.o obj-$(CONFIG_MACH_OMAP2_TUSB6010) += usb-tusb6010.o -include/generated/ti-pm-asm-offsets.h: arch/arm/mach-omap2/pm-asm-offsets.s FORCE +$(obj)/pm-asm-offsets.h: $(obj)/pm-asm-offsets.s FORCE $(call filechk,offsets,__TI_PM_ASM_OFFSETS_H__) -$(obj)/sleep33xx.o $(obj)/sleep43xx.o: include/generated/ti-pm-asm-offsets.h +$(obj)/sleep33xx.o $(obj)/sleep43xx.o: $(obj)/pm-asm-offsets.h targets += pm-asm-offsets.s +clean-files += pm-asm-offsets.h
arch/arm/mach-omap2/sleep33xx.S +1 -1
@@ -6,7 +6,6 @@ * Dave Gerlach, Vaibhav Bedia */ -#include <generated/ti-pm-asm-offsets.h> #include <linux/linkage.h> #include <linux/platform_data/pm33xx.h> #include <linux/ti-emif-sram.h>
@@ -15,6 +14,7 @@ #include "iomap.h" #include "cm33xx.h" +#include "pm-asm-offsets.h" #define AM33XX_CM_CLKCTRL_MODULESTATE_DISABLED 0x00030000 #define AM33XX_CM_CLKCTRL_MODULEMODE_DISABLE 0x0003
arch/arm/mach-omap2/sleep43xx.S +1 -1
@@ -6,7 +6,6 @@ * Dave Gerlach, Vaibhav Bedia */ -#include <generated/ti-pm-asm-offsets.h> #include <linux/linkage.h> #include <linux/ti-emif-sram.h> #include <linux/platform_data/pm33xx.h>
@@ -19,6 +18,7 @@ #include "iomap.h" #include "omap-secure.h" #include "omap44xx.h" +#include "pm-asm-offsets.h" #include "prm33xx.h" #include "prcm43xx.h"
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 154/344 PM / devfreq: passive: Use non-devm notifiers
In reply to Greg Kroah-HartmanFrom: Leonard Crestez <[email protected]>
[ Upstream commit 0ef7c7cce43f6ecc2b96d447e69b2900a9655f7c ]
The devfreq passive governor registers and unregisters devfreq transition notifiers on DEVFREQ_GOV_START/GOV_STOP using devm wrappers.
If devfreq itself is registered with devm then a warning is triggered on rmmod from devm_devfreq_unregister_notifier. Call stack looks like this:
devm_devfreq_unregister_notifier+0x30/0x40 devfreq_passive_event_handler+0x4c/0x88 devfreq_remove_device.part.8+0x6c/0x9c devm_devfreq_dev_release+0x18/0x20 release_nodes+0x1b0/0x220 devres_release_all+0x78/0x84 device_release_driver_internal+0x100/0x1c0 driver_detach+0x4c/0x90 bus_remove_driver+0x7c/0xd0 driver_unregister+0x2c/0x58 platform_driver_unregister+0x10/0x18 imx_devfreq_platdrv_exit+0x14/0xd40 [imx_devfreq]
This happens because devres_release_all will first remove all the nodes into a separate todo list so the nested devres_release from devm_devfreq_unregister_notifier won't find anything.
Fix the warning by calling the non-devm APIS for frequency notification. Using devm wrappers is not actually useful for a governor anyway: it relies on the devfreq core to correctly match the GOV_START/GOV_STOP notifications.
--- drivers/devfreq/governor_passive.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/devfreq/governor_passive.c +3 -3
@@ -165,12 +165,12 @@ static int devfreq_passive_event_handler(struct devfreq *devfreq, p_data->this = devfreq; nb->notifier_call = devfreq_passive_notifier_call; - ret =devm_devfreq_register_notifier (dev, parent, nb, + ret =devfreq_register_notifier (parent, nb,DEVFREQ_TRANSITION_NOTIFIER );break ;case DEVFREQ_GOV_STOP : -devm_devfreq_unregister_notifier (dev, parent, nb, -DEVFREQ_TRANSITION_NOTIFIER ); +WARN_ON (devfreq_unregister_notifier (parent, nb, +DEVFREQ_TRANSITION_NOTIFIER ));break ;default :break ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 155/344 PM / devfreq: exynos-bus: Correct clock enable sequence
In reply to Greg Kroah-HartmanFrom: Kamil Konieczny <[email protected]>
[ Upstream commit 2c2b20e0da89c76759ee28c6824413ab2fa3bfc6 ]
Regulators should be enabled before clocks to avoid h/w hang. This require change in exynos_bus_probe() to move exynos_bus_parse_of() after exynos_bus_parent_parse_of() and change in error handling. Similar change is needed in exynos_bus_exit() where clock should be disabled before regulators.
--- drivers/devfreq/exynos-bus.c | 31 +++++++++++++++++-------------- 1 file changed, 17 insertions(+), 14 deletions(-)
drivers/devfreq/exynos-bus.c +17 -14
@@ -191,11 +191,10 @@ static void exynos_bus_exit(struct device *dev)if (ret <0 )dev_warn (dev,"failed to disable the devfreq-event devices\n" ); -if (bus->regulator) -regulator_disable (bus->regulator); -dev_pm_opp_of_remove_table (dev);clk_disable_unprepare (bus->clk); +if (bus->regulator) +regulator_disable (bus->regulator); }/*
@@ -383,6 +382,7 @@ static int exynos_bus_probe(struct platform_device *pdev)struct exynos_bus *bus;int ret, max_state;unsigned long min_freq, max_freq; +bool passive = false;if (!np) {dev_err (dev,"failed to find devicetree node\n" );
@@ -396,27 +396,27 @@ static int exynos_bus_probe(struct platform_device *pdev) bus->dev = &pdev->dev;platform_set_drvdata (pdev, bus); -/* Parse the device-tree to get the resource information */ - ret =exynos_bus_parse_of (np, bus); -if (ret <0 ) -return ret; - profile =devm_kzalloc (dev,sizeof (*profile),GFP_KERNEL ); -if (!profile) { - ret = -ENOMEM ; - goto err; - } +if (!profile) +return -ENOMEM ; node =of_parse_phandle (dev->of_node,"devfreq" ,0 );if (node) {of_node_put (node); - goto passive; + passive = true; }else { ret =exynos_bus_parent_parse_of (np, bus); +if (ret <0 ) +return ret; } +/* Parse the device-tree to get the resource information */ + ret =exynos_bus_parse_of (np, bus);if (ret <0 ) - goto err; + goto err_reg; + +if (passive) + goto passive;/* Initialize the struct profile and governor data for parent device */ profile->polling_ms =50 ;
@@ -507,6 +507,9 @@ static int exynos_bus_probe(struct platform_device *pdev) err:dev_pm_opp_of_remove_table (dev);clk_disable_unprepare (bus->clk); +err_reg: +if (!passive) +regulator_disable (bus->regulator);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 156/344 media: cec-notifier: clear cec_adap in cec_notifier_unregister
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
[ Upstream commit 14d5511691e5290103bc480998bc322e68f139d4 ]
If cec_notifier_cec_adap_unregister() is called before cec_unregister_adapter() then everything is OK (and this is the case today). But if it is the other way around, then cec_notifier_unregister() is called first, and that doesn't set n->cec_adap to NULL.
So if e.g. cec_notifier_set_phys_addr() is called after cec_notifier_unregister() but before cec_unregister_adapter() then n->cec_adap points to an unregistered and likely deleted cec adapter. So just set n->cec_adap->notifier and n->cec_adap to NULL for rubustness.
Eventually cec_notifier_unregister will disappear and this will be simplified substantially.
--- drivers/media/cec/cec-notifier.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/media/cec/cec-notifier.c +2 -0
@@ -218,6 +218,8 @@ void cec_notifier_unregister(struct cec_notifier *n)mutex_lock (&n->lock); n->callback =NULL ; + n->cec_adap->notifier =NULL ; + n->cec_adap =NULL ;mutex_unlock (&n->lock);cec_notifier_put (n); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 157/344 media: saa7146: add cleanup in hexium_attach()
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit 42e64117d3b4a759013f77bbcf25ab6700e55de7 ]
If saa7146_register_device() fails, no cleanup is executed, leading to memory/resource leaks. To fix this issue, perform necessary cleanup work before returning the error.
--- drivers/media/pci/saa7146/hexium_gemini.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/media/pci/saa7146/hexium_gemini.c +3 -0
@@ -292,6 +292,9 @@ static int hexium_attach(struct saa7146_dev *dev, struct saa7146_pci_extension_d ret =saa7146_register_device (&hexium->video_dev, dev,"hexium gemini" ,VFL_TYPE_GRABBER );if (ret <0 ) {pr_err ("cannot register capture v4l2 device. skipping.\n" ); +saa7146_vv_release (dev); +i2c_del_adapter (&hexium->i2c_adapter); +kfree (hexium);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 158/344 media: cpia2_usb: fix memory leaks
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit 1c770f0f52dca1a2323c594f01f5ec6f1dddc97f ]
In submit_urbs(), 'cam->sbuf[i].data' is allocated through kmalloc_array(). However, it is not deallocated if the following allocation for urbs fails. To fix this issue, free 'cam->sbuf[i].data' if usb_alloc_urb() fails.
--- drivers/media/usb/cpia2/cpia2_usb.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/media/usb/cpia2/cpia2_usb.c +4 -0
@@ -676,6 +676,10 @@ static int submit_urbs(struct camera_data *cam)if (!urb) {for (j =0 ; j < i; j++)usb_free_urb (cam->sbuf[j].urb); +for (j =0 ; j <NUM_SBUF ; j++) { +kfree (cam->sbuf[j].data); + cam->sbuf[j].data =NULL ; + }return -ENOMEM ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 159/344 media: saa7134: fix terminology around saa7134_i2c_eeprom_md7134_gate()
In reply to Greg Kroah-HartmanFrom: Maciej S. Szmigiero <[email protected]>
[ Upstream commit 9d802222a3405599d6e1984d9324cddf592ea1f4 ]
saa7134_i2c_eeprom_md7134_gate() function and the associated comment uses an inverted i2c gate open / closed terminology.
Let's fix this.
--- drivers/media/pci/saa7134/saa7134-i2c.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/media/pci/saa7134/saa7134-i2c.c +8 -4
@@ -342,7 +342,11 @@ static const struct i2c_client saa7134_client_template = {/* ----------------------------------------------------------- */ -/* On Medion 7134 reading EEPROM needs DVB-T demod i2c gate open */ +/* +* On Medion 7134 reading the SAA7134 chip config EEPROM needs DVB-T +* demod i2c gate closed due to an address clash between this EEPROM +* and the demod one. +*/ static void saa7134_i2c_eeprom_md7134_gate (struct saa7134_dev *dev) {u8 subaddr =0x7 , dmdregval;
@@ -359,14 +363,14 @@ static void saa7134_i2c_eeprom_md7134_gate(struct saa7134_dev *dev) ret =i2c_transfer (&dev->i2c_adap, i2cgatemsg_r,2 );if ((ret ==2 ) && (dmdregval &0x2 )) { -pr_debug ("%s: DVB-T demod i2c gate was left closed\n" , +pr_debug ("%s: DVB-T demod i2c gate was left open\n" , dev->name); data[0 ] = subaddr; data[1 ] = (dmdregval & ~0x2 );if (i2c_transfer (&dev->i2c_adap, i2cgatemsg_w,1 ) !=1 ) -pr_err ("%s: EEPROM i2c gate open failure\n" , - dev->name); +pr_err ("%s: EEPROM i2c gate close failure\n" , + dev->name); } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 160/344 perf trace beauty ioctl: Fix off-by-one error in cmd->string table
In reply to Greg Kroah-HartmanFrom: Benjamin Peterson <[email protected]>
[ Upstream commit b92675f4a9c02dd78052645597dac9e270679ddf ]
While tracing a program that calls isatty(3), I noticed that strace reported TCGETS for the request argument of the underlying ioctl(2) syscall while perf trace reported TCSETS. strace is corrrect. The bug in perf was due to the tty ioctl beauty table starting at 0x5400 rather than 0x5401.
Committer testing:
Using augmented_raw_syscalls.o and settings to make 'perf trace' use strace formatting, i.e. with this in ~/.perfconfig
# cat ~/.perfconfig [trace] add_events = /home/acme/git/linux/tools/perf/examples/bpf/augmented_raw_syscalls.c show_zeros = yes show_duration = no no_inherit = yes show_timestamp = no show_arg_names = no args_alignment = 40 show_prefix = yes
# strace -e ioctl stty > /dev/null
ioctl(0, TCGETS, {B38400 opost isig icanon echo ...}) = 0
ioctl(1, TIOCGWINSZ, 0x7fff8a9b0860) = -1 ENOTTY (Inappropriate ioctl for device)
ioctl(1, TCGETS, 0x7fff8a9b0540) = -1 ENOTTY (Inappropriate ioctl for device)
+++ exited with 0 +++
#Before:
# perf trace -e ioctl stty > /dev/null ioctl(0, TCSETS, 0x7fff2cf79f20) = 0 ioctl(1, TIOCSWINSZ, 0x7fff2cf79f40) = -1 ENOTTY (Inappropriate ioctl for device) ioctl(1, TCSETS, 0x7fff2cf79c20) = -1 ENOTTY (Inappropriate ioctl for device) #
After:
# perf trace -e ioctl stty > /dev/null ioctl(0, TCGETS, 0x7ffed0763920) = 0 ioctl(1, TIOCGWINSZ, 0x7ffed0763940) = -1 ENOTTY (Inappropriate ioctl for device) ioctl(1, TCGETS, 0x7ffed0763620) = -1 ENOTTY (Inappropriate ioctl for device) #
--- tools/perf/trace/beauty/ioctl.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/perf/trace/beauty/ioctl.c +1 -1
@@ -21,7 +21,7 @@static size_t ioctl__scnprintf_tty_cmd (int nr,int dir,char *bf,size_t size) {static const char *ioctl_tty_cmd[] = { -"TCGETS" ,"TCSETS" ,"TCSETSW" ,"TCSETSF" ,"TCGETA" ,"TCSETA" ,"TCSETAW" , + [_IOC_NR (TCGETS )] ="TCGETS" ,"TCSETS" ,"TCSETSW" ,"TCSETSF" ,"TCGETA" ,"TCSETA" ,"TCSETAW" ,"TCSETAF" ,"TCSBRK" ,"TCXONC" ,"TCFLSH" ,"TIOCEXCL" ,"TIOCNXCL" ,"TIOCSCTTY" ,"TIOCGPGRP" ,"TIOCSPGRP" ,"TIOCOUTQ" ,"TIOCSTI" ,"TIOCGWINSZ" ,"TIOCSWINSZ" ,"TIOCMGET" ,"TIOCMBIS" ,"TIOCMBIC" ,"TIOCMSET" ,"TIOCGSOFTCAR" ,"TIOCSSOFTCAR" ,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 161/344 perf report: Fix --ns time sort key output
In reply to Greg Kroah-HartmanFrom: Andi Kleen <[email protected]>
[ Upstream commit 3dab6ac080dcd7f71cb9ceb84ad7dafecd6f7c07 ]
If the user specified --ns, the column to print the sort time stamp wasn't wide enough to actually print the full nanoseconds.
Widen the time key column width when --ns is specified.
Before:
% perf record -a sleep 1
% perf report --sort time,overhead,symbol --stdio --ns
...
2.39% 187851.10000 [k] smp_call_function_single - -
1.53% 187851.10000 [k] intel_idle - -
0.59% 187851.10000 [.] __wcscmp_ifunc - -
0.33% 187851.10000 [.] 0000000000000000 - -
0.28% 187851.10000 [k] cpuidle_enter_state - -After:
% perf report --sort time,overhead,symbol --stdio --ns
...
2.39% 187851.100000000 [k] smp_call_function_single - -
1.53% 187851.100000000 [k] intel_idle - -
0.59% 187851.100000000 [.] __wcscmp_ifunc - -
0.33% 187851.100000000 [.] 0000000000000000 - -
0.28% 187851.100000000 [k] cpuidle_enter_state - ---- tools/perf/util/hist.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
tools/perf/util/hist.c +4 -1
@@ -193,7 +193,10 @@ void hists__calc_col_len(struct hists *hists, struct hist_entry *h)hists__new_col_len (hists,HISTC_MEM_LVL ,21 +3 );hists__new_col_len (hists,HISTC_LOCAL_WEIGHT ,12 );hists__new_col_len (hists,HISTC_GLOBAL_WEIGHT ,12 ); -hists__new_col_len (hists,HISTC_TIME ,12 ); +if (symbol_conf.nanosecs) +hists__new_col_len (hists,HISTC_TIME ,16 ); +else +hists__new_col_len (hists,HISTC_TIME ,12 );if (h->srcline) { len =MAX (strlen (h->srcline),strlen (sort_srcline.se_header));
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 162/344 perf script: Fix memory leaks in list_scripts()
In reply to Greg Kroah-HartmanFrom: Gustavo A. R. Silva <[email protected]>
[ Upstream commit 3b4acbb92dbda4829e021e5c6d5410658849fa1c ]
In case memory resources for *buf* and *paths* were allocated, jump to *out* and release them before return.
Addresses-Coverity-ID: 1444328 ("Resource leak")
--- tools/perf/ui/browsers/scripts.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
tools/perf/ui/browsers/scripts.c +4 -2
@@ -131,8 +131,10 @@ static int list_scripts(char *script_name, bool *custom,int key =ui_browser__input_window ("perf script command" ,"Enter perf script command line (without perf script prefix)" , script_args,"" ,0 ); -if (key !=K_ENTER ) -return -1 ; +if (key !=K_ENTER ) { + ret =-1 ; + goto out; + }sprintf (script_name,"%s script %s" , perf, script_args); }else if (choice < num + max_std) {strcpy (script_name, paths[choice]);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 163/344 media: aspeed-video: address a protential usage of an unitialized var
In reply to Greg Kroah-HartmanFrom: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 31b8b0bd6e55c3ea5a08bb8141fa5d3c90600e3b ]
While this might not occur in practice, if the device is doing the right thing, it would be teoretically be possible to have both hsync_counter and vsync_counter negatives.
If this ever happen, ctrl will be undefined, but the driver will still call:
aspeed_video_update(video, VE_CTRL, 0, ctrl);
Change the code to prevent this to happen.
This was warned by cppcheck:
[drivers/media/platform/aspeed-video.c:653]: (error) Uninitialized variable: ctrl
--- drivers/media/platform/aspeed-video.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/media/platform/aspeed-video.c +3 -2
@@ -630,7 +630,7 @@ static void aspeed_video_check_and_set_polarity(struct aspeed_video *video) }if (hsync_counter <0 || vsync_counter <0 ) { -u32 ctrl; +u32 ctrl =0 ;if (hsync_counter <0 ) { ctrl =VE_CTRL_HSYNC_POL ;
@@ -650,7 +650,8 @@ static void aspeed_video_check_and_set_polarity(struct aspeed_video *video)V4L2_DV_VSYNC_POS_POL ; } -aspeed_video_update (video,VE_CTRL ,0 , ctrl); +if (ctrl) +aspeed_video_update (video,VE_CTRL ,0 , ctrl); } }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 164/344 media: ov9650: add a sanity check
In reply to Greg Kroah-HartmanFrom: Mauro Carvalho Chehab <[email protected]>
[ Upstream commit 093347abc7a4e0490e3c962ecbde2dc272a8f708 ]
As pointed by cppcheck:
[drivers/media/i2c/ov9650.c:706]: (error) Shifting by a negative value is undefined behaviour [drivers/media/i2c/ov9650.c:707]: (error) Shifting by a negative value is undefined behaviour [drivers/media/i2c/ov9650.c:721]: (error) Shifting by a negative value is undefined behaviour
Prevent mangling with gains with invalid values.
As pointed by Sylvester, this should never happen in practice, as min value of V4L2_CID_GAIN control is 16 (gain is always >= 16 and m is always >= 0), but it is too hard for a static analyzer to get this, as the logic with validates control min/max is elsewhere inside V4L2 core.
--- drivers/media/i2c/ov9650.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/media/i2c/ov9650.c +5 -0
@@ -703,6 +703,11 @@ static int ov965x_set_gain(struct ov965x *ov965x, int auto_gain)for (m =6 ; m >=0 ; m--)if (gain >= (1 << m) *16 )break ; + +/* Sanity check: don't adjust the gain with a negative value */ +if (m <0 ) +return -EINVAL ; + rgain = (gain - ((1 << m) *16 )) / (1 << m); rgain |= (((1 << m) -1 ) <<4 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 165/344 leds: lm3532: Fixes for the driver for stability
In reply to Greg Kroah-HartmanFrom: Dan Murphy <[email protected]>
[ Upstream commit 6559ac32998248182572e1ccae79dc2eb40ac7c6 ]
Fixed misspelled words, added error check during probe on the init of the registers, and fixed ALS/I2C control mode.
--- drivers/leds/leds-lm3532.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-)
drivers/leds/leds-lm3532.c +13 -4
@@ -40,7 +40,7 @@#define LM3532_REG_ZN_3_LO 0x67#define LM3532_REG_MAX 0x7e -/* Contorl Enable */ +/* Control Enable */ #define LM3532_CTRL_A_ENABLE BIT(0)#define LM3532_CTRL_B_ENABLE BIT(1)#define LM3532_CTRL_C_ENABLE BIT(2)
@@ -302,7 +302,7 @@ static int lm3532_led_disable(struct lm3532_led *led_data)int ret; ret =regmap_update_bits (led_data->priv->regmap,LM3532_REG_ENABLE , - ctrl_en_val, ~ctrl_en_val); + ctrl_en_val,0 );if (ret) {dev_err (led_data->priv->dev,"Failed to set ctrl:%d\n" , ret);return ret;
@@ -321,7 +321,7 @@ static int lm3532_brightness_set(struct led_classdev *led_cdev,mutex_lock (&led->priv->lock); -if (led->mode ==LM3532_BL_MODE_ALS ) { +if (led->mode ==LM3532_ALS_CTRL ) {if (brt_val >LED_OFF ) ret =lm3532_led_enable (led);else
@@ -542,11 +542,14 @@ static int lm3532_parse_node(struct lm3532_data *priv) }if (led->mode ==LM3532_BL_MODE_ALS ) { + led->mode =LM3532_ALS_CTRL ; ret =lm3532_parse_als (priv);if (ret)dev_err (&priv->client->dev,"Failed to parse als\n" );else lm3532_als_configure (priv, led); + }else { + led->mode =LM3532_I2C_CTRL ; } led->num_leds = fwnode_property_read_u32_array(child,
@@ -590,7 +593,13 @@ static int lm3532_parse_node(struct lm3532_data *priv) goto child_out; } -lm3532_init_registers (led); + ret =lm3532_init_registers (led); +if (ret) { +dev_err (&priv->client->dev,"register init err: %d\n" , + ret); +fwnode_handle_put (child); + goto child_out; + } i++; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 166/344 ASoC: es8316: fix headphone mixer volume table
In reply to Greg Kroah-HartmanFrom: Katsuhiro Suzuki <[email protected]>
[ Upstream commit f972d02fee2496024cfd6f59021c9d89d54922a6 ]
This patch fix setting table of Headphone mixer volume. Current code uses 4 ... 7 values but these values are prohibited.
Correct settings are the following:
0000 -12dB
0001 -10.5dB
0010 -9dB
0011 -7.5dB
0100 -6dB
1000 -4.5dB
1001 -3dB
1010 -1.5dB
1011 0dB
--- sound/soc/codecs/es8316.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-)
sound/soc/codecs/es8316.c +5 -2
@@ -51,7 +51,10 @@ static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(adc_vol_tlv, -9600, 50, 1); static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_max_gain_tlv, -650, 150, 0); static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_min_gain_tlv, -1200, 150, 0); static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(alc_target_tlv, -1650, 150, 0); -static const SNDRV_CTL_TLVD_DECLARE_DB_SCALE(hpmixer_gain_tlv, -1200, 150, 0); +static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(hpmixer_gain_tlv, +0 ,4 ,TLV_DB_SCALE_ITEM (-1200 ,150 ,0 ), + 8, 11, TLV_DB_SCALE_ITEM(-450, 150, 0), +); static const SNDRV_CTL_TLVD_DECLARE_DB_RANGE(adc_pga_gain_tlv, 0, 0, TLV_DB_SCALE_ITEM(-350, 0, 0),
@@ -89,7 +92,7 @@ static const struct snd_kcontrol_new es8316_snd_controls[] = {SOC_DOUBLE_TLV ("Headphone Playback Volume" ,ES8316_CPHP_ICAL_VOL ,4 ,0 ,3 ,1 , hpout_vol_tlv),SOC_DOUBLE_TLV ("Headphone Mixer Volume" ,ES8316_HPMIX_VOL , -0 ,4 ,7 ,0 , hpmixer_gain_tlv), +0 ,4 ,11 ,0 , hpmixer_gain_tlv),SOC_ENUM ("Playback Polarity" , dacpol), SOC_DOUBLE_R_TLV("DAC Playback Volume", ES8316_DAC_VOLL,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 167/344 ACPI / CPPC: do not require the _PSD method
In reply to Greg Kroah-HartmanFrom: Al Stone <[email protected]>
[ Upstream commit 4c4cdc4c63853fee48c02e25c8605fb65a6c9924 ]
According to the ACPI 6.3 specification, the _PSD method is optional when using CPPC. The underlying assumption is that each CPU can change frequency independently from all other CPUs; _PSD is provided to tell the OS that some processors can NOT do that.
However, the acpi_get_psd() function returns ENODEV if there is no _PSD method present, or an ACPI error status if an error occurs when evaluating _PSD, if present. This makes _PSD mandatory when using CPPC, in violation of the specification, and only on Linux.
This has forced some firmware writers to provide a dummy _PSD, even though it is irrelevant, but only because Linux requires it; other OSPMs follow the spec. We really do not want to have OS specific ACPI tables, though.
So, correct acpi_get_psd() so that it does not return an error if there is no _PSD method present, but does return a failure when the method can not be executed properly. This allows _PSD to be optional as it should be.
--- drivers/acpi/cppc_acpi.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
drivers/acpi/cppc_acpi.c +4 -2
@@ -365,8 +365,10 @@ static int acpi_get_psd(struct cpc_desc *cpc_ptr, acpi_handle handle)union acpi_object *psd =NULL ;struct acpi_psd_package *pdomain; - status =acpi_evaluate_object_typed (handle,"_PSD" ,NULL , &buffer, -ACPI_TYPE_PACKAGE ); + status =acpi_evaluate_object_typed (handle,"_PSD" ,NULL , + &buffer,ACPI_TYPE_PACKAGE ); +if (status ==AE_NOT_FOUND )/* _PSD is optional */ +return 0 ;if (ACPI_FAILURE (status))return -ENODEV ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 168/344 sched/cpufreq: Align trace event behavior of fast switching
In reply to Greg Kroah-HartmanFrom: Douglas RAILLARD <[email protected]>
[ Upstream commit 77c84dd1881d0f0176cb678d770bfbda26c54390 ]
Fast switching path only emits an event for the CPU of interest, whereas the regular path emits an event for all the CPUs that had their frequency changed, i.e. all the CPUs sharing the same policy.
With the current behavior, looking at cpu_frequency event for a given CPU that is using the fast switching path will not give the correct frequency signal.
--- kernel/sched/cpufreq_schedutil.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
kernel/sched/cpufreq_schedutil.c +6 -1
@@ -117,6 +117,7 @@ static void sugov_fast_switch(struct sugov_policy *sg_policy, u64 time, unsigned int next_freq) {struct cpufreq_policy *policy = sg_policy->policy; +int cpu;if (!sugov_update_next_freq (sg_policy, time, next_freq))return ;
@@ -126,7 +127,11 @@ static void sugov_fast_switch(struct sugov_policy *sg_policy, u64 time,return ; policy->cur = next_freq; -trace_cpu_frequency (next_freq,smp_processor_id ()); + +if (trace_cpu_frequency_enabled ()) { +for_each_cpu (cpu, policy->cpus) +trace_cpu_frequency (next_freq, cpu); + } } static void sugov_deferred_update(struct sugov_policy *sg_policy, u64 time,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 169/344 arm64: dts: meson: fix boards regulators states format
In reply to Greg Kroah-HartmanFrom: Neil Armstrong <[email protected]>
[ Upstream commit f9717178b9be9477877d4c3776c61ff56d854ddf ]
This fixes the following DT schemas check errors:meson-gxbb-odroidc2.dt.yaml: gpio-regulator-tf_io: states:0: Additional items are not allowed (1800000, 1 were unexpected) meson-gxbb-odroidc2.dt.yaml: gpio-regulator-tf_io: states:0: [3300000, 0, 1800000, 1] is too long meson-gxbb-nexbox-a95x.dt.yaml: gpio-regulator: states:0: Additional items are not allowed (3300000, 1 were unexpected) meson-gxbb-nexbox-a95x.dt.yaml: gpio-regulator: states:0: [1800000, 0, 3300000, 1] is too long meson-gxbb-p200.dt.yaml: gpio-regulator: states:0: Additional items are not allowed (3300000, 1 were unexpected) meson-gxbb-p200.dt.yaml: gpio-regulator: states:0: [1800000, 0, 3300000, 1] is too long meson-gxl-s905x-hwacom-amazetv.dt.yaml: gpio-regulator: states:0: Additional items are not allowed (3300000, 1 were unexpected) meson-gxl-s905x-hwacom-amazetv.dt.yaml: gpio-regulator: states:0: [1800000, 0, 3300000, 1] is too long meson-gxbb-p201.dt.yaml: gpio-regulator: states:0: Additional items are not allowed (3300000, 1 were unexpected) meson-gxbb-p201.dt.yaml: gpio-regulator: states:0: [1800000, 0, 3300000, 1] is too long meson-g12b-odroid-n2.dt.yaml: gpio-regulator-tf_io: states:0: Additional items are not allowed (1800000, 1 were unexpected) meson-g12b-odroid-n2.dt.yaml: gpio-regulator-tf_io: states:0: [3300000, 0, 1800000, 1] is too long meson-gxl-s905x-nexbox-a95x.dt.yaml: gpio-regulator: states:0: Additional items are not allowed (3300000, 1 were unexpected) meson-gxl-s905x-nexbox-a95x.dt.yaml: gpio-regulator: states:0: [1800000, 0, 3300000, 1] is too long
--- arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts | 4 ++-- arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts | 4 ++-- arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts | 4 ++-- arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi | 4 ++-- .../arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts | 4 ++-- arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-)
arch/arm64/boot/dts/amlogic/meson-g12b-odroid-n2.dts +2 -2
@@ -66,8 +66,8 @@ gpios = <&gpio_ao GPIOAO_9 GPIO_ACTIVE_HIGH>; gpios-states = <0>; - states = <3300000 0 - 1800000 1>; + states = <3300000 0>, + <1800000 1>; }; flash_1v8: regulator-flash_1v8 {
arch/arm64/boot/dts/amlogic/meson-gxbb-nexbox-a95x.dts +2 -2
@@ -75,8 +75,8 @@ gpios-states = <1>; /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ - states = <1800000 0 - 3300000 1>; + states = <1800000 0>, + <3300000 1>; }; vddio_boot: regulator-vddio_boot {
arch/arm64/boot/dts/amlogic/meson-gxbb-odroidc2.dts +2 -2
@@ -77,8 +77,8 @@ gpios = <&gpio_ao GPIOAO_3 GPIO_ACTIVE_HIGH>; gpios-states = <0>; - states = <3300000 0 - 1800000 1>; + states = <3300000 0>, + <1800000 1>; }; vcc1v8: regulator-vcc1v8 {
arch/arm64/boot/dts/amlogic/meson-gxbb-p20x.dtsi +2 -2
@@ -46,8 +46,8 @@ gpios-states = <1>; /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ - states = <1800000 0 - 3300000 1>; + states = <1800000 0>, + <3300000 1>; regulator-settling-time-up-us = <10000>; regulator-settling-time-down-us = <150000>;
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-hwacom-amazetv.dts +2 -2
@@ -38,8 +38,8 @@ gpios-states = <1>; /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ - states = <1800000 0 - 3300000 1>; + states = <1800000 0>, + <3300000 1>; }; vddio_boot: regulator-vddio_boot {
arch/arm64/boot/dts/amlogic/meson-gxl-s905x-nexbox-a95x.dts +2 -2
@@ -38,8 +38,8 @@ gpios-states = <1>; /* Based on P200 schematics, signal CARD_1.8V/3.3V_CTR */ - states = <1800000 0 - 3300000 1>; + states = <1800000 0>, + <3300000 1>; }; vddio_boot: regulator-vddio_boot {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 170/344 x86/apic/vector: Warn when vector space exhaustion breaks affinity
In reply to Greg Kroah-HartmanFrom: Neil Horman <[email protected]>
[ Upstream commit 743dac494d61d991967ebcfab92e4f80dc7583b3 ]
On x86, CPUs are limited in the number of interrupts they can have affined to them as they only support 256 interrupt vectors per CPU. 32 vectors are reserved for the CPU and the kernel reserves another 22 for internal purposes. That leaves 202 vectors for assignement to devices.
When an interrupt is set up or the affinity is changed by the kernel or the administrator, the vector assignment code attempts to honor the requested affinity mask. If the vector space on the CPUs in that affinity mask is exhausted the code falls back to a wider set of CPUs and assigns a vector on a CPU outside of the requested affinity mask silently.
While the effective affinity is reflected in the corresponding /proc/irq/$N/effective_affinity* files the silent breakage of the requested affinity can lead to unexpected behaviour for administrators.
Add a pr_warn() when this happens so that adminstrators get at least informed about it in the syslog.
[ tglx: Massaged changelog and made the pr_warn() more informative ]
--- arch/x86/kernel/apic/vector.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
arch/x86/kernel/apic/vector.c +11 -0
@@ -398,6 +398,17 @@ static int activate_reserved(struct irq_data *irqd)if (!irqd_can_reserve (irqd)) apicd->can_reserve = false; } + +/* +* Check to ensure that the effective affinity mask is a subset +* the user supplied affinity mask, and warn the user if it is not +*/ +if (!cpumask_subset (irq_data_get_effective_affinity_mask (irqd), +irq_data_get_affinity_mask (irqd))) { +pr_warn ("irq %u: Affinity broken due to vector space exhaustion.\n" , + irqd->irq); + } +return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 171/344 arm64: kpti: ensure patched kernel text is fetched from PoU
In reply to Greg Kroah-HartmanFrom: Mark Rutland <[email protected]>
[ Upstream commit f32c7a8e45105bd0af76872bf6eef0438ff12fb2 ]
While the MMUs is disabled, I-cache speculation can result in instructions being fetched from the PoC. During boot we may patch instructions (e.g. for alternatives and jump labels), and these may be dirty at the PoU (and stale at the PoC).
Thus, while the MMU is disabled in the KPTI pagetable fixup code we may load stale instructions into the I-cache, potentially leading to subsequent crashes when executing regions of code which have been modified at runtime.
Similarly to commit:
8ec41987436d566f ("arm64: mm: ensure patched kernel text is fetched from PoU")
... we can invalidate the I-cache after enabling the MMU to prevent such issues.
The KPTI pagetable fixup code itself should be clean to the PoC per the boot protocol, so no maintenance is required for this code.
--- arch/arm64/mm/proc.S | 9 +++++++++ 1 file changed, 9 insertions(+)
arch/arm64/mm/proc.S +9 -0
@@ -286,6 +286,15 @@ skip_pgd: msr sctlr_el1, x18 isb + /* + * Invalidate the local I-cache so that any instructions fetched + * speculatively from the PoC are discarded, since they may have + * been dynamically patched at the PoU. + */ + ic iallu + dsb nsh + isb + /* Set the flag to zero to indicate that we're all done */ str wzr, [flag_ptr] ret
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 172/344 perf evlist: Use unshare(CLONE_FS) in sb threads to let setns(CLONE_NEWNS) work
In reply to Greg Kroah-HartmanFrom: Arnaldo Carvalho de Melo <[email protected]>
[ Upstream commit b397f8468fa27f08b83b348ffa56a226f72453af ]
When we started using a thread to catch the PERF_RECORD_BPF_EVENT meta data events to then ask the kernel for further info (BTF, etc) for BPF programs shortly after they get loaded, we forgot to use unshare(CLONE_FS) as was done in:
868a832918f6 ("perf top: Support lookup of symbols in other mount namespaces.")
Do it so that we can enter the namespaces to read the build-ids at the end of a 'perf record' session for the DSOs that had hits.
Before:
Starting a 'stress-ng --cpus 8' inside a container and then, outside the container running:
# perf record -a --namespaces sleep 5 # perf buildid-list | grep stress-ng #
We would end up with a 'perf.data' file that had no entry in its build-id table for the /usr/bin/stress-ng binary inside the container that got tons of PERF_RECORD_SAMPLEs.
After:
# perf buildid-list | grep stress-ng f2ed02c68341183a124b9b0f6e2e6c493c465b29 /usr/bin/stress-ng #
Then its just a matter of making sure that that binary debuginfo package gets available in a place that 'perf report' will look at build-id keyed ELF files, which, in my case, on a f30 notebook, was a matter of installing the debuginfo file for the distro used in the container, fedora 31:
# rpm -ivh http://fedora.c3sl.ufpr.br/linux/development/31/Everything/x86_64/debug/tree/Packages/s/stress-ng-debuginfo-0.07.29-10.fc31.x86_64.rpm
Then, because perf currently looks for those debuginfo files (richer ELF symtab) inside that namespace (look at the setns calls):
openat(AT_FDCWD, "/proc/self/ns/mnt", O_RDONLY) = 137
openat(AT_FDCWD, "/proc/13169/ns/mnt", O_RDONLY) = 139
setns(139, CLONE_NEWNS) = 0
stat("/usr/bin/stress-ng", {st_mode=S_IFREG|0755, st_size=3065416, ...}) = 0
openat(AT_FDCWD, "/usr/bin/stress-ng", O_RDONLY) = 140
fcntl(140, F_GETFD) = 0
fstat(140, {st_mode=S_IFREG|0755, st_size=3065416, ...}) = 0
mmap(NULL, 3065416, PROT_READ, MAP_PRIVATE, 140, 0) = 0x7ff2fdc5b000
munmap(0x7ff2fdc5b000, 3065416) = 0
close(140) = 0
stat("stress-ng-0.07.29-10.fc31.x86_64.debug", 0x7fff45d71260) = -1 ENOENT (No such file or directory) stat("/usr/bin/stress-ng-0.07.29-10.fc31.x86_64.debug", 0x7fff45d71260) = -1 ENOENT (No such file or directory) stat("/usr/bin/.debug/stress-ng-0.07.29-10.fc31.x86_64.debug", 0x7fff45d71260) = -1 ENOENT (No such file or directory) stat("/usr/lib/debug/usr/bin/stress-ng-0.07.29-10.fc31.x86_64.debug", 0x7fff45d71260) = -1 ENOENT (No such file or directory) stat("/root/.debug/.build-id/f2/ed02c68341183a124b9b0f6e2e6c493c465b29", 0x7fff45d711e0) = -1 ENOENT (No such file or directory)
To only then go back to the "host" namespace to look just in the users's ~/.debug cache:
setns(137, CLONE_NEWNS) = 0
chdir("/root") = 0
close(137) = 0
close(139) = 0 stat("/root/.debug/.build-id/f2/ed02c68341183a124b9b0f6e2e6c493c465b29/elf", 0x7fff45d732e0) = -1 ENOENT (No such file or directory)
It continues to fail to resolve symbols:
# perf report | grep stress-ng | head -5
9.50% stress-ng-cpu stress-ng [.] 0x0000000000021ac1
8.58% stress-ng-cpu stress-ng [.] 0x0000000000021ab4
8.51% stress-ng-cpu stress-ng [.] 0x0000000000021489
7.17% stress-ng-cpu stress-ng [.] 0x00000000000219b6
3.93% stress-ng-cpu stress-ng [.] 0x0000000000021478
#To overcome that we use:
# perf buildid-cache -v --add /usr/lib/debug/usr/bin/stress-ng-0.07.29-10.fc31.x86_64.debug Adding f2ed02c68341183a124b9b0f6e2e6c493c465b29 /usr/lib/debug/usr/bin/stress-ng-0.07.29-10.fc31.x86_64.debug: Ok # # ls -la /root/.debug/.build-id/f2/ed02c68341183a124b9b0f6e2e6c493c465b29/elf -rw-r--r--. 3 root root 2401184 Jul 27 07:03 /root/.debug/.build-id/f2/ed02c68341183a124b9b0f6e2e6c493c465b29/elf # file /root/.debug/.build-id/f2/ed02c68341183a124b9b0f6e2e6c493c465b29/elf /root/.debug/.build-id/f2/ed02c68341183a124b9b0f6e2e6c493c465b29/elf: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter \004, BuildID[sha1]=f2ed02c68341183a124b9b0f6e2e6c493c465b29, for GNU/Linux 3.2.0, with debug_info, not stripped, too many notes (256) #
Now it finally works:
# perf report | grep stress-ng | head -5
23.59% stress-ng-cpu stress-ng [.] ackermann
23.33% stress-ng-cpu stress-ng [.] is_prime
17.36% stress-ng-cpu stress-ng [.] stress_cpu_sieve
6.08% stress-ng-cpu stress-ng [.] stress_cpu_correlate
3.55% stress-ng-cpu stress-ng [.] queens_try
#I'll make sure that it looks for the build-id keyed files in both the "host" namespace (the namespace the user running 'perf record' was a the time of the recording) and in the container namespace, as it shouldn't matter where a content based key lookup finds the ELF file to use in resolving symbols, etc.
--- tools/perf/util/evlist.c | 9 +++++++++ 1 file changed, 9 insertions(+)
tools/perf/util/evlist.c +9 -0
@@ -20,6 +20,7 @@#include "bpf-event.h" #include <signal.h> #include <unistd.h> +#include <sched.h> #include "parse-events.h" #include <subcmd/parse-options.h>
@@ -1870,6 +1871,14 @@ static void *perf_evlist__poll_thread(void *arg)struct perf_evlist *evlist = arg;bool draining = false;int i, done =0 ; +/* +* In order to read symbols from other namespaces perf to needs to call +* setns(2). This isn't permitted if the struct_fs has multiple users. +* unshare(2) the fs so that we may continue to setns into namespaces +* that we're observing when, for instance, reading the build-ids at +* the end of a 'perf record' session. +*/ +unshare (CLONE_FS );while (!done) {bool got_data = false;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 173/344 arm64: Use correct ll/sc atomic constraints
In reply to Greg Kroah-HartmanFrom: Andrew Murray <[email protected]>
[ Upstream commit 580fa1b874711d633f9b145b7777b0e83ebf3787 ]
The A64 ISA accepts distinct (but overlapping) ranges of immediates for:
* add arithmetic instructions ('I' machine constraint)
* sub arithmetic instructions ('J' machine constraint)
* 32-bit logical instructions ('K' machine constraint)
* 64-bit logical instructions ('L' machine constraint)
... but we currently use the 'I' constraint for many atomic operations using sub or logical instructions, which is not always valid.
When CONFIG_ARM64_LSE_ATOMICS is not set, this allows invalid immediates to be passed to instructions, potentially resulting in a build failure. When CONFIG_ARM64_LSE_ATOMICS is selected the out-of-line ll/sc atomics always use a register as they have no visibility of the value passed by the caller.
This patch adds a constraint parameter to the ATOMIC_xx and __CMPXCHG_CASE macros so that we can pass appropriate constraints for each case, with uses updated accordingly.
Unfortunately prior to GCC 8.1.0 the 'K' constraint erroneously accepted '4294967295', so we must instead force the use of a register.
--- arch/arm64/include/asm/atomic_ll_sc.h | 89 ++++++++++++++------------- 1 file changed, 47 insertions(+), 42 deletions(-)
arch/arm64/include/asm/atomic_ll_sc.h +47 -42
@@ -26,7 +26,7 @@* (the optimize attribute silently ignores these options). */ -#define ATOMIC_OP (op, asm_op) \ +#define ATOMIC_OP (op, asm_op, constraint) \ __LL_SC_INLINE void \ __LL_SC_PREFIX(arch_atomic_##op(int i, atomic_t *v)) \ { \
@@ -40,11 +40,11 @@ __LL_SC_PREFIX(arch_atomic_##op(int i, atomic_t *v)) \ " stxr %w1, %w0, %2\n" \ " cbnz %w1, 1b" \ : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ - : "Ir" (i)); \ + : #constraint "r" (i)); \ } \ __LL_SC_EXPORT(arch_atomic_##op); -#define ATOMIC_OP_RETURN (name, mb, acq, rel, cl, op, asm_op) \ +#define ATOMIC_OP_RETURN (name, mb, acq, rel, cl, op, asm_op, constraint)\ __LL_SC_INLINE int \ __LL_SC_PREFIX(arch_atomic_##op##_return##name(int i, atomic_t *v)) \ { \
@@ -59,14 +59,14 @@ __LL_SC_PREFIX(arch_atomic_##op##_return##name(int i, atomic_t *v)) \" cbnz %w1, 1b\n" \ " " #mb \ : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ - : "Ir" (i) \ + : #constraint "r" (i) \ : cl); \ \ return result; \ } \ __LL_SC_EXPORT(arch_atomic_##op##_return##name); -#define ATOMIC_FETCH_OP (name, mb, acq, rel, cl, op, asm_op) \ +#define ATOMIC_FETCH_OP (name, mb, acq, rel, cl, op, asm_op, constraint) \ __LL_SC_INLINE int \ __LL_SC_PREFIX(arch_atomic_fetch_##op##name(int i, atomic_t *v)) \ { \
@@ -81,7 +81,7 @@ __LL_SC_PREFIX(arch_atomic_fetch_##op##name(int i, atomic_t *v)) \" cbnz %w2, 1b\n" \ " " #mb \ : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter) \ - : "Ir" (i) \ + : #constraint "r" (i) \ : cl); \ \ return result; \
@@ -99,8 +99,8 @@ __LL_SC_EXPORT(arch_atomic_fetch_##op##name); ATOMIC_FETCH_OP (_acquire, , a, , "memory", __VA_ARGS__)\ ATOMIC_FETCH_OP (_release, , , l, "memory", __VA_ARGS__) -ATOMIC_OPS(add, add) -ATOMIC_OPS(sub, sub) +ATOMIC_OPS(add, add, I) +ATOMIC_OPS(sub, sub, J)#undef ATOMIC_OPS#define ATOMIC_OPS (...) \
@@ -110,17 +110,17 @@ ATOMIC_OPS(sub, sub) ATOMIC_FETCH_OP (_acquire, , a, , "memory", __VA_ARGS__)\ ATOMIC_FETCH_OP (_release, , , l, "memory", __VA_ARGS__) -ATOMIC_OPS(and, and) -ATOMIC_OPS(andnot, bic) -ATOMIC_OPS(or, orr) -ATOMIC_OPS(xor, eor) +ATOMIC_OPS(and, and, ) +ATOMIC_OPS(andnot, bic, ) +ATOMIC_OPS(or, orr, ) +ATOMIC_OPS(xor, eor, ) #undef ATOMIC_OPS #undef ATOMIC_FETCH_OP #undef ATOMIC_OP_RETURN #undef ATOMIC_OP -#define ATOMIC64_OP (op, asm_op) \ +#define ATOMIC64_OP(op, asm_op, constraint) \ __LL_SC_INLINE void \ __LL_SC_PREFIX(arch_atomic64_##op(s64 i, atomic64_t *v)) \ { \
@@ -134,11 +134,11 @@ __LL_SC_PREFIX(arch_atomic64_##op(s64 i, atomic64_t *v)) \ " stxr %w1, %0, %2\n" \ " cbnz %w1, 1b" \ : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ - : "Ir" (i)); \ + : #constraint "r" (i)); \ } \ __LL_SC_EXPORT(arch_atomic64_##op); -#define ATOMIC64_OP_RETURN (name, mb, acq, rel, cl, op, asm_op) \ +#define ATOMIC64_OP_RETURN (name, mb, acq, rel, cl, op, asm_op, constraint)\ __LL_SC_INLINE s64 \ __LL_SC_PREFIX(arch_atomic64_##op##_return##name(s64 i, atomic64_t *v))\ { \
@@ -153,14 +153,14 @@ __LL_SC_PREFIX(arch_atomic64_##op##_return##name(s64 i, atomic64_t *v))\" cbnz %w1, 1b\n" \ " " #mb \ : "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \ - : "Ir" (i) \ + : #constraint "r" (i) \ : cl); \ \ return result; \ } \ __LL_SC_EXPORT(arch_atomic64_##op##_return##name); -#define ATOMIC64_FETCH_OP (name, mb, acq, rel, cl, op, asm_op) \ +#define ATOMIC64_FETCH_OP (name, mb, acq, rel, cl, op, asm_op, constraint)\ __LL_SC_INLINE s64 \ __LL_SC_PREFIX(arch_atomic64_fetch_##op##name(s64 i, atomic64_t *v)) \ { \
@@ -175,7 +175,7 @@ __LL_SC_PREFIX(arch_atomic64_fetch_##op##name(s64 i, atomic64_t *v)) \" cbnz %w2, 1b\n" \ " " #mb \ : "=&r" (result), "=&r" (val), "=&r" (tmp), "+Q" (v->counter) \ - : "Ir" (i) \ + : #constraint "r" (i) \ : cl); \ \ return result; \
@@ -193,8 +193,8 @@ __LL_SC_EXPORT(arch_atomic64_fetch_##op##name); ATOMIC64_FETCH_OP (_acquire,, a, , "memory", __VA_ARGS__) \ ATOMIC64_FETCH_OP (_release,, , l, "memory", __VA_ARGS__) -ATOMIC64_OPS(add, add) -ATOMIC64_OPS(sub, sub) +ATOMIC64_OPS(add, add, I) +ATOMIC64_OPS(sub, sub, J)#undef ATOMIC64_OPS#define ATOMIC64_OPS (...) \
@@ -204,10 +204,10 @@ ATOMIC64_OPS(sub, sub) ATOMIC64_FETCH_OP (_acquire,, a, , "memory", __VA_ARGS__) \ ATOMIC64_FETCH_OP (_release,, , l, "memory", __VA_ARGS__) -ATOMIC64_OPS(and, and) -ATOMIC64_OPS(andnot, bic) -ATOMIC64_OPS(or, orr) -ATOMIC64_OPS(xor, eor) +ATOMIC64_OPS(and, and, L) +ATOMIC64_OPS(andnot, bic, ) +ATOMIC64_OPS(or, orr, L) +ATOMIC64_OPS(xor, eor, L) #undef ATOMIC64_OPS #undef ATOMIC64_FETCH_OP
@@ -237,7 +237,7 @@ __LL_SC_PREFIX(arch_atomic64_dec_if_positive(atomic64_t *v)) }__LL_SC_EXPORT (arch_atomic64_dec_if_positive); -#define __CMPXCHG_CASE (w, sfx, name, sz, mb, acq, rel, cl) \ +#define __CMPXCHG_CASE (w, sfx, name, sz, mb, acq, rel, cl, constraint) \ __LL_SC_INLINE u##sz \ __LL_SC_PREFIX(__cmpxchg_case_##name##sz(volatile void *ptr, \ unsigned long old, \
@@ -265,29 +265,34 @@ __LL_SC_PREFIX(__cmpxchg_case_##name##sz(volatile void *ptr, \ "2:" \ : [tmp] "=&r" (tmp), [oldval] "=&r" (oldval), \ [v] "+Q" (*(u##sz *)ptr) \ -: [old] " Kr" (old), [new] " r" (new) \ + : [old] #constraint "r" (old), [new] "r" (new) \ : cl); \ \ return oldval; \ } \ __LL_SC_EXPORT(__cmpxchg_case_##name##sz); -__CMPXCHG_CASE(w, b, , 8, , , , ) -__CMPXCHG_CASE(w, h, , 16, , , , ) -__CMPXCHG_CASE(w, , , 32, , , , ) -__CMPXCHG_CASE( , , , 64, , , , ) -__CMPXCHG_CASE(w, b, acq_, 8, , a, , "memory") -__CMPXCHG_CASE(w, h, acq_, 16, , a, , "memory") -__CMPXCHG_CASE(w, , acq_, 32, , a, , "memory") -__CMPXCHG_CASE( , , acq_, 64, , a, , "memory") -__CMPXCHG_CASE(w, b, rel_, 8, , , l, "memory") -__CMPXCHG_CASE(w, h, rel_, 16, , , l, "memory") -__CMPXCHG_CASE(w, , rel_, 32, , , l, "memory") -__CMPXCHG_CASE( , , rel_, 64, , , l, "memory") -__CMPXCHG_CASE(w, b, mb_, 8, dmb ish, , l, "memory") -__CMPXCHG_CASE(w, h, mb_, 16, dmb ish, , l, "memory") -__CMPXCHG_CASE(w, , mb_, 32, dmb ish, , l, "memory") -__CMPXCHG_CASE( , , mb_, 64, dmb ish, , l, "memory") +/* + * Earlier versions of GCC (no later than 8.1.0) appear to incorrectly + * handle the 'K' constraint for the value 4294967295 - thus we use no + * constraint for 32 bit operations. + */ +__CMPXCHG_CASE(w, b, , 8, , , , , ) +__CMPXCHG_CASE(w, h, , 16, , , , , ) +__CMPXCHG_CASE(w, , , 32, , , , , ) +__CMPXCHG_CASE( , , , 64, , , , , L) +__CMPXCHG_CASE(w, b, acq_, 8, , a, , "memory", ) +__CMPXCHG_CASE(w, h, acq_, 16, , a, , "memory", ) +__CMPXCHG_CASE(w, , acq_, 32, , a, , "memory", ) +__CMPXCHG_CASE( , , acq_, 64, , a, , "memory", L) +__CMPXCHG_CASE(w, b, rel_, 8, , , l, "memory", ) +__CMPXCHG_CASE(w, h, rel_, 16, , , l, "memory", ) +__CMPXCHG_CASE(w, , rel_, 32, , , l, "memory", ) +__CMPXCHG_CASE( , , rel_, 64, , , l, "memory", L) +__CMPXCHG_CASE(w, b, mb_, 8, dmb ish, , l, "memory", ) +__CMPXCHG_CASE(w, h, mb_, 16, dmb ish, , l, "memory", ) +__CMPXCHG_CASE(w, , mb_, 32, dmb ish, , l, "memory", ) +__CMPXCHG_CASE( , , mb_, 64, dmb ish, , l, "memory", L) #undef __CMPXCHG_CASE
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 174/344 jump_label: Dont warn on __exit jump entries
In reply to Greg Kroah-HartmanFrom: Andrew Murray <[email protected]>
[ Upstream commit 8f35eaa5f2de020073a48ad51112237c5932cfcc ]
On architectures that discard .exit.* sections at runtime, a warning is printed for each jump label that is used within an in-kernel __exit annotated function:
can't patch jump_label at ehci_hcd_cleanup+0x8/0x3c
WARNING: CPU: 0 PID: 1 at kernel/jump_label.c:410 __jump_label_update+0x12c/0x138
As these functions will never get executed (they are free'd along with the rest of initmem) - we do not need to patch them and should not display any warnings.
The warning is displayed because the test required to satisfy jump_entry_is_init is based on init_section_contains (__init_begin to __init_end) whereas the test in __jump_label_update is based on init_kernel_text (_sinittext to _einittext) via kernel_text_address).
--- kernel/jump_label.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
kernel/jump_label.c +3 -1
@@ -407,7 +407,9 @@ static bool jump_label_can_update(struct jump_entry *entry, bool init)return false;if (!kernel_text_address (jump_entry_code (entry))) { -WARN_ONCE (1 ,"can't patch jump_label at %pS" , (void *)jump_entry_code (entry)); +WARN_ONCE (!jump_entry_is_init (entry), +"can't patch jump_label at %pS" , + (void *)jump_entry_code (entry));return false; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 175/344 x86/mm/pti: Do not invoke PTI functions when PTI is disabled
In reply to Greg Kroah-HartmanFrom: Thomas Gleixner <[email protected]>
[ Upstream commit 990784b57731192b7d90c8d4049e6318d81e887d ]
When PTI is disabled at boot time either because the CPU is not affected or PTI has been disabled on the command line, the boot code still calls into pti_finalize() which then unconditionally invokes:
pti_clone_entry_text()
pti_clone_kernel_text()
pti_clone_kernel_text() was called unconditionally before the 32bit support was added and 32bit added the call to pti_clone_entry_text().
The call has no side effects as cloning the page tables into the available second one, which was allocated for PTI does not create damage. But it does not make sense either and in case that this functionality would be extended later this might actually lead to hard to diagnose issues.
Neither function should be called when PTI is runtime disabled. Make the invocation conditional.
--- arch/x86/mm/pti.c | 2 ++ 1 file changed, 2 insertions(+)
arch/x86/mm/pti.c +2 -0
@@ -666,6 +666,8 @@ void __init pti_init(void)*/ void pti_finalize (void ) { +if (!boot_cpu_has (X86_FEATURE_PTI )) +return ;/* * We need to clone everything (again) that maps parts of the * kernel image.
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 176/344 ASoC: fsl_ssi: Fix clock control issue in master mode
In reply to Greg Kroah-HartmanFrom: Shengjiu Wang <[email protected]>
[ Upstream commit 696d05225cebffd172008d212657be90e823eac0 ]
The test case is
arecord -Dhw:0 -d 10 -f S16_LE -r 48000 -c 2 temp.wav & aplay -Dhw:0 -d 30 -f S16_LE -r 48000 -c 2 test.wav
There will be error after end of arecord:
aplay: pcm_write:2051: write error: Input/output error
Capture and Playback work in parallel in master mode, one substream stops, the other substream is impacted, the reason is that clock is disabled wrongly.
The clock's reference count is not increased when second substream starts, the hw_param() function returns in the beginning because first substream is enabled, then in end of first substream, the hw_free() disables the clock.
This patch is to move the clock enablement to the place before checking of the device enablement in hw_param().
--- sound/soc/fsl/fsl_ssi.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
sound/soc/fsl/fsl_ssi.c +9 -9
@@ -799,15 +799,6 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream,u32 wl =SSI_SxCCR_WL (sample_size);int ret; -/* -* SSI is properly configured if it is enabled and running in -* the synchronous mode; Note that AC97 mode is an exception -* that should set separate configurations for STCCR and SRCCR -* despite running in the synchronous mode. -*/ -if (ssi->streams && ssi->synchronous) -return 0 ; -if (fsl_ssi_is_i2s_master (ssi)) { ret =fsl_ssi_set_bclk (substream, dai, hw_params);if (ret)
@@ -823,6 +814,15 @@ static int fsl_ssi_hw_params(struct snd_pcm_substream *substream, } } +/* +* SSI is properly configured if it is enabled and running in +* the synchronous mode; Note that AC97 mode is an exception +* that should set separate configurations for STCCR and SRCCR +* despite running in the synchronous mode. +*/ +if (ssi->streams && ssi->synchronous) +return 0 ; +if (!fsl_ssi_is_ac97 (ssi)) {/* * Keep the ssi->i2s_net intact while having a local variable
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 177/344 x86/mm/pti: Handle unaligned address gracefully in pti_clone_pagetable()
In reply to Greg Kroah-HartmanFrom: Song Liu <[email protected]>
[ Upstream commit 825d0b73cd7526b0bb186798583fae810091cbac ]
pti_clone_pmds() assumes that the supplied address is either:
- properly PUD/PMD aligned
or
- the address is actually mapped which means that independently of the mapping level (PUD/PMD/PTE) the next higher mapping exists.
If that's not the case the unaligned address can be incremented by PUD or PMD size incorrectly. All callers supply mapped and/or aligned addresses, but for the sake of robustness it's better to handle that case properly and to emit a warning.
[ tglx: Rewrote changelog and added WARN_ON_ONCE() ]
--- arch/x86/mm/pti.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/x86/mm/pti.c +4 -2
@@ -330,13 +330,15 @@ pti_clone_pgtable(unsigned long start, unsigned long end, pud =pud_offset (p4d, addr);if (pud_none (*pud)) { - addr +=PUD_SIZE ; +WARN_ON_ONCE (addr & ~PUD_MASK ); + addr =round_up (addr +1 ,PUD_SIZE );continue ; } pmd =pmd_offset (pud, addr);if (pmd_none (*pmd)) { - addr +=PMD_SIZE ; +WARN_ON_ONCE (addr & ~PMD_MASK ); + addr =round_up (addr +1 ,PMD_SIZE );continue ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 178/344 nvmet: fix data units read and written counters in SMART log
In reply to Greg Kroah-HartmanFrom: Tom Wu <[email protected]>
[ Upstream commit 3bec2e3754becebd4c452999adb49bc62c575ea4 ]
In nvme spec 1.3 there is a definition for data write/read counters from SMART log, (See section 5.14.1.2):
This value is reported in thousands (i.e., a value of 1 corresponds to 1000 units of 512 bytes read) and is rounded up.
However, in nvme target where value is reported with actual units, but not thousands of units as the spec requires.
--- drivers/nvme/target/admin-cmd.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
drivers/nvme/target/admin-cmd.c +8 -6
@@ -81,9 +81,11 @@ static u16 nvmet_get_smart_log_nsid(struct nvmet_req *req, goto out; host_reads =part_stat_read (ns->bdev->bd_part, ios[READ ]); - data_units_read =part_stat_read (ns->bdev->bd_part, sectors[READ ]); + data_units_read =DIV_ROUND_UP (part_stat_read (ns->bdev->bd_part, + sectors[READ ]),1000 ); host_writes =part_stat_read (ns->bdev->bd_part, ios[WRITE ]); - data_units_written =part_stat_read (ns->bdev->bd_part, sectors[WRITE ]); + data_units_written =DIV_ROUND_UP (part_stat_read (ns->bdev->bd_part, + sectors[WRITE ]),1000 );put_unaligned_le64 (host_reads, &slog->host_reads[0 ]);put_unaligned_le64 (data_units_read, &slog->data_units_read[0 ]);
@@ -111,11 +113,11 @@ static u16 nvmet_get_smart_log_all(struct nvmet_req *req,if (!ns->bdev)continue ; host_reads +=part_stat_read (ns->bdev->bd_part, ios[READ ]); - data_units_read += -part_stat_read (ns->bdev->bd_part, sectors[READ ]); + data_units_read +=DIV_ROUND_UP ( +part_stat_read (ns->bdev->bd_part, sectors[READ ]),1000 ); host_writes +=part_stat_read (ns->bdev->bd_part, ios[WRITE ]); - data_units_written += -part_stat_read (ns->bdev->bd_part, sectors[WRITE ]); + data_units_written +=DIV_ROUND_UP ( +part_stat_read (ns->bdev->bd_part, sectors[WRITE ]),1000 ); }rcu_read_unlock ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 179/344 nvme-multipath: fix ana log nsid lookup when nsid is not found
In reply to Greg Kroah-HartmanFrom: Anton Eidelman <[email protected]>
[ Upstream commit e01f91dff91c7b16a6e3faf2565017d497a73f83 ]
ANA log parsing invokes nvme_update_ana_state() per ANA group desc. This updates the state of namespaces with nsids in desc->nsids[].
Both ctrl->namespaces list and desc->nsids[] array are sorted by nsid. Hence nvme_update_ana_state() performs a single walk over ctrl->namespaces:
- if current namespace matches the current desc->nsids[n],
this namespace is updated, and n is incremented.
- the process stops when it encounters the end of either ctrl->namespaces end or desc->nsids[]
In case desc->nsids[n] does not match any of ctrl->namespaces, the remaining nsids following desc->nsids[n] will not be updated. Such situation was considered abnormal and generated WARN_ON_ONCE.
However ANA log MAY contain nsids not (yet) found in ctrl->namespaces. For example, lets consider the following scenario:
- nvme0 exposes namespaces with nsids = [2, 3] to the host
- a new namespace nsid = 1 is added dynamically
- also, a ANA topology change is triggered
- NS_CHANGED aen is generated and triggers scan_work
- before scan_work discovers nsid=1 and creates a namespace, a NOTICE_ANA aen was issues and ana_work receives ANA log with nsids=[1, 2, 3]
Result: ana_work fails to update ANA state on existing namespaces [2, 3]
Solution:
Change the way nvme_update_ana_state() namespace list walk checks the current namespace against desc->nsids[n] as follows:
a) ns->head->ns_id < desc->nsids[n]: keep walking ctrl->namespaces.
b) ns->head->ns_id == desc->nsids[n]: match, update the namespace
c) ns->head->ns_id >= desc->nsids[n]: skip to desc->nsids[n+1]
This enables correct operation in the scenario described above. This also allows ANA log to contain nsids currently invisible to the host, i.e. inactive nsids.
--- drivers/nvme/host/multipath.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/nvme/host/multipath.c +5 -3
@@ -509,14 +509,16 @@ static int nvme_update_ana_state(struct nvme_ctrl *ctrl,down_write (&ctrl->namespaces_rwsem);list_for_each_entry (ns, &ctrl->namespaces, list) { -if (ns->head->ns_id !=le32_to_cpu (desc->nsids[n])) +unsigned nsid =le32_to_cpu (desc->nsids[n]); + +if (ns->head->ns_id < nsid)continue ; -nvme_update_ns_ana_state (desc, ns); +if (ns->head->ns_id == nsid) +nvme_update_ns_ana_state (desc, ns);if (++n == nr_nsids)break ; }up_write (&ctrl->namespaces_rwsem); -WARN_ON_ONCE (n < nr_nsids);return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 180/344 ALSA: firewire-motu: add support for MOTU 4pre
In reply to Greg Kroah-HartmanFrom: Takashi Sakamoto <[email protected]>
[ Upstream commit 6af86bdb8ad41f4cf1292d3b10857dc322758328 ]
MOTU 4pre was launched in 2012 by MOTU, Inc. This commit allows userspace applications can transmit and receive PCM frames and MIDI messages for this model via ALSA PCM interface and RawMidi/Sequencer interfaces.
The device supports MOTU protocol version 3. Unlike the other devices, the device is simply designed. The size of data block is fixed to 10 quadlets during available sampling rates (44.1 - 96.0 kHz). Each data block includes 1 source packet header, 2 data chunks for messages, 8 data chunks for PCM samples and 2 data chunks for padding to quadlet alignment. The device has no MIDI, optical, BNC and AES/EBU interfaces.
Like support for the other MOTU devices, the quality of playback sound is not enough good with periodical noise yet.
$ python2 crpp < ~/git/am-config-rom/motu/motu-4pre.img
ROM header and bus information block
-----------------------------------------------------------------
400 041078cc bus_info_length 4, crc_length 16, crc 30924
404 31333934 bus_name "1394"
408 20ff7000 irmc 0, cmc 0, isc 1, bmc 0, cyc_clk_acc 255, max_rec 7 (256)
40c 0001f200 company_id 0001f2 |
410 000a41c5 device_id 00000a41c5 | EUI-64 0001f200000a41c5 root directory
-----------------------------------------------------------------
414 0004ef04 directory_length 4, crc 61188
418 030001f2 vendor
41c 0c0083c0 node capabilities per IEEE 1394
420 d1000002 --> unit directory at 428
424 8d000005 --> eui-64 leaf at 438 unit directory at 428
-----------------------------------------------------------------
428 0003ceda directory_length 3, crc 52954 42c 120001f2 specifier id 430 13000045 version 434 17103800 model
eui-64 leaf at 438
-----------------------------------------------------------------
438 0002d248 leaf_length 2, crc 53832
43c 0001f200 company_id 0001f2 |
440 000a41c5 device_id 00000a41c5 | EUI-64 0001f200000a41c5--- sound/firewire/motu/motu.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
sound/firewire/motu/motu.c +12 -0
@@ -247,6 +247,17 @@ static const struct snd_motu_spec motu_audio_express = { .analog_out_ports = 4, }; +static const struct snd_motu_spec motu_4pre = { + .name ="4pre" , + .protocol = &snd_motu_protocol_v3, + .flags =SND_MOTU_SPEC_SUPPORT_CLOCK_X2 | +SND_MOTU_SPEC_TX_MICINST_CHUNK | +SND_MOTU_SPEC_TX_RETURN_CHUNK | +SND_MOTU_SPEC_RX_SEPARETED_MAIN , + .analog_in_ports =2 , + .analog_out_ports =2 , +}; +#define SND_MOTU_DEV_ENTRY (model, data) \ { \ .match_flags = IEEE1394_MATCH_VENDOR_ID | \
@@ -265,6 +276,7 @@ static const struct ieee1394_device_id motu_id_table[] = {SND_MOTU_DEV_ENTRY (0x000015 , &motu_828mk3),/* FireWire only. */ SND_MOTU_DEV_ENTRY (0x000035 , &motu_828mk3),/* Hybrid. */ SND_MOTU_DEV_ENTRY (0x000033 , &motu_audio_express), +SND_MOTU_DEV_ENTRY (0x000045 , &motu_4pre), { } };MODULE_DEVICE_TABLE (ieee1394, motu_id_table);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 181/344 iommu/amd: Silence warnings under memory pressure
In reply to Greg Kroah-HartmanFrom: Qian Cai <[email protected]>
[ Upstream commit 3d708895325b78506e8daf00ef31549476e8586a ]
When running heavy memory pressure workloads, the system is throwing endless warnings,
smartpqi 0000:23:00.0: AMD-Vi: IOMMU mapping error in map_sg (io-pages:
5 reason: -12)
Hardware name: HPE ProLiant DL385 Gen10/ProLiant DL385 Gen10, BIOS A40 07/10/2019 swapper/10: page allocation failure: order:0, mode:0xa20(GFP_ATOMIC), nodemask=(null),cpuset=/,mems_allowed=0,4 Call Trace: <IRQ> dump_stack+0x62/0x9a warn_alloc.cold.43+0x8a/0x148 __alloc_pages_nodemask+0x1a5c/0x1bb0 get_zeroed_page+0x16/0x20 iommu_map_page+0x477/0x540 map_sg+0x1ce/0x2f0 scsi_dma_map+0xc6/0x160 pqi_raid_submit_scsi_cmd_with_io_request+0x1c3/0x470 [smartpqi] do_IRQ+0x81/0x170 common_interrupt+0xf/0xf </IRQ>
because the allocation could fail from iommu_map_page(), and the volume of this call could be huge which may generate a lot of serial console output and cosumes all CPUs.
Fix it by silencing the warning in this call site, and there is still a dev_err() later to notify the failure.
--- drivers/iommu/amd_iommu.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iommu/amd_iommu.c +3 -1
@@ -2577,7 +2577,9 @@ static int map_sg(struct device *dev, struct scatterlist *sglist, bus_addr = address + s->dma_address + (j <<PAGE_SHIFT ); phys_addr = (sg_phys (s) &PAGE_MASK ) + (j <<PAGE_SHIFT ); - ret =iommu_map_page (domain, bus_addr, phys_addr,PAGE_SIZE , prot,GFP_ATOMIC ); + ret =iommu_map_page (domain, bus_addr, phys_addr, +PAGE_SIZE , prot, +GFP_ATOMIC | __GFP_NOWARN);if (ret) goto out_unmap;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 182/344 ASoC: Intel: Haswell: Adjust machine device private context
In reply to Greg Kroah-HartmanFrom: Cezary Rojewski <[email protected]>
[ Upstream commit ca964edf0ddbfec2cb10b3d251d09598e7ca9b13 ]
Apart from Haswell machines, all other devices have their private data set to snd_soc_acpi_mach instance.
Changes for HSW/ BDW boards introduced with series:
https://patchwork.kernel.org/cover/10782035/
added support for dai_link platform_name adjustments within card probe routines. These take for granted private_data points to snd_soc_acpi_mach whereas for Haswell, it's sst_pdata instead. Change private context of platform_device - representing machine board - to address this.
--- sound/soc/intel/common/sst-acpi.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
sound/soc/intel/common/sst-acpi.c +2 -1
@@ -141,11 +141,12 @@ static int sst_acpi_probe(struct platform_device *pdev) }platform_set_drvdata (pdev, sst_acpi); + mach->pdata = sst_pdata;/* register machine driver */ sst_acpi->pdev_mach =platform_device_register_data (dev, mach->drv_name,-1 , - sst_pdata,sizeof (*sst_pdata)); + mach,sizeof (*mach));if (IS_ERR (sst_acpi->pdev_mach))return PTR_ERR (sst_acpi->pdev_mach);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 183/344 libata/ahci: Drop PCS quirk for Denverton and beyond
In reply to Greg Kroah-HartmanFrom: Dan Williams <[email protected]>
[ Upstream commit c312ef176399e04fc5f7f2809d9a589751fbf6d9 ]
The Linux ahci driver has historically implemented a configuration fixup for platforms / platform-firmware that fails to enable the ports prior to OS hand-off at boot. The fixup was originally implemented way back before ahci moved from drivers/scsi/ to drivers/ata/, and was updated in 2007 via commit 49f290903935 "ahci: update PCS programming". The quirk sets a port-enable bitmap in the PCS register at offset 0x92.
This quirk could be applied generically up until the arrival of the Denverton (DNV) platform. The DNV AHCI controller architecture supports more than 6 ports and along with that the PCS register location and format were updated to allow for more possible ports in the bitmap. DNV AHCI expands the register to 32-bits and moves it to offset 0x94.
As it stands there are no known problem reports with existing Linux trying to set bits at offset 0x92 which indicates that the quirk is not applicable. Likely it is not applicable on a wider range of platforms, but it is difficult to discern which platforms if any still depend on the quirk.
Rather than try to fix the PCS quirk to consider the DNV register layout instead require explicit opt-in. The assumption is that the OS driver need not touch this register, and platforms can be added with a new boad_ahci_pcs7 board-id when / if problematic platforms are found in the future. The logic in ahci_intel_pcs_quirk() looks for all Intel AHCI instances with "legacy" board-ids and otherwise skips the quirk if the board was matched by class-code.
--- drivers/ata/ahci.c | 116 +++++++++++++++++++++++++++------------------ drivers/ata/ahci.h | 2 + 2 files changed, 71 insertions(+), 47 deletions(-)
drivers/ata/ahci.c +69 -47
@@ -65,6 +65,12 @@ enum board_ids { board_ahci_sb700,/* for SB700 and SB800 */ board_ahci_vt8251, +/* +* board IDs for Intel chipsets that support more than 6 ports +* *and* end up needing the PCS quirk. +*/ + board_ahci_pcs7, +/* aliases */ board_ahci_mcp_linux = board_ahci_mcp65, board_ahci_mcp67 = board_ahci_mcp65,
@@ -220,6 +226,12 @@ static const struct ata_port_info ahci_port_info[] = { .udma_mask = ATA_UDMA6, .port_ops = &ahci_vt8251_ops, }, + [board_ahci_pcs7] = { + .flags = AHCI_FLAG_COMMON, + .pio_mask = ATA_PIO4, + .udma_mask = ATA_UDMA6, + .port_ops = &ahci_ops, + }, }; static const struct pci_device_id ahci_pci_tbl[] = {
@@ -264,26 +276,26 @@ static const struct pci_device_id ahci_pci_tbl[] = { { PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */ { PCI_VDEVICE(INTEL, 0x3b2c), board_ahci_mobile }, /* PCH M RAID */ { PCI_VDEVICE(INTEL, 0x3b2f), board_ahci }, /* PCH AHCI */ - { PCI_VDEVICE(INTEL, 0x19b0), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b1), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b2), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b3), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b4), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b5), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b6), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19b7), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19bE), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19bF), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c0), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c1), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c2), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c3), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c4), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c5), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c6), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19c7), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19cE), board_ahci }, /* DNV AHCI */ - { PCI_VDEVICE(INTEL, 0x19cF), board_ahci }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b0), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b1), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b2), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b3), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b4), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b5), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b6), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19b7), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19bE), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19bF), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c0), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c1), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c2), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c3), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c4), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c5), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c6), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19c7), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19cE), board_ahci_pcs7 }, /* DNV AHCI */ + { PCI_VDEVICE(INTEL, 0x19cF), board_ahci_pcs7 }, /* DNV AHCI */ { PCI_VDEVICE(INTEL, 0x1c02), board_ahci }, /* CPT AHCI */ { PCI_VDEVICE(INTEL, 0x1c03), board_ahci_mobile }, /* CPT M AHCI */ { PCI_VDEVICE(INTEL, 0x1c04), board_ahci }, /* CPT RAID */
@@ -623,30 +635,6 @@ static void ahci_pci_save_initial_config(struct pci_dev *pdev,ahci_save_initial_config (&pdev->dev, hpriv); } -static int ahci_pci_reset_controller (struct ata_host *host) -{ -struct pci_dev *pdev =to_pci_dev (host->dev); -int rc; - - rc =ahci_reset_controller (host); -if (rc) -return rc; - -if (pdev->vendor ==PCI_VENDOR_ID_INTEL ) { -struct ahci_host_priv *hpriv = host->private_data; -u16 tmp16; - -/* configure PCS */ -pci_read_config_word (pdev,0x92 , &tmp16); -if ((tmp16 & hpriv->port_map) != hpriv->port_map) { - tmp16 |= hpriv->port_map; -pci_write_config_word (pdev,0x92 , tmp16); - } - } - -return 0 ; -} -static void ahci_pci_init_controller (struct ata_host *host) {struct ahci_host_priv *hpriv = host->private_data;
@@ -849,7 +837,7 @@ static int ahci_pci_device_runtime_resume(struct device *dev)struct ata_host *host =pci_get_drvdata (pdev);int rc; - rc =ahci_pci_reset_controller (host); + rc =ahci_reset_controller (host);if (rc)return rc;ahci_pci_init_controller (host);
@@ -884,7 +872,7 @@ static int ahci_pci_device_resume(struct device *dev)ahci_mcp89_apple_enable (pdev);if (pdev->dev.power.power_state.event ==PM_EVENT_SUSPEND ) { - rc =ahci_pci_reset_controller (host); + rc =ahci_reset_controller (host);if (rc)return rc;
@@ -1619,6 +1607,34 @@ static void ahci_update_initial_lpm_policy(struct ata_port *ap, ap->target_lpm_policy = policy; } +static void ahci_intel_pcs_quirk (struct pci_dev *pdev,struct ahci_host_priv *hpriv) +{ +const struct pci_device_id *id =pci_match_id (ahci_pci_tbl, pdev); +u16 tmp16; + +/* +* Only apply the 6-port PCS quirk for known legacy platforms. +*/ +if (!id || id->vendor !=PCI_VENDOR_ID_INTEL ) +return ; +if (((enum board_ids ) id->driver_data) < board_ahci_pcs7) +return ; + +/* +* port_map is determined from PORTS_IMPL PCI register which is +* implemented as write or write-once register. If the register +* isn't programmed, ahci automatically generates it from number +* of ports, which is good enough for PCS programming. It is +* otherwise expected that platform firmware enables the ports +* before the OS boots. +*/ +pci_read_config_word (pdev,PCS_6 , &tmp16); +if ((tmp16 & hpriv->port_map) != hpriv->port_map) { + tmp16 |= hpriv->port_map; +pci_write_config_word (pdev,PCS_6 , tmp16); + } +} +static int ahci_init_one (struct pci_dev *pdev,const struct pci_device_id *ent) {unsigned int board_id = ent->driver_data;
@@ -1731,6 +1747,12 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)/* save initial config */ ahci_pci_save_initial_config (pdev, hpriv); +/* +* If platform firmware failed to enable ports, try to enable +* them here. +*/ +ahci_intel_pcs_quirk (pdev, hpriv); +/* prepare host */ if (hpriv->cap &HOST_CAP_NCQ ) { pi.flags |=ATA_FLAG_NCQ ;
@@ -1840,7 +1862,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)if (rc)return rc; - rc =ahci_pci_reset_controller (host); + rc =ahci_reset_controller (host);if (rc)return rc;
drivers/ata/ahci.h +2 -0
@@ -247,6 +247,8 @@ enum {ATA_FLAG_ACPI_SATA |ATA_FLAG_AN ,ICH_MAP =0x90 ,/* ICH MAP register */ +PCS_6 =0x92 ,/* 6 port PCS */ +PCS_7 =0x94 ,/* 7+ port PCS (Denverton) */ /* em constants */ EM_MAX_SLOTS = 8,
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 184/344 iommu/iova: Avoid false sharing on fq_timer_on
In reply to Greg Kroah-HartmanFrom: Eric Dumazet <[email protected]>
[ Upstream commit 0d87308cca2c124f9bce02383f1d9632c9be89c4 ]
In commit 14bd9a607f90 ("iommu/iova: Separate atomic variables to improve performance") Jinyu Qi identified that the atomic_cmpxchg() in queue_iova() was causing a performance loss and moved critical fields so that the false sharing would not impact them.
However, avoiding the false sharing in the first place seems easy. We should attempt the atomic_cmpxchg() no more than 100 times per second. Adding an atomic_read() will keep the cache line mostly shared.
This false sharing came with commit 9a005a800ae8
("iommu/iova: Add flush timer").
--- drivers/iommu/iova.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/iommu/iova.c +3 -1
@@ -577,7 +577,9 @@ void queue_iova(struct iova_domain *iovad,spin_unlock_irqrestore (&fq->lock, flags); -if (atomic_cmpxchg (&iovad->fq_timer_on,0 ,1 ) ==0 ) +/* Avoid false sharing as much as possible. */ +if (!atomic_read (&iovad->fq_timer_on) && + !atomic_cmpxchg (&iovad->fq_timer_on,0 ,1 ))mod_timer (&iovad->fq_timer, jiffies +msecs_to_jiffies (IOVA_FQ_TIMEOUT )); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 185/344 libtraceevent: Change users plugin directory
In reply to Greg Kroah-HartmanFrom: Tzvetomir Stoyanov <[email protected]>
[ Upstream commit e97fd1383cd77c467d2aed7fa4e596789df83977 ]
To be compliant with XDG user directory layout, the user's plugin directory is changed from ~/.traceevent/plugins to ~/.local/lib/traceevent/plugins/
--- tools/lib/traceevent/Makefile | 6 +++--- tools/lib/traceevent/event-plugin.c | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-)
tools/lib/traceevent/Makefile +3 -3
@@ -62,15 +62,15 @@ set_plugin_dir := 1 # Set plugin_dir to preffered global plugin location # If we install under $HOME directory we go under -# $(HOME)/.traceevent/plugins +# $(HOME)/.local/lib/traceevent/plugins # # We dont set PLUGIN_DIR in case we install under $HOME # directory, because by default the code looks under: -# $(HOME)/.traceevent/plugins by default. +# $(HOME)/.local/lib/traceevent/plugins by default. # ifeq ($(plugin_dir),) ifeq ($(prefix),$(HOME)) -override plugin_dir = $(HOME)/.traceevent/plugins +override plugin_dir = $(HOME)/.local/lib/traceevent/plugins set_plugin_dir := 0 else override plugin_dir = $(libdir)/traceevent/plugins
tools/lib/traceevent/event-plugin.c +1 -1
@@ -18,7 +18,7 @@#include "event-utils.h" #include "trace-seq.h" -#define LOCAL_PLUGIN_DIR ".traceevent/plugins" +#define LOCAL_PLUGIN_DIR ".local/lib/traceevent/plugins/" static struct registered_plugin_options { struct registered_plugin_options *next;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 186/344 ASoC: dt-bindings: sun4i-spdif: Fix dma-names warning
In reply to Greg Kroah-HartmanFrom: Maxime Ripard <[email protected]>
[ Upstream commit 1a8e7cdfa4f5872bf0c202d09bff6628aba6b9f6 ]
Even though the H6 compatible has been properly added, the exeption for the number of DMA channels hasn't been updated, leading in a validation warning.
Fix this.
--- .../devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
Documentation/devicetree/bindings/sound/allwinner,sun4i-a10-spdif.yaml +3 -1
@@ -70,7 +70,9 @@ allOf: properties: compatible: contains: - const: allwinner,sun8i-h3-spdif + enum: + - allwinner,sun8i-h3-spdif + - allwinner,sun50i-h6-spdif then: properties:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 187/344 ARM: dts: exynos: Mark LDO10 as always-on on Peach Pit/Pi Chromebooks
In reply to Greg Kroah-HartmanFrom: Marek Szyprowski <[email protected]>
[ Upstream commit 5b0eeeaa37615df37a9a30929b73e9defe61ca84 ]
Commit aff138bf8e37 ("ARM: dts: exynos: Add TMU nodes regulator supply for Peach boards") assigned LDO10 to Exynos Thermal Measurement Unit, but it turned out that it supplies also some other critical parts and board freezes/crashes when it is turned off.
The mentioned commit made Exynos TMU a consumer of that regulator and in typical case Exynos TMU driver keeps it enabled from early boot. However there are such configurations (example is multi_v7_defconfig), in which some of the regulators are compiled as modules and are not available from early boot. In such case it may happen that LDO10 is turned off by regulator core, because it has no consumers yet (in this case consumer drivers cannot get it, because the supply regulators for it are not yet available). This in turn causes the board to crash. This patch restores 'always-on' property for the LDO10 regulator.
--- arch/arm/boot/dts/exynos5420-peach-pit.dts | 1 + arch/arm/boot/dts/exynos5800-peach-pi.dts | 1 + 2 files changed, 2 insertions(+)
arch/arm/boot/dts/exynos5420-peach-pit.dts +1 -0
@@ -440,6 +440,7 @@ regulator-name = "vdd_ldo10"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; + regulator-always-on; regulator-state-mem { regulator-off-in-suspend; };
arch/arm/boot/dts/exynos5800-peach-pi.dts +1 -0
@@ -440,6 +440,7 @@ regulator-name = "vdd_ldo10"; regulator-min-microvolt = <1800000>; regulator-max-microvolt = <1800000>; + regulator-always-on; regulator-state-mem { regulator-off-in-suspend; };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 188/344 x86/amd_nb: Add PCI device IDs for family 17h, model 70h
In reply to Greg Kroah-HartmanFrom: Marcel Bocu <[email protected]>
[ Upstream commit af4e1c5eca95bed1192d8dc45c8ed63aea2209e8 ]
The AMD Ryzen gen 3 processors came with a different PCI IDs for the function 3 & 4 which are used to access the SMN interface. The root PCI address however remained at the same address as the model 30h.
Adding the F3/F4 PCI IDs respectively to the misc and link ids appear to be sufficient for k10temp, so let's add them and follow up on the patch if other functions need more tweaking.
Vicki Pfau sent an identical patch after I checked that no-one had written this patch. I would have been happy about dropping my patch but unlike for his patch series, I had already Cc:ed the x86 people and they already reviewed the changes. Since Vicki has not answered to any email after his initial series, let's assume she is on vacation and let's avoid duplication of reviews from the maintainers and merge my series. To acknowledge Vicki's anteriority, I added her S-o-b to the patch.
v2, suggested by Guenter Roeck and Brian Woods:
- rename from 71h to 70h
--- arch/x86/kernel/amd_nb.c | 3 +++ include/linux/pci_ids.h | 1 + 2 files changed, 4 insertions(+)
arch/x86/kernel/amd_nb.c +3 -0
@@ -21,6 +21,7 @@#define PCI_DEVICE_ID_AMD_17H_DF_F4 0x1464#define PCI_DEVICE_ID_AMD_17H_M10H_DF_F4 0x15ec#define PCI_DEVICE_ID_AMD_17H_M30H_DF_F4 0x1494 +#define PCI_DEVICE_ID_AMD_17H_M70H_DF_F4 0x1444/* Protect the PCI config register pairs used for SMN and DF indirect access. */ static DEFINE_MUTEX (smn_mutex);
@@ -50,6 +51,7 @@ const struct pci_device_id amd_nb_misc_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M10H_DF_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M30H_DF_F3) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F3) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M70H_DF_F3) }, {} };EXPORT_SYMBOL_GPL (amd_nb_misc_ids);
@@ -63,6 +65,7 @@ static const struct pci_device_id amd_nb_link_ids[] = { { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M10H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M30H_DF_F4) }, + { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_17H_M70H_DF_F4) }, { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_CNB17H_F4) }, {} };
include/linux/pci_ids.h +1 -0
@@ -548,6 +548,7 @@#define PCI_DEVICE_ID_AMD_17H_DF_F3 0x1463#define PCI_DEVICE_ID_AMD_17H_M10H_DF_F3 0x15eb#define PCI_DEVICE_ID_AMD_17H_M30H_DF_F3 0x1493 +#define PCI_DEVICE_ID_AMD_17H_M70H_DF_F3 0x1443#define PCI_DEVICE_ID_AMD_CNB17H_F3 0x1703#define PCI_DEVICE_ID_AMD_LANCE 0x2000#define PCI_DEVICE_ID_AMD_LANCE_HOME 0x2001
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 189/344 ACPI: custom_method: fix memory leaks
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit 03d1571d9513369c17e6848476763ebbd10ec2cb ]
In cm_write(), 'buf' is allocated through kzalloc(). In the following execution, if an error occurs, 'buf' is not deallocated, leading to memory leaks. To fix this issue, free 'buf' before returning the error.
--- drivers/acpi/custom_method.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/acpi/custom_method.c +4 -1
@@ -49,8 +49,10 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,if ((*ppos > max_size) || (*ppos + count > max_size) || (*ppos + count < count) || - (count > uncopied_bytes)) + (count > uncopied_bytes)) { +kfree (buf);return -EINVAL ; + }if (copy_from_user (buf + (*ppos), user_buf, count)) {kfree (buf);
@@ -70,6 +72,7 @@ static ssize_t cm_write(struct file *file, const char __user * user_buf,add_taint (TAINT_OVERRIDDEN_ACPI_TABLE ,LOCKDEP_NOW_UNRELIABLE ); } +kfree (buf);return count; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 190/344 ACPI / PCI: fix acpi_pci_irq_enable() memory leak
In reply to Greg Kroah-HartmanFrom: Wenwen Wang <[email protected]>
[ Upstream commit 29b49958cf73b439b17fa29e9a25210809a6c01c ]
In acpi_pci_irq_enable(), 'entry' is allocated by kzalloc() in acpi_pci_irq_check_entry() (invoked from acpi_pci_irq_lookup()). However, it is not deallocated if acpi_pci_irq_valid() returns false, leading to a memory leak. To fix this issue, free 'entry' before returning 0.
--- drivers/acpi/pci_irq.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/acpi/pci_irq.c +3 -1
@@ -449,8 +449,10 @@ int acpi_pci_irq_enable(struct pci_dev *dev)* No IRQ known to the ACPI subsystem - maybe the BIOS / * driver reported one, then use it. Exit in any case. */ -if (!acpi_pci_irq_valid (dev, pin)) +if (!acpi_pci_irq_valid (dev, pin)) { +kfree (entry);return 0 ; + }if (acpi_isa_register_gsi (dev)) dev_warn(&dev->dev, "PCI INT %c: no GSI\n",
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 191/344 closures: fix a race on wakeup from closure_sync
In reply to Greg Kroah-HartmanFrom: Kent Overstreet <[email protected]>
[ Upstream commit a22a9602b88fabf10847f238ff81fde5f906fef7 ]
The race was when a thread using closure_sync() notices cl->s->done == 1 before the thread calling closure_put() calls wake_up_process(). Then, it's possible for that thread to return and exit just before wake_up_process() is called - so we're trying to wake up a process that no longer exists.
rcu_read_lock() is sufficient to protect against this, as there's an rcu barrier somewhere in the process teardown path.
--- drivers/md/bcache/closure.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-)
drivers/md/bcache/closure.c +8 -2
@@ -105,8 +105,14 @@ struct closure_syncer {static void closure_sync_fn (struct closure *cl) { - cl->s->done =1 ; -wake_up_process (cl->s->task); +struct closure_syncer *s = cl->s; +struct task_struct *p; + +rcu_read_lock (); + p =READ_ONCE (s->task); + s->done =1 ; +wake_up_process (p); +rcu_read_unlock (); } void __sched __closure_sync(struct closure *cl)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 192/344 hwmon: (k10temp) Add support for AMD family 17h, model 70h CPUs
In reply to Greg Kroah-HartmanFrom: Marcel Bocu <[email protected]>
[ Upstream commit 12163cfbfc0f804cc7d27bc20e8d266ce7459260 ]
It would seem like model 70h is behaving in the same way as model 30h, so let's just add the new F3 PCI ID to the list of compatible devices.
Unlike previous Ryzen/Threadripper, Ryzen gen 3 processors do not need temperature offsets anymore. This has been reported in the press and verified on my Ryzen 3700X by checking that the idle temperature reported by k10temp is matching the temperature reported by the firmware.
Vicki Pfau sent an identical patch after I checked that no-one had written this patch. I would have been happy about dropping my patch but unlike for his patch series, I had already Cc:ed the x86 people and they already reviewed the changes. Since Vicki has not answered to any email after his initial series, let's assume she is on vacation and let's avoid duplication of reviews from the maintainers and merge my series. To acknowledge Vicki's anteriority, I added her S-o-b to the patch.
v2, suggested by Guenter Roeck and Brian Woods:
- rename from 71h to 70h
--- drivers/hwmon/k10temp.c | 1 + 1 file changed, 1 insertion(+)
drivers/hwmon/k10temp.c +1 -0
@@ -349,6 +349,7 @@ static const struct pci_device_id k10temp_id_table[] = { { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_DF_F3) }, { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_M10H_DF_F3) }, { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_M30H_DF_F3) }, + { PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_17H_M70H_DF_F3) }, { PCI_VDEVICE(HYGON, PCI_DEVICE_ID_AMD_17H_DF_F3) }, {} };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 193/344 hwmon: (acpi_power_meter) Change log level for unsafe software power cap
In reply to Greg Kroah-HartmanFrom: Wang Shenran <[email protected]>
[ Upstream commit 6e4d91aa071810deac2cd052161aefb376ecf04e ]
At boot time, the acpi_power_meter driver logs the following error level
message: "Ignoring unsafe software power cap". Having read about it from a few sources, it seems that the error message can be quite misleading.
While the message can imply that Linux is ignoring the fact that the system is operating in potentially dangerous conditions, the truth is the driver found an ACPI_PMC object that supports software power capping. The driver simply decides not to use it, perhaps because it doesn't support the object.
The best solution is probably changing the log level from error to warning. All sources I have found, regarding the error, have downplayed its significance. There is not much of a reason for it to be on error level, while causing potential confusions or misinterpretations.
--- drivers/hwmon/acpi_power_meter.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/hwmon/acpi_power_meter.c +2 -2
@@ -681,8 +681,8 @@ static int setup_attrs(struct acpi_power_meter_resource *resource)if (resource->caps.flags &POWER_METER_CAN_CAP ) {if (!can_cap_in_hardware ()) { -dev_err (&resource->acpi_dev->dev, -"Ignoring unsafe software power cap!\n" ); +dev_warn (&resource->acpi_dev->dev, +"Ignoring unsafe software power cap!\n" ); goto skip_unsafe_cap; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 194/344 md/raid1: fail run raid1 array when active disk less than one
In reply to Greg Kroah-HartmanFrom: Yufen Yu <[email protected]>
[ Upstream commit 07f1a6850c5d5a65c917c3165692b5179ac4cb6b ]
When run test case:
mdadm -CR /dev/md1 -l 1 -n 4 /dev/sd[a-d] --assume-clean --bitmap=internal mdadm -S /dev/md1
mdadm -A /dev/md1 /dev/sd[b-c] --run --force
mdadm --zero /dev/sda mdadm /dev/md1 -a /dev/sda
echo offline > /sys/block/sdc/device/state
echo offline > /sys/block/sdb/device/state
sleep 5
mdadm -S /dev/md1
echo running > /sys/block/sdb/device/state echo running > /sys/block/sdc/device/state mdadm -A /dev/md1 /dev/sd[a-c] --run --force
mdadm run fail with kernel message as follow:
[ 172.986064] md: kicking non-fresh sdb from array! [ 173.004210] md: kicking non-fresh sdc from array! [ 173.022383] md/raid1:md1: active with 0 out of 4 mirrors [ 173.022406] md1: failed to create bitmap (-5)
In fact, when active disk in raid1 array less than one, we need to return fail in raid1_run().
--- drivers/md/raid1.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
drivers/md/raid1.c +12 -1
@@ -3129,6 +3129,13 @@ static int raid1_run(struct mddev *mddev) !test_bit (In_sync, &conf->mirrors[i].rdev->flags) || test_bit(Faulty, &conf->mirrors[i].rdev->flags)) mddev->degraded++; +/* +* RAID1 needs at least one disk in active +*/ +if (conf->raid_disks - mddev->degraded <1 ) { + ret = -EINVAL ; + goto abort; + }if (conf->raid_disks - mddev->degraded ==1 ) mddev->recovery_cp = MaxSector;
@@ -3162,8 +3169,12 @@ static int raid1_run(struct mddev *mddev) ret =md_integrity_register (mddev);if (ret) {md_unregister_thread (&mddev->thread); -raid1_free (mddev, conf); + goto abort; } +return 0 ; + +abort: +raid1_free (mddev, conf);return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 195/344 dmaengine: ti: edma: Do not reset reserved paRAM slots
In reply to Greg Kroah-HartmanFrom: Peter Ujfalusi <[email protected]>
[ Upstream commit c5dbe60664b3660f5ac5854e21273ea2e7ff698f ]
Skip resetting paRAM slots marked as reserved as they might be used by other cores.
--- drivers/dma/ti/edma.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/dma/ti/edma.c +6 -3
@@ -2273,9 +2273,6 @@ static int edma_probe(struct platform_device *pdev) ecc->default_queue = info->default_queue; -for (i =0 ; i < ecc->num_slots; i++) -edma_write_slot (ecc, i, &dummy_paramset); -if (info->rsv) {/* Set the reserved slots in inuse list */ rsv_slots = info->rsv->rsv_slots;
@@ -2288,6 +2285,12 @@ static int edma_probe(struct platform_device *pdev) } } +for (i =0 ; i < ecc->num_slots; i++) { +/* Reset only unused - not reserved - paRAM slots */ +if (!test_bit (i, ecc->slot_inuse)) +edma_write_slot (ecc, i, &dummy_paramset); + } +/* Clear the xbar mapped channels in unused list */ xbar_chans = info->xbar_chans;if (xbar_chans) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 196/344 kprobes: Prohibit probing on BUG() and WARN() address
In reply to Greg Kroah-HartmanFrom: Masami Hiramatsu <[email protected]>
[ Upstream commit e336b4027775cb458dc713745e526fa1a1996b2a ]
Since BUG() and WARN() may use a trap (e.g. UD2 on x86) to get the address where the BUG() has occurred, kprobes can not do single-step out-of-line that instruction. So prohibit probing on such address.
Without this fix, if someone put a kprobe on WARN(), the kernel will crash with invalid opcode error instead of outputing warning message, because kernel can not find correct bug address.
--- include/linux/bug.h | 5 +++++ kernel/kprobes.c | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-)
include/linux/bug.h +5 -0
@@ -47,6 +47,11 @@ void generic_bug_clear_once(void);#else /* !CONFIG_GENERIC_BUG */ +static inline void *find_bug (unsigned long bugaddr) +{ +return NULL ; +} +static inline enum bug_trap_type report_bug (unsigned long bug_addr,struct pt_regs *regs) {
kernel/kprobes.c +2 -1
@@ -1514,7 +1514,8 @@ static int check_kprobe_address_safe(struct kprobe *p,/* Ensure it is not in reserved area nor out of text */ if (!kernel_text_address ((unsigned long ) p->addr) ||within_kprobe_blacklist ((unsigned long ) p->addr) || -jump_label_text_reserved (p->addr, p->addr)) { +jump_label_text_reserved (p->addr, p->addr) || +find_bug ((unsigned long )p->addr)) { ret = -EINVAL ; goto out; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 197/344 x86/mm: Fix cpumask_of_node() error condition
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit bc04a049f058a472695aa22905d57e2b1f4c77d9 ]
When CONFIG_DEBUG_PER_CPU_MAPS=y we validate that the @node argument of cpumask_of_node() is a valid node_id. It however forgets to check for negative numbers. Fix this by explicitly casting to unsigned int.
(unsigned)node >= nr_node_ids
verifies: 0 <= node < nr_node_ids
Also ammend the error message to match the condition.
--- arch/x86/mm/numa.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/x86/mm/numa.c +2 -2
@@ -861,9 +861,9 @@ void numa_remove_cpu(int cpu)*/ const struct cpumask *cpumask_of_node (int node) { -if (node >= nr_node_ids) { +if ((unsigned )node >= nr_node_ids) {printk (KERN_WARNING -"cpumask_of_node(%d): node > nr_node_ids(%u)\n" , +"cpumask_of_node(%d): (unsigned)node >= nr_node_ids(%u)\n" , node, nr_node_ids);dump_stack ();return cpu_none_mask;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 198/344 irqchip/sifive-plic: set max threshold for ignored handlers
In reply to Greg Kroah-HartmanFrom: Christoph Hellwig <[email protected]>
[ Upstream commit 9ce06497c2722a0f9109e4cc3ce35b7a69617886 ]
When running in M-mode, the S-mode plic handlers are still listed in the device tree. Ignore them by setting the maximum threshold.
--- drivers/irqchip/irq-sifive-plic.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
drivers/irqchip/irq-sifive-plic.c +10 -2
@@ -244,6 +244,7 @@ static int __init plic_init(struct device_node *node,struct plic_handler *handler;irq_hw_number_t hwirq;int cpu, hartid; +u32 threshold =0 ;if (of_irq_parse_one (node, i, &parent)) {pr_err ("failed to parse parent for context %d.\n" , i);
@@ -266,10 +267,16 @@ static int __init plic_init(struct device_node *node,continue ; } +/* +* When running in M-mode we need to ignore the S-mode handler. +* Here we assume it always comes later, but that might be a +* little fragile. +*/ handler =per_cpu_ptr (&plic_handlers, cpu);if (handler->present) {pr_warn ("handler already present for context %d.\n" , i); -continue ; + threshold =0xffffffff ; + goto done; } handler->present = true;
@@ -279,8 +286,9 @@ static int __init plic_init(struct device_node *node, handler->enable_base = plic_regs +ENABLE_BASE + i *ENABLE_PER_HART ; +done:/* priority must be > threshold to trigger an interrupt */ -writel (0 , handler->hart_base +CONTEXT_THRESHOLD ); +writel (threshold, handler->hart_base +CONTEXT_THRESHOLD );for (hwirq =1 ; hwirq <= nr_irqs; hwirq++)plic_toggle (handler, hwirq,0 ); nr_handlers++;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 199/344 s390/crypto: xts-aes-s390 fix extra run-time crypto self tests finding
In reply to Greg Kroah-HartmanFrom: Harald Freudenberger <[email protected]>
[ Upstream commit 9e323d45ba94262620a073a3f9945ca927c07c71 ]
With 'extra run-time crypto self tests' enabled, the selftest for s390-xts fails with
alg: skcipher: xts-aes-s390 encryption unexpectedly succeeded on test vector "random: len=0 klen=64"; expected_error=-22, cfg="random: inplace use_digest nosimd src_divs=[2.61%@+4006, 84.44%@+21, 1.55%@+13, 4.50%@+344, 4.26%@+21, 2.64%@+27]"
This special case with nbytes=0 is not handled correctly and this fix now makes sure that -EINVAL is returned when there is en/decrypt called with 0 bytes to en/decrypt.
--- arch/s390/crypto/aes_s390.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/s390/crypto/aes_s390.c +6 -0
@@ -586,6 +586,9 @@ static int xts_aes_encrypt(struct blkcipher_desc *desc,struct s390_xts_ctx *xts_ctx =crypto_blkcipher_ctx (desc->tfm);struct blkcipher_walk walk; +if (!nbytes) +return -EINVAL ; +if (unlikely (!xts_ctx->fc))return xts_fallback_encrypt (desc, dst, src, nbytes);
@@ -600,6 +603,9 @@ static int xts_aes_decrypt(struct blkcipher_desc *desc,struct s390_xts_ctx *xts_ctx =crypto_blkcipher_ctx (desc->tfm);struct blkcipher_walk walk; +if (!nbytes) +return -EINVAL ; +if (unlikely (!xts_ctx->fc))return xts_fallback_decrypt (desc, dst, src, nbytes);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 200/344 irqchip/gic-v3-its: Fix LPI release for Multi-MSI devices
In reply to Greg Kroah-HartmanFrom: Marc Zyngier <[email protected]>
[ Upstream commit c9c96e30ecaa0aafa225aa1a5392cb7db17c7a82 ]
When allocating a range of LPIs for a Multi-MSI capable device, this allocation extended to the closest power of 2.
But on the release path, the interrupts are released one by one. This results in not releasing the "extra" range, leaking the its_device. Trying to reprobe the device will then fail.
Fix it by releasing the LPIs the same way we allocate them.
--- drivers/irqchip/irq-gic-v3-its.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-)
drivers/irqchip/irq-gic-v3-its.c +4 -5
@@ -2641,14 +2641,13 @@ static void its_irq_domain_free(struct irq_domain *domain, unsigned int virq,struct its_node *its = its_dev->its;int i; +bitmap_release_region (its_dev->event_map.lpi_map, +its_get_event_id (irq_domain_get_irq_data (domain, virq)), +get_count_order (nr_irqs)); +for (i =0 ; i < nr_irqs; i++) {struct irq_data *data =irq_domain_get_irq_data (domain, virq + i); -u32 event =its_get_event_id (data); - -/* Mark interrupt index as unused */ -clear_bit (event, its_dev->event_map.lpi_map); -/* Nuke the entry in the domain */ irq_domain_reset_irq_data (data); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 201/344 x86/cpu: Add Tiger Lake to Intel family
In reply to Greg Kroah-HartmanFrom: Gayatri Kammela <[email protected]>
[ Upstream commit 6e1c32c5dbb4b90eea8f964c2869d0bde050dbe0 ]
Add the model numbers/CPUIDs of Tiger Lake mobile and desktop to the Intel family.
--- arch/x86/include/asm/intel-family.h | 3 +++ 1 file changed, 3 insertions(+)
arch/x86/include/asm/intel-family.h +3 -0
@@ -73,6 +73,9 @@#define INTEL_FAM6_ICELAKE_MOBILE 0x7E#define INTEL_FAM6_ICELAKE_NNPI 0x9D +#define INTEL_FAM6_TIGERLAKE_L 0x8C +#define INTEL_FAM6_TIGERLAKE 0x8D +/* "Small Core" Processors (Atom) */ #define INTEL_FAM6_ATOM_BONNELL 0x1C/* Diamondville, Pineview */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 202/344 platform/x86: intel_pmc_core: Do not ioremap RAM
In reply to Greg Kroah-HartmanFrom: M. Vefa Bicakci <[email protected]>
[ Upstream commit 7d505758b1e556cdf65a5e451744fe0ae8063d17 ]
On a Xen-based PVH virtual machine with more than 4 GiB of RAM, intel_pmc_core fails initialization with the following warning message from the kernel, indicating that the driver is attempting to ioremap RAM:
ioremap on RAM at 0x00000000fe000000 - 0x00000000fe001fff
WARNING: CPU: 1 PID: 434 at arch/x86/mm/ioremap.c:186 __ioremap_caller.constprop.0+0x2aa/0x2c0 ... Call Trace: ? pmc_core_probe+0x87/0x2d0 [intel_pmc_core] pmc_core_probe+0x87/0x2d0 [intel_pmc_core]
This issue appears to manifest itself because of the following fallback mechanism in the driver:
if (lpit_read_residency_count_address(&slp_s0_addr)) pmcdev->base_addr = PMC_BASE_ADDR_DEFAULT;
The validity of address PMC_BASE_ADDR_DEFAULT (i.e., 0xFE000000) is not verified by the driver, which is what this patch introduces. With this patch, if address PMC_BASE_ADDR_DEFAULT is in RAM, then the driver will not attempt to ioremap the aforementioned address.
--- drivers/platform/x86/intel_pmc_core.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)
drivers/platform/x86/intel_pmc_core.c +6 -2
@@ -878,10 +878,14 @@ static int pmc_core_probe(struct platform_device *pdev)if (pmcdev->map == &spt_reg_map && !pci_dev_present (pmc_pci_ids)) pmcdev->map = &cnp_reg_map; -if (lpit_read_residency_count_address (&slp_s0_addr)) +if (lpit_read_residency_count_address (&slp_s0_addr)) { pmcdev->base_addr =PMC_BASE_ADDR_DEFAULT ; -else + +if (page_is_ram (PHYS_PFN (pmcdev->base_addr))) +return -ENODEV ; + }else { pmcdev->base_addr = slp_s0_addr - pmcdev->map->slp_s0_offset; + } pmcdev->regbase =ioremap (pmcdev->base_addr, pmcdev->map->regmap_length);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 203/344 platform/x86: intel_pmc_core_pltdrv: Module removal warning fix
In reply to Greg Kroah-HartmanFrom: M. Vefa Bicakci <[email protected]>
[ Upstream commit 0b43e41e93815ecd9616759cf5d64d3a7be8e6fb ]
Prior to this commit, removing the intel_pmc_core_pltdrv module would cause the following warning:
Device 'intel_pmc_core.0' does not have a release() function, it is broken and must be fixed. See Documentation/kobject.txt.
WARNING: CPU: 0 PID: 2202 at drivers/base/core.c:1238 device_release+0x6f/0x80
This commit hence adds an empty release function for the driver.
--- drivers/platform/x86/intel_pmc_core_pltdrv.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/platform/x86/intel_pmc_core_pltdrv.c +8 -0
@@ -18,8 +18,16 @@#include <asm/cpu_device_id.h> #include <asm/intel-family.h> +static void intel_pmc_core_release (struct device *dev) +{ +/* Nothing to do. */ +} +static struct platform_device pmc_core_device = { .name ="intel_pmc_core" , + .dev = { + .release = intel_pmc_core_release, + }, };/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 204/344 SoC: simple-card-utils: set 0Hz to sysclk when shutdown
In reply to Greg Kroah-HartmanFrom: Katsuhiro Suzuki <[email protected]>
[ Upstream commit 2458adb8f92ad4d07ef7ab27c5bafa1d3f4678d6 ]
This patch set 0Hz to sysclk when shutdown the card.
Some codecs set rate constraints that derives from sysclk. This mechanism works correctly if machine drivers give fixed frequency.
But simple-audio and audio-graph card set variable clock rate if 'mclk-fs' property exists. In this case, rate constraints will go bad scenario. For example a codec accepts three limited rates (mclk / 256, mclk / 384, mclk / 512).
Bad scenario as follows (mclk-fs = 256):
- Initialize sysclk by correct value (Ex. 12.288MHz)
- Codec set constraints of PCM rate by sysclk 48kHz (1/256), 32kHz (1/384), 24kHz (1/512)
- Play 48kHz sound, it's acceptable
- Sysclk is not changed
- Play 32kHz sound, it's acceptable
- Set sysclk to 8.192MHz (= fs * mclk-fs = 32k * 256)
- Codec set constraints of PCM rate by sysclk 32kHz (1/256), 21.33kHz (1/384), 16kHz (1/512)
- Play 48kHz again, but it's NOT acceptable because constraints do not allow 48kHz
So codecs treat 0Hz sysclk as signal of applying no constraints to avoid this problem.
--- sound/soc/generic/simple-card-utils.c | 7 +++++++ 1 file changed, 7 insertions(+)
sound/soc/generic/simple-card-utils.c +7 -0
@@ -213,10 +213,17 @@ EXPORT_SYMBOL_GPL(asoc_simple_startup);void asoc_simple_shutdown (struct snd_pcm_substream *substream) {struct snd_soc_pcm_runtime *rtd = substream->private_data; +struct snd_soc_dai *codec_dai = rtd->codec_dai; +struct snd_soc_dai *cpu_dai = rtd->cpu_dai;struct asoc_simple_priv *priv =snd_soc_card_get_drvdata (rtd->card);struct simple_dai_props *dai_props =simple_priv_to_props (priv, rtd->num); +if (dai_props->mclk_fs) { +snd_soc_dai_set_sysclk (codec_dai,0 ,0 ,SND_SOC_CLOCK_IN ); +snd_soc_dai_set_sysclk (cpu_dai,0 ,0 ,SND_SOC_CLOCK_OUT ); + } +asoc_simple_clk_disable (dai_props->cpu_dai);asoc_simple_clk_disable (dai_props->codec_dai);
Signature · 1 line
2.20.1
Re: [PATCH 5.3 204/344] SoC: simple-card-utils: set 0Hz to sysclk when shutdown
Quoted 6 lines · Greg Kroah-Hartman
From: Katsuhiro Suzuki <[email protected]>
[ Upstream commit
2458adb8f92ad4d07ef7ab27c5bafa1d3f4678d6]This patch set 0Hz to sysclk when shutdown the card.
Quoted 7 lines
Some codecs set rate constraints that derives from sysclk. This mechanism works correctly if machine drivers give fixed frequency.
But simple-audio and audio-graph card set variable clock rate if 'mclk-fs' property exists. In this case, rate constraints will go bad scenario. For example a codec accepts three limited rates (mclk / 256, mclk / 384, mclk / 512).
This is a new feature which seems out of scope for stable - I thought I'd raised this already?
Re: [PATCH 5.3 204/344] SoC: simple-card-utils: set 0Hz to sysclk when shutdown
Quoted 7 lines · Mark Brown
Quoted 2 lines · Greg Kroah-Hartman
Some codecs set rate constraints that derives from sysclk. This mechanism works correctly if machine drivers give fixed frequency.
This is a new feature which seems out of scope for stable - I thought I'd raised this already?
No, I didn't sorry - that was a similar patch in a device driver that I'd flagged (and has been correctly dropped).
Greg Kroah-Hartman
maintainerRe: [PATCH 5.3 204/344] SoC: simple-card-utils: set 0Hz to sysclk when shutdown
Quoted 11 lines · Mark Brown
Quoted 7 lines · Mark Brown
Quoted 2 lines · Greg Kroah-Hartman
Some codecs set rate constraints that derives from sysclk. This mechanism works correctly if machine drivers give fixed frequency.
This is a new feature which seems out of scope for stable - I thought I'd raised this already?
No, I didn't sorry - that was a similar patch in a device driver that I'd flagged (and has been correctly dropped).
Now dropped from here and 5.2.y, thansk!
greg k-h
Greg Kroah-Hartman
maintainerPATCH 205/344 ASoC: dmaengine: Make the pcm->name equal to pcm->id if the name is not set
In reply to Greg Kroah-HartmanFrom: Peter Ujfalusi <[email protected]>
[ Upstream commit 2ec42f3147e1610716f184b02e65d7f493eed925 ]
Some tools use the snd_pcm_info_get_name() to try to identify PCMs or for other purposes.
Currently it is left empty with the dmaengine-pcm, in this case copy the pcm->id string as pcm->name.
For example IGT is using this to find the HDMI PCM for testing audio on it.
--- sound/soc/soc-generic-dmaengine-pcm.c | 6 ++++++ 1 file changed, 6 insertions(+)
sound/soc/soc-generic-dmaengine-pcm.c +6 -0
@@ -306,6 +306,12 @@ static int dmaengine_pcm_new(struct snd_soc_pcm_runtime *rtd)if (!dmaengine_pcm_can_report_residue (dev, pcm->chan[i])) pcm->flags |=SND_DMAENGINE_PCM_FLAG_NO_RESIDUE ; + +if (rtd->pcm->streams[i].pcm->name[0 ] =='\0' ) { +strncpy (rtd->pcm->streams[i].pcm->name, + rtd->pcm->streams[i].pcm->id, +sizeof (rtd->pcm->streams[i].pcm->name)); + } }return 0 ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 206/344 tools/power/x86/intel-speed-select: Fix memory leak
In reply to Greg Kroah-HartmanFrom: Prarit Bhargava <[email protected]>
[ Upstream commit 3bc3d30ca324bfc3045a1a7fe1f5fe5ad5d92fd9 ]
cpumasks are allocated by calling the alloc_cpu_mask() function and are never free'd. They should be free'd after the commands have run.
Fix the memory leaks by calling free_cpu_set().
--- tools/power/x86/intel-speed-select/isst-config.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-)
tools/power/x86/intel-speed-select/isst-config.c +11 -5
@@ -603,6 +603,10 @@ static int isst_fill_platform_info(void)close (fd); +if (isst_platform_info.api_version > supported_api_ver) { +printf ("Incompatible API versions; Upgrade of tool is required\n" ); +return -1 ; + }return 0 ; }
@@ -1529,6 +1533,7 @@ static void cmdline(int argc, char **argv) {int opt;int option_index =0 ; +int ret;static struct option long_options[] = { {"cpu" , required_argument,0 ,'c' },
@@ -1590,13 +1595,14 @@ static void cmdline(int argc, char **argv)set_max_cpu_num ();set_cpu_present_cpu_mask ();set_cpu_target_cpu_mask (); -isst_fill_platform_info (); -if (isst_platform_info.api_version > supported_api_ver) { -printf ("Incompatible API versions; Upgrade of tool is required\n" ); -exit (0 ); - } + ret =isst_fill_platform_info (); +if (ret) + goto out;process_command (argc, argv); +out: +free_cpu_set (present_cpumask); +free_cpu_set (target_cpumask); }int main (int argc,char **argv)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 207/344 spi: bcm2835: Work around DONE bit erratum
In reply to Greg Kroah-HartmanFrom: Lukas Wunner <[email protected]>
[ Upstream commit 4c524191c0a21d758b519087c64f84348095e940 ]
Commit 3bd7f6589f67 ("spi: bcm2835: Overcome sglist entry length limitation") amended the BCM2835 SPI driver with support for DMA transfers whose buffers are not aligned to 4 bytes and require more than one sglist entry.
When testing this feature with upcoming commits to speed up TX-only and RX-only transfers, I noticed that SPI transmission sometimes breaks. A function introduced by the commit, bcm2835_spi_transfer_prologue(), performs one or two PIO transmissions as a prologue to the actual DMA transmission. It turns out that the breakage goes away if the DONE bit in the CS register is set when ending such a PIO transmission.
The DONE bit signifies emptiness of the TX FIFO. According to the spec, the bit is of type RO, so writing it should never have any effect. Perhaps the spec is wrong and the bit is actually of type RW1C. E.g. the I2C controller on the BCM2835 does have an RW1C DONE bit which needs to be cleared by the driver. Another, possibly more likely explanation is that it's a hardware erratum since the issue does not occur consistently.
Either way, amend bcm2835_spi_transfer_prologue() to always write the DONE bit.
Usually a transmission is ended by bcm2835_spi_reset_hw(). If the transmission was successful, the TX FIFO is empty and thus the DONE bit is set when bcm2835_spi_reset_hw() reads the CS register. The bit is then written back to the register, so we happen to do the right thing.
However if DONE is not set, e.g. because transmission is aborted with a non-empty TX FIFO, the bit won't be written by bcm2835_spi_reset_hw() and it seems possible that transmission might subsequently break. To be on the safe side, likewise amend bcm2835_spi_reset_hw() to always write the bit.
--- drivers/spi/spi-bcm2835.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-)
drivers/spi/spi-bcm2835.c +12 -2
@@ -319,6 +319,13 @@ static void bcm2835_spi_reset_hw(struct spi_controller *ctlr)BCM2835_SPI_CS_INTD |BCM2835_SPI_CS_DMAEN | BCM2835_SPI_CS_TA); +/* +* Transmission sometimes breaks unless the DONE bit is written at the +* end of every transfer. The spec says it's a RO bit. Either the +* spec is wrong and the bit is actually of type RW1C, or it's a +* hardware erratum. +*/ + cs |=BCM2835_SPI_CS_DONE ;/* and reset RX/TX FIFOS */ cs |=BCM2835_SPI_CS_CLEAR_RX |BCM2835_SPI_CS_CLEAR_TX ;
@@ -477,7 +484,9 @@ static void bcm2835_spi_transfer_prologue(struct spi_controller *ctlr,bcm2835_wr_fifo_count (bs, bs->rx_prologue);bcm2835_wait_tx_fifo_empty (bs);bcm2835_rd_fifo_count (bs, bs->rx_prologue); -bcm2835_spi_reset_hw (ctlr); +bcm2835_wr (bs,BCM2835_SPI_CS , cs |BCM2835_SPI_CS_CLEAR_RX + |BCM2835_SPI_CS_CLEAR_TX + |BCM2835_SPI_CS_DONE ); dma_sync_single_for_device(ctlr->dma_rx->device->dev, sg_dma_address(&tfr->rx_sg.sgl[0]),
@@ -498,7 +507,8 @@ static void bcm2835_spi_transfer_prologue(struct spi_controller *ctlr, | BCM2835_SPI_CS_DMAEN);bcm2835_wr_fifo_count (bs, tx_remaining);bcm2835_wait_tx_fifo_empty (bs); -bcm2835_wr (bs,BCM2835_SPI_CS , cs |BCM2835_SPI_CS_CLEAR_TX ); +bcm2835_wr (bs,BCM2835_SPI_CS , cs |BCM2835_SPI_CS_CLEAR_TX + |BCM2835_SPI_CS_DONE ); }if (likely (!bs->tx_spillover)) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 208/344 io_uring: fix wrong sequence setting logic
In reply to Greg Kroah-HartmanFrom: Jackie Liu <[email protected]>
[ Upstream commit 8776f3fa15a5cd213c4dfab7ddaf557983374ea6 ]
Sqo_thread will get sqring in batches, which will cause ctx->cached_sq_head to be added in batches. if one of these sqes is set with the DRAIN flag, then he will never get a chance to process, and finally sqo_thread will not exit.
--- fs/io_uring.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/io_uring.c +3 -1
@@ -288,6 +288,7 @@ struct io_ring_ctx {struct sqe_submit {const struct io_uring_sqe *sqe;unsigned short index; +u32 sequence;bool has_user;bool needs_lock;bool needs_fixed_file;
@@ -2040,7 +2041,7 @@ static int io_req_set_file(struct io_ring_ctx *ctx, const struct sqe_submit *s,if (flags &IOSQE_IO_DRAIN ) { req->flags |=REQ_F_IO_DRAIN ; - req->sequence = ctx->cached_sq_head -1 ; + req->sequence = s->sequence; }if (!io_op_needs_file (s->sqe))
@@ -2247,6 +2248,7 @@ static bool io_get_sqring(struct io_ring_ctx *ctx, struct sqe_submit *s)if (head < ctx->sq_entries) { s->index = head; s->sqe = &ctx->sq_sqes[head]; + s->sequence = ctx->cached_sq_head; ctx->cached_sq_head++;return true; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 209/344 block: make rq sector size accessible for block stats
In reply to Greg Kroah-HartmanFrom: Hou Tao <[email protected]>
[ Upstream commit 3d24430694077313c75c6b89f618db09943621e4 ]
Currently rq->data_len will be decreased by partial completion or zeroed by completion, so when blk_stat_add() is invoked, data_len will be zero and there will never be samples in poll_cb because blk_mq_poll_stats_bkt() will return -1 if data_len is zero.
We could move blk_stat_add() back to __blk_mq_complete_request(), but that would make the effort of trying to call ktime_get_ns() once in vain. Instead we can reuse throtl_size field, and use it for both block stats and block throttle, and adjust the logic in blk_mq_poll_stats_bkt() accordingly.
--- block/blk-mq.c | 11 +++++------ block/blk-throttle.c | 3 ++- include/linux/blkdev.h | 15 ++++++++++++--- 3 files changed, 19 insertions(+), 10 deletions(-)
block/blk-mq.c +5 -6
@@ -44,12 +44,12 @@ static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb);static int blk_mq_poll_stats_bkt (const struct request *rq) { -int ddir, bytes, bucket; +int ddir, sectors, bucket; ddir =rq_data_dir (rq); - bytes =blk_rq_bytes (rq); + sectors =blk_rq_stats_sectors (rq); - bucket = ddir +2 *(ilog2 (bytes) -9 ); + bucket = ddir +2 *ilog2 (sectors);if (bucket <0 )return -1 ;
@@ -330,6 +330,7 @@ static struct request *blk_mq_rq_ctx_init(struct blk_mq_alloc_data *data,else rq->start_time_ns =0 ; rq->io_start_time_ns =0 ; + rq->stats_sectors =0 ; rq->nr_phys_segments =0 ;#if defined(CONFIG_BLK_DEV_INTEGRITY ) rq->nr_integrity_segments =0 ;
@@ -673,9 +674,7 @@ void blk_mq_start_request(struct request *rq)if (test_bit (QUEUE_FLAG_STATS , &q->queue_flags)) { rq->io_start_time_ns =ktime_get_ns (); -#ifdef CONFIG_BLK_DEV_THROTTLING_LOW - rq->throtl_size =blk_rq_sectors (rq); -#endif + rq->stats_sectors =blk_rq_sectors (rq); rq->rq_flags |=RQF_STATS ;rq_qos_issue (q, rq); }
block/blk-throttle.c +2 -1
@@ -2246,7 +2246,8 @@ void blk_throtl_stat_add(struct request *rq, u64 time_ns)struct request_queue *q = rq->q;struct throtl_data *td = q->td; -throtl_track_latency (td, rq->throtl_size,req_op (rq), time_ns >>10 ); +throtl_track_latency (td,blk_rq_stats_sectors (rq),req_op (rq), + time_ns >>10 ); }void blk_throtl_bio_endio (struct bio *bio)
include/linux/blkdev.h +12 -3
@@ -202,9 +202,12 @@ struct request {#ifdef CONFIG_BLK_WBT unsigned short wbt_flags;#endif -#ifdef CONFIG_BLK_DEV_THROTTLING_LOW -unsigned short throtl_size; -#endif +/* +* rq sectors used for blk stats. It has the same value +* with blk_rq_sectors(rq), except that it never be zeroed +* by completion. +*/ +unsigned short stats_sectors;/* * Number of scatter-gather DMA addr+len pairs after
@@ -903,6 +906,7 @@ static inline struct request_queue *bdev_get_queue(struct block_device *bdev)* blk_rq_err_bytes() : bytes left till the next error boundary * blk_rq_sectors() : sectors left in the entire request * blk_rq_cur_sectors() : sectors left in the current segment +* blk_rq_stats_sectors() : sectors of the entire request used for stats */ static inline sector_t blk_rq_pos (const struct request *rq) {
@@ -931,6 +935,11 @@ static inline unsigned int blk_rq_cur_sectors(const struct request *rq)return blk_rq_cur_bytes (rq) >>SECTOR_SHIFT ; } +static inline unsigned int blk_rq_stats_sectors (const struct request *rq) +{ +return rq->stats_sectors; +} +#ifdef CONFIG_BLK_DEV_ZONED static inline unsigned int blk_rq_zone_no (struct request *rq) {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 210/344 raid5: dont set STRIPE_HANDLE to stripe which is in batch list
In reply to Greg Kroah-HartmanFrom: Guoqing Jiang <[email protected]>
[ Upstream commit 6ce220dd2f8ea71d6afc29b9a7524c12e39f374a ]
If stripe in batch list is set with STRIPE_HANDLE flag, then the stripe could be set with STRIPE_ACTIVE by the handle_stripe function. And if error happens to the batch_head at the same time, break_stripe_batch_list is called, then below warning could happen (the same report in [1]), it means a member of batch list was set with STRIPE_ACTIVE.
[7028915.431770] stripe state: 2001 [7028915.431815] ------------[ cut here ]------------ [7028915.431828] WARNING: CPU: 18 PID: 29089 at drivers/md/raid5.c:4614 break_stripe_batch_list+0x203/0x240 [raid456] [...] [7028915.431879] CPU: 18 PID: 29089 Comm: kworker/u82:5 Tainted: G O 4.14.86-1-storage #4.14.86-1.2~deb9 [7028915.431881] Hardware name: Supermicro SSG-2028R-ACR24L/X10DRH-iT, BIOS 3.1 06/18/2018 [7028915.431888] Workqueue: raid5wq raid5_do_work [raid456] [7028915.431890] task: ffff9ab0ef36d7c0 task.stack: ffffb72926f84000 [7028915.431896] RIP: 0010:break_stripe_batch_list+0x203/0x240 [raid456] [7028915.431898] RSP: 0018:ffffb72926f87ba8 EFLAGS: 00010286 [7028915.431900] RAX: 0000000000000012 RBX: ffff9aaa84a98000 RCX: 0000000000000000 [7028915.431901] RDX: 0000000000000000 RSI: ffff9ab2bfa15458 RDI: ffff9ab2bfa15458 [7028915.431902] RBP: ffff9aaa8fb4e900 R08: 0000000000000001 R09: 0000000000002eb4 [7028915.431903] R10: 00000000ffffffff R11: 0000000000000000 R12: ffff9ab1736f1b00 [7028915.431904] R13: 0000000000000000 R14: ffff9aaa8fb4e900 R15: 0000000000000001 [7028915.431906] FS: 0000000000000000(0000) GS:ffff9ab2bfa00000(0000) knlGS:0000000000000000 [7028915.431907] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [7028915.431908] CR2: 00007ff953b9f5d8 CR3: 0000000bf4009002 CR4: 00000000003606e0 [7028915.431909] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 [7028915.431910] DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 [7028915.431910] Call Trace: [7028915.431923] handle_stripe+0x8e7/0x2020 [raid456] [7028915.431930] ? __wake_up_common_lock+0x89/0xc0 [7028915.431935] handle_active_stripes.isra.58+0x35f/0x560 [raid456] [7028915.431939] raid5_do_work+0xc6/0x1f0 [raid456]
Also commit 59fc630b8b5f9f ("RAID5: batch adjacent full stripe write") said "If a stripe is added to batch list, then only the first stripe of the list should be put to handle_list and run handle_stripe."
So don't set STRIPE_HANDLE to stripe which is already in batch list, otherwise the stripe could be put to handle_list and run handle_stripe, then the above warning could be triggered.
[1]. https://www.spinics.net/lists/raid/msg62552.html
--- drivers/md/raid5.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/raid5.c +2 -1
@@ -5718,7 +5718,8 @@ static bool raid5_make_request(struct mddev *mddev, struct bio * bi) do_flush = false; } -set_bit (STRIPE_HANDLE , &sh->state); +if (!sh->batch_head) +set_bit (STRIPE_HANDLE , &sh->state);clear_bit (STRIPE_DELAYED , &sh->state); if ((!sh->batch_head || sh == sh->batch_head) && (bi->bi_opf & REQ_SYNC) &&
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 211/344 mmc: core: Clarify sdio_irq_pending flag for MMC_CAP2_SDIO_IRQ_NOTHREAD
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
[ Upstream commit 36d57efb4af534dd6b442ea0b9a04aa6dfa37abe ]
The sdio_irq_pending flag is used to let host drivers indicate that it has signaled an IRQ. If that is the case and we only have a single SDIO func that have claimed an SDIO IRQ, our assumption is that we can avoid reading the SDIO_CCCR_INTx register and just call the SDIO func irq handler immediately. This makes sense, but the flag is set/cleared in a somewhat messy order, let's fix that up according to below.
First, the flag is currently set in sdio_run_irqs(), which is executed as a work that was scheduled from sdio_signal_irq(). To make it more implicit that the host have signaled an IRQ, let's instead immediately set the flag in sdio_signal_irq(). This also makes the behavior consistent with host drivers that uses the legacy, mmc_signal_sdio_irq() API. This have no functional impact, because we don't expect host drivers to call sdio_signal_irq() until after the work (sdio_run_irqs()) have been executed anyways.
Second, currently we never clears the flag when using the sdio_run_irqs() work, but only when using the sdio_irq_thread(). Let make the behavior consistent, by moving the flag to be cleared inside the common process_sdio_pending_irqs() function. Additionally, tweak the behavior of the flag slightly, by avoiding to clear it unless we processed the SDIO IRQ. The purpose with this at this point, is to keep the information about whether there have been an SDIO IRQ signaled by the host, so at system resume we can decide to process it without reading the SDIO_CCCR_INTx register.
--- drivers/mmc/core/sdio_irq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
drivers/mmc/core/sdio_irq.c +6 -3
@@ -31,6 +31,7 @@ static int process_sdio_pending_irqs(struct mmc_host *host) {struct mmc_card *card = host->card;int i, ret, count; +bool sdio_irq_pending = host->sdio_irq_pending;unsigned char pending;struct sdio_func *func;
@@ -38,13 +39,16 @@ static int process_sdio_pending_irqs(struct mmc_host *host)if (mmc_card_suspended (card))return 0 ; +/* Clear the flag to indicate that we have processed the IRQ. */ + host->sdio_irq_pending = false; +/* * Optimization, if there is only 1 function interrupt registered * and we know an IRQ was signaled then call irq handler directly. * Otherwise do the full probe. */ func = card->sdio_single_irq; -if (func && host->sdio_irq_pending) { +if (func && sdio_irq_pending) { func->irq_handler (func);return 1 ; }
@@ -96,7 +100,6 @@ static void sdio_run_irqs(struct mmc_host *host) {mmc_claim_host (host);if (host->sdio_irqs) { - host->sdio_irq_pending = true;process_sdio_pending_irqs (host);if (host->ops->ack_sdio_irq) host->ops->ack_sdio_irq (host);
@@ -114,6 +117,7 @@ void sdio_irq_work(struct work_struct *work)void sdio_signal_irq (struct mmc_host *host) { + host->sdio_irq_pending = true;queue_delayed_work (system_wq, &host->sdio_irq_work,0 ); }EXPORT_SYMBOL_GPL (sdio_signal_irq);
@@ -159,7 +163,6 @@ static int sdio_irq_thread(void *_host)if (ret)break ; ret =process_sdio_pending_irqs (host); - host->sdio_irq_pending = false;mmc_release_host (host);/*
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 212/344 sched/psi: Correct overly pessimistic size calculation
In reply to Greg Kroah-HartmanFrom: Miles Chen <[email protected]>
[ Upstream commit 4adcdcea717cb2d8436bef00dd689aa5bc76f11b ]
When passing a equal or more then 32 bytes long string to psi_write(), psi_write() copies 31 bytes to its buf and overwrites buf[30] with '\0'. Which makes the input string 1 byte shorter than it should be.
Fix it by copying sizeof(buf) bytes when nbytes >= sizeof(buf).
This does not cause problems in normal use case like:
"some 500000 10000000" or "full 500000 10000000" because they are less than 32 bytes in length.
/* assuming nbytes == 35 */ char buf[32]; buf_size = min(nbytes, (sizeof(buf) - 1)); /* buf_size = 31 */ if (copy_from_user(buf, user_buf, buf_size)) return -EFAULT; buf[buf_size - 1] = '\0'; /* buf[30] = '\0' */
Before:
%cd /proc/pressure/
%echo "123456789|123456789|123456789|1234" > memory
[ 22.473497] nbytes=35,buf_size=31 [ 22.473775] 123456789|123456789|123456789| (print 30 chars) %sh: write error: Invalid argument
%echo "123456789|123456789|123456789|1" > memory
[ 64.916162] nbytes=32,buf_size=31 [ 64.916331] 123456789|123456789|123456789| (print 30 chars) %sh: write error: Invalid argument
After:
%cd /proc/pressure/
%echo "123456789|123456789|123456789|1234" > memory
[ 254.837863] nbytes=35,buf_size=32 [ 254.838541] 123456789|123456789|123456789|1 (print 31 chars) %sh: write error: Invalid argument
%echo "123456789|123456789|123456789|1" > memory
[ 9965.714935] nbytes=32,buf_size=32 [ 9965.715096] 123456789|123456789|123456789|1 (print 31 chars) %sh: write error: Invalid argument
Also remove the superfluous parentheses.
--- kernel/sched/psi.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/sched/psi.c +1 -1
@@ -1198,7 +1198,7 @@ static ssize_t psi_write(struct file *file, const char __user *user_buf,if (static_branch_likely (&psi_disabled))return -EOPNOTSUPP ; - buf_size =min (nbytes, (sizeof (buf) -1 )); + buf_size =min (nbytes,sizeof (buf));if (copy_from_user (buf, user_buf, buf_size))return -EFAULT ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 213/344 mmc: sdhci: Fix incorrect switch to HS mode
In reply to Greg Kroah-HartmanFrom: Al Cooper <[email protected]>
[ Upstream commit c894e33ddc1910e14d6f2a2016f60ab613fd8b37 ]
When switching from any MMC speed mode that requires 1.8v (HS200, HS400 and HS400ES) to High Speed (HS) mode, the system ends up configured for SDR12 with a 50MHz clock which is an illegal mode.
This happens because the SDHCI_CTRL_VDD_180 bit in the SDHCI_HOST_CONTROL2 register is left set and when this bit is set, the speed mode is controlled by the SDHCI_CTRL_UHS field in the SDHCI_HOST_CONTROL2 register. The SDHCI_CTRL_UHS field will end up being set to 0 (SDR12) by sdhci_set_uhs_signaling() because there is no UHS mode being set.
The fix is to change sdhci_set_uhs_signaling() to set the SDHCI_CTRL_UHS field to SDR25 (which is the same as HS) for any switch to HS mode.
This was found on a new eMMC controller that does strict checking of the speed mode and the corresponding clock rate. It caused the switch to HS400 mode to fail because part of the sequence to switch to HS400 requires a switch from HS200 to HS before going to HS400.
--- drivers/mmc/host/sdhci.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/mmc/host/sdhci.c +3 -1
@@ -1849,7 +1849,9 @@ void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing) ctrl_2 |=SDHCI_CTRL_UHS_SDR104 ; else if (timing == MMC_TIMING_UHS_SDR12) ctrl_2 |= SDHCI_CTRL_UHS_SDR12; - else if (timing == MMC_TIMING_UHS_SDR25) + else if (timing == MMC_TIMING_SD_HS || + timing == MMC_TIMING_MMC_HS || + timing == MMC_TIMING_UHS_SDR25) ctrl_2 |= SDHCI_CTRL_UHS_SDR25; else if (timing == MMC_TIMING_UHS_SDR50) ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 214/344 mmc: core: Add helper function to indicate if SDIO IRQs is enabled
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
[ Upstream commit bd880b00697befb73eff7220ee20bdae4fdd487b ]
To avoid each host driver supporting SDIO IRQs, from keeping track internally about if SDIO IRQs has been claimed, let's introduce a common helper function, sdio_irq_claimed().
The function returns true if SDIO IRQs are claimed, via using the information about the number of claimed irqs. This is safe, even without any locks, as long as the helper function is called only from runtime/system suspend callbacks of the host driver.
--- include/linux/mmc/host.h | 9 +++++++++ 1 file changed, 9 insertions(+)
include/linux/mmc/host.h +9 -0
@@ -493,6 +493,15 @@ void mmc_command_done(struct mmc_host *host, struct mmc_request *mrq);void mmc_cqe_request_done (struct mmc_host *host,struct mmc_request *mrq); +/* +* May be called from host driver's system/runtime suspend/resume callbacks, +* to know if SDIO IRQs has been claimed. +*/ +static inline bool sdio_irq_claimed (struct mmc_host *host) +{ +return host->sdio_irqs >0 ; +} +static inline void mmc_signal_sdio_irq (struct mmc_host *host) { host->ops->enable_sdio_irq (host,0 );
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 215/344 mmc: dw_mmc: Re-store SDIO IRQs mask at system resume
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
[ Upstream commit 7c526608d5afb62cbc967225e2ccaacfdd142e9d ]
In cases when SDIO IRQs have been enabled, runtime suspend is prevented by the driver. However, this still means dw_mci_runtime_suspend|resume() gets called during system suspend/resume, via pm_runtime_force_suspend|resume(). This means during system suspend/resume, the register context of the dw_mmc device most likely loses its register context, even in cases when SDIO IRQs have been enabled.
To re-enable the SDIO IRQs during system resume, the dw_mmc driver currently relies on the mmc core to re-enable the SDIO IRQs when it resumes the SDIO card, but this isn't the recommended solution. Instead, it's better to deal with this locally in the dw_mmc driver, so let's do that.
--- drivers/mmc/host/dw_mmc.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/mmc/host/dw_mmc.c +4 -0
@@ -3460,6 +3460,10 @@ int dw_mci_runtime_resume(struct device *dev)/* Force setup bus to guarantee available clock output */ dw_mci_setup_bus (host->slot, true); +/* Re-enable SDIO interrupts. */ +if (sdio_irq_claimed (host->slot->mmc)) +__dw_mci_enable_sdio_irq (host->slot,1 ); +/* Now that slots are all setup, we can enable card detect */ dw_mci_enable_cd (host);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 216/344 raid5: dont increment read_errors on EILSEQ return
In reply to Greg Kroah-HartmanFrom: Nigel Croxon <[email protected]>
[ Upstream commit b76b4715eba0d0ed574f58918b29c1b2f0fa37a8 ]
While MD continues to count read errors returned by the lower layer. If those errors are -EILSEQ, instead of -EIO, it should NOT increase the read_errors count.
When RAID6 is set up on dm-integrity target that detects massive corruption, the leg will be ejected from the array. Even if the issue is correctable with a sector re-write and the array has necessary redundancy to correct it.
The leg is ejected because it runs up the rdev->read_errors beyond conf->max_nr_stripes. The return status in dm-drypt when there is a data integrity error is -EILSEQ (BLK_STS_PROTECTION).
--- drivers/md/raid5.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/md/raid5.c +2 -1
@@ -2526,7 +2526,8 @@ static void raid5_end_read_request(struct bio * bi)int set_bad =0 ;clear_bit (R5_UPTODATE , &sh->dev[i].flags); -atomic_inc (&rdev->read_errors); +if (!(bi->bi_status ==BLK_STS_PROTECTION )) +atomic_inc (&rdev->read_errors);if (test_bit (R5_ReadRepl, &sh->dev[i].flags)) pr_warn_ratelimited( "md/raid:%s: read error on replacement device (sector %llu on %s).\n",
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 217/344 mmc: mtk-sd: Re-store SDIO IRQs mask at system resume
In reply to Greg Kroah-HartmanFrom: Ulf Hansson <[email protected]>
[ Upstream commit 1c81d69d4c98aab56c5a7d5a810f84aefdb37e9b ]
In cases when SDIO IRQs have been enabled, runtime suspend is prevented by the driver. However, this still means msdc_runtime_suspend|resume() gets called during system suspend/resume, via pm_runtime_force_suspend|resume().
This means during system suspend/resume, the register context of the mtk-sd device most likely loses its register context, even in cases when SDIO IRQs have been enabled.
To re-enable the SDIO IRQs during system resume, the mtk-sd driver currently relies on the mmc core to re-enable the SDIO IRQs when it resumes the SDIO card, but this isn't the recommended solution. Instead, it's better to deal with this locally in the mtk-sd driver, so let's do that.
--- drivers/mmc/host/mtk-sd.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/mmc/host/mtk-sd.c +3 -0
@@ -2421,6 +2421,9 @@ static void msdc_restore_reg(struct msdc_host *host) }else {writel (host->save_para.pad_tune, host->base + tune_reg); } + +if (sdio_irq_claimed (host->mmc)) +__msdc_enable_sdio_irq (host,1 ); }static int msdc_runtime_suspend (struct device *dev)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 218/344 libertas: Add missing sentinel at end of if_usb.c fw_table
In reply to Greg Kroah-HartmanFrom: Kevin Easton <[email protected]>
[ Upstream commit 764f3f1ecffc434096e0a2b02f1a6cc964a89df6 ]
This sentinel tells the firmware loading process when to stop.
--- drivers/net/wireless/marvell/libertas/if_usb.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/net/wireless/marvell/libertas/if_usb.c +2 -1
@@ -50,7 +50,8 @@ static const struct lbs_fw_table fw_table[] = { { MODEL_8388, "libertas/usb8388_v5.bin", NULL }, { MODEL_8388, "libertas/usb8388.bin", NULL }, { MODEL_8388, "usb8388.bin", NULL }, - { MODEL_8682, "libertas/usb8682.bin", NULL } + { MODEL_8682, "libertas/usb8682.bin", NULL }, + { 0, NULL, NULL } }; static const struct usb_device_id if_usb_table[] = {
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 219/344 e1000e: add workaround for possible stalled packet
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit e5e9a2ecfe780975820e157b922edee715710b66 ]
This works around a possible stalled packet issue, which may occur due to clock recovery from the PCH being too slow, when the LAN is transitioning from K1 at 1G link speed.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204057
--- drivers/net/ethernet/intel/e1000e/ich8lan.c | 10 ++++++++++ drivers/net/ethernet/intel/e1000e/ich8lan.h | 2 +- 2 files changed, 11 insertions(+), 1 deletion(-)
drivers/net/ethernet/intel/e1000e/ich8lan.c +10 -0
@@ -1429,6 +1429,16 @@ static s32 e1000_check_for_copper_link_ich8lan(struct e1000_hw *hw)else phy_reg |=0xFA ;e1e_wphy_locked (hw,I217_PLL_CLOCK_GATE_REG , phy_reg); + +if (speed ==SPEED_1000 ) { + hw->phy.ops.read_reg_locked (hw,HV_PM_CTRL , + &phy_reg); + + phy_reg |=HV_PM_CTRL_K1_CLK_REQ ; + + hw->phy.ops.write_reg_locked (hw,HV_PM_CTRL , + phy_reg); + } } hw->phy.ops.release (hw);
drivers/net/ethernet/intel/e1000e/ich8lan.h +1 -1
@@ -210,7 +210,7 @@/* PHY Power Management Control */ #define HV_PM_CTRL PHY_REG(770, 17) -#define HV_PM_CTRL_PLL_STOP_IN_K1_GIGA 0x100 +#define HV_PM_CTRL_K1_CLK_REQ 0x200#define HV_PM_CTRL_K1_ENABLE 0x4000#define I217_PLL_CLOCK_GATE_REG PHY_REG(772, 28)
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 220/344 ALSA: hda - Add a quirk model for fixing Huawei Matebook X right speaker
In reply to Greg Kroah-HartmanFrom: Tomas Espeleta <[email protected]>
[ Upstream commit a2ef03fe617a8365fb7794531b11ba587509a9b9 ]
[ This is rather a revival of the patch Tomas sent in months ago, but
applying only with the quirk model option -- tiwai ]
Hard coded coefficients to make Huawuei Matebook X right speaker work. The Matebook X has a ALC298, please refer to bug 197801 on how these numbers were reverse engineered from the Windows driver
The reversed engineered sequence represents a repeating pattern of verbs, and the only values that are changing periodically are written on indexes 0x23 and 0x25:
0x500, 0x230x400, VALUE10x500, 0x250x400, VALUE2
* skipped reading sequences (0x500 - 0xc00 sequences are ignored)
* static values from reverse engineering are used
NOTE: since a significant risk is still considered, this is provided as an experimental fix that isn't applied as default for now. For enabling the fix, you'll have to choose huawei-mbx-stereo via model option of snd-hda-intel module.
If we get feedback from users that this works stably, we may apply it per default.
[ Some coding style fixes and replacement with AC_VERB_* by tiwai ]
--- Documentation/sound/hd-audio/models.rst | 3 + sound/pci/hda/patch_realtek.c | 74 +++++++++++++++++++++++++ 2 files changed, 77 insertions(+)
Documentation/sound/hd-audio/models.rst +3 -0
@@ -260,6 +260,9 @@ alc295-hp-x360 HP Spectre X360 fixups alc-sense-combo Headset button support for Chrome platform +huawei-mbx-stereo + Enable initialization verbs for Huawei MBX stereo speakers; + might be risky, try this at your own risk ALC66x/67x/892 ==============
sound/pci/hda/patch_realtek.c +74 -0
98 lines not on this page · raw message
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 221/344 ALSA: hda - Drop unsol event handler for Intel HDMI codecs
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit f2dbe87c5ac1f88e6007ba1f1374f4bd8a197fb6 ]
We don't need to deal with the unsol events for Intel chips that are tied with the graphics via audio component notifier. Although the presence of the audio component is checked at the beginning of hdmi_unsol_event(), better to short cut by dropping unsol_event ops.
--- sound/pci/hda/patch_hdmi.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
sound/pci/hda/patch_hdmi.c +8 -1
@@ -2616,6 +2616,8 @@ static void i915_pin_cvt_fixup(struct hda_codec *codec,/* precondition and allocation for Intel codecs */ static int alloc_intel_hdmi (struct hda_codec *codec) { +int err; +/* requires i915 binding */ if (!codec->bus->core.audio_component) {codec_info (codec,"No i915 binding for Intel HDMI/DP codec\n" );
@@ -2624,7 +2626,12 @@ static int alloc_intel_hdmi(struct hda_codec *codec)return -ENODEV ; } -return alloc_generic_hdmi (codec); + err =alloc_generic_hdmi (codec); +if (err <0 ) +return err; +/* no need to handle unsol events */ + codec->patch_ops.unsol_event =NULL ; +return 0 ; }/* parse and post-process for Intel codecs */
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 222/344 drm/amd/powerplay/smu7: enforce minimal VBITimeout (v2)
In reply to Greg Kroah-HartmanFrom: Ahzo <[email protected]>
[ Upstream commit f659bb6dae58c113805f92822e4c16ddd3156b79 ]
This fixes screen corruption/flickering on 75 Hz displays.
v2: make print statement debug only (Alex)
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=102646
--- drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/gpu/drm/amd/powerplay/hwmgr/smu7_hwmgr.c +5 -0
@@ -4068,6 +4068,11 @@ static int smu7_program_display_gap(struct pp_hwmgr *hwmgr) data->frame_time_x2 = frame_time_in_us *2 /100 ; +if (data->frame_time_x2 <280 ) { +pr_debug ("%s: enforce minimal VBITimeout: %d -> 280\n" , __func__, data->frame_time_x2); + data->frame_time_x2 =280 ; + } + display_gap2 = pre_vbi_time_in_us * (ref_clock /100 );cgs_write_ind_register (hwmgr->device,CGS_IND_REG__SMC , ixCG_DISPLAY_GAP_CNTL2, display_gap2);
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 223/344 media: ttusb-dec: Fix info-leak in ttusb_dec_send_command()
In reply to Greg Kroah-HartmanFrom: Tomas Bortoli <[email protected]>
[ Upstream commit a10feaf8c464c3f9cfdd3a8a7ce17e1c0d498da1 ]
The function at issue does not always initialize each byte allocated for 'b' and can therefore leak uninitialized memory to a USB device in the call to usb_bulk_msg()
Use kzalloc() instead of kmalloc()
--- drivers/media/usb/ttusb-dec/ttusb_dec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/usb/ttusb-dec/ttusb_dec.c +1 -1
@@ -319,7 +319,7 @@ static int ttusb_dec_send_command(struct ttusb_dec *dec, const u8 command,dprintk ("%s\n" , __func__); - b =kmalloc (COMMAND_PACKET_SIZE +4 ,GFP_KERNEL ); + b =kzalloc (COMMAND_PACKET_SIZE +4 ,GFP_KERNEL );if (!b)return -ENOMEM ;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 224/344 drm: fix module name in edid_firmware log message
In reply to Greg Kroah-HartmanFrom: Jani Nikula <[email protected]>
[ Upstream commit ade925995b172f1d7410d1c665b2f47c5e99bef0 ]
The module is drm_kms_helper, not drm_kms_firmware.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=204549
--- drivers/gpu/drm/drm_kms_helper_common.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/drm_kms_helper_common.c +1 -1
@@ -40,7 +40,7 @@ MODULE_LICENSE("GPL and additional rights");/* Backward compatibility for drm_kms_helper.edid_firmware */ static int edid_firmware_set (const char *val,const struct kernel_param *kp) { -DRM_NOTE ("drm_kms_firmware.edid_firmware is deprecated, please use drm.edid_firmware instead.\n" ); +DRM_NOTE ("drm_kms_helper.edid_firmware is deprecated, please use drm.edid_firmware instead.\n" );return __drm_set_edid_firmware_path (val); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 225/344 ALSA: hda/realtek - Blacklist PC beep for Lenovo ThinkCentre M73/93
In reply to Greg Kroah-HartmanFrom: Takashi Iwai <[email protected]>
[ Upstream commit 051c78af14fcd74a22b5af45548ad9d588247cc7 ]
Lenovo ThinkCentre M73 and M93 don't seem to have a proper beep although the driver tries to probe and set up blindly. Blacklist these machines for suppressing the beep creation.
--- sound/pci/hda/patch_realtek.c | 3 +++ 1 file changed, 3 insertions(+)
sound/pci/hda/patch_realtek.c +3 -0
@@ -1058,6 +1058,9 @@ static const struct snd_pci_quirk beep_white_list[] = {SND_PCI_QUIRK (0x1043 ,0x834a ,"EeePC" ,1 ),SND_PCI_QUIRK (0x1458 ,0xa002 ,"GA-MA790X" ,1 ),SND_PCI_QUIRK (0x8086 ,0xd613 ,"Intel" ,1 ), +/* blacklist -- no beep available */ +SND_PCI_QUIRK (0x17aa ,0x309e ,"Lenovo ThinkCentre M73" ,0 ), + SND_PCI_QUIRK(0x17aa, 0x30a3, "Lenovo ThinkCentre M93", 0), {} };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 226/344 iommu/amd: Override wrong IVRS IOAPIC on Raven Ridge systems
In reply to Greg Kroah-HartmanFrom: Kai-Heng Feng <[email protected]>
[ Upstream commit 93d051550ee02eaff9a2541d825605a7bd778027 ]
Raven Ridge systems may have malfunction touchpad or hang at boot if incorrect IVRS IOAPIC is provided by BIOS.
Users already found correct "ivrs_ioapic=" values, let's put them inside kernel to workaround buggy BIOS.
--- drivers/iommu/Makefile | 2 +- drivers/iommu/amd_iommu.h | 14 +++++ drivers/iommu/amd_iommu_init.c | 5 +- drivers/iommu/amd_iommu_quirks.c | 92 ++++++++++++++++++++++++++++++++ 4 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 drivers/iommu/amd_iommu.h create mode 100644 drivers/iommu/amd_iommu_quirks.c
drivers/iommu/Makefile +1 -1
@@ -10,7 +10,7 @@ obj-$(CONFIG_IOMMU_IO_PGTABLE_LPAE) += io-pgtable-arm.o obj-$(CONFIG_IOMMU_IOVA) += iova.o obj-$(CONFIG_OF_IOMMU) += of_iommu.o obj-$(CONFIG_MSM_IOMMU) += msm_iommu.o -obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o +obj-$(CONFIG_AMD_IOMMU) += amd_iommu.o amd_iommu_init.o amd_iommu_quirks.o obj-$(CONFIG_AMD_IOMMU_DEBUGFS) += amd_iommu_debugfs.o obj-$(CONFIG_AMD_IOMMU_V2) += amd_iommu_v2.o obj-$(CONFIG_ARM_SMMU) += arm-smmu.o
drivers/iommu/amd_iommu.h new file +14 -0
@@ -0,0 +1,14 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ + +#ifndef AMD_IOMMU_H +#define AMD_IOMMU_H + +int __init add_special_device (u8 type,u8 id,u16 *devid,bool cmd_line); + +#ifdef CONFIG_DMI +void amd_iommu_apply_ivrs_quirks (void ); +#else +static void amd_iommu_apply_ivrs_quirks (void ) { } +#endif + +#endif
drivers/iommu/amd_iommu_init.c +4 -1
@@ -32,6 +32,7 @@#include <asm/irq_remapping.h> #include <linux/crash_dump.h> +#include "amd_iommu.h" #include "amd_iommu_proto.h" #include "amd_iommu_types.h" #include "irq_remapping.h"
@@ -1002,7 +1003,7 @@ static void __init set_dev_entry_from_acpi(struct amd_iommu *iommu,set_iommu_for_device (iommu, devid); } -static int __init add_special_device (u8 type,u8 id,u16 *devid,bool cmd_line) +int __init add_special_device (u8 type,u8 id,u16 *devid,bool cmd_line) {struct devid_map *entry;struct list_head *list;
@@ -1153,6 +1154,8 @@ static int __init init_iommu_from_acpi(struct amd_iommu *iommu,if (ret)return ret; +amd_iommu_apply_ivrs_quirks (); +/* * First save the recommended feature enable bits from ACPI */
drivers/iommu/amd_iommu_quirks.c new file +92 -0
92 lines not on this page · raw message
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 227/344 zd1211rw: remove false assertion from zd_mac_clear()
In reply to Greg Kroah-HartmanFrom: Oliver Neukum <[email protected]>
[ Upstream commit 7a2eb7367fdea72e448d1a847aa857f6caf8ea2f ]
The function is called before the lock which is asserted was ever used. Just remove it.
--- drivers/net/wireless/zydas/zd1211rw/zd_mac.c | 1 - 1 file changed, 1 deletion(-)
drivers/net/wireless/zydas/zd1211rw/zd_mac.c +0 -1
@@ -223,7 +223,6 @@ void zd_mac_clear(struct zd_mac *mac) {flush_workqueue (zd_workqueue);zd_chip_clear (&mac->chip); -lockdep_assert_held (&mac->lock);ZD_MEMCLEAR (mac,sizeof (struct zd_mac )); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 228/344 btrfs: delayed-inode: Kill the BUG_ON() in btrfs_delete_delayed_dir_index()
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit 933c22a7512c5c09b1fdc46b557384efe8d03233 ]
There is one report of fuzzed image which leads to BUG_ON() in btrfs_delete_delayed_dir_index().
Although that fuzzed image can already be addressed by enhanced extent-tree error handler, it's still better to hunt down more BUG_ON().
This patch will hunt down two BUG_ON()s in btrfs_delete_delayed_dir_index():
- One for error from btrfs_delayed_item_reserve_metadata() Instead of BUG_ON(), we output an error message and free the item. And return the error.
All callers of this function handles the error by aborting current trasaction.
- One for possible EEXIST from __btrfs_add_delayed_deletion_item() That function can return -EEXIST.
We already have a good enough error message for that, only need to clean up the reserved metadata space and allocated item.
To help above cleanup, also modifiy __btrfs_remove_delayed_item() called in btrfs_release_delayed_item(), to skip unassociated item.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=203253
--- fs/btrfs/delayed-inode.c | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-)
fs/btrfs/delayed-inode.c +11 -2
@@ -474,6 +474,9 @@ static void __btrfs_remove_delayed_item(struct btrfs_delayed_item *delayed_item)struct rb_root_cached *root;struct btrfs_delayed_root *delayed_root; +/* Not associated with any delayed_node */ +if (!delayed_item->delayed_node) +return ; delayed_root = delayed_item->delayed_node->root->fs_info->delayed_root;BUG_ON (!delayed_root);
@@ -1525,7 +1528,12 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,* we have reserved enough space when we start a new transaction, * so reserving metadata failure is impossible. */ -BUG_ON (ret); +if (ret <0 ) { +btrfs_err (trans->fs_info, +"metadata reservation failed for delayed dir item deltiona, should have been reserved" ); +btrfs_release_delayed_item (item); + goto end; + }mutex_lock (&node->mutex); ret =__btrfs_add_delayed_deletion_item (node, item);
@@ -1534,7 +1542,8 @@ int btrfs_delete_delayed_dir_index(struct btrfs_trans_handle *trans,"err add delayed dir index item(index: %llu) into the deletion tree of the delayed node(root id: %llu, inode id: %llu, errno: %d)" , index, node->root->root_key.objectid, node->inode_id, ret); -BUG (); +btrfs_delayed_item_release_metadata (dir->root, item); +btrfs_release_delayed_item (item); }mutex_unlock (&node->mutex); end:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 229/344 btrfs: extent-tree: Make sure we only allocate extents from block groups with the same type
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit 2a28468e525f3924efed7f29f2bc5a2926e7e19a ]
[BUG]
With fuzzed image and MIXED_GROUPS super flag, we can hit the following BUG_ON():
kernel BUG at fs/btrfs/delayed-ref.c:491!
invalid opcode: 0000 [#1] PREEMPT SMP NOPTI
CPU: 0 PID: 1849 Comm: sync Tainted: G O 5.2.0-custom #27 RIP: 0010:update_existing_head_ref.cold+0x44/0x46 [btrfs] Call Trace: add_delayed_ref_head+0x20c/0x2d0 [btrfs] btrfs_add_delayed_tree_ref+0x1fc/0x490 [btrfs] btrfs_free_tree_block+0x123/0x380 [btrfs] __btrfs_cow_block+0x435/0x500 [btrfs] btrfs_cow_block+0x110/0x240 [btrfs] btrfs_search_slot+0x230/0xa00 [btrfs] ? __lock_acquire+0x105e/0x1e20 btrfs_insert_empty_items+0x67/0xc0 [btrfs] alloc_reserved_file_extent+0x9e/0x340 [btrfs] __btrfs_run_delayed_refs+0x78e/0x1240 [btrfs] ? kvm_clock_read+0x18/0x30 ? __sched_clock_gtod_offset+0x21/0x50 btrfs_run_delayed_refs.part.0+0x4e/0x180 [btrfs] btrfs_run_delayed_refs+0x23/0x30 [btrfs] btrfs_commit_transaction+0x53/0x9f0 [btrfs] btrfs_sync_fs+0x7c/0x1c0 [btrfs] ? __ia32_sys_fdatasync+0x20/0x20 sync_fs_one_sb+0x23/0x30 iterate_supers+0x95/0x100 ksys_sync+0x62/0xb0 __ia32_sys_sync+0xe/0x20 do_syscall_64+0x65/0x240 entry_SYSCALL_64_after_hwframe+0x49/0xbe
[CAUSE]
This situation is caused by several factors:
- Fuzzed image
The extent tree of this fs missed one backref for extent tree root. So we can allocated space from that slot.
- MIXED_BG feature
Super block has MIXED_BG flag.
- No mixed block groups exists
All block groups are just regular ones.
This makes data space_info->block_groups[] contains metadata block groups. And when we reserve space for data, we can use space in metadata block group.
Then we hit the following file operations:
- fallocate
We need to allocate data extents.
find_free_extent() choose to use the metadata block to allocate space from, and choose the space of extent tree root, since its backref is missing.
This generate one delayed ref head with is_data = 1.
- extent tree update
We need to update extent tree at run_delayed_ref time.
This generate one delayed ref head with is_data = 0, for the same bytenr of old extent tree root.
Then we trigger the BUG_ON().
[FIX]
The quick fix here is to check block_group->flags before using it.
The problem can only happen for MIXED_GROUPS fs. Regular filesystems won't have space_info with DATA|METADATA flag, and no way to hit the bug.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=203255
--- fs/btrfs/extent-tree.c | 8 ++++++++ 1 file changed, 8 insertions(+)
fs/btrfs/extent-tree.c +8 -0
@@ -5751,6 +5751,14 @@ static noinline int find_free_extent(struct btrfs_fs_info *fs_info,*/ if ((flags & extra) && !(block_group->flags & extra)) goto loop; + +/* +* This block group has different flags than we want. +* It's possible that we have MIXED_GROUP flag but no +* block group is mixed. Just skip such block group. +*/ +btrfs_release_block_group (block_group, delalloc); +continue ; } have_block_group:
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 230/344 btrfs: tree-checker: Add ROOT_ITEM check
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit 259ee7754b6793af8bdd77f9ca818bc41cfe9541 ]
This patch will introduce ROOT_ITEM check, which includes:
- Key->objectid and key->offset check
Currently only some easy check, e.g. 0 as rootid is invalid.
- Item size check
Root item size is fixed.
- Generation checks
Generation, generation_v2 and last_snapshot should not be greater than super generation + 1
- Level and alignment check
Level should be in [0, 7], and bytenr must be aligned to sector size.
- Flags check
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=203261
--- fs/btrfs/tree-checker.c | 92 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+)
fs/btrfs/tree-checker.c +92 -0
@@ -821,6 +821,95 @@ static int check_inode_item(struct extent_buffer *leaf,return 0 ; } +static int check_root_item (struct extent_buffer *leaf,struct btrfs_key *key, +int slot) +{ +struct btrfs_fs_info *fs_info = leaf->fs_info; +struct btrfs_root_item ri; +const u64 valid_root_flags =BTRFS_ROOT_SUBVOL_RDONLY | +BTRFS_ROOT_SUBVOL_DEAD ; + +/* No such tree id */ +if (key->objectid ==0 ) { +generic_err (leaf, slot,"invalid root id 0" ); +return -EUCLEAN ; + } + +/* +* Some older kernel may create ROOT_ITEM with non-zero offset, so here +* we only check offset for reloc tree whose key->offset must be a +* valid tree. +*/ +if (key->objectid ==BTRFS_TREE_RELOC_OBJECTID && key->offset ==0 ) { +generic_err (leaf, slot,"invalid root id 0 for reloc tree" ); +return -EUCLEAN ; + } + +if (btrfs_item_size_nr (leaf, slot) !=sizeof (ri)) { +generic_err (leaf, slot, +"invalid root item size, have %u expect %zu" , +btrfs_item_size_nr (leaf, slot),sizeof (ri)); + } + +read_extent_buffer (leaf, &ri,btrfs_item_ptr_offset (leaf, slot), +sizeof (ri)); + +/* Generation related */ +if (btrfs_root_generation (&ri) > +btrfs_super_generation (fs_info->super_copy) +1 ) { +generic_err (leaf, slot, +"invalid root generation, have %llu expect (0, %llu]" , +btrfs_root_generation (&ri), +btrfs_super_generation (fs_info->super_copy) +1 ); +return -EUCLEAN ; + } +if (btrfs_root_generation_v2 (&ri) > +btrfs_super_generation (fs_info->super_copy) +1 ) { +generic_err (leaf, slot, +"invalid root v2 generation, have %llu expect (0, %llu]" , +btrfs_root_generation_v2 (&ri), +btrfs_super_generation (fs_info->super_copy) +1 ); +return -EUCLEAN ; + } +if (btrfs_root_last_snapshot (&ri) > +btrfs_super_generation (fs_info->super_copy) +1 ) { +generic_err (leaf, slot, +"invalid root last_snapshot, have %llu expect (0, %llu]" , +btrfs_root_last_snapshot (&ri), +btrfs_super_generation (fs_info->super_copy) +1 ); +return -EUCLEAN ; + } + +/* Alignment and level check */ +if (!IS_ALIGNED (btrfs_root_bytenr (&ri), fs_info->sectorsize)) { +generic_err (leaf, slot, +"invalid root bytenr, have %llu expect to be aligned to %u" , +btrfs_root_bytenr (&ri), fs_info->sectorsize); +return -EUCLEAN ; + } +if (btrfs_root_level (&ri) >=BTRFS_MAX_LEVEL ) { +generic_err (leaf, slot, +"invalid root level, have %u expect [0, %u]" , +btrfs_root_level (&ri),BTRFS_MAX_LEVEL -1 ); +return -EUCLEAN ; + } +if (ri.drop_level >=BTRFS_MAX_LEVEL ) { +generic_err (leaf, slot, +"invalid root level, have %u expect [0, %u]" , + ri.drop_level,BTRFS_MAX_LEVEL -1 ); +return -EUCLEAN ; + } + +/* Flags check */ +if (btrfs_root_flags (&ri) & ~valid_root_flags) { +generic_err (leaf, slot, +"invalid root flags, have 0x%llx expect mask 0x%llx" , +btrfs_root_flags (&ri), valid_root_flags); +return -EUCLEAN ; + } +return 0 ; +} +/* * Common point to switch the item-specific validation. */
@@ -856,6 +945,9 @@ static int check_leaf_item(struct extent_buffer *leaf,case BTRFS_INODE_ITEM_KEY : ret =check_inode_item (leaf, key, slot);break ; +case BTRFS_ROOT_ITEM_KEY : + ret =check_root_item (leaf, key, slot); +break ; }return ret; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 231/344 btrfs: Detect unbalanced tree with empty leaf before crashing btree operations
In reply to Greg Kroah-HartmanFrom: Qu Wenruo <[email protected]>
[ Upstream commit 62fdaa52a3d00a875da771719b6dc537ca79fce1 ]
[BUG]
With crafted image, btrfs will panic at btree operations:
kernel BUG at fs/btrfs/ctree.c:3894!
invalid opcode: 0000 [#1] SMP PTI
CPU: 0 PID: 1138 Comm: btrfs-transacti Not tainted 5.0.0-rc8+ #9 RIP: 0010:__push_leaf_left+0x6b6/0x6e0 RSP: 0018:ffffc0bd4128b990 EFLAGS: 00010246 RAX: 0000000000000000 RBX: ffffa0a4ab8f0e38 RCX: 0000000000000000 RDX: ffffa0a280000000 RSI: 0000000000000000 RDI: ffffa0a4b3814000 RBP: ffffc0bd4128ba38 R08: 0000000000001000 R09: ffffc0bd4128b948 R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000240 R13: ffffa0a4b556fb60 R14: ffffa0a4ab8f0af0 R15: ffffa0a4ab8f0af0 FS: 0000000000000000(0000) GS:ffffa0a4b7a00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 00007f2461c80020 CR3: 000000022b32a006 CR4: 00000000000206f0 Call Trace: ? _cond_resched+0x1a/0x50 push_leaf_left+0x179/0x190 btrfs_del_items+0x316/0x470 btrfs_del_csums+0x215/0x3a0 __btrfs_free_extent.isra.72+0x5a7/0xbe0 __btrfs_run_delayed_refs+0x539/0x1120 btrfs_run_delayed_refs+0xdb/0x1b0 btrfs_commit_transaction+0x52/0x950 ? start_transaction+0x94/0x450 transaction_kthread+0x163/0x190 kthread+0x105/0x140 ? btrfs_cleanup_transaction+0x560/0x560 ? kthread_destroy_worker+0x50/0x50 ret_from_fork+0x35/0x40 Modules linked in: ---[ end trace c2425e6e89b5558f ]---
[CAUSE]
The offending csum tree looks like this:
checksum tree key (CSUM_TREE ROOT_ITEM 0)
node 29741056 level 1 items 14 free 107 generation 19 owner CSUM_TREE
... key (EXTENT_CSUM EXTENT_CSUM 85975040) block 29630464 gen 17 key (EXTENT_CSUM EXTENT_CSUM 89911296) block 29642752 gen 17 <<< key (EXTENT_CSUM EXTENT_CSUM 92274688) block 29646848 gen 17 ...
leaf 29630464 items 6 free space 1 generation 17 owner CSUM_TREE
item 0 key (EXTENT_CSUM EXTENT_CSUM 85975040) itemoff 3987 itemsize 8 range start 85975040 end 85983232 length 8192 ...
leaf 29642752 items 0 free space 3995 generation 17 owner 0
^ empty leaf invalid owner ^
leaf 29646848 items 1 free space 602 generation 17 owner CSUM_TREE
item 0 key (EXTENT_CSUM EXTENT_CSUM 92274688) itemoff 627 itemsize 3368 range start 92274688 end 95723520 length 3448832
So we have a corrupted csum tree where one tree leaf is completely empty, causing unbalanced btree, thus leading to unexpected btree balance error.
[FIX]
For this particular case, we handle it in two directions to catch it:
- Check if the tree block is empty through btrfs_verify_level_key() So that invalid tree blocks won't be read out through btrfs_search_slot() and its variants.
- Check 0 tree owner in tree checker
NO tree is using 0 as its tree owner, detect it and reject at tree block read time.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202821
--- fs/btrfs/disk-io.c | 10 ++++++++++ fs/btrfs/tree-checker.c | 6 ++++++ 2 files changed, 16 insertions(+)
fs/btrfs/disk-io.c +10 -0
@@ -416,6 +416,16 @@ int btrfs_verify_level_key(struct extent_buffer *eb, int level,*/ if (btrfs_header_generation (eb) > fs_info->last_trans_committed)return 0 ; + +/* We have @first_key, so this @eb must have at least one item */ +if (btrfs_header_nritems (eb) ==0 ) { +btrfs_err (fs_info, +"invalid tree nritems, bytenr=%llu nritems=0 expect >0" , + eb->start); +WARN_ON (IS_ENABLED (CONFIG_BTRFS_DEBUG )); +return -EUCLEAN ; + } +if (found_level)btrfs_node_key_to_cpu (eb, &found_key,0 );else
fs/btrfs/tree-checker.c +6 -0
@@ -991,6 +991,12 @@ static int check_leaf(struct extent_buffer *leaf, bool check_item_data) owner);return -EUCLEAN ; } +/* Unknown tree */ +if (owner ==0 ) { +generic_err (leaf,0 , +"invalid owner, root 0 is not defined" ); +return -EUCLEAN ; + }return 0 ; }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 232/344 kvm: Nested KVM MMUs need PAE root too
In reply to Greg Kroah-HartmanFrom: Jiří Paleček <[email protected]>
[ Upstream commit 1cfff4d9a5d01fa61e5768a6afffc81ae1c8ecb9 ]
On AMD processors, in PAE 32bit mode, nested KVM instances don't work. The L0 host get a kernel OOPS, which is related to arch.mmu->pae_root being NULL.
The reason for this is that when setting up nested KVM instance, arch.mmu is set to &arch.guest_mmu (while normally, it would be &arch.root_mmu). However, the initialization and allocation of pae_root only creates it in root_mmu. KVM code (ie. in mmu_alloc_shadow_roots) then accesses arch.mmu->pae_root, which is the unallocated arch.guest_mmu->pae_root.
This fix just allocates (and frees) pae_root in both guest_mmu and root_mmu (and also lm_root if it was allocated). The allocation is subject to previous restrictions ie. it won't allocate anything on 64-bit and AFAIK not on Intel.
--- arch/x86/kvm/mmu.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-)
arch/x86/kvm/mmu.c +22 -8
@@ -5611,13 +5611,13 @@ slot_handle_leaf(struct kvm *kvm, struct kvm_memory_slot *memslot, PT_PAGE_TABLE_LEVEL, lock_flush_tlb); } -static void free_mmu_pages (struct kvm_vcpu *vcpu) +static void free_mmu_pages (struct kvm_mmu *mmu) { -free_page ((unsigned long )vcpu->arch.mmu->pae_root); -free_page ((unsigned long )vcpu->arch.mmu->lm_root); +free_page ((unsigned long )mmu->pae_root); +free_page ((unsigned long )mmu->lm_root); } -static int alloc_mmu_pages (struct kvm_vcpu *vcpu) +static int alloc_mmu_pages (struct kvm_vcpu *vcpu,struct kvm_mmu *mmu) {struct page *page;int i;
@@ -5638,9 +5638,9 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu)if (!page)return -ENOMEM ; - vcpu->arch.mmu->pae_root =page_address (page); + mmu->pae_root =page_address (page);for (i =0 ; i <4 ; ++i) - vcpu->arch.mmu->pae_root[i] =INVALID_PAGE ; + mmu->pae_root[i] =INVALID_PAGE ;return 0 ; }
@@ -5648,6 +5648,7 @@ static int alloc_mmu_pages(struct kvm_vcpu *vcpu)int kvm_mmu_create (struct kvm_vcpu *vcpu) {uint i; +int ret; vcpu->arch.mmu = &vcpu->arch.root_mmu; vcpu->arch.walk_mmu = &vcpu->arch.root_mmu;
@@ -5665,7 +5666,19 @@ int kvm_mmu_create(struct kvm_vcpu *vcpu) vcpu->arch.guest_mmu.prev_roots[i] =KVM_MMU_ROOT_INFO_INVALID ; vcpu->arch.nested_mmu.translate_gpa = translate_nested_gpa; -return alloc_mmu_pages (vcpu); + + ret =alloc_mmu_pages (vcpu, &vcpu->arch.guest_mmu); +if (ret) +return ret; + + ret =alloc_mmu_pages (vcpu, &vcpu->arch.root_mmu); +if (ret) + goto fail_allocate_root; + +return ret; + fail_allocate_root: +free_mmu_pages (&vcpu->arch.guest_mmu); +return ret; }
@@ -6168,7 +6181,8 @@ unsigned long kvm_mmu_calculate_default_mmu_pages(struct kvm *kvm)void kvm_mmu_destroy (struct kvm_vcpu *vcpu) {kvm_mmu_unload (vcpu); -free_mmu_pages (vcpu); +free_mmu_pages (&vcpu->arch.root_mmu); +free_mmu_pages (&vcpu->arch.guest_mmu);mmu_free_memory_caches (vcpu); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 233/344 media: omap3isp: Set device on omap3isp subdevs
In reply to Greg Kroah-HartmanFrom: Sakari Ailus <[email protected]>
[ Upstream commit e9eb103f027725053a4b02f93d7f2858b56747ce ]
The omap3isp driver registered subdevs without the dev field being set. Do that now.
--- drivers/media/platform/omap3isp/ispccdc.c | 1 + drivers/media/platform/omap3isp/ispccp2.c | 1 + drivers/media/platform/omap3isp/ispcsi2.c | 1 + drivers/media/platform/omap3isp/isppreview.c | 1 + drivers/media/platform/omap3isp/ispresizer.c | 1 + drivers/media/platform/omap3isp/ispstat.c | 2 ++ 6 files changed, 7 insertions(+)
drivers/media/platform/omap3isp/ispccdc.c +1 -0
@@ -2602,6 +2602,7 @@ int omap3isp_ccdc_register_entities(struct isp_ccdc_device *ccdc,int ret;/* Register the subdev and video node. */ + ccdc->subdev.dev = vdev->mdev->dev; ret =v4l2_device_register_subdev (vdev, &ccdc->subdev);if (ret <0 ) goto error;
drivers/media/platform/omap3isp/ispccp2.c +1 -0
@@ -1031,6 +1031,7 @@ int omap3isp_ccp2_register_entities(struct isp_ccp2_device *ccp2,int ret;/* Register the subdev and video nodes. */ + ccp2->subdev.dev = vdev->mdev->dev; ret =v4l2_device_register_subdev (vdev, &ccp2->subdev);if (ret <0 ) goto error;
drivers/media/platform/omap3isp/ispcsi2.c +1 -0
@@ -1198,6 +1198,7 @@ int omap3isp_csi2_register_entities(struct isp_csi2_device *csi2,int ret;/* Register the subdev and video nodes. */ + csi2->subdev.dev = vdev->mdev->dev; ret =v4l2_device_register_subdev (vdev, &csi2->subdev);if (ret <0 ) goto error;
drivers/media/platform/omap3isp/isppreview.c +1 -0
@@ -2225,6 +2225,7 @@ int omap3isp_preview_register_entities(struct isp_prev_device *prev,int ret;/* Register the subdev and video nodes. */ + prev->subdev.dev = vdev->mdev->dev; ret =v4l2_device_register_subdev (vdev, &prev->subdev);if (ret <0 ) goto error;
drivers/media/platform/omap3isp/ispresizer.c +1 -0
@@ -1681,6 +1681,7 @@ int omap3isp_resizer_register_entities(struct isp_res_device *res,int ret;/* Register the subdev and video nodes. */ + res->subdev.dev = vdev->mdev->dev; ret =v4l2_device_register_subdev (vdev, &res->subdev);if (ret <0 ) goto error;
drivers/media/platform/omap3isp/ispstat.c +2 -0
@@ -1026,6 +1026,8 @@ void omap3isp_stat_unregister_entities(struct ispstat *stat)int omap3isp_stat_register_entities (struct ispstat *stat,struct v4l2_device *vdev) { + stat->subdev.dev = vdev->mdev->dev; +return v4l2_device_register_subdev (vdev, &stat->subdev); }
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 234/344 PM / devfreq: passive: fix compiler warning
In reply to Greg Kroah-HartmanFrom: MyungJoo Ham <[email protected]>
[ Upstream commit 0465814831a926ce2f83e8f606d067d86745234e ]
The recent commit of
PM / devfreq: passive: Use non-devm notifiers had incurred compiler warning, "unused variable 'dev'".
--- drivers/devfreq/governor_passive.c | 1 - 1 file changed, 1 deletion(-)
drivers/devfreq/governor_passive.c +0 -1
@@ -149,7 +149,6 @@ static int devfreq_passive_notifier_call(struct notifier_block *nb,static int devfreq_passive_event_handler (struct devfreq *devfreq,unsigned int event,void *data) { -struct device *dev = devfreq->dev.parent;struct devfreq_passive_data *p_data = (struct devfreq_passive_data *)devfreq->data;struct devfreq *parent = (struct devfreq *)p_data->parent;
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 235/344 ARM: dts: logicpd-torpedo-baseboard: Fix missing video
In reply to Greg Kroah-HartmanFrom: Adam Ford <[email protected]>
commit f9f5518a38684e031d913f40482721ff553f5ba2 upstream.
A previous commit removed the panel-dpi driver, which made the Torpedo video stop working because it relied on the dpi driver for setting video timings. Now that the simple-panel driver is available in omap2plus, this patch migrates the Torpedo dev kits to use a similar panel and remove the manual timing requirements.
--- arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi | 37 +++-------------------- 1 file changed, 6 insertions(+), 31 deletions(-)
arch/arm/boot/dts/logicpd-torpedo-baseboard.dtsi +6 -31
@@ -108,7 +108,6 @@ &dss { status = "ok"; vdds_dsi-supply = <&vpll2>; - vdda_video-supply = <&video_reg>; pinctrl-names = "default"; pinctrl-0 = <&dss_dpi_pins1>; port {
@@ -124,44 +123,20 @@ display0 = &lcd0; }; - video_reg: video_reg { - pinctrl-names = "default"; - pinctrl-0 = <&panel_pwr_pins>; - compatible = "regulator-fixed"; - regulator-name = "fixed-supply"; - regulator-min-microvolt = <3300000>; - regulator-max-microvolt = <3300000>; - gpio = <&gpio5 27 GPIO_ACTIVE_HIGH>; /* gpio155, lcd INI */ - }; - lcd0: display { - compatible = "panel-dpi"; + /* This isn't the exact LCD, but the timings meet spec */ + /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ + compatible = "newhaven,nhd-4.3-480272ef-atxl"; label = "15"; - status = "okay"; - /* default-on; */ pinctrl-names = "default"; - + pinctrl-0 = <&panel_pwr_pins>; + backlight = <&bl>; + enable-gpios = <&gpio5 27 GPIO_ACTIVE_HIGH>; port { lcd_in: endpoint { remote-endpoint = <&dpi_out>; }; }; - - panel-timing { - clock-frequency = <9000000>; - hactive = <480>; - vactive = <272>; - hfront-porch = <3>; - hback-porch = <2>; - hsync-len = <42>; - vback-porch = <3>; - vfront-porch = <4>; - vsync-len = <11>; - hsync-active = <0>; - vsync-active = <0>; - de-active = <1>; - pixelclk-active = <1>; - }; }; bl: backlight {
Greg Kroah-Hartman
maintainerPATCH 236/344 ARM: omap2plus_defconfig: Fix missing video
In reply to Greg Kroah-HartmanFrom: Adam Ford <[email protected]>
commit 4957eccf979b025286b39388fd1a60cde601a10a upstream.
When the panel-dpi driver was removed, the simple-panels driver was never enabled, so anyone who used the panel-dpi driver lost video, and those who used it inconjunction with simple-panels would have to manually enable CONFIG_DRM_PANEL_SIMPLE.
This patch makes CONFIG_DRM_PANEL_SIMPLE a module in the same way the deprecated panel-dpi was.
--- arch/arm/configs/omap2plus_defconfig | 1 + 1 file changed, 1 insertion(+)
arch/arm/configs/omap2plus_defconfig +1 -0
@@ -363,6 +363,7 @@ CONFIG_DRM_OMAP_PANEL_TPO_TD028TTEC1=m CONFIG_DRM_OMAP_PANEL_TPO_TD043MTEA1=m CONFIG_DRM_OMAP_PANEL_NEC_NL8048HL11=m CONFIG_DRM_TILCDC=m +CONFIG_DRM_PANEL_SIMPLE=m CONFIG_FB=y CONFIG_FIRMWARE_EDID=y CONFIG_FB_MODE_HELPERS=y
Greg Kroah-Hartman
maintainerPATCH 237/344 iwlwifi: fw: dont send GEO_TX_POWER_LIMIT command to FW version 36
In reply to Greg Kroah-HartmanFrom: Luca Coelho <[email protected]>
commit fddbfeece9c7882cc47754c7da460fe427e3e85b upstream.
The intention was to have the GEO_TX_POWER_LIMIT command in FW version 36 as well, but not all 8000 family got this feature enabled. The 8000 family is the only one using version 36, so skip this version entirely. If we try to send this command to the firmwares that do not support it, we get a BAD_COMMAND response from the firmware.
This fixes https://bugzilla.kernel.org/show_bug.cgi?id=204151.
--- drivers/net/wireless/intel/iwlwifi/mvm/fw.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
drivers/net/wireless/intel/iwlwifi/mvm/fw.c +5 -3
@@ -887,11 +887,13 @@ static bool iwl_mvm_sar_geo_support(stru* firmware versions. Unfortunately, we don't have a TLV API * flag to rely on, so rely on the major version which is in * the first byte of ucode_ver. This was implemented -* initially on version 38 and then backported to 36, 29 and -* 17. +* initially on version 38 and then backported to29 and 17. +* The intention was to have it in 36 as well, but not all +* 8000 family got this feature enabled. The 8000 family is +* the only one using version 36, so skip this version +* entirely. */ return IWL_UCODE_SERIAL (mvm->fw->ucode_ver) >=38 || -IWL_UCODE_SERIAL (mvm->fw->ucode_ver) ==36 ||IWL_UCODE_SERIAL (mvm->fw->ucode_ver) ==29 ||IWL_UCODE_SERIAL (mvm->fw->ucode_ver) ==17 ; }
Greg Kroah-Hartman
maintainerPATCH 238/344 ALSA: firewire-tascam: handle error code when getting current source of clock
In reply to Greg Kroah-HartmanFrom: Takashi Sakamoto <[email protected]>
commit 2617120f4de6d0423384e0e86b14c78b9de84d5a upstream.
The return value of snd_tscm_stream_get_clock() is ignored. This commit checks the value and handle error.
--- sound/firewire/tascam/tascam-pcm.c | 3 +++ 1 file changed, 3 insertions(+)
sound/firewire/tascam/tascam-pcm.c +3 -0
@@ -56,6 +56,9 @@ static int pcm_open(struct snd_pcm_subst goto err_locked; err =snd_tscm_stream_get_clock (tscm, &clock); +if (err <0 ) + goto err_locked; +if (clock !=SND_TSCM_CLOCK_INTERNAL ||amdtp_stream_pcm_running (&tscm->rx_stream) ||amdtp_stream_pcm_running (&tscm->tx_stream)) {
Greg Kroah-Hartman
maintainerPATCH 239/344 ALSA: firewire-tascam: check intermediate state of clock status and retry
In reply to Greg Kroah-HartmanFrom: Takashi Sakamoto <[email protected]>
commit e1a00b5b253a4f97216b9a33199a863987075162 upstream.
2 bytes in MSB of register for clock status is zero during intermediate state after changing status of sampling clock in models of TASCAM FireWire series. The duration of this state differs depending on cases. During the state, it's better to retry reading the register for current status of the clock.
In current implementation, the intermediate state is checked only when getting current sampling transmission frequency, then retry reading. This care is required for the other operations to read the register.
This commit moves the codes of check and retry into helper function commonly used for operations to read the register.
--- sound/firewire/tascam/tascam-stream.c | 42 ++++++++++++++++++++++------------ 1 file changed, 28 insertions(+), 14 deletions(-)
sound/firewire/tascam/tascam-stream.c +28 -14
@@ -8,20 +8,37 @@#include <linux/delay.h> #include "tascam.h" +#define CLOCK_STATUS_MASK 0xffff0000 +#define CLOCK_CONFIG_MASK 0x0000ffff +#define CALLBACK_TIMEOUT 500static int get_clock (struct snd_tscm *tscm,u32 *data) { +int trial =0 ;__be32 reg;int err; - err =snd_fw_transaction (tscm->unit,TCODE_READ_QUADLET_REQUEST , -TSCM_ADDR_BASE +TSCM_OFFSET_CLOCK_STATUS , - ®,sizeof (reg),0 ); -if (err >=0 ) +while (trial++ <5 ) { + err =snd_fw_transaction (tscm->unit,TCODE_READ_QUADLET_REQUEST , +TSCM_ADDR_BASE +TSCM_OFFSET_CLOCK_STATUS , + ®,sizeof (reg),0 ); +if (err <0 ) +return err; + *data =be32_to_cpu (reg); +if (*data &CLOCK_STATUS_MASK ) +break ; + +// In intermediate state after changing clock status. +msleep (50 ); + } -return err; +// Still in the intermediate state. +if (trial >=5 ) +return -EAGAIN ; + +return 0 ; } static int set_clock(struct snd_tscm *tscm, unsigned int rate,
@@ -34,7 +51,7 @@ static int set_clock(struct snd_tscm *ts err =get_clock (tscm, &data);if (err <0 )return err; - data &=0x0000ffff ; + data &=CLOCK_CONFIG_MASK ;if (rate >0 ) { data &=0x000000ff ;
@@ -79,17 +96,14 @@ static int set_clock(struct snd_tscm *tsint snd_tscm_stream_get_rate (struct snd_tscm *tscm,unsigned int *rate) { -u32 data =0x0 ; -unsigned int trials =0 ; +u32 data;int err; -while (data ==0x0 || trials++ <5 ) { - err =get_clock (tscm, &data); -if (err <0 ) -return err; + err =get_clock (tscm, &data); +if (err <0 ) +return err; - data = (data &0xff000000 ) >>24 ; - } + data = (data &0xff000000 ) >>24 ;/* Check base rate. */ if ((data &0x0f ) ==0x01 )
Greg Kroah-Hartman
maintainerPATCH 240/344 scsi: scsi_dh_rdac: zero cdb in send_mode_select()
In reply to Greg Kroah-HartmanFrom: Martin Wilck <[email protected]>
commit 57adf5d4cfd3198aa480e7c94a101fc8c4e6109d upstream.
cdb in send_mode_select() is not zeroed and is only partially filled in rdac_failover_get(), which leads to some random data getting to the device. Users have reported storage responding to such commands with INVALID FIELD IN CDB. Code before commit 327825574132 was not affected, as it called blk_rq_set_block_pc().
Fix this by zeroing out the cdb first.
Identified & fix proposed by HPE.
--- drivers/scsi/device_handler/scsi_dh_rdac.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/scsi/device_handler/scsi_dh_rdac.c +2 -0
@@ -546,6 +546,8 @@ static void send_mode_select(struct workspin_unlock (&ctlr->ms_lock); retry: +memset (cdb,0 ,sizeof (cdb)); + data_size =rdac_failover_get (ctlr, &list, cdb); RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
Greg Kroah-Hartman
maintainerPATCH 241/344 scsi: qla2xxx: Fix Relogin to prevent modifying scan_state flag
In reply to Greg Kroah-HartmanFrom: Quinn Tran <[email protected]>
commit 8b5292bcfcacf15182a77a973a98d310e76fd58b upstream.
Relogin fails to move forward due to scan_state flag indicating device is not there. Before relogin process, Session delete process accidently modified the scan_state flag.
[mkp: typos plus corrected Fixes: sha as reported by sfr]
--- drivers/scsi/qla2xxx/qla_init.c | 25 ++++++++++++++++++++----- drivers/scsi/qla2xxx/qla_os.c | 1 + drivers/scsi/qla2xxx/qla_target.c | 1 - 3 files changed, 21 insertions(+), 6 deletions(-)
drivers/scsi/qla2xxx/qla_init.c +20 -5
@@ -289,8 +289,13 @@ qla2x00_async_login(struct scsi_qla_hoststruct srb_iocb *lio;int rval =QLA_FUNCTION_FAILED ; -if (!vha->flags.online) - goto done; +if (!vha->flags.online || (fcport->flags &FCF_ASYNC_SENT ) || + fcport->loop_id ==FC_NO_LOOP_ID ) { +ql_log (ql_log_warn, vha,0xffff , +"%s: %8phC - not sending command.\n" , + __func__, fcport->port_name); +return rval; + } sp =qla2x00_get_sp (vha, fcport,GFP_KERNEL );if (!sp)
@@ -1262,8 +1267,13 @@ int qla24xx_async_gpdb(struct scsi_qla_hstruct port_database_24xx *pd;struct qla_hw_data *ha = vha->hw; -if (!vha->flags.online || (fcport->flags &FCF_ASYNC_SENT )) +if (!vha->flags.online || (fcport->flags &FCF_ASYNC_SENT ) || + fcport->loop_id ==FC_NO_LOOP_ID ) { +ql_log (ql_log_warn, vha,0xffff , +"%s: %8phC - not sending command.\n" , + __func__, fcport->port_name);return rval; + } fcport->disc_state =DSC_GPDB ;
@@ -1953,8 +1963,11 @@ qla24xx_handle_plogi_done_event(struct sreturn ; } -if (fcport->disc_state ==DSC_DELETE_PEND ) +if ((fcport->disc_state ==DSC_DELETE_PEND ) || + (fcport->disc_state ==DSC_DELETED )) { +set_bit (RELOGIN_NEEDED , &vha->dpc_flags);return ; + }if (ea->sp->gen2 != fcport->login_gen) {/* target side must have changed it. */
@@ -6698,8 +6711,10 @@ qla2x00_abort_isp_cleanup(scsi_qla_host_ }/* Clear all async request states across all VPs. */ -list_for_each_entry (fcport, &vha->vp_fcports, list) +list_for_each_entry (fcport, &vha->vp_fcports, list) { fcport->flags &= ~(FCF_LOGIN_NEEDED |FCF_ASYNC_SENT ); + fcport->scan_state =0 ; + }spin_lock_irqsave (&ha->vport_slock, flags);list_for_each_entry (vp, &ha->vp_list, list) {atomic_inc (&vp->vref_count);
drivers/scsi/qla2xxx/qla_os.c +1 -0
@@ -5086,6 +5086,7 @@ void qla24xx_create_new_sess(struct scsiif (fcport) { fcport->id_changed =1 ; fcport->scan_state =QLA_FCPORT_FOUND ; + fcport->chip_reset = vha->hw->base_qpair->chip_reset;memcpy (fcport->node_name, e->u.new_sess.node_name,WWN_SIZE );if (pla) {
drivers/scsi/qla2xxx/qla_target.c +0 -1
@@ -1209,7 +1209,6 @@ static void qla24xx_chk_fcp_state(struct sess->logout_on_delete =0 ; sess->logo_ack_needed =0 ; sess->fw_login_state =DSC_LS_PORT_UNAVAIL ; - sess->scan_state =0 ; } }
Greg Kroah-Hartman
maintainerPATCH 242/344 printk: Do not lose last line in kmsg buffer dump
In reply to Greg Kroah-HartmanFrom: Vincent Whitchurch <[email protected]>
commit c9dccacfccc72c32692eedff4a27a4b0833a2afd upstream.
kmsg_dump_get_buffer() is supposed to select all the youngest log messages which fit into the provided buffer. It determines the correct start index by using msg_print_text() with a NULL buffer to calculate the size of each entry. However, when performing the actual writes, msg_print_text() only writes the entry to the buffer if the written len is lesser than the size of the buffer. So if the lengths of the selected youngest log messages happen to precisely fill up the provided buffer, the last log message is not included.
We don't want to modify msg_print_text() to fill up the buffer and start returning a length which is equal to the size of the buffer, since callers of its other users, such as kmsg_dump_get_line(), depend upon the current behaviour.
Instead, fix kmsg_dump_get_buffer() to compensate for this.
For example, with the following two final prints:
[ 6.427502] AAAAAAAAAAAAA [ 6.427769] BBBBBBBB12345
A dump of a 64-byte buffer filled by kmsg_dump_get_buffer(), before this patch:
00000000: 3c 30 3e 5b 20 20 20 20 36 2e 35 32 32 31 39 37 <0>[ 6.522197 00000010: 5d 20 41 41 41 41 41 41 41 41 41 41 41 41 41 0a ] AAAAAAAAAAAAA. 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
After this patch:
00000000: 3c 30 3e 5b 20 20 20 20 36 2e 34 35 36 36 37 38 <0>[ 6.456678 00000010: 5d 20 42 42 42 42 42 42 42 42 31 32 33 34 35 0a ] BBBBBBBB12345. 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 00000030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
--- kernel/printk/printk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
kernel/printk/printk.c +1 -1
@@ -3274,7 +3274,7 @@ bool kmsg_dump_get_buffer(struct kmsg_du/* move first record forward until length fits into the buffer */ seq = dumper->cur_seq; idx = dumper->cur_idx; -while (l > size && seq < dumper->next_seq) { +while (l >= size && seq < dumper->next_seq) {struct printk_log *msg =log_from_idx (idx); l -=msg_print_text (msg, true, time,NULL ,0 );
Greg Kroah-Hartman
maintainerPATCH 243/344 IB/mlx5: Free mpi in mp_slave mode
In reply to Greg Kroah-HartmanFrom: Danit Goldberg <[email protected]>
commit 5d44adebbb7e785939df3db36ac360f5e8b73e44 upstream.
ib_add_slave_port() allocates a multiport struct but never frees it. Don't leak memory, free the allocated mpi struct during driver unload.
--- drivers/infiniband/hw/mlx5/main.c | 1 + 1 file changed, 1 insertion(+)
drivers/infiniband/hw/mlx5/main.c +1 -0
@@ -6959,6 +6959,7 @@ static void mlx5_ib_remove(struct mlx5_cmlx5_ib_unbind_slave_port (mpi->ibdev, mpi);list_del (&mpi->list);mutex_unlock (&mlx5_ib_multiport_mutex); +kfree (mpi);return ; }
Greg Kroah-Hartman
maintainerPATCH 244/344 IB/hfi1: Define variables as unsigned long to fix KASAN warning
In reply to Greg Kroah-HartmanFrom: Ira Weiny <[email protected]>
commit f8659d68e2bee5b86a1beaf7be42d942e1fc81f4 upstream.
Define the working variables to be unsigned long to be compatible with for_each_set_bit and change types as needed.
While we are at it remove unused variables from a couple of functions.
This was found because of the following KASAN warning:
==================================================================
BUG: KASAN: stack-out-of-bounds in find_first_bit+0x19/0x70
Read of size 8 at addr ffff888362d778d0 by task kworker/u308:2/1889
CPU: 21 PID: 1889 Comm: kworker/u308:2 Tainted: G W 5.3.0-rc2-mm1+ #2
Hardware name: Intel Corporation W2600CR/W2600CR, BIOS SE5C600.86B.02.04.0003.102320141138 10/23/2014
Workqueue: ib-comp-unb-wq ib_cq_poll_work [ib_core]
Call Trace:
dump_stack+0x9a/0xf0
? find_first_bit+0x19/0x70
print_address_description+0x6c/0x332
? find_first_bit+0x19/0x70
? find_first_bit+0x19/0x70
__kasan_report.cold.6+0x1a/0x3b
? find_first_bit+0x19/0x70
kasan_report+0xe/0x12
find_first_bit+0x19/0x70
pma_get_opa_portstatus+0x5cc/0xa80 [hfi1]
? ret_from_fork+0x3a/0x50
? pma_get_opa_port_ectrs+0x200/0x200 [hfi1]
? stack_trace_consume_entry+0x80/0x80
hfi1_process_mad+0x39b/0x26c0 [hfi1]
? __lock_acquire+0x65e/0x21b0
? clear_linkup_counters+0xb0/0xb0 [hfi1]
? check_chain_key+0x1d7/0x2e0
? lock_downgrade+0x3a0/0x3a0
? match_held_lock+0x2e/0x250
ib_mad_recv_done+0x698/0x15e0 [ib_core]
? clear_linkup_counters+0xb0/0xb0 [hfi1]
? ib_mad_send_done+0xc80/0xc80 [ib_core]
? mark_held_locks+0x79/0xa0
? _raw_spin_unlock_irqrestore+0x44/0x60
? rvt_poll_cq+0x1e1/0x340 [rdmavt]
__ib_process_cq+0x97/0x100 [ib_core]
ib_cq_poll_work+0x31/0xb0 [ib_core]
process_one_work+0x4ee/0xa00
? pwq_dec_nr_in_flight+0x110/0x110
? do_raw_spin_lock+0x113/0x1d0
worker_thread+0x57/0x5a0
? process_one_work+0xa00/0xa00
kthread+0x1bb/0x1e0
? kthread_create_on_node+0xc0/0xc0
ret_from_fork+0x3a/0x50
The buggy address belongs to the page:
page:ffffea000d8b5dc0 refcount:0 mapcount:0 mapping:0000000000000000 index:0x0
flags: 0x17ffffc0000000()
raw: 0017ffffc0000000 0000000000000000 ffffea000d8b5dc8 0000000000000000
raw: 0000000000000000 0000000000000000 00000000ffffffff 0000000000000000
page dumped because: kasan: bad access detected addr ffff888362d778d0 is located in stack of task kworker/u308:2/1889 at offset 32 in frame:
pma_get_opa_portstatus+0x0/0xa80 [hfi1]
this frame has 1 object:
[32, 36) 'vl_select_mask'
Memory state around the buggy address:
ffff888362d77780: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff888362d77800: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
>ffff888362d77880: 00 00 00 00 00 00 f1 f1 f1 f1 04 f2 f2 f2 00 00
^
ffff888362d77900: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
ffff888362d77980: 00 00 00 00 00 00 00 00 f1 f1 f1 f1 04 f2 f2 f2==================================================================
--- drivers/infiniband/hw/hfi1/mad.c | 45 ++++++++++++++++----------------------- 1 file changed, 19 insertions(+), 26 deletions(-)
drivers/infiniband/hw/hfi1/mad.c +19 -26
@@ -2326,7 +2326,7 @@ struct opa_port_status_req {__be32 vl_select_mask; }; -#define VL_MASK_ALL 0x000080ff +#define VL_MASK_ALL 0x00000000000080ffULstruct opa_port_status_rsp {__u8 port_num;
@@ -2625,15 +2625,14 @@ static int pma_get_opa_classportinfo(str }static void a0_portstatus (struct hfi1_pportdata *ppd, -struct opa_port_status_rsp *rsp,u32 vl_select_mask) +struct opa_port_status_rsp *rsp) {if (!is_bx (ppd->dd)) {unsigned long vl;u64 sum_vl_xmit_wait =0 ; -u32 vl_all_mask =VL_MASK_ALL ; +unsigned long vl_all_mask =VL_MASK_ALL ; -for_each_set_bit (vl, (unsigned long *)&(vl_all_mask), -8 *sizeof (vl_all_mask)) { +for_each_set_bit (vl, &vl_all_mask,BITS_PER_LONG ) {u64 tmp = sum_vl_xmit_wait +read_port_cntr (ppd,C_TX_WAIT_VL ,idx_from_vl (vl));
@@ -2730,12 +2729,12 @@ static int pma_get_opa_portstatus(struct (struct opa_port_status_req *)pmp->data;struct hfi1_devdata *dd =dd_from_ibdev (ibdev);struct opa_port_status_rsp *rsp; -u32 vl_select_mask =be32_to_cpu (req->vl_select_mask); +unsigned long vl_select_mask =be32_to_cpu (req->vl_select_mask);unsigned long vl;size_t response_data_size;u32 nports =be32_to_cpu (pmp->mad_hdr.attr_mod) >>24 ;u8 port_num = req->port_num; -u8 num_vls =hweight32 (vl_select_mask); +u8 num_vls =hweight64 (vl_select_mask);struct _vls_pctrs *vlinfo;struct hfi1_ibport *ibp =to_iport (ibdev, port);struct hfi1_pportdata *ppd =ppd_from_ibp (ibp);
@@ -2770,7 +2769,7 @@ static int pma_get_opa_portstatus(structhfi1_read_link_quality (dd, &rsp->link_quality_indicator); - rsp->vl_select_mask =cpu_to_be32 (vl_select_mask); + rsp->vl_select_mask =cpu_to_be32 ((u32 )vl_select_mask); rsp->port_xmit_data =cpu_to_be64 (read_dev_cntr (dd,C_DC_XMIT_FLITS ,CNTR_INVALID_VL )); rsp->port_rcv_data = cpu_to_be64(read_dev_cntr(dd, C_DC_RCV_FLITS,
@@ -2841,8 +2840,7 @@ static int pma_get_opa_portstatus(struct* So in the for_each_set_bit() loop below, we don't need * any additional checks for vl. */ -for_each_set_bit (vl, (unsigned long *)&(vl_select_mask), -8 *sizeof (vl_select_mask)) { +for_each_set_bit (vl, &vl_select_mask,BITS_PER_LONG ) {memset (vlinfo,0 ,sizeof (*vlinfo)); tmp =read_dev_cntr (dd,C_DC_RX_FLIT_VL ,idx_from_vl (vl));
@@ -2883,7 +2881,7 @@ static int pma_get_opa_portstatus(struct vfi++; } -a0_portstatus (ppd, rsp, vl_select_mask); +a0_portstatus (ppd, rsp);if (resp_len) *resp_len += response_data_size;
@@ -2930,16 +2928,14 @@ static u64 get_error_counter_summary(strreturn error_counter_summary; } -static void a0_datacounters (struct hfi1_pportdata *ppd,struct _port_dctrs *rsp, -u32 vl_select_mask) +static void a0_datacounters (struct hfi1_pportdata *ppd,struct _port_dctrs *rsp) {if (!is_bx (ppd->dd)) {unsigned long vl;u64 sum_vl_xmit_wait =0 ; -u32 vl_all_mask =VL_MASK_ALL ; +unsigned long vl_all_mask =VL_MASK_ALL ; -for_each_set_bit (vl, (unsigned long *)&(vl_all_mask), -8 *sizeof (vl_all_mask)) { +for_each_set_bit (vl, &vl_all_mask,BITS_PER_LONG ) {u64 tmp = sum_vl_xmit_wait +read_port_cntr (ppd,C_TX_WAIT_VL ,idx_from_vl (vl));
@@ -2994,7 +2990,7 @@ static int pma_get_opa_datacounters(struu64 port_mask;u8 port_num;unsigned long vl; -u32 vl_select_mask; +unsigned long vl_select_mask;int vfi;u16 link_width;u16 link_speed;
@@ -3071,8 +3067,7 @@ static int pma_get_opa_datacounters(stru* So in the for_each_set_bit() loop below, we don't need * any additional checks for vl. */ -for_each_set_bit (vl, (unsigned long *)&(vl_select_mask), -8 *sizeof (req->vl_select_mask)) { +for_each_set_bit (vl, &vl_select_mask,BITS_PER_LONG ) {memset (vlinfo,0 ,sizeof (*vlinfo)); rsp->vls[vfi].port_vl_xmit_data =
@@ -3120,7 +3115,7 @@ static int pma_get_opa_datacounters(stru vfi++; } -a0_datacounters (ppd, rsp, vl_select_mask); +a0_datacounters (ppd, rsp);if (resp_len) *resp_len += response_data_size;
@@ -3215,7 +3210,7 @@ static int pma_get_opa_porterrors(structstruct _vls_ectrs *vlinfo;unsigned long vl;u64 port_mask, tmp; -u32 vl_select_mask; +unsigned long vl_select_mask;int vfi; req = (struct opa_port_error_counters64_msg *)pmp->data;
@@ -3273,8 +3268,7 @@ static int pma_get_opa_porterrors(struct vlinfo = &rsp->vls[0 ]; vfi =0 ; vl_select_mask =be32_to_cpu (req->vl_select_mask); -for_each_set_bit (vl, (unsigned long *)&(vl_select_mask), -8 *sizeof (req->vl_select_mask)) { +for_each_set_bit (vl, &vl_select_mask,BITS_PER_LONG ) {memset (vlinfo,0 ,sizeof (*vlinfo)); rsp->vls[vfi].port_vl_xmit_discards = cpu_to_be64(read_port_cntr(ppd, C_SW_XMIT_DSCD_VL,
@@ -3485,7 +3479,7 @@ static int pma_set_opa_portstatus(structu32 nports =be32_to_cpu (pmp->mad_hdr.attr_mod) >>24 ;u64 portn =be64_to_cpu (req->port_select_mask[3 ]);u32 counter_select =be32_to_cpu (req->counter_select_mask); -u32 vl_select_mask =VL_MASK_ALL ;/* clear all per-vl cnts */ +unsigned long vl_select_mask =VL_MASK_ALL ;/* clear all per-vl cnts */ unsigned long vl;if ((nports !=1 ) || (portn !=1 << port)) {
@@ -3579,8 +3573,7 @@ static int pma_set_opa_portstatus(structif (counter_select &CS_UNCORRECTABLE_ERRORS )write_dev_cntr (dd,C_DC_UNC_ERR ,CNTR_INVALID_VL ,0 ); -for_each_set_bit (vl, (unsigned long *)&(vl_select_mask), -8 *sizeof (vl_select_mask)) { +for_each_set_bit (vl, &vl_select_mask,BITS_PER_LONG ) {if (counter_select &CS_PORT_XMIT_DATA )write_port_cntr (ppd,C_TX_FLIT_VL ,idx_from_vl (vl),0 );
Greg Kroah-Hartman
maintainerPATCH 245/344 IB/hfi1: Do not update hcrc for a KDETH packet during fault injection
In reply to Greg Kroah-HartmanFrom: Kaike Wan <[email protected]>
commit b2590bdd0b1dfb91737e6cb07ebb47bd74957f7e upstream.
When a KDETH packet is subject to fault injection during transmission, HCRC is supposed to be omitted from the packet so that the hardware on the receiver side would drop the packet. When creating pbc, the PbcInsertHcrc field is set to be PBC_IHCRC_NONE if the KDETH packet is subject to fault injection, but overwritten with PBC_IHCRC_LKDETH when update_hcrc() is called later.
This problem is fixed by not calling update_hcrc() when the packet is subject to fault injection.
--- drivers/infiniband/hw/hfi1/verbs.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-)
drivers/infiniband/hw/hfi1/verbs.c +9 -8
@@ -874,16 +874,17 @@ int hfi1_verbs_send_dma(struct rvt_qp *qelse pbc |= (ib_is_sc5 (sc5) <<PBC_DC_INFO_SHIFT ); -if (unlikely (hfi1_dbg_should_fault_tx (qp, ps->opcode))) - pbc =hfi1_fault_tx (qp, ps->opcode, pbc); pbc =create_pbc (ppd, pbc, qp->srate_mbps, vl, plen); -/* Update HCRC based on packet opcode */ - pbc =update_hcrc (ps->opcode, pbc); +if (unlikely (hfi1_dbg_should_fault_tx (qp, ps->opcode))) + pbc =hfi1_fault_tx (qp, ps->opcode, pbc); +else +/* Update HCRC based on packet opcode */ + pbc =update_hcrc (ps->opcode, pbc); } tx->wqe = qp->s_wqe; ret =build_verbs_tx_desc (tx->sde, len, tx, ahg_info, pbc);
@@ -1030,12 +1031,12 @@ int hfi1_verbs_send_pio(struct rvt_qp *qelse pbc |= (ib_is_sc5 (sc5) <<PBC_DC_INFO_SHIFT ); + pbc =create_pbc (ppd, pbc, qp->srate_mbps, vl, plen);if (unlikely (hfi1_dbg_should_fault_tx (qp, ps->opcode))) pbc =hfi1_fault_tx (qp, ps->opcode, pbc); - pbc =create_pbc (ppd, pbc, qp->srate_mbps, vl, plen); - -/* Update HCRC based on packet opcode */ - pbc =update_hcrc (ps->opcode, pbc); +else +/* Update HCRC based on packet opcode */ + pbc =update_hcrc (ps->opcode, pbc); }if (cb)iowait_pio_inc (&priv->s_iowait);
Greg Kroah-Hartman
maintainerPATCH 246/344 RDMA: Fix double-free in srq creation error flow
In reply to Greg Kroah-HartmanFrom: Jack Morgenstein <[email protected]>
commit 3eca7fc2d8d1275d9cf0c709f0937becbfcf6d96 upstream.
The cited commit introduced a double-free of the srq buffer in the error flow of procedure __uverbs_create_xsrq().
The problem is that ib_destroy_srq_user() called in the error flow also frees the srq buffer.
Thus, if uverbs_response() fails in __uverbs_create_srq(), the srq buffer will be freed twice.
--- drivers/infiniband/core/uverbs_cmd.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/infiniband/core/uverbs_cmd.c +2 -1
@@ -3484,7 +3484,8 @@ static int __uverbs_create_xsrq(struct u err_copy:ib_destroy_srq_user (srq,uverbs_get_cleared_udata (attrs)); - +/* It was released in ib_destroy_srq_user */ + srq =NULL ; err_free:kfree (srq); err_put:
Greg Kroah-Hartman
maintainerPATCH 247/344 randstruct: Check member structs in is_pure_ops_struct()
In reply to Greg Kroah-HartmanFrom: Joonwon Kang <[email protected]>
commit 60f2c82ed20bde57c362e66f796cf9e0e38a6dbb upstream.
While no uses in the kernel triggered this case, it was possible to have a false negative where a struct contains other structs which contain only function pointers because of unreachable code in is_pure_ops_struct().
--- scripts/gcc-plugins/randomize_layout_plugin.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
scripts/gcc-plugins/randomize_layout_plugin.c +5 -5
@@ -443,13 +443,13 @@ static int is_pure_ops_struct(const_treeif (node == fieldtype)continue ; -if (!is_fptr (fieldtype)) -return 0 ; - -if (code !=RECORD_TYPE && code !=UNION_TYPE ) +if (code ==RECORD_TYPE || code ==UNION_TYPE ) { +if (!is_pure_ops_struct (fieldtype)) +return 0 ;continue ; + } -if (!is_pure_ops_struct (fieldtype)) +if (!is_fptr (fieldtype))return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 248/344 ARM: dts: am3517-evm: Fix missing video
In reply to Greg Kroah-HartmanFrom: Adam Ford <[email protected]>
commit 24cf23276a54dd2825d3e3965c1b1b453e2a113d upstream.
A previous commit removed the panel-dpi driver, which made the video on the AM3517-evm stop working because it relied on the dpi driver for setting video timings. Now that the simple-panel driver is available in omap2plus, this patch migrates the am3517-evm to use a similar panel and remove the manual timing requirements.
--- arch/arm/boot/dts/am3517-evm.dts | 23 ++++------------------- 1 file changed, 4 insertions(+), 19 deletions(-)
arch/arm/boot/dts/am3517-evm.dts +4 -19
@@ -124,10 +124,11 @@ }; lcd0: display@0 { - compatible = "panel-dpi"; + /* This isn't the exact LCD, but the timings meet spec */ + /* To make it work, set CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK=4 */ + compatible = "newhaven,nhd-4.3-480272ef-atxl"; label = "15"; - status = "okay"; - pinctrl-names = "default"; + backlight = <&bl>; enable-gpios = <&gpio6 16 GPIO_ACTIVE_HIGH>; /* gpio176, lcd INI */ vcc-supply = <&vdd_io_reg>;
@@ -136,22 +137,6 @@ remote-endpoint = <&dpi_out>; }; }; - - panel-timing { - clock-frequency = <9000000>; - hactive = <480>; - vactive = <272>; - hfront-porch = <3>; - hback-porch = <2>; - hsync-len = <42>; - vback-porch = <3>; - vfront-porch = <4>; - vsync-len = <11>; - hsync-active = <0>; - vsync-active = <0>; - de-active = <1>; - pixelclk-active = <1>; - }; }; bl: backlight {
Greg Kroah-Hartman
maintainerPATCH 249/344 rcu/tree: Fix SCHED_FIFO params
In reply to Greg Kroah-HartmanFrom: Peter Zijlstra <[email protected]>
[ Upstream commit 130d9c331bc59a8733b47c58ef197a2b1fa3ed43 ]
A rather embarrasing mistake had us call sched_setscheduler() before initializing the parameters passed to it.
--- kernel/rcu/tree.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
kernel/rcu/tree.c +3 -3
@@ -3234,13 +3234,13 @@ static int __init rcu_spawn_gp_kthread(void) t =kthread_create (rcu_gp_kthread,NULL ,"%s" , rcu_state.name);if (WARN_ONCE (IS_ERR (t),"%s: Could not start grace-period kthread, OOM is now expected behavior\n" , __func__))return 0 ; -if (kthread_prio) +if (kthread_prio) { + sp.sched_priority = kthread_prio;sched_setscheduler_nocheck (t,SCHED_FIFO , &sp); + } rnp =rcu_get_root ();raw_spin_lock_irqsave_rcu_node (rnp, flags); rcu_state.gp_kthread = t; -if (kthread_prio) - sp.sched_priority = kthread_prio;raw_spin_unlock_irqrestore_rcu_node (rnp, flags);wake_up_process (t);rcu_spawn_nocb_kthreads ();
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 250/344 ALSA: hda/realtek - PCI quirk for Medion E4254
In reply to Greg Kroah-HartmanFrom: Jan-Marek Glogowski <[email protected]>
[ Upstream commit bd9c10bc663dd2eaac8fe39dad0f18cd21527446 ]
The laptop has a combined jack to attach headsets on the right. The BIOS encodes them as two different colored jacks at the front, but otherwise it seems to be configured ok. But any adaption of the pins config on its own doesn't fix the jack detection to work in Linux. Still Windows works correct.
This is somehow fixed by chaining ALC256_FIXUP_ASUS_HEADSET_MODE, which seems to register the microphone jack as a headset part and also results in fixing jack sensing, visible in dmesg as:
-snd_hda_codec_realtek hdaudioC0D0: Mic=0x19
+snd_hda_codec_realtek hdaudioC0D0: Headset Mic=0x19
[ Actually the essential change is the location of the jack; the
driver created "Front Mic Jack" without the matching volume / mute control element due to its jack location, which confused PA. -- tiwai ]
--- sound/pci/hda/patch_realtek.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
sound/pci/hda/patch_realtek.c +13 -0
@@ -5870,6 +5870,7 @@ enum {ALC256_FIXUP_ASUS_MIC_NO_PRESENCE ,ALC299_FIXUP_PREDATOR_SPK ,ALC294_FIXUP_ASUS_INTSPK_HEADSET_MIC , + ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, }; static const struct hda_fixup alc269_fixups[] = {
@@ -6926,6 +6927,16 @@ static const struct hda_fixup alc269_fixups[] = { .chained = true, .chain_id =ALC269_FIXUP_HEADSET_MODE_NO_HP_MIC }, + [ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE] = { + .type = HDA_FIXUP_PINS, + .v.pins = (const struct hda_pintbl []) { + {0x19 ,0x04a11040 }, + {0x21 ,0x04211020 }, + { } + }, + .chained = true, + .chain_id =ALC256_FIXUP_ASUS_HEADSET_MODE + }, };static const struct snd_pci_quirk alc269_fixup_tbl[] = {
@@ -7189,6 +7200,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {SND_PCI_QUIRK (0x17aa ,0x9e54 ,"LENOVO NB" ,ALC269_FIXUP_LENOVO_EAPD ),SND_PCI_QUIRK (0x19e5 ,0x3204 ,"Huawei MACH-WX9" ,ALC256_FIXUP_HUAWEI_MACH_WX9_PINS ),SND_PCI_QUIRK (0x1b7d ,0xa831 ,"Ordissimo EVE2 " ,ALC269VB_FIXUP_ORDISSIMO_EVE2 ),/* Also known as Malata PC-B1303 */ +SND_PCI_QUIRK (0x10ec ,0x118c ,"Medion EE4254 MD62100" ,ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE ), #if 0/* Below is a quirk table taken from the old code.
@@ -7357,6 +7369,7 @@ static const struct hda_model_fixup alc269_fixup_models[] = { {.id = ALC295_FIXUP_CHROME_BOOK, .name = "alc-chrome-book"}, {.id = ALC299_FIXUP_PREDATOR_SPK, .name = "predator-spk"}, {.id = ALC298_FIXUP_HUAWEI_MBX_STEREO, .name = "huawei-mbx-stereo"}, + {.id = ALC256_FIXUP_MEDION_HEADSET_NO_PRESENCE, .name = "alc256-medion-headset"}, {} };#define ALC225_STANDARD_PINS \
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 251/344 blk-mq: add callback of .cleanup_rq
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
[ Upstream commit 226b4fc75c78f9c497c5182d939101b260cfb9f3 ]
SCSI maintains its own driver private data hooked off of each SCSI request, and the pridate data won't be freed after scsi_queue_rq() returns BLK_STS_RESOURCE or BLK_STS_DEV_RESOURCE. An upper layer driver (e.g. dm-rq) may need to retry these SCSI requests, before SCSI has fully dispatched them, due to a lower level SCSI driver's resource limitation identified in scsi_queue_rq(). Currently SCSI's per-request private data is leaked when the upper layer driver (dm-rq) frees and then retries these requests in response to BLK_STS_RESOURCE or BLK_STS_DEV_RESOURCE returns from scsi_queue_rq().
This usecase is so specialized that it doesn't warrant training an existing blk-mq interface (e.g. blk_mq_free_request) to allow SCSI to account for freeing its driver private data -- doing so would add an extra branch for handling a special case that all other consumers of SCSI (and blk-mq) won't ever need to worry about.
So the most pragmatic way forward is to delegate freeing SCSI driver private data to the upper layer driver (dm-rq). Do so by adding new .cleanup_rq callback and calling a new blk_mq_cleanup_rq() method from dm-rq. A following commit will implement the .cleanup_rq() hook in scsi_mq_ops.
--- drivers/md/dm-rq.c | 1 + include/linux/blk-mq.h | 13 +++++++++++++ 2 files changed, 14 insertions(+)
drivers/md/dm-rq.c +1 -0
@@ -408,6 +408,7 @@ static int map_request(struct dm_rq_target_io *tio) ret =dm_dispatch_clone_request (clone, rq);if (ret ==BLK_STS_RESOURCE || ret ==BLK_STS_DEV_RESOURCE ) {blk_rq_unprep_clone (clone); +blk_mq_cleanup_rq (clone); tio->ti->type->release_clone_rq (clone, &tio->info); tio->clone =NULL ;return DM_MAPIO_REQUEUE ;
include/linux/blk-mq.h +13 -0
@@ -140,6 +140,7 @@ typedef int (poll_fn)(struct blk_mq_hw_ctx *);typedef int (map_queues_fn )(struct blk_mq_tag_set *set);typedef bool (busy_fn )(struct request_queue *);typedef void (complete_fn )(struct request *); +typedef void (cleanup_rq_fn )(struct request *);struct blk_mq_ops {
@@ -200,6 +201,12 @@ struct blk_mq_ops {/* Called from inside blk_get_request() */ void (*initialize_rq_fn)(struct request *rq); +/* +* Called before freeing one request which isn't completed yet, +* and usually for freeing the driver private data +*/ +cleanup_rq_fn *cleanup_rq; +/* * If set, returns whether or not this queue currently is busy */
@@ -366,4 +373,10 @@ static inline blk_qc_t request_to_qc_t(struct blk_mq_hw_ctx *hctx, BLK_QC_T_INTERNAL; } +static inline void blk_mq_cleanup_rq (struct request *rq) +{ +if (rq->q->mq_ops->cleanup_rq) + rq->q->mq_ops->cleanup_rq (rq); +} +#endif
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 252/344 scsi: implement .cleanup_rq callback
In reply to Greg Kroah-HartmanFrom: Ming Lei <[email protected]>
[ Upstream commit b7e9e1fb7a9227be34ad4a5e778022c3164494cf ]
Implement .cleanup_rq() callback for freeing driver private part of the request. Then we can avoid to leak this part if the request isn't completed by SCSI, and freed by blk-mq or upper layer(such as dm-rq) finally.
--- drivers/scsi/scsi_lib.c | 13 +++++++++++++ 1 file changed, 13 insertions(+)
drivers/scsi/scsi_lib.c +13 -0
@@ -1089,6 +1089,18 @@ static void scsi_initialize_rq(struct request *rq) cmd->retries =0 ; } +/* +* Only called when the request isn't completed by SCSI, and not freed by +* SCSI +*/ +static void scsi_cleanup_rq (struct request *rq) +{ +if (rq->rq_flags &RQF_DONTPREP ) { +scsi_mq_uninit_cmd (blk_mq_rq_to_pdu (rq)); + rq->rq_flags &= ~RQF_DONTPREP ; + } +} +/* Add a command to the list used by the aacraid and dpt_i2o drivers */ void scsi_add_cmd_to_list (struct scsi_cmnd *cmd) {
@@ -1821,6 +1833,7 @@ static const struct blk_mq_ops scsi_mq_ops = { .init_request = scsi_mq_init_request, .exit_request = scsi_mq_exit_request, .initialize_rq_fn = scsi_initialize_rq, + .cleanup_rq = scsi_cleanup_rq, .busy = scsi_mq_lld_busy, .map_queues = scsi_map_queues, };
Signature · 1 line
2.20.1
Greg Kroah-Hartman
maintainerPATCH 253/344 powerpc/imc: Dont create debugfs files for cpu-less nodes
In reply to Greg Kroah-HartmanFrom: Madhavan Srinivasan <[email protected]>
commit 41ba17f20ea835c489e77bd54e2da73184e22060 upstream.
Commit <684d984038aa> ('powerpc/powernv: Add debugfs interface for imc-mode and imc') added debugfs interface for the nest imc pmu devices to support changing of different ucode modes. Primarily adding this capability for debug. But when doing so, the code did not consider the case of cpu-less nodes. So when reading the _cmd_ or _mode_ file of a cpu-less node will create this crash.
Faulting instruction address: 0xc0000000000d0d58
Oops: Kernel access of bad area, sig: 11 [#1]
...
CPU: 67 PID: 5301 Comm: cat Not tainted 5.2.0-rc6-next-20190627+ #19
NIP: c0000000000d0d58 LR: c00000000049aa18 CTR:c0000000000d0d50
REGS: c00020194548f9e0 TRAP: 0300 Not tainted (5.2.0-rc6-next-20190627+)
MSR: 9000000000009033 <SF,HV,EE,ME,IR,DR,RI,LE> CR:28022822 XER: 00000000
CFAR: c00000000049aa14 DAR: 000000000003fc08 DSISR:40000000 IRQMASK: 0
...
NIP imc_mem_get+0x8/0x20
LR simple_attr_read+0x118/0x170
Call Trace:
simple_attr_read+0x70/0x170 (unreliable)
debugfs_attr_read+0x6c/0xb0
__vfs_read+0x3c/0x70
vfs_read+0xbc/0x1a0
ksys_read+0x7c/0x140
system_call+0x5c/0x70Patch fixes the issue with a more robust check for vbase to NULL.
Before patch, ls output for the debugfs imc directory
# ls /sys/kernel/debug/powerpc/imc/ imc_cmd_0 imc_cmd_251 imc_cmd_253 imc_cmd_255 imc_mode_0 imc_mode_251 imc_mode_253 imc_mode_255 imc_cmd_250 imc_cmd_252 imc_cmd_254 imc_cmd_8 imc_mode_250 imc_mode_252 imc_mode_254 imc_mode_8
After patch, ls output for the debugfs imc directory
# ls /sys/kernel/debug/powerpc/imc/ imc_cmd_0 imc_cmd_8 imc_mode_0 imc_mode_8
Actual bug here is that, we have two loops with potentially different loop counts. That is, in imc_get_mem_addr_nest(), loop count is obtained from the dt entries. But in case of export_imc_mode_and_cmd(), loop was based on for_each_nid() count. Patch fixes the loop count in latter based on the struct mem_info. Ideally it would be better to have array size in struct imc_pmu.
--- arch/powerpc/platforms/powernv/opal-imc.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/powerpc/platforms/powernv/opal-imc.c +6 -6
@@ -53,9 +53,9 @@ static void export_imc_mode_and_cmd(stru struct imc_pmu *pmu_ptr) {static u64 loc, *imc_mode_addr, *imc_cmd_addr; -int chip =0 , nid;char mode[16 ], cmd[16 ];u32 cb_offset; +struct imc_mem_info *ptr = pmu_ptr->mem_info; imc_debugfs_parent =debugfs_create_dir ("imc" , powerpc_debugfs_root);
@@ -69,20 +69,20 @@ static void export_imc_mode_and_cmd(struif (of_property_read_u32 (node,"cb_offset" , &cb_offset)) cb_offset =IMC_CNTL_BLK_OFFSET ; -for_each_node (nid) { - loc = (u64)(pmu_ptr->mem_info[chip].vbase) + cb_offset; +while (ptr->vbase !=NULL ) { + loc = (u64)(ptr->vbase) + cb_offset; imc_mode_addr = (u64 *)(loc +IMC_CNTL_BLK_MODE_OFFSET ); -sprintf (mode,"imc_mode_%d" , nid); +sprintf (mode,"imc_mode_%d" , (u32)(ptr->id));if (!imc_debugfs_create_x64 (mode,0600 , imc_debugfs_parent, imc_mode_addr)) goto err; imc_cmd_addr = (u64 *)(loc +IMC_CNTL_BLK_CMD_OFFSET ); -sprintf (cmd,"imc_cmd_%d" , nid); +sprintf (cmd,"imc_cmd_%d" , (u32)(ptr->id));if (!imc_debugfs_create_x64 (cmd,0600 , imc_debugfs_parent, imc_cmd_addr)) goto err; - chip++; + ptr++; }return ;
Greg Kroah-Hartman
maintainerPATCH 254/344 tpm_tis_core: Turn on the TPM before probing IRQs
In reply to Greg Kroah-HartmanFrom: Stefan Berger <[email protected]>
commit 5b359c7c43727e624eac3efc7ad21bd2defea161 upstream.
The interrupt probing sequence in tpm_tis_core cannot obviously run with the TPM power gated. Power on the TPM with tpm_chip_start() before probing IRQ's. Turn it off once the probing is complete.
--- drivers/char/tpm/tpm_tis_core.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/char/tpm/tpm_tis_core.c +2 -0
@@ -980,6 +980,7 @@ int tpm_tis_core_init(struct device *dev goto out_err; } +tpm_chip_start (chip);if (irq) {tpm_tis_probe_irq_single (chip, intmask,IRQF_SHARED , irq);
@@ -989,6 +990,7 @@ int tpm_tis_core_init(struct device *dev }else {tpm_tis_probe_irq (chip, intmask); } +tpm_chip_stop (chip); } rc =tpm_chip_register (chip);
Greg Kroah-Hartman
maintainerPATCH 255/344 tpm_tis_core: Set TPM_CHIP_FLAG_IRQ before probing for interrupts
In reply to Greg Kroah-HartmanFrom: Stefan Berger <[email protected]>
commit 1ea32c83c699df32689d329b2415796b7bfc2f6e upstream.
The tpm_tis_core has to set the TPM_CHIP_FLAG_IRQ before probing for interrupts since there is no other place in the code that would set it.
--- drivers/char/tpm/tpm_tis_core.c | 1 + 1 file changed, 1 insertion(+)
drivers/char/tpm/tpm_tis_core.c +1 -0
@@ -981,6 +981,7 @@ int tpm_tis_core_init(struct device *dev }tpm_chip_start (chip); + chip->flags |=TPM_CHIP_FLAG_IRQ ;if (irq) {tpm_tis_probe_irq_single (chip, intmask,IRQF_SHARED , irq);
Greg Kroah-Hartman
maintainerPATCH 256/344 tpm: Wrap the buffer from the caller to tpm_buf in tpm_send()
In reply to Greg Kroah-HartmanFrom: Jarkko Sakkinen <[email protected]>
commit e13cd21ffd50a07b55dcc4d8c38cedf27f28eaa1 upstream.
tpm_send() does not give anymore the result back to the caller. This would require another memcpy(), which kind of tells that the whole approach is somewhat broken. Instead, as Mimi suggested, this commit just wraps the data to the tpm_buf, and thus the result will not go to the garbage.
Obviously this assumes from the caller that it passes large enough buffer, which makes the whole API somewhat broken because it could be different size than @buflen but since trusted keys is the only module using this API right now I think that this fix is sufficient for the moment.
In the near future the plan is to replace the parameters with a tpm_buf created by the caller.
--- drivers/char/tpm/tpm-interface.c | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-)
drivers/char/tpm/tpm-interface.c +2 -7
@@ -354,14 +354,9 @@ int tpm_send(struct tpm_chip *chip, voidif (!chip)return -ENODEV ; - rc =tpm_buf_init (&buf,0 ,0 ); -if (rc) - goto out; - -memcpy (buf.data, cmd, buflen); + buf.data = cmd; rc =tpm_transmit_cmd (chip, &buf,0 ,"attempting to a send a command" ); -tpm_buf_destroy (&buf); -out: +tpm_put_ops (chip);return rc; }
Greg Kroah-Hartman
maintainerPATCH 257/344 fuse: fix deadlock with aio poll and fuse_iqueue::waitq.lock
In reply to Greg Kroah-HartmanFrom: Eric Biggers <[email protected]>
commit 76e43c8ccaa35c30d5df853013561145a0f750a5 upstream.
When IOCB_CMD_POLL is used on the FUSE device, aio_poll() disables IRQs and takes kioctx::ctx_lock, then fuse_iqueue::waitq.lock.
This may have to wait for fuse_iqueue::waitq.lock to be released by one of many places that take it with IRQs enabled. Since the IRQ handler may take kioctx::ctx_lock, lockdep reports that a deadlock is possible.
Fix it by protecting the state of struct fuse_iqueue with a separate spinlock, and only accessing fuse_iqueue::waitq using the versions of the waitqueue functions which do IRQ-safe locking internally.
Reproducer:
#include <fcntl.h>
#include <stdio.h>
#include <sys/mount.h>
#include <sys/stat.h>
#include <sys/syscall.h>
#include <unistd.h>
#include <linux/aio_abi.h>
int main()
{
char opts[128];
int fd = open("/dev/fuse", O_RDWR);
aio_context_t ctx = 0;
struct iocb cb = { .aio_lio_opcode = IOCB_CMD_POLL, .aio_fildes = fd };
struct iocb *cbp = &cb;
sprintf(opts, "fd=%d,rootmode=040000,user_id=0,group_id=0", fd);
mkdir("mnt", 0700);
mount("foo", "mnt", "fuse", 0, opts);
syscall(__NR_io_setup, 1, &ctx);
syscall(__NR_io_submit, ctx, 1, &cbp);
}Beginning of lockdep output:
=====================================================
WARNING: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected
5.3.0-rc5 #9 Not tainted
-----------------------------------------------------
syz_fuse/135 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:
000000003590ceda (&fiq->waitq){+.+.}, at: spin_lock include/linux/spinlock.h:338 [inline]
000000003590ceda (&fiq->waitq){+.+.}, at: aio_poll fs/aio.c:1751 [inline]
000000003590ceda (&fiq->waitq){+.+.}, at: __io_submit_one.constprop.0+0x203/0x5b0 fs/aio.c:1825
and this task is already holding:
0000000075037284 (&(&ctx->ctx_lock)->rlock){..-.}, at: spin_lock_irq include/linux/spinlock.h:363 [inline]
0000000075037284 (&(&ctx->ctx_lock)->rlock){..-.}, at: aio_poll fs/aio.c:1749 [inline]
0000000075037284 (&(&ctx->ctx_lock)->rlock){..-.}, at: __io_submit_one.constprop.0+0x1f4/0x5b0 fs/aio.c:1825
which would create a new lock dependency:
(&(&ctx->ctx_lock)->rlock){..-.} -> (&fiq->waitq){+.+.}
but this new dependency connects a SOFTIRQ-irq-safe lock:
(&(&ctx->ctx_lock)->rlock){..-.}
[...]--- fs/fuse/dev.c | 93 ++++++++++++++++++++++++++++--------------------------- fs/fuse/fuse_i.h | 3 + fs/fuse/inode.c | 1 3 files changed, 52 insertions(+), 45 deletions(-)
fs/fuse/dev.c +48 -45
@@ -377,7 +377,7 @@ static void queue_request(struct fuse_iq req->in.h.len =sizeof (struct fuse_in_header ) +len_args (req->in.numargs, (struct fuse_arg *) req->in.args);list_add_tail (&req->list, &fiq->pending); -wake_up_locked (&fiq->waitq); +wake_up (&fiq->waitq);kill_fasync (&fiq->fasync,SIGIO ,POLL_IN ); }
@@ -389,16 +389,16 @@ void fuse_queue_forget(struct fuse_conn forget->forget_one.nodeid = nodeid; forget->forget_one.nlookup = nlookup; -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);if (fiq->connected) { fiq->forget_list_tail->next = forget; fiq->forget_list_tail = forget; -wake_up_locked (&fiq->waitq); +wake_up (&fiq->waitq);kill_fasync (&fiq->fasync,SIGIO ,POLL_IN ); }else {kfree (forget); } -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); }static void flush_bg_queue (struct fuse_conn *fc)
@@ -412,10 +412,10 @@ static void flush_bg_queue(struct fuse_c req = list_first_entry(&fc->bg_queue, struct fuse_req, list);list_del (&req->list); fc->active_background++; -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock); req->in.h.unique =fuse_get_unique (fiq);queue_request (fiq, req); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); } }
@@ -439,9 +439,9 @@ static void request_end(struct fuse_conn* smp_mb() from queue_interrupt(). */ if (!list_empty (&req->intr_entry)) { -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);list_del_init (&req->intr_entry); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); }WARN_ON (test_bit (FR_PENDING , &req->flags));WARN_ON (test_bit (FR_SENT , &req->flags));
@@ -483,10 +483,10 @@ put_request:static int queue_interrupt (struct fuse_iqueue *fiq,struct fuse_req *req) { -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);/* Check for we've sent request to interrupt this req */ if (unlikely (!test_bit (FR_INTERRUPTED , &req->flags))) { -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return -EINVAL ; }
@@ -499,13 +499,13 @@ static int queue_interrupt(struct fuse_ismp_mb ();if (test_bit (FR_FINISHED , &req->flags)) {list_del_init (&req->intr_entry); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return 0 ; } -wake_up_locked (&fiq->waitq); +wake_up (&fiq->waitq);kill_fasync (&fiq->fasync,SIGIO ,POLL_IN ); } -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return 0 ; }
@@ -535,16 +535,16 @@ static void request_wait_answer(struct fif (!err)return ; -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);/* Request is not yet in userspace, bail out */ if (test_bit (FR_PENDING , &req->flags)) {list_del (&req->list); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);__fuse_put_request (req); req->out.h.error = -EINTR ;return ; } -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); }/*
@@ -559,9 +559,9 @@ static void __fuse_request_send(struct fstruct fuse_iqueue *fiq = &fc->iq;BUG_ON (test_bit (FR_BACKGROUND , &req->flags)); -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);if (!fiq->connected) { -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); req->out.h.error = -ENOTCONN ; }else { req->in.h.unique =fuse_get_unique (fiq);
@@ -569,7 +569,7 @@ static void __fuse_request_send(struct f/* acquire extra reference, since request is still needed after request_end() */ __fuse_get_request (req); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);request_wait_answer (fc, req);/* Pairs with smp_wmb() in request_end() */
@@ -700,12 +700,12 @@ static int fuse_request_send_notify_repl__clear_bit (FR_ISREPLY , &req->flags); req->in.h.unique = unique; -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);if (fiq->connected) {queue_request (fiq, req); err =0 ; } -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return err; }
@@ -1149,12 +1149,12 @@ static int request_pending(struct fuse_i* Unlike other requests this is assembled on demand, without a need * to allocate a separate fuse_req structure. * -* Called with fiq->waitq.lock held, releases it +* Called with fiq->lock held, releases it */ static int fuse_read_interrupt (struct fuse_iqueue *fiq,struct fuse_copy_state *cs,size_t nbytes,struct fuse_req *req) -__releases(fiq->waitq.lock) +__releases(fiq->lock) {struct fuse_in_header ih;struct fuse_interrupt_in arg;
@@ -1169,7 +1169,7 @@ __releases(fiq->waitq.lock) ih.unique = (req->in.h.unique |FUSE_INT_REQ_BIT ); arg.unique = req->in.h.unique; -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);if (nbytes < reqsize)return -EINVAL ;
@@ -1206,7 +1206,7 @@ static struct fuse_forget_link *dequeue_static int fuse_read_single_forget (struct fuse_iqueue *fiq,struct fuse_copy_state *cs,size_t nbytes) -__releases(fiq->waitq.lock) +__releases(fiq->lock) {int err;struct fuse_forget_link *forget =dequeue_forget (fiq,1 ,NULL );
@@ -1220,7 +1220,7 @@ __releases(fiq->waitq.lock) .len = sizeof(ih) + sizeof(arg), }; -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);kfree (forget);if (nbytes < ih.len)return -EINVAL ;
@@ -1238,7 +1238,7 @@ __releases(fiq->waitq.lock)static int fuse_read_batch_forget (struct fuse_iqueue *fiq,struct fuse_copy_state *cs,size_t nbytes) -__releases(fiq->waitq.lock) +__releases(fiq->lock) {int err;unsigned max_forgets;
@@ -1252,13 +1252,13 @@ __releases(fiq->waitq.lock) };if (nbytes < ih.len) { -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return -EINVAL ; } max_forgets = (nbytes - ih.len) /sizeof (struct fuse_forget_one ); head =dequeue_forget (fiq, max_forgets, &count); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); arg.count = count; ih.len += count *sizeof (struct fuse_forget_one );
@@ -1288,7 +1288,7 @@ __releases(fiq->waitq.lock)static int fuse_read_forget (struct fuse_conn *fc,struct fuse_iqueue *fiq,struct fuse_copy_state *cs,size_t nbytes) -__releases(fiq->waitq.lock) +__releases(fiq->lock) {if (fc->minor <16 || fiq->forget_list_head.next->next ==NULL )return fuse_read_single_forget (fiq, cs, nbytes);
@@ -1318,16 +1318,19 @@ static ssize_t fuse_dev_do_read(struct funsigned int hash; restart: -spin_lock (&fiq->waitq.lock); - err = -EAGAIN ; -if ((file->f_flags &O_NONBLOCK ) && fiq->connected && - !request_pending (fiq)) - goto err_unlock; +for (;;) { +spin_lock (&fiq->lock); +if (!fiq->connected ||request_pending (fiq)) +break ; +spin_unlock (&fiq->lock); - err =wait_event_interruptible_exclusive_locked (fiq->waitq, +if (file->f_flags &O_NONBLOCK ) +return -EAGAIN ; + err =wait_event_interruptible_exclusive (fiq->waitq, !fiq->connected ||request_pending (fiq)); -if (err) - goto err_unlock; +if (err) +return err; + }if (!fiq->connected) { err = fc->aborted ? -ECONNABORTED : -ENODEV ;
@@ -1351,7 +1354,7 @@ static ssize_t fuse_dev_do_read(struct f req = list_entry(fiq->pending.next, struct fuse_req, list);clear_bit (FR_PENDING , &req->flags);list_del_init (&req->list); -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock); in = &req->in; reqsize = in->h.len;
@@ -1409,7 +1412,7 @@ out_end:return err; err_unlock: -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return err; }
@@ -2121,12 +2124,12 @@ static __poll_t fuse_dev_poll(struct fil fiq = &fud->fc->iq;poll_wait (file, &fiq->waitq, wait); -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock);if (!fiq->connected) mask =EPOLLERR ;else if (request_pending (fiq)) mask |=EPOLLIN |EPOLLRDNORM ; -spin_unlock (&fiq->waitq.lock); +spin_unlock (&fiq->lock);return mask; }
@@ -2221,15 +2224,15 @@ void fuse_abort_conn(struct fuse_conn *fflush_bg_queue (fc);spin_unlock (&fc->bg_lock); -spin_lock (&fiq->waitq.lock); +spin_lock (&fiq->lock); fiq->connected =0 ;list_for_each_entry (req, &fiq->pending, list)clear_bit (FR_PENDING , &req->flags);list_splice_tail_init (&fiq->pending, &to_end);while (forget_pending (fiq))kfree (dequeue_forget (fiq,1 ,NULL )); -wake_up_all_locked (&fiq->waitq); -spin_unlock (&fiq->waitq.lock); +wake_up_all (&fiq->waitq); +spin_unlock (&fiq->lock);kill_fasync (&fiq->fasync,SIGIO ,POLL_IN );end_polls (fc);wake_up_all (&fc->blocked_waitq);
fs/fuse/fuse_i.h +3 -0
@@ -450,6 +450,9 @@ struct fuse_iqueue {/** Connection established */ unsigned connected; +/** Lock protecting accesses to members of this structure */ +spinlock_t lock; +/** Readers of the connection are waiting on this */ wait_queue_head_t waitq;
fs/fuse/inode.c +1 -0
@@ -582,6 +582,7 @@ static int fuse_show_options(struct seq_static void fuse_iqueue_init (struct fuse_iqueue *fiq) {memset (fiq,0 ,sizeof (struct fuse_iqueue )); +spin_lock_init (&fiq->lock);init_waitqueue_head (&fiq->waitq);INIT_LIST_HEAD (&fiq->pending);INIT_LIST_HEAD (&fiq->interrupts);
Greg Kroah-Hartman
maintainerPATCH 258/344 fuse: fix missing unlock_page in fuse_writepage()
In reply to Greg Kroah-HartmanFrom: Vasily Averin <[email protected]>
commit d5880c7a8620290a6c90ced7a0e8bd0ad9419601 upstream.
unlock_page() was missing in case of an already in-flight write against the same page.
--- fs/fuse/file.c | 1 + 1 file changed, 1 insertion(+)
fs/fuse/file.c +1 -0
@@ -1767,6 +1767,7 @@ static int fuse_writepage(struct page *pWARN_ON (wbc->sync_mode ==WB_SYNC_ALL );redirty_page_for_writepage (wbc, page); +unlock_page (page);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 259/344 fuse: fix beyond-end-of-page access in fuse_parse_cache()
In reply to Greg Kroah-HartmanFrom: Tejun Heo <[email protected]>
commit e5854b1cdf6cb48a20e01e3bdad0476a4c60a077 upstream.
With DEBUG_PAGEALLOC on, the following triggers.
BUG: unable to handle page fault for address: ffff88859367c000 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 3001067 P4D 3001067 PUD 406d3a8067 PMD 406d30c067 PTE 800ffffa6c983060 Oops: 0000 [#1] SMP DEBUG_PAGEALLOC CPU: 38 PID: 3110657 Comm: python2.7 RIP: 0010:fuse_readdir+0x88f/0xe7a [fuse] Code: 49 8b 4d 08 49 39 4e 60 0f 84 44 04 00 00 48 8b 43 08 43 8d 1c 3c 4d 01 7e 68 49 89 dc 48 03 5c 24 38 49 89 46 60 8b 44 24 30 <8b> 4b 10 44 29 e0 48 89 ca 48 83 c1 1f 48 83 e1 f8 83 f8 17 49 89 RSP: 0018:ffffc90035edbde0 EFLAGS: 00010286 RAX: 0000000000001000 RBX: ffff88859367bff0 RCX: 0000000000000000 RDX: 0000000000000000 RSI: ffff88859367bfed RDI: 0000000000920907 RBP: ffffc90035edbe90 R08: 000000000000014b R09: 0000000000000004 R10: ffff88859367b000 R11: 0000000000000000 R12: 0000000000000ff0 R13: ffffc90035edbee0 R14: ffff889fb8546180 R15: 0000000000000020 FS: 00007f80b5f4a740(0000) GS:ffff889fffa00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: ffff88859367c000 CR3: 0000001c170c2001 CR4: 00000000003606e0 DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000 DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400 Call Trace: iterate_dir+0x122/0x180 __x64_sys_getdents+0xa6/0x140 do_syscall_64+0x42/0x100 entry_SYSCALL_64_after_hwframe+0x44/0xa9
It's in fuse_parse_cache(). %rbx (ffff88859367bff0) is fuse_dirent pointer - addr + offset. FUSE_DIRENT_SIZE() is trying to dereference namelen off of it but that derefs into the next page which is disabled by pagealloc debug causing a PF.
This is caused by dirent->namelen being accessed before ensuring that there's enough bytes in the page for the dirent. Fix it by pushing down reclen calculation.
--- fs/fuse/readdir.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
fs/fuse/readdir.c +3 -1
@@ -372,11 +372,13 @@ static enum fuse_parse_result fuse_parsefor (;;) {struct fuse_dirent *dirent = addr + offset;unsigned int nbytes = size - offset; -size_t reclen =FUSE_DIRENT_SIZE (dirent); +size_t reclen;if (nbytes <FUSE_NAME_OFFSET || !dirent->namelen)break ; + reclen =FUSE_DIRENT_SIZE (dirent);/* derefs ->namelen */ +if (WARN_ON (dirent->namelen >FUSE_NAME_MAX ))return FOUND_ERR ;if (WARN_ON (reclen > nbytes))
Greg Kroah-Hartman
maintainerPATCH 260/344 parisc: Disable HP HSC-PCI Cards to prevent kernel crash
In reply to Greg Kroah-HartmanFrom: Helge Deller <[email protected]>
commit 5fa1659105fac63e0f3c199b476025c2e04111ce upstream.
The HP Dino PCI controller chip can be used in two variants: as on-board controller (e.g. in B160L), or on an Add-On card ("Card-Mode") to bridge PCI components to systems without a PCI bus, e.g. to a HSC/GSC bus. One such Add-On card is the HP HSC-PCI Card which has one or more DEC Tulip PCI NIC chips connected to the on-card Dino PCI controller.
Dino in Card-Mode has a big disadvantage: All PCI memory accesses need to go through the DINO_MEM_DATA register, so Linux drivers will not be able to use the ioremap() function. Without ioremap() many drivers will not work, one example is the tulip driver which then simply crashes the kernel if it tries to access the ports on the HP HSC card.
This patch disables the HP HSC card if it finds one, and as such fixes the kernel crash on a HP D350/2 machine.
--- drivers/parisc/dino.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+)
drivers/parisc/dino.c +24 -0
@@ -156,6 +156,15 @@ static inline struct dino_device *DINO_D return container_of(hba, struct dino_device, hba); } +/* Check if PCI device is behind a Card-mode Dino. */ +static int pci_dev_is_behind_card_dino (struct pci_dev *dev) +{ +struct dino_device *dino_dev; + + dino_dev =DINO_DEV (parisc_walk_tree (dev->bus->bridge)); +return is_card_dino (&dino_dev->hba.dev->id); +} +/* * Dino Configuration Space Accessor Functions */
@@ -437,6 +446,21 @@ static void quirk_cirrus_cardbus(struct }DECLARE_PCI_FIXUP_ENABLE (PCI_VENDOR_ID_CIRRUS ,PCI_DEVICE_ID_CIRRUS_6832 , quirk_cirrus_cardbus ); +#ifdef CONFIG_TULIP +static void pci_fixup_tulip (struct pci_dev *dev) +{ +if (!pci_dev_is_behind_card_dino (dev)) +return ; +if (!(pci_resource_flags (dev,1 ) &IORESOURCE_MEM )) +return ; +pr_warn ("%s: HP HSC-PCI Cards with card-mode Dino not yet supported.\n" , +pci_name (dev)); +/* Disable this card by zeroing the PCI resources */ +memset (&dev->resource[0 ],0 ,sizeof (dev->resource[0 ])); +memset (&dev->resource[1 ],0 ,sizeof (dev->resource[1 ])); +} +DECLARE_PCI_FIXUP_FINAL (PCI_VENDOR_ID_DEC ,PCI_ANY_ID , pci_fixup_tulip); +#endif /* CONFIG_TULIP */ static void __init dino_bios_init (void )
Greg Kroah-Hartman
maintainerPATCH 261/344 platform/x86: intel_int0002_vgpio: Fix wakeups not working on Cherry Trail
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 1bd43d0077b9a32a8b8059036471f3fc82dae342 upstream.
Commit 871f1f2bcb01 ("platform/x86: intel_int0002_vgpio: Only implement irq_set_wake on Bay Trail") removed the irq_set_wake method from the struct irq_chip used on Cherry Trail, but it did not set IRQCHIP_SKIP_SET_WAKE causing kernel/irq/manage.c: set_irq_wake_real() to return -ENXIO.
This causes the kernel to no longer see PME events reported through the INT0002 device as wakeup events. Which e.g. breaks wakeup by the (USB) keyboard on many Cherry Trail 2-in-1 devices.
--- drivers/platform/x86/intel_int0002_vgpio.c | 1 + 1 file changed, 1 insertion(+)
drivers/platform/x86/intel_int0002_vgpio.c +1 -0
@@ -144,6 +144,7 @@ static struct irq_chip int0002_cht_irqch* No set_wake, on CHT the IRQ is typically shared with the ACPI SCI * and we don't want to mess with the ACPI SCI irq settings. */ + .flags = IRQCHIP_SKIP_SET_WAKE, };static const struct x86_cpu_id int0002_cpu_ids[] = {
Greg Kroah-Hartman
maintainerPATCH 262/344 KVM: x86: always stop emulation on page fault
In reply to Greg Kroah-HartmanFrom: Jan Dakinevich <[email protected]>
commit 8530a79c5a9f4e29e6ffb35ec1a79d81f4968ec8 upstream.
inject_emulated_exception() returns true if and only if nested page fault happens. However, page fault can come from guest page tables walk, either nested or not nested. In both cases we should stop an attempt to read under RIP and give guest to step over its own page fault handler.
This is also visible when an emulated instruction causes a #GP fault and the VMware backdoor is enabled. To handle the VMware backdoor, KVM intercepts #GP faults; with only the next patch applied, x86_emulate_instruction() injects a #GP but returns EMULATE_FAIL
instead of EMULATE_DONE. EMULATE_FAIL causes handle_exception_nmi()
(or gp_interception() for SVM) to re-inject the original #GP because it thinks emulation failed due to a non-VMware opcode. This patch prevents the issue as x86_emulate_instruction() will return EMULATE_DONE after injecting the #GP.
--- arch/x86/kvm/x86.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/x86/kvm/x86.c +3 -1
@@ -6528,8 +6528,10 @@ int x86_emulate_instruction(struct kvm_vif (reexecute_instruction (vcpu, cr2, write_fault_to_spt, emulation_type))return EMULATE_DONE ; -if (ctxt->have_exception &&inject_emulated_exception (vcpu)) +if (ctxt->have_exception) { +inject_emulated_exception (vcpu);return EMULATE_DONE ; + }if (emulation_type &EMULTYPE_SKIP )return EMULATE_FAIL ;return handle_emulation_failure (vcpu, emulation_type);
Greg Kroah-Hartman
maintainerPATCH 263/344 KVM: x86: set ctxt->have_exception in x86_decode_insn()
In reply to Greg Kroah-HartmanFrom: Jan Dakinevich <[email protected]>
commit c8848cee74ff05638e913582a476bde879c968ad upstream.
x86_emulate_instruction() takes into account ctxt->have_exception flag during instruction decoding, but in practice this flag is never set in x86_decode_insn().
--- arch/x86/kvm/emulate.c | 2 ++ arch/x86/kvm/x86.c | 6 ++++++ 2 files changed, 8 insertions(+)
arch/x86/kvm/emulate.c +2 -0
@@ -5395,6 +5395,8 @@ done_prefixes: ctxt->memopp->addr.mem.ea + ctxt->_eip); done: +if (rc ==X86EMUL_PROPAGATE_FAULT ) + ctxt->have_exception = true;return (rc !=X86EMUL_CONTINUE ) ?EMULATION_FAILED :EMULATION_OK ; }
arch/x86/kvm/x86.c +6 -0
@@ -6529,6 +6529,12 @@ int x86_emulate_instruction(struct kvm_v emulation_type))return EMULATE_DONE ;if (ctxt->have_exception) { +/* +* #UD should result in just EMULATION_FAILED, and trap-like +* exception should not be encountered during decode. +*/ +WARN_ON_ONCE (ctxt->exception.vector ==UD_VECTOR || +exception_type (ctxt->exception.vector) ==EXCPT_TRAP );inject_emulated_exception (vcpu);return EMULATE_DONE ; }
Greg Kroah-Hartman
maintainerPATCH 264/344 KVM: x86: Manually calculate reserved bits when loading PDPTRS
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 16cfacc8085782dab8e365979356ce1ca87fd6cc upstream.
Manually generate the PDPTR reserved bit mask when explicitly loading PDPTRs. The reserved bits that are being tracked by the MMU reflect the current paging mode, which is unlikely to be PAE paging in the vast majority of flows that use load_pdptrs(), e.g. CR0 and CR4 emulation, __set_sregs(), etc... This can cause KVM to incorrectly signal a bad PDPTR, or more likely, miss a reserved bit check and subsequently fail a VM-Enter due to a bad VMCS.GUEST_PDPTR.
Add a one off helper to generate the reserved bits instead of sharing code across the MMU's calculations and the PDPTR emulation. The PDPTR reserved bits are basically set in stone, and pushing a helper into the MMU's calculation adds unnecessary complexity without improving readability.
Oppurtunistically fix/update the comment for load_pdptrs().
Note, the buggy commit also introduced a deliberate functional change, "Also remove bit 5-6 from rsvd_bits_mask per latest SDM.", which was effectively (and correctly) reverted by commit cd9ae5fe47df ("KVM: x86:
Fix page-tables reserved bits"). A bit of SDM archaeology shows that the SDM from late 2008 had a bug (likely a copy+paste error) where it listed bits 6:5 as AVL and A for PDPTEs used for 4k entries but reserved for 2mb entries. I.e. the SDM contradicted itself, and bits 6:5 are and always have been reserved.
--- arch/x86/kvm/x86.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-)
arch/x86/kvm/x86.c +8 -3
@@ -674,8 +674,14 @@ static int kvm_read_nested_guest_page(st data, offset, len, access); } +static inline u64 pdptr_rsvd_bits (struct kvm_vcpu *vcpu) +{ +return rsvd_bits (cpuid_maxphyaddr (vcpu),63 ) |rsvd_bits (5 ,8 ) | +rsvd_bits (1 ,2 ); +} +/* -* Load the pae pdptrs. Return true is they are all valid. +* Load the pae pdptrs. Return 1 if they are all valid, 0 otherwise. */ int load_pdptrs (struct kvm_vcpu *vcpu,struct kvm_mmu *mmu,unsigned long cr3) {
@@ -694,8 +700,7 @@ int load_pdptrs(struct kvm_vcpu *vcpu, s }for (i =0 ; i <ARRAY_SIZE (pdpte); ++i) {if ((pdpte[i] &PT_PRESENT_MASK ) && - (pdpte[i] & - vcpu->arch.mmu->guest_rsvd_check.rsvd_bits_mask[0 ][2 ])) { + (pdpte[i] &pdptr_rsvd_bits (vcpu))) { ret =0 ; goto out; }
Greg Kroah-Hartman
maintainerPATCH 265/344 KVM: x86: Disable posted interrupts for non-standard IRQs delivery modes
In reply to Greg Kroah-HartmanFrom: Alexander Graf <[email protected]>
commit fdcf756213756c23b533ca4974d1f48c6a4d4281 upstream.
We can easily route hardware interrupts directly into VM context when they target the "Fixed" or "LowPriority" delivery modes.
However, on modes such as "SMI" or "Init", we need to go via KVM code to actually put the vCPU into a different mode of operation, so we can not post the interrupt
Add code in the VMX and SVM PI logic to explicitly refuse to establish posted mappings for advanced IRQ deliver modes. This reflects the logic in __apic_accept_irq() which also only ever passes Fixed and LowPriority interrupts as posted interrupts into the guest.
This fixes a bug I have with code which configures real hardware to inject virtual SMIs into my guest.
--- arch/x86/include/asm/kvm_host.h | 7 +++++++ arch/x86/kvm/svm.c | 4 +++- arch/x86/kvm/vmx/vmx.c | 6 +++++- 3 files changed, 15 insertions(+), 2 deletions(-)
arch/x86/include/asm/kvm_host.h +7 -0
@@ -1583,6 +1583,13 @@ bool kvm_intr_is_single_vcpu(struct kvmvoid kvm_set_msi_irq (struct kvm *kvm,struct kvm_kernel_irq_routing_entry *e,struct kvm_lapic_irq *irq); +static inline bool kvm_irq_is_postable (struct kvm_lapic_irq *irq) +{ +/* We can only post Fixed and LowPrio IRQs */ +return (irq->delivery_mode == dest_Fixed || + irq->delivery_mode == dest_LowestPrio); +} +static inline void kvm_arch_vcpu_blocking (struct kvm_vcpu *vcpu) {if (kvm_x86_ops->vcpu_blocking)
arch/x86/kvm/svm.c +3 -1
@@ -5274,7 +5274,8 @@ get_pi_vcpu_info(struct kvm *kvm, structkvm_set_msi_irq (kvm, e, &irq); -if (!kvm_intr_is_single_vcpu (kvm, &irq, &vcpu)) { +if (!kvm_intr_is_single_vcpu (kvm, &irq, &vcpu) || + !kvm_irq_is_postable (&irq)) {pr_debug ("SVM: %s: use legacy intr remap mode for irq %u\n" , __func__, irq.vector);return -1 ;
@@ -5328,6 +5329,7 @@ static int svm_update_pi_irte(struct kvm* 1. When cannot target interrupt to a specific vcpu. * 2. Unsetting posted interrupt. * 3. APIC virtialization is disabled for the vcpu. +* 4. IRQ has incompatible delivery mode (SMI, INIT, etc) */ if (!get_pi_vcpu_info (kvm, e, &vcpu_info, &svm) && set &&kvm_vcpu_apicv_active (&svm->vcpu)) {
arch/x86/kvm/vmx/vmx.c +5 -1
@@ -7369,10 +7369,14 @@ static int vmx_update_pi_irte(struct kvm* irqbalance to make the interrupts single-CPU. * * We will support full lowest-priority interrupt later. +* +* In addition, we can only inject generic interrupts using +* the PI mechanism, refuse to route others through it. */ kvm_set_msi_irq (kvm, e, &irq); -if (!kvm_intr_is_single_vcpu (kvm, &irq, &vcpu)) { +if (!kvm_intr_is_single_vcpu (kvm, &irq, &vcpu) || + !kvm_irq_is_postable (&irq)) {/* * Make sure the IRTE is in remapped mode if * we don't handle it in posted mode.
Greg Kroah-Hartman
maintainerPATCH 266/344 kvm: x86: Add "significant index" flag to a few CPUID leaves
In reply to Greg Kroah-HartmanFrom: Jim Mattson <[email protected]>
commit a06dcd625d6181747fac7f4c140b5a4c397a778c upstream.
According to the Intel SDM, volume 2, "CPUID," the index is significant (or partially significant) for CPUID leaves 0FH, 10H, 12H, 17H, 18H, and 1FH.
Add the corresponding flag to these CPUID leaves in do_host_cpuid().
--- arch/x86/kvm/cpuid.c | 6 ++++++ 1 file changed, 6 insertions(+)
arch/x86/kvm/cpuid.c +6 -0
@@ -304,7 +304,13 @@ static void do_host_cpuid(struct kvm_cpucase 7 :case 0xb :case 0xd : +case 0xf : +case 0x10 : +case 0x12 :case 0x14 : +case 0x17 : +case 0x18 : +case 0x1f :case 0x8000001d : entry->flags |=KVM_CPUID_FLAG_SIGNIFCANT_INDEX ;break ;
Greg Kroah-Hartman
maintainerPATCH 267/344 KVM: x86/mmu: Use fast invalidate mechanism to zap MMIO sptes
In reply to Greg Kroah-HartmanFrom: Sean Christopherson <[email protected]>
commit 92f58b5c0181596d9f1e317b49ada2e728fb76eb upstream.
Use the fast invalidate mechasim to zap MMIO sptes on a MMIO generation wrap. The fast invalidate flow was reintroduced to fix a livelock bug in kvm_mmu_zap_all() that can occur if kvm_mmu_zap_all() is invoked when the guest has live vCPUs. I.e. using kvm_mmu_zap_all() to handle the MMIO generation wrap is theoretically susceptible to the livelock bug.
This effectively reverts commit 4771450c345dc ("Revert "KVM: MMU: drop kvm_mmu_zap_mmio_sptes""), i.e. restores the behavior of commit a8eca9dcc656a ("KVM: MMU: drop kvm_mmu_zap_mmio_sptes").
Note, this actually fixes commit 571c5af06e303 ("KVM: x86/mmu:
Voluntarily reschedule as needed when zapping MMIO sptes"), but there is no need to incrementally revert back to using fast invalidate, e.g. doing so doesn't provide any bisection or stability benefits.
--- arch/x86/kvm/mmu.c | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-)
arch/x86/kvm/mmu.c +3 -14
@@ -395,8 +395,6 @@ static void mark_mmio_spte(struct kvm_vc mask |= (gpa & shadow_nonpresent_or_rsvd_mask) << shadow_nonpresent_or_rsvd_mask_len; -page_header (__pa (sptep))->mmio_cached = true; -trace_mark_mmio_spte (sptep, gfn, access, gen);mmu_spte_set (sptep, mask); }
@@ -5956,7 +5954,7 @@ void kvm_mmu_slot_set_dirty(struct kvm * }EXPORT_SYMBOL_GPL (kvm_mmu_slot_set_dirty); -static void __kvm_mmu_zap_all (struct kvm *kvm,bool mmio_only) +void kvm_mmu_zap_all (struct kvm *kvm) {struct kvm_mmu_page *sp, *node;LIST_HEAD (invalid_list);
@@ -5965,14 +5963,10 @@ static void __kvm_mmu_zap_all(struct kvmspin_lock (&kvm->mmu_lock); restart:list_for_each_entry_safe (sp, node, &kvm->arch.active_mmu_pages, link) { -if (mmio_only && !sp->mmio_cached) -continue ;if (sp->role.invalid && sp->root_count)continue ; -if (__kvm_mmu_prepare_zap_page (kvm, sp, &invalid_list, &ign)) { -WARN_ON_ONCE (mmio_only); +if (__kvm_mmu_prepare_zap_page (kvm, sp, &invalid_list, &ign)) goto restart; - }if (cond_resched_lock (&kvm->mmu_lock)) goto restart; }
@@ -5981,11 +5975,6 @@ restart:spin_unlock (&kvm->mmu_lock); } -void kvm_mmu_zap_all (struct kvm *kvm) -{ -return __kvm_mmu_zap_all (kvm, false); -} -void kvm_mmu_invalidate_mmio_sptes (struct kvm *kvm,u64 gen) {WARN_ON (gen &KVM_MEMSLOT_GEN_UPDATE_IN_PROGRESS );
@@ -6007,7 +5996,7 @@ void kvm_mmu_invalidate_mmio_sptes(struc*/ if (unlikely (gen ==0 )) {kvm_debug_ratelimited ("kvm: zapping shadow pages for mmio generation wraparound\n" ); -__kvm_mmu_zap_all (kvm, true); +kvm_mmu_zap_all_fast (kvm); } }
Greg Kroah-Hartman
maintainerPATCH 268/344 media: videobuf-core.c: poll_wait needs a non-NULL buf pointer
In reply to Greg Kroah-HartmanFrom: Hans Verkuil <[email protected]>
commit 6f51fdfd8229d5358c2d6e272cf73478866e8ddc upstream.
poll_wait uses &buf->done, but buf is NULL. Move the poll_wait to later in the function once buf is correctly set and only call it if it is non-NULL.
--- drivers/media/v4l2-core/videobuf-core.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
drivers/media/v4l2-core/videobuf-core.c +3 -2
@@ -1123,7 +1123,6 @@ __poll_t videobuf_poll_stream(struct filstruct videobuf_buffer *buf =NULL ;__poll_t rc =0 ; -poll_wait (file, &buf->done, wait);videobuf_queue_lock (q);if (q->streaming) {if (!list_empty (&q->stream))
@@ -1143,7 +1142,9 @@ __poll_t videobuf_poll_stream(struct fil } buf = q->read_buf; } -if (!buf) +if (buf) +poll_wait (file, &buf->done, wait); +else rc =EPOLLERR ;if (0 == rc) {
Greg Kroah-Hartman
maintainerPATCH 269/344 media: sn9c20x: Add MSI MS-1039 laptop to flip_dmi_table
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 7e0bb5828311f811309bed5749528ca04992af2f upstream.
Like a bunch of other MSI laptops the MS-1039 uses a 0c45:627b SN9C201 + OV7660 webcam which is mounted upside down.
Add it to the sn9c20x flip_dmi_table to deal with this.
--- drivers/media/usb/gspca/sn9c20x.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/media/usb/gspca/sn9c20x.c +7 -0
@@ -124,6 +124,13 @@ static const struct dmi_system_id flip_d } }, { + .ident = "MSI MS-1039", + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"MICRO-STAR INT'L CO.,LTD." ), + DMI_MATCH(DMI_PRODUCT_NAME, "MS-1039"), + } + }, + { .ident ="MSI MS-1632" , .matches = { DMI_MATCH(DMI_BOARD_VENDOR, "MSI"),
Greg Kroah-Hartman
maintainerPATCH 270/344 media: hantro: Set DMA max segment size
In reply to Greg Kroah-HartmanFrom: Francois Buergisser <[email protected]>
commit c3c3509b86810293df5c524ef61421d8affc8bf0 upstream.
The Hantro codec is typically used in platforms with an IOMMU, so we need to set a proper DMA segment size. Devices without an IOMMU will still fallback to default 64KiB segments.
--- drivers/staging/media/hantro/hantro_drv.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/media/hantro/hantro_drv.c +1 -0
@@ -724,6 +724,7 @@ static int hantro_probe(struct platform_dev_err (vpu->dev,"Could not set DMA coherent mask.\n" );return ret; } +vb2_dma_contig_set_max_seg_size (&pdev->dev,DMA_BIT_MASK (32 ));for (i =0 ; i < vpu->variant->num_irqs; i++) {const char *irq_name = vpu->variant->irqs[i].name;
Greg Kroah-Hartman
maintainerPATCH 271/344 media: dont drop front-end reference count for ->detach
In reply to Greg Kroah-HartmanFrom: Arnd Bergmann <[email protected]>
commit 14e3cdbb00a885eedc95c0cf8eda8fe28d26d6b4 upstream.
A bugfix introduce a link failure in configurations without CONFIG_MODULES:
In file included from drivers/media/usb/dvb-usb/pctv452e.c:20:0:drivers/media/usb/dvb-usb/pctv452e.c: In function 'pctv452e_frontend_attach':drivers/media/dvb-frontends/stb0899_drv.h:151:36: error: weak declaration of 'stb0899_attach' being applied to a already existing, static definition
The problem is that the !IS_REACHABLE() declaration of stb0899_attach() is a 'static inline' definition that clashes with the weak definition.
I further observed that the bugfix was only done for one of the five users of stb0899_attach(), the other four still have the problem. This reverts the bugfix and instead addresses the problem by not dropping the reference count when calling '->detach()', instead we call this function directly in dvb_frontend_put() before dropping the kref on the front-end.
I first submitted this in early 2018, and after some discussion it was apparently discarded. While there is a long-term plan in place, that plan is obviously not nearing completion yet, and the current kernel is still broken unless this patch is applied.
--- drivers/media/dvb-core/dvb_frontend.c | 4 +++- drivers/media/usb/dvb-usb/pctv452e.c | 8 -------- 2 files changed, 3 insertions(+), 9 deletions(-)
drivers/media/dvb-core/dvb_frontend.c +3 -1
@@ -152,6 +152,9 @@ static void dvb_frontend_free(struct krestatic void dvb_frontend_put (struct dvb_frontend *fe) { +/* call detach before dropping the reference count */ +if (fe->ops.detach) + fe->ops.detach (fe);/* * Check if the frontend was registered, as otherwise * kref was not initialized yet.
@@ -3040,7 +3043,6 @@ void dvb_frontend_detach(struct dvb_frondvb_frontend_invoke_release (fe, fe->ops.release_sec);dvb_frontend_invoke_release (fe, fe->ops.tuner_ops.release);dvb_frontend_invoke_release (fe, fe->ops.analog_ops.release); -dvb_frontend_invoke_release (fe, fe->ops.detach);dvb_frontend_put (fe); }EXPORT_SYMBOL (dvb_frontend_detach);
drivers/media/usb/dvb-usb/pctv452e.c +0 -8
@@ -909,14 +909,6 @@ static int pctv452e_frontend_attach(stru &a->dev->i2c_adap);if (!a->fe_adap[0 ].fe)return -ENODEV ; - -/* -* dvb_frontend will call dvb_detach for both stb0899_detach -* and stb0899_release but we only do dvb_attach(stb0899_attach). -* Increment the module refcount instead. -*/ -symbol_get (stb0899_attach); -if ((dvb_attach (lnbp22_attach, a->fe_adap[0 ].fe, &a->dev->i2c_adap)) ==NULL )err ("Cannot attach lnbp22\n" );
Greg Kroah-Hartman
maintainerPATCH 272/344 media: vivid: fix device init when no_error_inj=1 and fb disabled
In reply to Greg Kroah-HartmanFrom: Guillaume Tucker <[email protected]>
commit 79e85d1d2c16ba4907bb9d6a4381516b729ff341 upstream.
Add an extra condition to add the video output control class when the device has some hdmi outputs defined. This is required to then always be able to add the display present control, which is enabled when there are some hdmi outputs.
This fixes the corner case where no_error_inj is enabled and the device has no frame buffer but some hdmi outputs, as otherwise the video output control class would be added anyway. Without this fix, the sanity checks fail in v4l2_ctrl_new() as name is NULL.
--- drivers/media/platform/vivid/vivid-ctrls.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/media/platform/vivid/vivid-ctrls.c +1 -1
@@ -1473,7 +1473,7 @@ int vivid_create_controls(struct vivid_dv4l2_ctrl_handler_init (hdl_vid_cap,55 );v4l2_ctrl_new_custom (hdl_vid_cap, &vivid_ctrl_class,NULL );v4l2_ctrl_handler_init (hdl_vid_out,26 ); -if (!no_error_inj || dev->has_fb) +if (!no_error_inj || dev->has_fb || dev->num_hdmi_outputs)v4l2_ctrl_new_custom (hdl_vid_out, &vivid_ctrl_class,NULL );v4l2_ctrl_handler_init (hdl_vbi_cap,21 );v4l2_ctrl_new_custom (hdl_vbi_cap, &vivid_ctrl_class,NULL );
Greg Kroah-Hartman
maintainerPATCH 273/344 spi: ep93xx: Repair SPI CS lookup tables
In reply to Greg Kroah-HartmanFrom: Alexander Sverdlin <[email protected]>
commit 4fbc485324d2975c54201091dfad0a7dd4902324 upstream.
The actual device name of the SPI controller being registered on EP93xx is "spi0" (as seen by gpiod_find_lookup_table()). This patch fixes all relevant lookup tables and the following failure (seen on EDB9302):
ep93xx-spi ep93xx-spi.0: failed to register SPI master
ep93xx-spi: probe of ep93xx-spi.0 failed with error -22
--- arch/arm/mach-ep93xx/edb93xx.c | 2 +- arch/arm/mach-ep93xx/simone.c | 2 +- arch/arm/mach-ep93xx/ts72xx.c | 4 ++-- arch/arm/mach-ep93xx/vision_ep9307.c | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-)
arch/arm/mach-ep93xx/edb93xx.c +1 -1
@@ -103,7 +103,7 @@ static struct spi_board_info edb93xx_spi };static struct gpiod_lookup_table edb93xx_spi_cs_gpio_table = { - .dev_id ="ep93xx-spi.0" , + .dev_id ="spi0" , .table = {GPIO_LOOKUP ("A" ,6 ,"cs" ,GPIO_ACTIVE_LOW ), { },
arch/arm/mach-ep93xx/simone.c +1 -1
@@ -73,7 +73,7 @@ static struct spi_board_info simone_spi_* v1.3 parts will still work, since the signal on SFRMOUT is automatic. */ static struct gpiod_lookup_table simone_spi_cs_gpio_table = { - .dev_id ="ep93xx-spi.0" , + .dev_id ="spi0" , .table = {GPIO_LOOKUP ("A" ,1 ,"cs" ,GPIO_ACTIVE_LOW ), { },
arch/arm/mach-ep93xx/ts72xx.c +2 -2
@@ -267,7 +267,7 @@ static struct spi_board_info bk3_spi_boa* goes through CPLD */ static struct gpiod_lookup_table bk3_spi_cs_gpio_table = { - .dev_id ="ep93xx-spi.0" , + .dev_id ="spi0" , .table = {GPIO_LOOKUP ("F" ,3 ,"cs" ,GPIO_ACTIVE_LOW ), { },
@@ -316,7 +316,7 @@ static struct spi_board_info ts72xx_spi_ };static struct gpiod_lookup_table ts72xx_spi_cs_gpio_table = { - .dev_id ="ep93xx-spi.0" , + .dev_id ="spi0" , .table = {/* DIO_17 */ GPIO_LOOKUP ("F" ,2 ,"cs" ,GPIO_ACTIVE_LOW ),
arch/arm/mach-ep93xx/vision_ep9307.c +1 -1
@@ -242,7 +242,7 @@ static struct spi_board_info vision_spi_ };static struct gpiod_lookup_table vision_spi_cs_gpio_table = { - .dev_id ="ep93xx-spi.0" , + .dev_id ="spi0" , .table = {GPIO_LOOKUP_IDX ("A" ,6 ,"cs" ,0 ,GPIO_ACTIVE_LOW ),GPIO_LOOKUP_IDX ("A" ,7 ,"cs" ,1 ,GPIO_ACTIVE_LOW ),
Greg Kroah-Hartman
maintainerPATCH 274/344 spi: spi-fsl-dspi: Exit the ISR with IRQ_NONE when its not ours
In reply to Greg Kroah-HartmanFrom: Vladimir Oltean <[email protected]>
commit d41f36a6464a85c06ad920703d878e4491d2c023 upstream.
The DSPI interrupt can be shared between two controllers at least on the LX2160A. In that case, the driver for one controller might misbehave and consume the other's interrupt. Fix this by actually checking if any of the bits in the status register have been asserted.
--- drivers/spi/spi-fsl-dspi.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
drivers/spi/spi-fsl-dspi.c +3 -1
@@ -886,9 +886,11 @@ static irqreturn_t dspi_interrupt(int ir trans_mode); } } + +return IRQ_HANDLED ; } -return IRQ_HANDLED ; +return IRQ_NONE ; }static const struct of_device_id fsl_dspi_dt_ids[] = {
Greg Kroah-Hartman
maintainerPATCH 275/344 binfmt_elf: Do not move brk for INTERP-less ET_EXEC
In reply to Greg Kroah-HartmanFrom: Kees Cook <[email protected]>
commit 7be3cb019db1cbd5fd5ffe6d64a23fefa4b6f229 upstream.
When brk was moved for binaries without an interpreter, it should have been limited to ET_DYN only. In other words, the special case was an ET_DYN that lacks an INTERP, not just an executable that lacks INTERP. The bug manifested for giant static executables, where the brk would end up in the middle of the text area on 32-bit architectures.
--- fs/binfmt_elf.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
fs/binfmt_elf.c +2 -1
@@ -1141,7 +1141,8 @@ out_free_interp:* (since it grows up, and may collide early with the stack * growing down), and into the unused ELF_ET_DYN_BASE region. */ -if (IS_ENABLED (CONFIG_ARCH_HAS_ELF_RANDOMIZE ) && !interpreter) +if (IS_ENABLED (CONFIG_ARCH_HAS_ELF_RANDOMIZE ) && + loc->elf_ex.e_type ==ET_DYN && !interpreter) current->mm->brk = current->mm->start_brk =ELF_ET_DYN_BASE ;
Greg Kroah-Hartman
maintainerPATCH 276/344 ASoC: Intel: NHLT: Fix debug print format
In reply to Greg Kroah-HartmanFrom: Amadeusz Sławiński <[email protected]>
commit 855a06da37a773fd073d51023ac9d07988c87da8 upstream.
oem_table_id is 8 chars long, so we need to limit it, otherwise it may print some unprintable characters into dmesg.
--- sound/soc/intel/skylake/skl-nhlt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/intel/skylake/skl-nhlt.c +1 -1
@@ -225,7 +225,7 @@ int skl_nhlt_update_topology_bin(structstruct hdac_bus *bus =skl_to_bus (skl);struct device *dev = bus->dev; -dev_dbg (dev,"oem_id %.6s, oem_table_id %8s oem_revision %d\n" , +dev_dbg (dev,"oem_id %.6s, oem_table_id %.8s oem_revision %d\n" , nhlt->header.oem_id, nhlt->header.oem_table_id, nhlt->header.oem_revision);
Greg Kroah-Hartman
maintainerPATCH 277/344 ASoC: Intel: Skylake: Use correct function to access iomem space
In reply to Greg Kroah-HartmanFrom: Amadeusz Sławiński <[email protected]>
commit 17d29ff98fd4b70e9ccdac5e95e18a087e2737ef upstream.
For copying from __iomem, we should use __ioread32_copy.
reported by sparse:sound/soc/intel/skylake/skl-debug.c:437:34: warning: incorrect type in argument 1 (different address spaces)sound/soc/intel/skylake/skl-debug.c:437:34: expected void [noderef] <asn:2> *tosound/soc/intel/skylake/skl-debug.c:437:34: got unsigned char *sound/soc/intel/skylake/skl-debug.c:437:51: warning: incorrect type in argument 2 (different address spaces)sound/soc/intel/skylake/skl-debug.c:437:51: expected void const *fromsound/soc/intel/skylake/skl-debug.c:437:51: got void [noderef] <asn:2> *[assigned] fw_reg_addr
--- sound/soc/intel/skylake/skl-debug.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
sound/soc/intel/skylake/skl-debug.c +1 -1
@@ -188,7 +188,7 @@ static ssize_t fw_softreg_read(struct fimemset (d->fw_read_buff,0 ,FW_REG_BUF );if (w0_stat_sz >0 ) -__iowrite32_copy (d->fw_read_buff, fw_reg_addr, w0_stat_sz >>2 ); +__ioread32_copy (d->fw_read_buff, fw_reg_addr, w0_stat_sz >>2 );for (offset =0 ; offset <FW_REG_SIZE ; offset +=16 ) { ret +=snprintf (tmp + ret,FW_REG_BUF - ret,"%#.4x: " , offset);
Greg Kroah-Hartman
maintainerPATCH 278/344 ASoC: Intel: Fix use of potentially uninitialized variable
In reply to Greg Kroah-HartmanFrom: Amadeusz Sławiński <[email protected]>
commit 810f3b860850148788fc1ed8a6f5f807199fed65 upstream.
If ipc->ops.reply_msg_match is NULL, we may end up using uninitialized mask value.
reported by smatch:sound/soc/intel/common/sst-ipc.c:266 sst_ipc_reply_find_msg() error: uninitialized symbol 'mask'.
--- sound/soc/intel/common/sst-ipc.c | 2 ++ 1 file changed, 2 insertions(+)
sound/soc/intel/common/sst-ipc.c +2 -0
@@ -222,6 +222,8 @@ struct ipc_message *sst_ipc_reply_find_mif (ipc->ops.reply_msg_match !=NULL ) header = ipc->ops.reply_msg_match (header, &mask); +else + mask = (u64)-1 ;if (list_empty (&ipc->rx_list)) { dev_err(ipc->dev, "error: rx list empty but received 0x%llx\n",
Greg Kroah-Hartman
maintainerPATCH 279/344 staging: erofs: cannot set EROFS_V_Z_INITED_BIT if fill_inode_lazy fails
In reply to Greg Kroah-HartmanFrom: Gao Xiang <[email protected]>
commit 3407a4198faf01c9d7596c45b8606834b8dfc2b7 upstream.
As reported by erofs-utils fuzzer, unsupported compressed clustersize will make fill_inode_lazy fail, for such case we cannot set EROFS_V_Z_INITED_BIT since we need return failure for each z_erofs_map_blocks_iter().
--- drivers/staging/erofs/zmap.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-)
drivers/staging/erofs/zmap.c +1 -2
@@ -86,12 +86,11 @@ static int fill_inode_lazy(struct inode vi->z_physical_clusterbits[1 ] = vi->z_logical_clusterbits + ((h->h_clusterbits >>5 ) &7 ); +set_bit (EROFS_V_Z_INITED_BIT , &vi->flags); unmap_done:kunmap_atomic (kaddr);unlock_page (page);put_page (page); - -set_bit (EROFS_V_Z_INITED_BIT , &vi->flags); out_unlock:clear_and_wake_up_bit (EROFS_V_BL_Z_BIT , &vi->flags);return err;
Greg Kroah-Hartman
maintainerPATCH 280/344 ARM: samsung: Fix system restart on S3C6410
In reply to Greg Kroah-HartmanFrom: Lihua Yao <[email protected]>
commit 16986074035cc0205472882a00d404ed9d213313 upstream.
S3C6410 system restart is triggered by watchdog reset.
--- arch/arm/plat-samsung/watchdog-reset.c | 1 + 1 file changed, 1 insertion(+)
arch/arm/plat-samsung/watchdog-reset.c +1 -0
@@ -62,6 +62,7 @@ void samsung_wdt_reset(void)#ifdef CONFIG_OF static const struct of_device_id s3c2410_wdt_match[] = { { .compatible ="samsung,s3c2410-wdt" }, + { .compatible ="samsung,s3c6410-wdt" }, {}, };
Greg Kroah-Hartman
maintainerPATCH 281/344 ARM: zynq: Use memcpy_toio instead of memcpy on smp bring-up
In reply to Greg Kroah-HartmanFrom: Luis Araneda <[email protected]>
commit b7005d4ef4f3aa2dc24019ffba03a322557ac43d upstream.
This fixes a kernel panic on memcpy whenFORTIFY_SOURCE is enabled.
The initial smp implementation on commit aa7eb2bb4e4a ("arm: zynq: Add smp support")
used memcpy, which worked fine until commit ee333554fed5 ("ARM: 8749/1: Kconfig: Add ARCH_HAS_FORTIFY_SOURCE") enabled overflow checks at runtime, producing a read overflow panic.
The computed size of memcpy args are:
- p_size (dst): 4294967295 = (size_t) -1
- q_size (src): 1
- size (len): 8
Additionally, the memory is marked as __iomem, so one of the memcpy_* functions should be used for read/write.
--- arch/arm/mach-zynq/platsmp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-zynq/platsmp.c +1 -1
@@ -57,7 +57,7 @@ int zynq_cpun_start(u32 address, int cpu* 0x4: Jump by mov instruction * 0x8: Jumping address */ -memcpy ((__force void *)zero, &zynq_secondary_trampoline, +memcpy_toio (zero, &zynq_secondary_trampoline, trampoline_size);writel (address, zero + trampoline_size);
Greg Kroah-Hartman
maintainerPATCH 282/344 arm64: tlb: Ensure we execute an ISB following walk cache invalidation
In reply to Greg Kroah-HartmanFrom: Will Deacon <[email protected]>
commit 51696d346c49c6cf4f29e9b20d6e15832a2e3408 upstream.
05f2d2f83b5a ("arm64: tlbflush: Introduce __flush_tlb_kernel_pgtable") added a new TLB invalidation helper which is used when freeing intermediate levels of page table used for kernel mappings, but is missing the required ISB instruction after completion of the TLBI instruction.
Add the missing barrier.
--- arch/arm64/include/asm/tlbflush.h | 1 + 1 file changed, 1 insertion(+)
arch/arm64/include/asm/tlbflush.h +1 -0
@@ -251,6 +251,7 @@ static inline void __flush_tlb_kernel_pgdsb (ishst);__tlbi (vaae1is, addr);dsb (ish); + isb(); }#endif
Greg Kroah-Hartman
maintainerPATCH 283/344 arm64: dts: rockchip: limit clock rate of MMC controllers for RK3328
In reply to Greg Kroah-HartmanFrom: Shawn Lin <[email protected]>
commit 03e61929c0d227ed3e1c322fc3804216ea298b7e upstream.
150MHz is a fundamental limitation of RK3328 Soc, w/o this limitation, eMMC, for instance, will run into 200MHz clock rate in HS200 mode, which makes the RK3328 boards not always boot properly. By adding it in rk3328.dtsi would also obviate the worry of missing it when adding new boards.
--- arch/arm64/boot/dts/rockchip/rk3328.dtsi | 3 +++ 1 file changed, 3 insertions(+)
arch/arm64/boot/dts/rockchip/rk3328.dtsi +3 -0
@@ -801,6 +801,7 @@ <&cru SCLK_SDMMC_DRV>, <&cru SCLK_SDMMC_SAMPLE>; clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; + max-frequency = <150000000>; status = "disabled"; };
@@ -812,6 +813,7 @@ <&cru SCLK_SDIO_DRV>, <&cru SCLK_SDIO_SAMPLE>; clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; + max-frequency = <150000000>; status = "disabled"; };
@@ -823,6 +825,7 @@ <&cru SCLK_EMMC_DRV>, <&cru SCLK_EMMC_SAMPLE>; clock-names = "biu", "ciu", "ciu-drive", "ciu-sample"; fifo-depth = <0x100>; + max-frequency = <150000000>; status = "disabled"; };
Greg Kroah-Hartman
maintainerPATCH 284/344 iommu/arm-smmu-v3: Disable detection of ATS and PRI
In reply to Greg Kroah-HartmanFrom: Will Deacon <[email protected]>
commit b5e86196b83fd68e065a7c811ab8925fb0dc3893 upstream.
Detecting the ATS capability of the SMMU at probe time introduces a spinlock into the ->unmap() fast path, even when ATS is not actually in use. Furthermore, the ATC invalidation that exists is broken, as it occurs before invalidation of the main SMMU TLB which leaves a window where the ATC can be repopulated with stale entries.
Given that ATS is both a new feature and a specialist sport, disable it for now whilst we fix it properly in subsequent patches. Since PRI requires ATS, disable that too.
--- drivers/iommu/arm-smmu-v3.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/iommu/arm-smmu-v3.c +2 -0
@@ -2843,11 +2843,13 @@ static int arm_smmu_device_hw_probe(stru }/* Boolean feature flags */ +#if 0 /* ATS invalidation is slow and broken */ if (IS_ENABLED (CONFIG_PCI_PRI ) && reg &IDR0_PRI ) smmu->features |=ARM_SMMU_FEAT_PRI ;if (IS_ENABLED (CONFIG_PCI_ATS ) && reg &IDR0_ATS ) smmu->features |=ARM_SMMU_FEAT_ATS ; +#endif if (reg &IDR0_SEV ) smmu->features |=ARM_SMMU_FEAT_SEV ;
Greg Kroah-Hartman
maintainerPATCH 285/344 alarmtimer: Use EOPNOTSUPP instead of ENOTSUPP
In reply to Greg Kroah-HartmanFrom: Thadeu Lima de Souza Cascardo <[email protected]>
commit f18ddc13af981ce3c7b7f26925f099e7c6929aba upstream.
ENOTSUPP is not supposed to be returned to userspace. This was found on an OpenPower machine, where the RTC does not support set_alarm.
On that system, a clock_nanosleep(CLOCK_REALTIME_ALARM, ...) results in "524 Unknown error 524"
Replace it with EOPNOTSUPP which results in the expected "95 Operation not supported" error.
--- kernel/time/alarmtimer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
kernel/time/alarmtimer.c +2 -2
@@ -672,7 +672,7 @@ static int alarm_timer_create(struct k_ienum alarmtimer_type type;if (!alarmtimer_get_rtcdev ()) -return -ENOTSUPP ; +return -EOPNOTSUPP ;if (!capable (CAP_WAKE_ALARM ))return -EPERM ;
@@ -790,7 +790,7 @@ static int alarm_timer_nsleep(const clocint ret =0 ;if (!alarmtimer_get_rtcdev ()) -return -ENOTSUPP ; +return -EOPNOTSUPP ;if (flags & ~TIMER_ABSTIME )return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 286/344 iommu/vt-d: Fix wrong analysis whether devices share the same bus
In reply to Greg Kroah-HartmanFrom: Nadav Amit <[email protected]>
commit 2c70010867f164d1b30e787e360e05d10cc40046 upstream.
set_msi_sid_cb() is used to determine whether device aliases share the same bus, but it can provide false indications that aliases use the same bus when in fact they do not. The reason is that set_msi_sid_cb() assumes that pdev is fixed, while actually pci_for_each_dma_alias() can call fn() when pdev is set to a subordinate device.
As a result, running an VM on ESX with VT-d emulation enabled can results in the log warning such as:
DMAR: [INTR-REMAP] Request device [00:11.0] fault index 3b [fault reason 38] Blocked an interrupt request due to source-id verification failure
This seems to cause additional ata errors such as:
ata3.00: qc timeout (cmd 0xa1)
ata3.00: failed to IDENTIFY (I/O error, err_mask=0x4)
These timeouts also cause boot to be much longer and other errors.
Fix it by checking comparing the alias with the previous one instead.
--- drivers/iommu/intel_irq_remapping.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
drivers/iommu/intel_irq_remapping.c +3 -3
@@ -376,13 +376,13 @@ static int set_msi_sid_cb(struct pci_dev {struct set_msi_sid_data *data = opaque; +if (data->count ==0 ||PCI_BUS_NUM (alias) ==PCI_BUS_NUM (data->alias)) + data->busmatch_count++; + data->pdev = pdev; data->alias = alias; data->count++; -if (PCI_BUS_NUM (alias) == pdev->bus->number) - data->busmatch_count++; -return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 287/344 regulator: Defer init completion for a while after late_initcall
In reply to Greg Kroah-HartmanFrom: Mark Brown <[email protected]>
commit 55576cf1853798e86f620766e23b604c9224c19c upstream.
The kernel has no way of knowing when we have finished instantiating drivers, between deferred probe and systems that build key drivers as modules we might be doing this long after userspace has booted. This has always been a bit of an issue with regulator_init_complete since it can power off hardware that's not had it's driver loaded which can result in user visible effects, the main case is powering off displays. Practically speaking it's not been an issue in real systems since most systems that use the regulator API are embedded and build in key drivers anyway but with Arm laptops coming on the market it's becoming more of an issue so let's do something about it.
In the absence of any better idea just defer the powering off for 30s after late_initcall(), this is obviously a hack but it should mask the issue for now and it's no more arbitrary than late_initcall() itself. Ideally we'd have some heuristics to detect if we're on an affected system and tune or skip the delay appropriately, and there may be some need for a command line option to be added.
--- drivers/regulator/core.c | 42 +++++++++++++++++++++++++++++++----------- 1 file changed, 31 insertions(+), 11 deletions(-)
drivers/regulator/core.c +31 -11
@@ -5640,7 +5640,7 @@ static int __init regulator_init(void)/* init early to allow our consumers to complete system booting */ core_initcall (regulator_init); -static int __init regulator_late_cleanup (struct device *dev,void *data) +static int regulator_late_cleanup (struct device *dev,void *data) {struct regulator_dev *rdev =dev_to_rdev (dev);const struct regulator_ops *ops = rdev->desc->ops;
@@ -5689,18 +5689,9 @@ unlock:return 0 ; } -static int __init regulator_init_complete (void ) +static void regulator_init_complete_work_function (struct work_struct *work) {/* -* Since DT doesn't provide an idiomatic mechanism for -* enabling full constraints and since it's much more natural -* with DT to provide them just assume that a DT enabled -* system has full constraints. -*/ -if (of_have_populated_dt ()) - has_full_constraints = true; - -/* * Regulators may had failed to resolve their input supplies * when were registered, either because the input supply was * not registered yet or because its parent device was not
@@ -5717,6 +5708,35 @@ static int __init regulator_init_complet*/ class_for_each_device (®ulator_class,NULL ,NULL , regulator_late_cleanup); +} + +static DECLARE_DELAYED_WORK(regulator_init_complete_work, + regulator_init_complete_work_function); + +static int __init regulator_init_complete (void ) +{ +/* +* Since DT doesn't provide an idiomatic mechanism for +* enabling full constraints and since it's much more natural +* with DT to provide them just assume that a DT enabled +* system has full constraints. +*/ +if (of_have_populated_dt ()) + has_full_constraints = true; + +/* +* We punt completion for an arbitrary amount of time since +* systems like distros will load many drivers from userspace +* so consumers might not always be ready yet, this is +* particularly an issue with laptops where this might bounce +* the display off then on. Ideally we'd get a notification +* from userspace when this happens but we don't so just wait +* a bit and hope we waited long enough. It'd be better if +* we'd only do this on systems that need it, and a kernel +* command line option might be useful. +*/ +schedule_delayed_work (®ulator_init_complete_work, +msecs_to_jiffies (30000 ));return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 288/344 efifb: BGRT: Improve efifb_bgrt_sanity_check
In reply to Greg Kroah-HartmanFrom: Hans de Goede <[email protected]>
commit 51677dfcc17f88ed754143df670ff064eae67f84 upstream.
For various reasons, at least with x86 EFI firmwares, the xoffset and yoffset in the BGRT info are not always reliable.
Extensive testing has shown that when the info is correct, the BGRT image is always exactly centered horizontally (the yoffset variable is more variable and not always predictable).
This commit simplifies / improves the bgrt_sanity_check to simply check that the BGRT image is exactly centered horizontally and skips (re)drawing it when it is not.
This fixes the BGRT image sometimes being drawn in the wrong place.
--- drivers/video/fbdev/efifb.c | 27 ++++++--------------------- 1 file changed, 6 insertions(+), 21 deletions(-)
drivers/video/fbdev/efifb.c +6 -21
@@ -122,28 +122,13 @@ static void efifb_copy_bmp(u8 *src, u32*/ static bool efifb_bgrt_sanity_check (struct screen_info *si,u32 bmp_width) { -static const int default_resolutions[][2 ] = { - {800 ,600 }, - {1024 ,768 }, - {1280 ,1024 }, - }; -u32 i, right_margin; +/* +* All x86 firmwares horizontally center the image (the yoffset +* calculations differ between boards, but xoffset is predictable). +*/ +u32 expected_xoffset = (si->lfb_width - bmp_width) /2 ; -for (i =0 ; i <ARRAY_SIZE (default_resolutions); i++) { -if (default_resolutions[i][0 ] == si->lfb_width && - default_resolutions[i][1 ] == si->lfb_height) -break ; - } -/* If not a default resolution used for textmode, this should be fine */ -if (i >=ARRAY_SIZE (default_resolutions)) -return true; - -/* If the right margin is 5 times smaller then the left one, reject */ - right_margin = si->lfb_width - (bgrt_tab.image_offset_x + bmp_width); -if (right_margin < (bgrt_tab.image_offset_x /5 )) -return false; - -return true; +return bgrt_tab.image_offset_x == expected_xoffset; }#else static bool efifb_bgrt_sanity_check (struct screen_info *si,u32 bmp_width)
Greg Kroah-Hartman
maintainerPATCH 289/344 gfs2: clear buf_in_tr when ending a transaction in sweep_bh_for_rgrps
In reply to Greg Kroah-HartmanFrom: Bob Peterson <[email protected]>
commit f0b444b349e33ae0d3dd93e25ca365482a5d17d4 upstream.
In function sweep_bh_for_rgrps, which is a helper for punch_hole, it uses variable buf_in_tr to keep track of when it needs to commit pending block frees on a partial delete that overflows the transaction created for the delete. The problem is that the variable was initialized at the start of function sweep_bh_for_rgrps but it was never cleared, even when starting a new transaction.
This patch reinitializes the variable when the transaction is ended, so the next transaction starts out with it cleared.
--- fs/gfs2/bmap.c | 1 + 1 file changed, 1 insertion(+)
fs/gfs2/bmap.c +1 -0
@@ -1680,6 +1680,7 @@ out_unlock:brelse (dibh);up_write (&ip->i_rw_mutex);gfs2_trans_end (sdp); + buf_in_tr = false; }gfs2_glock_dq_uninit (rd_gh);cond_resched ();
Greg Kroah-Hartman
maintainerPATCH 290/344 z3fold: fix retry mechanism in page reclaim
In reply to Greg Kroah-HartmanFrom: Vitaly Wool <[email protected]>
commit 3f9d2b5766aea06042630ac60b7316fd0cebf06f upstream.
z3fold_page_reclaim()'s retry mechanism is broken: on a second iteration it will have zhdr from the first one so that zhdr is no longer in line with struct page. That leads to crashes when the system is stressed.
Fix that by moving zhdr assignment up.
While at it, protect against using already freed handles by using own local slots structure in z3fold_page_reclaim().
--- mm/z3fold.c | 49 ++++++++++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 15 deletions(-)
mm/z3fold.c +34 -15
@@ -366,9 +366,10 @@ static inline int __idx(struct z3fold_he* Encodes the handle of a particular buddy within a z3fold page * Pool lock should be held as this function accesses first_num */ -static unsigned long encode_handle (struct z3fold_header *zhdr,enum buddy bud) +static unsigned long __encode_handle (struct z3fold_header *zhdr, +struct z3fold_buddy_slots *slots, +enum buddy bud) { -struct z3fold_buddy_slots *slots;unsigned long h = (unsigned long )zhdr;int idx =0 ;
@@ -385,11 +386,15 @@ static unsigned long encode_handle(strucif (bud ==LAST ) h |= (zhdr->last_chunks <<BUDDY_SHIFT ); - slots = zhdr->slots; slots->slot[idx] = h;return (unsigned long )&slots->slot[idx]; } +static unsigned long encode_handle (struct z3fold_header *zhdr,enum buddy bud) +{ +return __encode_handle (zhdr, zhdr->slots, bud); +} +/* Returns the z3fold page where a given handle is stored */ static inline struct z3fold_header *handle_to_z3fold_header (unsigned long h) {
@@ -624,6 +629,7 @@ static void do_compact_page(struct z3fol }if (unlikely (PageIsolated (page) || +test_bit (PAGE_CLAIMED , &page->private) ||test_bit (PAGE_STALE , &page->private))) {z3fold_page_unlock (zhdr);return ;
@@ -1100,6 +1106,7 @@ static int z3fold_reclaim_page(struct z3struct z3fold_header *zhdr =NULL ;struct page *page =NULL ;struct list_head *pos; +struct z3fold_buddy_slots slots;unsigned long first_handle =0 , middle_handle =0 , last_handle =0 ;spin_lock (&pool->lock);
@@ -1118,16 +1125,22 @@ static int z3fold_reclaim_page(struct z3/* this bit could have been set by free, in which case * we pass over to the next page in the pool. */ -if (test_and_set_bit (PAGE_CLAIMED , &page->private)) +if (test_and_set_bit (PAGE_CLAIMED , &page->private)) { + page =NULL ;continue ; + } -if (unlikely (PageIsolated (page))) +if (unlikely (PageIsolated (page))) { +clear_bit (PAGE_CLAIMED , &page->private); + page =NULL ;continue ; + } + zhdr =page_address (page);if (test_bit (PAGE_HEADLESS , &page->private))break ; - zhdr =page_address (page);if (!z3fold_page_trylock (zhdr)) { +clear_bit (PAGE_CLAIMED , &page->private); zhdr =NULL ;continue ;/* can't evict at this point */ }
@@ -1145,26 +1158,30 @@ static int z3fold_reclaim_page(struct z3if (!test_bit (PAGE_HEADLESS , &page->private)) {/* -* We need encode the handles before unlocking, since -* we can race with free that will set -* (first|last)_chunks to 0 +* We need encode the handles before unlocking, and +* use our local slots structure because z3fold_free +* can zero out zhdr->slots and we can't do much +* about that */ first_handle =0 ; last_handle =0 ; middle_handle =0 ;if (zhdr->first_chunks) - first_handle =encode_handle (zhdr,FIRST ); + first_handle =__encode_handle (zhdr, &slots, +FIRST );if (zhdr->middle_chunks) - middle_handle =encode_handle (zhdr,MIDDLE ); + middle_handle =__encode_handle (zhdr, &slots, +MIDDLE );if (zhdr->last_chunks) - last_handle =encode_handle (zhdr,LAST ); + last_handle =__encode_handle (zhdr, &slots, +LAST );/* * it's safe to unlock here because we hold a * reference to this page */ z3fold_page_unlock (zhdr); }else { - first_handle =encode_handle (zhdr,HEADLESS ); + first_handle =__encode_handle (zhdr, &slots,HEADLESS ); last_handle = middle_handle =0 ; }
@@ -1194,9 +1211,9 @@ next:spin_lock (&pool->lock);list_add (&page->lru, &pool->lru);spin_unlock (&pool->lock); +clear_bit (PAGE_CLAIMED , &page->private); }else {z3fold_page_lock (zhdr); -clear_bit (PAGE_CLAIMED , &page->private);if (kref_put (&zhdr->refcount, release_z3fold_page_locked)) {atomic64_dec (&pool->pages_nr);
@@ -1211,6 +1228,7 @@ next:list_add (&page->lru, &pool->lru);spin_unlock (&pool->lock);z3fold_page_unlock (zhdr); +clear_bit (PAGE_CLAIMED , &page->private); }/* We started off locked to we need to lock the pool back */
@@ -1315,7 +1333,8 @@ static bool z3fold_page_isolate(struct pVM_BUG_ON_PAGE (!PageMovable (page), page);VM_BUG_ON_PAGE (PageIsolated (page), page); -if (test_bit (PAGE_HEADLESS , &page->private)) +if (test_bit (PAGE_HEADLESS , &page->private) || +test_bit (PAGE_CLAIMED , &page->private))return false; zhdr =page_address (page);
Greg Kroah-Hartman
maintainerPATCH 291/344 z3fold: fix memory leak in kmem cache
In reply to Greg Kroah-HartmanFrom: Vitaly Wool <[email protected]>
commit 63398413c00c7836ea87a1fa205c91d2199b25cf upstream.
Currently there is a leak in init_z3fold_page() -- it allocates handles from kmem cache even for headless pages, but then they are never used and never freed, so eventually kmem cache may get exhausted. This patch provides a fix for that.
--- mm/z3fold.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
mm/z3fold.c +9 -6
@@ -295,14 +295,11 @@ static void z3fold_unregister_migration( }/* Initializes the z3fold header of a newly allocated z3fold page */ -static struct z3fold_header *init_z3fold_page (struct page *page, +static struct z3fold_header *init_z3fold_page (struct page *page,bool headless,struct z3fold_pool *pool,gfp_t gfp) {struct z3fold_header *zhdr =page_address (page); -struct z3fold_buddy_slots *slots =alloc_slots (pool, gfp); - -if (!slots) -return NULL ; +struct z3fold_buddy_slots *slots;INIT_LIST_HEAD (&page->lru);clear_bit (PAGE_HEADLESS , &page->private);
@@ -310,6 +307,12 @@ static struct z3fold_header *init_z3foldclear_bit (NEEDS_COMPACTING , &page->private);clear_bit (PAGE_STALE , &page->private);clear_bit (PAGE_CLAIMED , &page->private); +if (headless) +return zhdr; + + slots =alloc_slots (pool, gfp); +if (!slots) +return NULL ;spin_lock_init (&zhdr->page_lock);kref_init (&zhdr->refcount);
@@ -930,7 +933,7 @@ retry:if (!page)return -ENOMEM ; - zhdr =init_z3fold_page (page, pool, gfp); + zhdr =init_z3fold_page (page, bud ==HEADLESS , pool, gfp);if (!zhdr) {__free_page (page);return -ENOMEM ;
Greg Kroah-Hartman
maintainerPATCH 292/344 mm/compaction.c: clear total_{migrate,free}_scanned before scanning a new zone
In reply to Greg Kroah-HartmanFrom: Yafang Shao <[email protected]>
commit a94b525241c0fff3598809131d7cfcfe1d572d8c upstream.
total_{migrate,free}_scanned will be added to COMPACTMIGRATE_SCANNED and COMPACTFREE_SCANNED in compact_zone(). We should clear them before scanning a new zone. In the proc triggered compaction, we forgot clearing them.
--- mm/compaction.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-)
mm/compaction.c +13 -22
@@ -2078,6 +2078,17 @@ compact_zone(struct compact_control *cc,const bool sync = cc->mode !=MIGRATE_ASYNC ;bool update_cached; +/* +* These counters track activities during zone compaction. Initialize +* them before compacting a new zone. +*/ + cc->total_migrate_scanned =0 ; + cc->total_free_scanned =0 ; + cc->nr_migratepages =0 ; + cc->nr_freepages =0 ; +INIT_LIST_HEAD (&cc->freepages); +INIT_LIST_HEAD (&cc->migratepages); + cc->migratetype =gfpflags_to_migratetype (cc->gfp_mask); ret =compaction_suitable (cc->zone, cc->order, cc->alloc_flags, cc->classzone_idx);
@@ -2281,10 +2292,6 @@ static enum compact_result compact_zone_ {enum compact_result ret;struct compact_control cc = { - .nr_freepages =0 , - .nr_migratepages =0 , - .total_migrate_scanned =0 , - .total_free_scanned =0 , .order = order, .search_order = order, .gfp_mask = gfp_mask,
@@ -2305,8 +2312,6 @@ static enum compact_result compact_zone_if (capture) current->capture_control = &capc; -INIT_LIST_HEAD (&cc.freepages); -INIT_LIST_HEAD (&cc.migratepages); ret =compact_zone (&cc, &capc);
@@ -2408,8 +2413,6 @@ static void compact_node(int nid)struct zone *zone;struct compact_control cc = { .order =-1 , - .total_migrate_scanned =0 , - .total_free_scanned =0 , .mode =MIGRATE_SYNC , .ignore_skip_hint = true, .whole_zone = true,
@@ -2423,11 +2426,7 @@ static void compact_node(int nid)if (!populated_zone (zone))continue ; - cc.nr_freepages =0 ; - cc.nr_migratepages =0 ; cc.zone = zone; -INIT_LIST_HEAD (&cc.freepages); -INIT_LIST_HEAD (&cc.migratepages);compact_zone (&cc,NULL );
@@ -2529,8 +2528,6 @@ static void kcompactd_do_work(pg_data_tstruct compact_control cc = { .order = pgdat->kcompactd_max_order, .search_order = pgdat->kcompactd_max_order, - .total_migrate_scanned =0 , - .total_free_scanned =0 , .classzone_idx = pgdat->kcompactd_classzone_idx, .mode =MIGRATE_SYNC_LIGHT , .ignore_skip_hint = false,
@@ -2554,16 +2551,10 @@ static void kcompactd_do_work(pg_data_t COMPACT_CONTINUE)continue ; - cc.nr_freepages =0 ; - cc.nr_migratepages =0 ; - cc.total_migrate_scanned =0 ; - cc.total_free_scanned =0 ; - cc.zone = zone; -INIT_LIST_HEAD (&cc.freepages); -INIT_LIST_HEAD (&cc.migratepages); -if (kthread_should_stop ())return ; + + cc.zone = zone; status =compact_zone (&cc,NULL );if (status ==COMPACT_SUCCESS ) {
Greg Kroah-Hartman
maintainerPATCH 293/344 memcg, oom: dont require __GFP_FS when invoking memcg OOM killer
In reply to Greg Kroah-HartmanFrom: Tetsuo Handa <[email protected]>
commit f9c645621a28e37813a1de96d9cbd89cde94a1e4 upstream.
Masoud Sharbiani noticed that commit 29ef680ae7c21110 ("memcg, oom: move out_of_memory back to the charge path") broke memcg OOM called from __xfs_filemap_fault() path. It turned out that try_charge() is retrying forever without making forward progress because mem_cgroup_oom(GFP_NOFS) cannot invoke the OOM killer due to commit 3da88fb3bacfaa33 ("mm, oom:
move GFP_NOFS check to out_of_memory").
Allowing forced charge due to being unable to invoke memcg OOM killer will lead to global OOM situation. Also, just returning -ENOMEM will be risky because OOM path is lost and some paths (e.g. get_user_pages()) will leak -ENOMEM. Therefore, invoking memcg OOM killer (despite GFP_NOFS) will be the only choice we can choose for now.
Until 29ef680ae7c21110, we were able to invoke memcg OOM killer when GFP_KERNEL reclaim failed [1]. But since 29ef680ae7c21110, we need to invoke memcg OOM killer when GFP_NOFS reclaim failed [2]. Although in the past we did invoke memcg OOM killer for GFP_NOFS [3], we might get pre-mature memcg OOM reports due to this patch.
[1]
leaker invoked oom-killer: gfp_mask=0x6200ca(GFP_HIGHUSER_MOVABLE), nodemask=(null), order=0, oom_score_adj=0
CPU: 0 PID: 2746 Comm: leaker Not tainted 4.18.0+ #19 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018 Call Trace: dump_stack+0x63/0x88 dump_header+0x67/0x27a ? mem_cgroup_scan_tasks+0x91/0xf0 oom_kill_process+0x210/0x410 out_of_memory+0x10a/0x2c0 mem_cgroup_out_of_memory+0x46/0x80 mem_cgroup_oom_synchronize+0x2e4/0x310 ? high_work_func+0x20/0x20 pagefault_out_of_memory+0x31/0x76 mm_fault_error+0x55/0x115 ? handle_mm_fault+0xfd/0x220 __do_page_fault+0x433/0x4e0 do_page_fault+0x22/0x30 ? page_fault+0x8/0x30 page_fault+0x1e/0x30 RIP: 0033:0x4009f0 Code: 03 00 00 00 e8 71 fd ff ff 48 83 f8 ff 49 89 c6 74 74 48 89 c6 bf c0 0c 40 00 31 c0 e8 69 fd ff ff 45 85 ff 7e 21 31 c9 66 90 <41> 0f be 14 0e 01 d3 f7 c1 ff 0f 00 00 75 05 41 c6 04 0e 2a 48 83 RSP: 002b:00007ffe29ae96f0 EFLAGS: 00010206 RAX: 000000000000001b RBX: 0000000000000000 RCX: 0000000001ce1000 RDX: 0000000000000000 RSI: 000000007fffffe5 RDI: 0000000000000000 RBP: 000000000000000c R08: 0000000000000000 R09: 00007f94be09220d R10: 0000000000000002 R11: 0000000000000246 R12: 00000000000186a0 R13: 0000000000000003 R14: 00007f949d845000 R15: 0000000002800000 Task in /leaker killed as a result of limit of /leaker memory: usage 524288kB, limit 524288kB, failcnt 158965 memory+swap: usage 0kB, limit 9007199254740988kB, failcnt 0 kmem: usage 2016kB, limit 9007199254740988kB, failcnt 0 Memory cgroup stats for /leaker: cache:844KB rss:521136KB rss_huge:0KB shmem:0KB mapped_file:0KB dirty:132KB writeback:0KB inactive_anon:0KB active_anon:521224KB inactive_file:1012KB active_file:8KB unevictable:0KB Memory cgroup out of memory: Kill process 2746 (leaker) score 998 or sacrifice child Killed process 2746 (leaker) total-vm:536704kB, anon-rss:521176kB, file-rss:1208kB, shmem-rss:0kB oom_reaper: reaped process 2746 (leaker), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
[2]
leaker invoked oom-killer: gfp_mask=0x600040(GFP_NOFS), nodemask=(null), order=0, oom_score_adj=0
CPU: 1 PID: 2746 Comm: leaker Not tainted 4.18.0+ #20 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018 Call Trace: dump_stack+0x63/0x88 dump_header+0x67/0x27a ? mem_cgroup_scan_tasks+0x91/0xf0 oom_kill_process+0x210/0x410 out_of_memory+0x109/0x2d0 mem_cgroup_out_of_memory+0x46/0x80 try_charge+0x58d/0x650 ? __radix_tree_replace+0x81/0x100 mem_cgroup_try_charge+0x7a/0x100 __add_to_page_cache_locked+0x92/0x180 add_to_page_cache_lru+0x4d/0xf0 iomap_readpages_actor+0xde/0x1b0 ? iomap_zero_range_actor+0x1d0/0x1d0 iomap_apply+0xaf/0x130 iomap_readpages+0x9f/0x150 ? iomap_zero_range_actor+0x1d0/0x1d0 xfs_vm_readpages+0x18/0x20 [xfs] read_pages+0x60/0x140 __do_page_cache_readahead+0x193/0x1b0 ondemand_readahead+0x16d/0x2c0 page_cache_async_readahead+0x9a/0xd0 filemap_fault+0x403/0x620 ? alloc_set_pte+0x12c/0x540 ? _cond_resched+0x14/0x30 __xfs_filemap_fault+0x66/0x180 [xfs] xfs_filemap_fault+0x27/0x30 [xfs] __do_fault+0x19/0x40 __handle_mm_fault+0x8e8/0xb60 handle_mm_fault+0xfd/0x220 __do_page_fault+0x238/0x4e0 do_page_fault+0x22/0x30 ? page_fault+0x8/0x30 page_fault+0x1e/0x30 RIP: 0033:0x4009f0 Code: 03 00 00 00 e8 71 fd ff ff 48 83 f8 ff 49 89 c6 74 74 48 89 c6 bf c0 0c 40 00 31 c0 e8 69 fd ff ff 45 85 ff 7e 21 31 c9 66 90 <41> 0f be 14 0e 01 d3 f7 c1 ff 0f 00 00 75 05 41 c6 04 0e 2a 48 83 RSP: 002b:00007ffda45c9290 EFLAGS: 00010206 RAX: 000000000000001b RBX: 0000000000000000 RCX: 0000000001a1e000 RDX: 0000000000000000 RSI: 000000007fffffe5 RDI: 0000000000000000 RBP: 000000000000000c R08: 0000000000000000 R09: 00007f6d061ff20d R10: 0000000000000002 R11: 0000000000000246 R12: 00000000000186a0 R13: 0000000000000003 R14: 00007f6ce59b2000 R15: 0000000002800000 Task in /leaker killed as a result of limit of /leaker memory: usage 524288kB, limit 524288kB, failcnt 7221 memory+swap: usage 0kB, limit 9007199254740988kB, failcnt 0 kmem: usage 1944kB, limit 9007199254740988kB, failcnt 0 Memory cgroup stats for /leaker: cache:3632KB rss:518232KB rss_huge:0KB shmem:0KB mapped_file:0KB dirty:0KB writeback:0KB inactive_anon:0KB active_anon:518408KB inactive_file:3908KB active_file:12KB unevictable:0KB Memory cgroup out of memory: Kill process 2746 (leaker) score 992 or sacrifice child Killed process 2746 (leaker) total-vm:536704kB, anon-rss:518264kB, file-rss:1188kB, shmem-rss:0kB oom_reaper: reaped process 2746 (leaker), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
[3]
leaker invoked oom-killer: gfp_mask=0x50, order=0, oom_score_adj=0 leaker cpuset=/ mems_allowed=0
CPU: 1 PID: 3206 Comm: leaker Not tainted 3.10.0-957.27.2.el7.x86_64 #1 Hardware name: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 04/13/2018 Call Trace: [<ffffffffaf364147>] dump_stack+0x19/0x1b [<ffffffffaf35eb6a>] dump_header+0x90/0x229 [<ffffffffaedbb456>] ? find_lock_task_mm+0x56/0xc0 [<ffffffffaee32a38>] ? try_get_mem_cgroup_from_mm+0x28/0x60 [<ffffffffaedbb904>] oom_kill_process+0x254/0x3d0 [<ffffffffaee36c36>] mem_cgroup_oom_synchronize+0x546/0x570 [<ffffffffaee360b0>] ? mem_cgroup_charge_common+0xc0/0xc0 [<ffffffffaedbc194>] pagefault_out_of_memory+0x14/0x90 [<ffffffffaf35d072>] mm_fault_error+0x6a/0x157 [<ffffffffaf3717c8>] __do_page_fault+0x3c8/0x4f0 [<ffffffffaf371925>] do_page_fault+0x35/0x90 [<ffffffffaf36d768>] page_fault+0x28/0x30 Task in /leaker killed as a result of limit of /leaker memory: usage 524288kB, limit 524288kB, failcnt 20628 memory+swap: usage 524288kB, limit 9007199254740988kB, failcnt 0 kmem: usage 0kB, limit 9007199254740988kB, failcnt 0 Memory cgroup stats for /leaker: cache:840KB rss:523448KB rss_huge:0KB mapped_file:0KB swap:0KB inactive_anon:0KB active_anon:523448KB inactive_file:464KB active_file:376KB unevictable:0KB Memory cgroup out of memory: Kill process 3206 (leaker) score 970 or sacrifice child Killed process 3206 (leaker) total-vm:536692kB, anon-rss:523304kB, file-rss:412kB, shmem-rss:0kB
Bisected by Masoud Sharbiani.
--- mm/oom_kill.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-)
mm/oom_kill.c +3 -2
@@ -1068,9 +1068,10 @@ bool out_of_memory(struct oom_control *o* The OOM killer does not compensate for IO-less reclaim. * pagefault_out_of_memory lost its gfp context so we have to * make sure exclude 0 mask - all other users should have at least -* ___GFP_DIRECT_RECLAIM to get here. +* ___GFP_DIRECT_RECLAIM to get here. But mem_cgroup_oom() has to +* invoke the OOM killer even if it is a GFP_NOFS allocation. */ -if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS)) +if (oc->gfp_mask && !(oc->gfp_mask & __GFP_FS) && !is_memcg_oom (oc))return true;/*
Greg Kroah-Hartman
maintainerPATCH 294/344 memcg, kmem: do not fail __GFP_NOFAIL charges
In reply to Greg Kroah-HartmanFrom: Michal Hocko <[email protected]>
commit e55d9d9bfb69405bd7615c0f8d229d8fafb3e9b8 upstream.
Thomas has noticed the following NULL ptr dereference when using cgroup v1 kmem limit:
BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 PGD 0 P4D 0 Oops: 0000 [#1] PREEMPT SMP PTI CPU: 3 PID: 16923 Comm: gtk-update-icon Not tainted 4.19.51 #42 Hardware name: Gigabyte Technology Co., Ltd. Z97X-Gaming G1/Z97X-Gaming G1, BIOS F9 07/31/2015 RIP: 0010:create_empty_buffers+0x24/0x100 Code: cd 0f 1f 44 00 00 0f 1f 44 00 00 41 54 49 89 d4 ba 01 00 00 00 55 53 48 89 fb e8 97 fe ff ff 48 89 c5 48 89 c2 eb 03 48 89 ca <48> 8b 4a 08 4c 09 22 48 85 c9 75 f1 48 89 6a 08 48 8b 43 18 48 8d RSP: 0018:ffff927ac1b37bf8 EFLAGS: 00010286 RAX: 0000000000000000 RBX: fffff2d4429fd740 RCX: 0000000100097149 RDX: 0000000000000000 RSI: 0000000000000082 RDI: ffff9075a99fbe00 RBP: 0000000000000000 R08: fffff2d440949cc8 R09: 00000000000960c0 R10: 0000000000000002 R11: 0000000000000000 R12: 0000000000000000 R13: ffff907601f18360 R14: 0000000000002000 R15: 0000000000001000 FS: 00007fb55b288bc0(0000) GS:ffff90761f8c0000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 CR2: 0000000000000008 CR3: 000000007aebc002 CR4: 00000000001606e0 Call Trace: create_page_buffers+0x4d/0x60 __block_write_begin_int+0x8e/0x5a0 ? ext4_inode_attach_jinode.part.82+0xb0/0xb0 ? jbd2__journal_start+0xd7/0x1f0 ext4_da_write_begin+0x112/0x3d0 generic_perform_write+0xf1/0x1b0 ? file_update_time+0x70/0x140 __generic_file_write_iter+0x141/0x1a0 ext4_file_write_iter+0xef/0x3b0 __vfs_write+0x17e/0x1e0 vfs_write+0xa5/0x1a0 ksys_write+0x57/0xd0 do_syscall_64+0x55/0x160 entry_SYSCALL_64_after_hwframe+0x44/0xa9
Tetsuo then noticed that this is because the __memcg_kmem_charge_memcg fails __GFP_NOFAIL charge when the kmem limit is reached. This is a wrong behavior because nofail allocations are not allowed to fail. Normal charge path simply forces the charge even if that means to cross the limit. Kmem accounting should be doing the same.
--- mm/memcontrol.c | 10 ++++++++++ 1 file changed, 10 insertions(+)
mm/memcontrol.c +10 -0
@@ -2821,6 +2821,16 @@ int __memcg_kmem_charge_memcg(struct pagif (!cgroup_subsys_on_dfl (memory_cgrp_subsys) && !page_counter_try_charge (&memcg->kmem, nr_pages, &counter)) { + +/* +* Enforce __GFP_NOFAIL allocation because callers are not +* prepared to see failures and likely do not have any failure +* handling code. +*/ +if (gfp & __GFP_NOFAIL) { +page_counter_charge (&memcg->kmem, nr_pages); +return 0 ; + }cancel_charge (memcg, nr_pages);return -ENOMEM ; }
Greg Kroah-Hartman
maintainerPATCH 295/344 lib/lzo/lzo1x_compress.c: fix alignment bug in lzo-rle
In reply to Greg Kroah-HartmanFrom: Dave Rodgman <[email protected]>
commit 09b35b4192f6682dff96a093ab1930998cdb73b4 upstream.
Fix an unaligned access which breaks on platforms where this is not permitted (e.g., Sparc).
--- lib/lzo/lzo1x_compress.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-)
lib/lzo/lzo1x_compress.c +8 -6
@@ -83,17 +83,19 @@ next: ALIGN((uintptr_t)ir, 4)) && (ir < limit) && (*ir == 0)) ir++; -for (; (ir +4 ) <= limit; ir +=4 ) { - dv = *((u32 *)ir); -if (dv) { +if (IS_ALIGNED ((uintptr_t )ir,4 )) { +for (; (ir +4 ) <= limit; ir +=4 ) { + dv = *((u32 *)ir); +if (dv) {# if defined(__LITTLE_ENDIAN) - ir +=__builtin_ctz (dv) >>3 ; + ir +=__builtin_ctz (dv) >>3 ;# elif defined(__BIG_ENDIAN) - ir +=__builtin_clz (dv) >>3 ; + ir +=__builtin_clz (dv) >>3 ;# else # error "missing endian definition"# endif -break ; +break ; + } } }#endif
Greg Kroah-Hartman
maintainerPATCH 296/344 mt76: round up length on mt76_wr_copy
In reply to Greg Kroah-HartmanFrom: Felix Fietkau <[email protected]>
commit 850e8f6fbd5d0003b0f1119d19a01c6fef1644e2 upstream.
When beacon length is not a multiple of 4, the beacon could be sent with the last 1-3 bytes corrupted. The skb data is guaranteed to have enough room for reading beyond the end, because it is always followed by skb_shared_info, so rounding up is safe.
All other callers of mt76_wr_copy have multiple-of-4 length already.
--- drivers/net/wireless/mediatek/mt76/mmio.c | 2 +- drivers/net/wireless/mediatek/mt76/usb.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-)
drivers/net/wireless/mediatek/mt76/mmio.c +1 -1
@@ -43,7 +43,7 @@ static u32 mt76_mmio_rmw(struct mt76_devstatic void mt76_mmio_copy (struct mt76_dev *dev,u32 offset,const void *data,int len) { -__iowrite32_copy (dev->mmio.regs + offset, data, len >>2 ); +__iowrite32_copy (dev->mmio.regs + offset, data,DIV_ROUND_UP (len,4 )); } static int mt76_mmio_wr_rp(struct mt76_dev *dev, u32 base,
drivers/net/wireless/mediatek/mt76/usb.c +1 -1
@@ -164,7 +164,7 @@ static void mt76u_copy(struct mt76_dev *int i, ret;mutex_lock (&usb->usb_ctrl_mtx); -for (i =0 ; i < (len /4 ); i++) { +for (i =0 ; i <DIV_ROUND_UP (len,4 ); i++) {put_unaligned_le32 (val[i], usb->data); ret = __mt76u_vendor_request(dev, MT_VEND_MULTI_WRITE, USB_DIR_OUT | USB_TYPE_VENDOR,
Greg Kroah-Hartman
maintainerPATCH 297/344 KEYS: trusted: correctly initialize digests and fix locking issue
In reply to Greg Kroah-HartmanFrom: Roberto Sassu <[email protected]>
commit 9f75c82246313d4c2a6bc77e947b45655b3b5ad5 upstream.
Commit 0b6cf6b97b7e ("tpm: pass an array of tpm_extend_digest structures to tpm_pcr_extend()") modifies tpm_pcr_extend() to accept a digest for each PCR bank. After modification, tpm_pcr_extend() expects that digests are passed in the same order as the algorithms set in chip->allocated_banks.
This patch fixes two issues introduced in the last iterations of the patch
set: missing initialization of the TPM algorithm ID in the tpm_digest structures passed to tpm_pcr_extend() by the trusted key module, and unreleased locks in the TPM driver due to returning from tpm_pcr_extend() without calling tpm_put_ops().
--- drivers/char/tpm/tpm-interface.c | 14 +++++++++----- security/keys/trusted.c | 5 +++++ 2 files changed, 14 insertions(+), 5 deletions(-)
drivers/char/tpm/tpm-interface.c +9 -5
@@ -320,18 +320,22 @@ int tpm_pcr_extend(struct tpm_chip *chipif (!chip)return -ENODEV ; -for (i =0 ; i < chip->nr_allocated_banks; i++) -if (digests[i].alg_id != chip->allocated_banks[i].alg_id) -return -EINVAL ; +for (i =0 ; i < chip->nr_allocated_banks; i++) { +if (digests[i].alg_id != chip->allocated_banks[i].alg_id) { + rc =EINVAL ; + goto out; + } + }if (chip->flags &TPM_CHIP_FLAG_TPM2 ) { rc =tpm2_pcr_extend (chip, pcr_idx, digests); -tpm_put_ops (chip); -return rc; + goto out; } rc =tpm1_pcr_extend (chip, pcr_idx, digests[0 ].digest,"attempting extend a PCR value" ); + +out:tpm_put_ops (chip);return rc; }
security/keys/trusted.c +5 -0
@@ -1228,11 +1228,16 @@ hashalg_fail:static int __init init_digests (void ) { +int i; + digests =kcalloc (chip->nr_allocated_banks,sizeof (*digests),GFP_KERNEL );if (!digests)return -ENOMEM ; +for (i =0 ; i < chip->nr_allocated_banks; i++) + digests[i].alg_id = chip->allocated_banks[i].alg_id; +return 0 ; }