scsi: libiscsi: Fix NULL pointer dereference in iscsi_eh_session_reset
Subsystems (13)
Sasha Levin
maintainerPATCH 1/16 scsi: libiscsi: Fix NULL pointer dereference in iscsi_eh_session_reset
From: Fred Herard <[email protected]>
[ Upstream commit 5db6dd14b31397e8cccaaddab2ff44ebec1acf25 ]
This commit addresses NULL pointer dereference in iscsi_eh_session_reset. Reference should not be made to session->leadconn when session->state is set to ISCSI_STATE_TERMINATE.
--- drivers/scsi/libiscsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/libiscsi.c +2 -2
@@ -2433,8 +2433,8 @@ int iscsi_eh_session_reset(struct scsi_cmnd *sc) failed:ISCSI_DBG_EH (session,"failing session reset: Could not log back into " -"%s, %s [age %d]\n" , session->targetname, - conn->persistent_address, session->age); +"%s [age %d]\n" , session->targetname, + session->age);spin_unlock_bh (&session->frwd_lock);mutex_unlock (&session->eh_mutex);return FAILED ;
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 2/16 scsi: vmw_pscsi: Rearrange code to avoid multiple calls to free_irq during unload
From: Cathy Avery <[email protected]>
[ Upstream commit 02f425f811cefcc4d325d7a72272651e622dc97e ]
Currently pvscsi_remove calls free_irq more than once as pvscsi_release_resources and __pvscsi_shutdown both call pvscsi_shutdown_intr. This results in a 'Trying to free already-free IRQ' warning and stack trace. To solve the problem pvscsi_shutdown_intr has been moved out of pvscsi_release_resources.
--- drivers/scsi/vmw_pvscsi.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/scsi/vmw_pvscsi.c +2 -2
@@ -1225,8 +1225,6 @@ static void pvscsi_shutdown_intr(struct pvscsi_adapter *adapter)static void pvscsi_release_resources (struct pvscsi_adapter *adapter) { -pvscsi_shutdown_intr (adapter); -if (adapter->workqueue)destroy_workqueue (adapter->workqueue);
@@ -1555,6 +1553,7 @@ static int pvscsi_probe(struct pci_dev *pdev, const struct pci_device_id *id) out_reset_adapter:ll_adapter_reset (adapter); out_release_resources: +pvscsi_shutdown_intr (adapter);pvscsi_release_resources (adapter);scsi_host_put (host); out_disable_device:
@@ -1563,6 +1562,7 @@ static int pvscsi_probe(struct pci_dev *pdev, const struct pci_device_id *id)return error; out_release_resources_and_disable: +pvscsi_shutdown_intr (adapter);pvscsi_release_resources (adapter); goto out_disable_device; }
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 3/16 x86/earlyprintk/efi: Fix infinite loop on some screen widths
In reply to Sasha LevinFrom: YiFei Zhu <[email protected]>
[ Upstream commit 79c2206d369b87b19ac29cb47601059b6bf5c291 ]
An affected screen resolution is 1366 x 768, which width is not divisible by 8, the default font width. On such screens, when longer lines are earlyprintk'ed, overflow-to-next-line can never trigger, due to the left-most x-coordinate of the next character always less than the screen width. Earlyprintk will infinite loop in trying to print the rest of the string but unable to, due to the line being full.
This patch makes the trigger consider the right-most x-coordinate, instead of left-most, as the value to compare against the screen width threshold.
--- arch/x86/platform/efi/early_printk.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/x86/platform/efi/early_printk.c +1 -1
@@ -179,7 +179,7 @@ early_efi_write(struct console *con, const char *str, unsigned int num) num--; } -if (efi_x >= si->lfb_width) { +if (efi_x + font->width > si->lfb_width) { efi_x =0 ; efi_y += font->height; }
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 4/16 bonding: fix 802.3ad state sent to partner when unbinding slave
In reply to Sasha LevinFrom: Toni Peltonen <[email protected]>
[ Upstream commit 3b5b3a3331d141e8f2a7aaae3a94dfa1e61ecbe4 ]
Previously when unbinding a slave the 802.3ad implementation only told partner that the port is not suitable for aggregation by setting the port aggregation state from aggregatable to individual. This is not enough. If the physical layer still stays up and we only unbinded this port from the bond there is nothing in the aggregation status alone to prevent the partner from sending traffic towards us. To ensure that the partner doesn't consider this port at all anymore we should also disable collecting and distributing to signal that this actor is going away. Also clear AD_STATE_SYNCHRONIZATION to ensure partner exits collecting + distributing state.
I have tested this behaviour againts Arista EOS switches with mlx5 cards (physical link stays up even when interface is down) and simulated the same situation virtually Linux <-> Linux with two network namespaces running two veth device pairs. In both cases setting aggregation to individual doesn't alone prevent traffic from being to sent towards this port given that the link stays up in partners end. Partner still keeps it's end in collecting + distributing state and continues until timeout is reached. In most cases this means we are losing the traffic partner sends towards our port while we wait for timeout. This is most visible with slow periodic time (LACP rate slow).
Other open source implementations like Open VSwitch and libreswitch, and vendor implementations like Arista EOS, seem to disable collecting + distributing to when doing similar port disabling/detaching/removing change. With this patch kernel implementation would behave the same way and ensure partner doesn't consider our actor viable anymore.
--- drivers/net/bonding/bond_3ad.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/net/bonding/bond_3ad.c +3 -0
@@ -1906,6 +1906,9 @@ void bond_3ad_unbind_slave(struct slave *slave) aggregator->aggregator_identifier);/* Tell the partner that this port is not suitable for aggregation */ + port->actor_oper_port_state &= ~AD_STATE_SYNCHRONIZATION ; + port->actor_oper_port_state &= ~AD_STATE_COLLECTING ; + port->actor_oper_port_state &= ~AD_STATE_DISTRIBUTING ; port->actor_oper_port_state &= ~AD_STATE_AGGREGATION ;__update_lacpdu_from_port (port);ad_lacpdu_send (port);
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 5/16 SUNRPC: Fix leak of krb5p encode pages
In reply to Sasha LevinFrom: Chuck Lever <[email protected]>
[ Upstream commit 8dae5398ab1ac107b1517e8195ed043d5f422bd0 ]
call_encode can be invoked more than once per RPC call. Ensure that each call to gss_wrap_req_priv does not overwrite pointers to previously allocated memory.
--- net/sunrpc/auth_gss/auth_gss.c | 4 ++++ 1 file changed, 4 insertions(+)
net/sunrpc/auth_gss/auth_gss.c +4 -0
@@ -1721,6 +1721,7 @@ priv_release_snd_buf(struct rpc_rqst *rqstp)for (i=0 ; i < rqstp->rq_enc_pages_num; i++)__free_page (rqstp->rq_enc_pages[i]);kfree (rqstp->rq_enc_pages); + rqstp->rq_release_snd_buf =NULL ; } static int
@@ -1729,6 +1730,9 @@ alloc_enc_pages(struct rpc_rqst *rqstp)struct xdr_buf *snd_buf = &rqstp->rq_snd_buf;int first, last, i; +if (rqstp->rq_release_snd_buf) + rqstp->rq_release_snd_buf (rqstp); +if (snd_buf->page_len ==0 ) { rqstp->rq_enc_pages_num =0 ;return 0 ;
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 6/16 SUNRPC: Fix a potential race in xprt_connect()
In reply to Sasha LevinFrom: Trond Myklebust <[email protected]>
[ Upstream commit 0a9a4304f3614e25d9de9b63502ca633c01c0d70 ]
If an asynchronous connection attempt completes while another task is in xprt_connect(), then the call to rpc_sleep_on() could end up racing with the call to xprt_wake_pending_tasks().
So add a second test of the connection state after we've put the task to sleep and set the XPRT_CONNECTING flag, when we know that there can be no asynchronous connection attempts still in progress.
--- net/sunrpc/xprt.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
net/sunrpc/xprt.c +9 -2
@@ -721,8 +721,15 @@ void xprt_connect(struct rpc_task *task)return ;if (xprt_test_and_set_connecting (xprt))return ; - xprt->stat.connect_start = jiffies; - xprt->ops->connect (xprt, task); +/* Race breaker */ +if (!xprt_connected (xprt)) { + xprt->stat.connect_start = jiffies; + xprt->ops->connect (xprt, task); + }else { +xprt_clear_connecting (xprt); + task->tk_status =0 ; +rpc_wake_up_queued_task (&xprt->pending, task); + } } }
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 7/16 sbus: char: add of_node_put()
In reply to Sasha LevinFrom: Yangtao Li <[email protected]>
[ Upstream commit 87d81a23e24f24ebe014891e8bdf3ff8785031e8 ]
use of_node_put() to release the refcount.
--- drivers/sbus/char/display7seg.c | 1 + 1 file changed, 1 insertion(+)
drivers/sbus/char/display7seg.c +1 -0
@@ -221,6 +221,7 @@ static int d7s_probe(struct platform_device *op)dev_set_drvdata (&op->dev, p); d7s_device = p; err =0 ; +of_node_put (opts); out:return err;
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 8/16 drivers/sbus/char: add of_node_put()
In reply to Sasha LevinFrom: Yangtao Li <[email protected]>
[ Upstream commit 6bd520ab7cf69486ea81fd3cdfd2d5a390ad1100 ]
use of_node_put() to release the refcount.
--- drivers/sbus/char/envctrl.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/sbus/char/envctrl.c +2 -0
@@ -910,8 +910,10 @@ static void envctrl_init_i2c_child(struct device_node *dp,for (len =0 ; len <PCF8584_MAX_CHANNELS ; ++len) { pchild->mon_type[len] =ENVCTRL_NOMON ; } +of_node_put (root_node);return ; } +of_node_put (root_node); }/* Get the monitor channels. */
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 9/16 drivers/tty: add missing of_node_put()
In reply to Sasha LevinFrom: Yangtao Li <[email protected]>
[ Upstream commit dac097c4546e4c5b16dd303a1e97c1d319c8ab3e ]
of_find_node_by_path() acquires a reference to the node returned by it and that reference needs to be dropped by its caller. This place is not doing this, so fix it.
--- drivers/tty/serial/suncore.c | 1 + 1 file changed, 1 insertion(+)
drivers/tty/serial/suncore.c +1 -0
@@ -112,6 +112,7 @@ void sunserial_console_termios(struct console *con, struct device_node *uart_dp) mode =of_get_property (dp, mode_prop,NULL );if (!mode) mode ="9600,8,n,1,-" ; +of_node_put (dp); } cflag =CREAD |HUPCL |CLOCAL ;
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 10/16 ide: pmac: add of_node_put()
In reply to Sasha LevinFrom: Yangtao Li <[email protected]>
[ Upstream commit a51921c0db3fd26c4ed83dc0ec5d32988fa02aa5 ]
use of_node_put() to release the refcount.
--- drivers/ide/pmac.c | 1 + 1 file changed, 1 insertion(+)
drivers/ide/pmac.c +1 -0
@@ -920,6 +920,7 @@ static u8 pmac_ide_cable_detect(ide_hwif_t *hwif)struct device_node *root =of_find_node_by_path ("/" );const char *model =of_get_property (root,"model" ,NULL ); +of_node_put (root);/* Get cable type from device-tree. */ if (cable && !strncmp (cable,"80-" ,3 )) {/* Some drives fail to detect 80c cable in PowerBook */
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 11/16 Input: omap-keypad - fix keyboard debounce configuration
In reply to Sasha LevinFrom: Tony Lindgren <[email protected]>
[ Upstream commit 6c3516fed7b61a3527459ccfa67fab130d910610 ]
I noticed that the Android v3.0.8 kernel on droid4 is using different keypad values from the mainline kernel and does not have issues with keys occasionally being stuck until pressed again. Turns out there was an earlier patch posted to fix this as "Input: omap-keypad: errata i689:
Correct debounce time", but it was never reposted to fix use macros for timing calculations.
This updated version is using macros, and also fixes the use of the input clock rate to use 32768KiHz instead of 32000KiHz. And we want to use the known good Android kernel values of 3 and 6 instead of 2 and 6 in the earlier patch.
--- drivers/input/keyboard/omap4-keypad.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-)
drivers/input/keyboard/omap4-keypad.c +14 -4
@@ -60,8 +60,18 @@/* OMAP4 values */ #define OMAP4_VAL_IRQDISABLE 0x0 -#define OMAP4_VAL_DEBOUNCINGTIME 0x7 -#define OMAP4_VAL_PVT 0x7 + +/* +* Errata i689: If a key is released for a time shorter than debounce time, +* the keyboard will idle and never detect the key release. The workaround +* is to use at least a 12ms debounce time. See omap5432 TRM chapter +* "26.4.6.2 Keyboard Controller Timer" for more information. +*/ +#define OMAP4_KEYPAD_PTV_DIV_128 0x6 +#define OMAP4_KEYPAD_DEBOUNCINGTIME_MS (dbms, ptv) \ + ((((dbms) * 1000) / ((1 << ((ptv) + 1)) * (1000000 / 32768))) - 1) +#define OMAP4_VAL_DEBOUNCINGTIME_16MS \ + OMAP4_KEYPAD_DEBOUNCINGTIME_MS(16, OMAP4_KEYPAD_PTV_DIV_128)enum {KBD_REVISION_OMAP4 =0 ,
@@ -181,9 +191,9 @@ static int omap4_keypad_open(struct input_dev *input)kbd_writel (keypad_data,OMAP4_KBD_CTRL ,OMAP4_DEF_CTRL_NOSOFTMODE | - (OMAP4_VAL_PVT <<OMAP4_DEF_CTRL_PTV_SHIFT )); + (OMAP4_KEYPAD_PTV_DIV_128 <<OMAP4_DEF_CTRL_PTV_SHIFT ));kbd_writel (keypad_data,OMAP4_KBD_DEBOUNCINGTIME , -OMAP4_VAL_DEBOUNCINGTIME ); +OMAP4_VAL_DEBOUNCINGTIME_16MS );/* clear pending interrupts */ kbd_write_irqreg (keypad_data,OMAP4_KBD_IRQSTATUS ,kbd_read_irqreg (keypad_data,OMAP4_KBD_IRQSTATUS ));
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 12/16 libata: whitelist all SAMSUNG MZ7KM* solid-state disks
In reply to Sasha LevinFrom: Juha-Matti Tilli <[email protected]>
[ Upstream commit fd6f32f78645db32b6b95a42e45da2ddd6de0e67 ]
These devices support read zero after trim (RZAT), as they advertise to the OS. However, the OS doesn't believe the SSDs unless they are explicitly whitelisted.
--- drivers/ata/libata-core.c | 1 + 1 file changed, 1 insertion(+)
drivers/ata/libata-core.c +1 -0
@@ -4295,6 +4295,7 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = { { "SSD*INTEL*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "Samsung*SSD*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "SAMSUNG*SSD*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, + { "SAMSUNG*MZ7KM*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, }, { "ST[1248][0248]0[FH]*", NULL, ATA_HORKAGE_ZERO_AFTER_TRIM, },/* devices that don't properly handle TRIM commands */
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 13/16 net: 8139cp: fix a BUG triggered by changing mtu with network traffic
In reply to Sasha LevinFrom: Su Yanjun <[email protected]>
[ Upstream commit a5d4a89245ead1f37ed135213653c5beebea4237 ]
When changing mtu many times with traffic, a bug is triggered:
[ 1035.684037] kernel BUG at lib/dynamic_queue_limits.c:26! [ 1035.684042] invalid opcode: 0000 [#1] SMP [ 1035.684049] Modules linked in: loop binfmt_misc 8139cp(OE) macsec
tcp_diag udp_diag inet_diag unix_diag af_packet_diag netlink_diag tcp_lp fuse uinput xt_CHECKSUM iptable_mangle ipt_MASQUERADE nf_nat_masquerade_ipv4 iptable_nat nf_nat_ipv4 nf_nat nf_conntrack_ipv4 nf_defrag_ipv4 xt_conntrack nf_conntrack ipt_REJECT nf_reject_ipv4 tun bridge stp llc ebtable_filter ebtables ip6table_filter devlink ip6_tables iptable_filter sunrpc snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep ppdev snd_seq iosf_mbi crc32_pclmul parport_pc snd_seq_device ghash_clmulni_intel parport snd_pcm aesni_intel joydev lrw snd_timer virtio_balloon sg gf128mul glue_helper ablk_helper cryptd snd soundcore i2c_piix4 pcspkr ip_tables xfs libcrc32c sr_mod sd_mod cdrom crc_t10dif crct10dif_generic ata_generic
[ 1035.684102] pata_acpi virtio_console qxl drm_kms_helper syscopyarea
sysfillrect sysimgblt floppy fb_sys_fops crct10dif_pclmul crct10dif_common ttm crc32c_intel serio_raw ata_piix drm libata 8139too virtio_pci drm_panel_orientation_quirks virtio_ring virtio mii dm_mirror dm_region_hash dm_log dm_mod [last unloaded: 8139cp]
[ 1035.684132] CPU: 9 PID: 25140 Comm: if-mtu-change Kdump: loaded Tainted: G OE ------------ T 3.10.0-957.el7.x86_64 #1 [ 1035.684134] Hardware name: Red Hat KVM, BIOS 0.5.1 01/01/2011 [ 1035.684136] task: ffff8f59b1f5a080 ti: ffff8f5a2e32c000 task.ti: ffff8f5a2e32c000 [ 1035.684149] RIP: 0010:[<ffffffffba3a40d0>] [<ffffffffba3a40d0>] dql_completed+0x180/0x190 [ 1035.684162] RSP: 0000:ffff8f5a75483e50 EFLAGS: 00010093 [ 1035.684162] RAX: 00000000000000c2 RBX: ffff8f5a6f91c000 RCX: 0000000000000000 [ 1035.684162] RDX: 0000000000000000 RSI: 0000000000000184 RDI: ffff8f599fea3ec0 [ 1035.684162] RBP: ffff8f5a75483ea8 R08: 00000000000000c2 R09: 0000000000000000 [ 1035.684162] R10: 00000000000616ef R11: ffff8f5a75483b56 R12: ffff8f599fea3e00 [ 1035.684162] R13: 0000000000000001 R14: 0000000000000000 R15: 0000000000000184 [ 1035.684162] FS: 00007fa8434de740(0000) GS:ffff8f5a75480000(0000) knlGS:0000000000000000 [ 1035.684162] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 1035.684162] CR2: 00000000004305d0 CR3: 000000024eb66000 CR4: 00000000001406e0 [ 1035.684162] Call Trace: [ 1035.684162] <IRQ> [ 1035.684162] [<ffffffffc08cbaf8>] ? cp_interrupt+0x478/0x580 [8139cp] [ 1035.684162] [<ffffffffba14a294>] __handle_irq_event_percpu+0x44/0x1c0 [ 1035.684162] [<ffffffffba14a442>] handle_irq_event_percpu+0x32/0x80 [ 1035.684162] [<ffffffffba14a4cc>] handle_irq_event+0x3c/0x60 [ 1035.684162] [<ffffffffba14db29>] handle_fasteoi_irq+0x59/0x110 [ 1035.684162] [<ffffffffba02e554>] handle_irq+0xe4/0x1a0 [ 1035.684162] [<ffffffffba7795dd>] do_IRQ+0x4d/0xf0 [ 1035.684162] [<ffffffffba76b362>] common_interrupt+0x162/0x162 [ 1035.684162] <EOI> [ 1035.684162] [<ffffffffba0c2ae4>] ? __wake_up_bit+0x24/0x70 [ 1035.684162] [<ffffffffba1e46f5>] ? do_set_pte+0xd5/0x120 [ 1035.684162] [<ffffffffba1b64fb>] unlock_page+0x2b/0x30 [ 1035.684162] [<ffffffffba1e4879>] do_read_fault.isra.61+0x139/0x1b0 [ 1035.684162] [<ffffffffba1e9134>] handle_pte_fault+0x2f4/0xd10 [ 1035.684162] [<ffffffffba1ebc6d>] handle_mm_fault+0x39d/0x9b0 [ 1035.684162] [<ffffffffba76f5e3>] __do_page_fault+0x203/0x500 [ 1035.684162] [<ffffffffba76f9c6>] trace_do_page_fault+0x56/0x150 [ 1035.684162] [<ffffffffba76ef42>] do_async_page_fault+0x22/0xf0 [ 1035.684162] [<ffffffffba76b788>] async_page_fault+0x28/0x30 [ 1035.684162] Code: 54 c7 47 54 ff ff ff ff 44 0f 49 ce 48 8b 35 48 2f 9c 00 48 89 77 58 e9 fe fe ff ff 0f 1f 80 00 00 00 00 41 89 d1 e9 ef fe ff ff <0f> 0b 66 2e 0f 1f 84 00 00 00 00 00 0f 1f 40 00 55 8d 42 ff 48 [ 1035.684162] RIP [<ffffffffba3a40d0>] dql_completed+0x180/0x190 [ 1035.684162] RSP <ffff8f5a75483e50>
It's not the same as in 7fe0ee09 patch described. As 8139cp uses shared irq mode, other device irq will trigger cp_interrupt to execute.
cp_change_mtu
-> cp_close
-> cp_open
In cp_close routine just before free_irq(), some interrupt may occur. In my environment, cp_interrupt exectutes and IntrStatus is 0x4, exactly TxOk. That will cause cp_tx to wake device queue.
As device queue is started, cp_start_xmit and cp_open will run at same time which will cause kernel BUG.
For example:
[#] for tx descriptor
At start:
[#][#][#]
num_queued=3
After cp_init_hw->cp_start_hw->netdev_reset_queue:
[#][#][#]
num_queued=0
When 8139cp starts to work then cp_tx will checknum_queued mismatchs the complete_bytes.
The patch will check IntrMask before check IntrStatus in cp_interrupt. When 8139cp interrupt is disabled, just return.
--- drivers/net/ethernet/realtek/8139cp.c | 5 +++++ 1 file changed, 5 insertions(+)
drivers/net/ethernet/realtek/8139cp.c +5 -0
@@ -576,6 +576,7 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance)struct cp_private *cp;int handled =0 ;u16 status; +u16 mask;if (unlikely (dev ==NULL ))return IRQ_NONE ;
@@ -583,6 +584,10 @@ static irqreturn_t cp_interrupt (int irq, void *dev_instance)spin_lock (&cp->lock); + mask =cpr16 (IntrMask); +if (!mask) + goto out_unlock; + status =cpr16 (IntrStatus);if (!status || (status ==0xFFFF )) goto out_unlock;
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 14/16 ARM: 8814/1: mm: improve/fix ARM v7_dma_inv_range() unaligned address handling
In reply to Sasha LevinFrom: Chris Cole <[email protected]>
[ Upstream commit a1208f6a822ac29933e772ef1f637c5d67838da9 ]
This patch addresses possible memory corruption when v7_dma_inv_range(start_address, end_address) address parameters are not aligned to whole cache lines. This function issues "invalidate" cache management operations to all cache lines from start_address (inclusive) to end_address (exclusive). When start_address and/or end_address are not aligned, the start and/or end cache lines are first issued "clean & invalidate" operation. The assumption is this is done to ensure that any dirty data addresses outside the address range (but part of the first or last cache lines) are cleaned/flushed so that data is not lost, which could happen if just an invalidate is issued.
The problem is that these first/last partial cache lines are issued "clean & invalidate" and then "invalidate". This second "invalidate" is not required and worse can cause "lost" writes to addresses outside the address range but part of the cache line. If another component writes to its part of the cache line between the "clean & invalidate" and "invalidate" operations, the write can get lost. This fix is to remove the extra "invalidate" operation when unaligned addressed are used.
A kernel module is available that has a stress test to reproduce the issue and a unit test of the updated v7_dma_inv_range(). It can be downloaded from
http://ftp.sageembedded.com/outgoing/linux/cache-test-20181107.tgz.
v7_dma_inv_range() is call by dmac_[un]map_area(addr, len, direction) when the direction is DMA_FROM_DEVICE. One can (I believe) successfully argue that DMA from a device to main memory should use buffers aligned to cache line size, because the "clean & invalidate" might overwrite data that the device just wrote using DMA. But if a driver does use unaligned buffers, at least this fix will prevent memory corruption outside the buffer.
--- arch/arm/mm/cache-v7.S | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
arch/arm/mm/cache-v7.S +5 -3
@@ -359,14 +359,16 @@ v7_dma_inv_range: ALT_UP(W(nop)) #endif mcrne p15, 0, r0, c7, c14, 1 @ clean & invalidate D / U line + addne r0, r0, r2 tst r1, r3 bic r1, r1, r3 mcrne p15, 0, r1, c7, c14, 1 @ clean & invalidate D / U line -1: - mcr p15, 0, r0, c7, c6, 1 @ invalidate D / U line - add r0, r0, r2 cmp r0, r1 +1: + mcrlo p15, 0, r0, c7, c6, 1 @ invalidate D / U line + addlo r0, r0, r2 + cmplo r0, r1 blo 1b dsb st ret lr
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 15/16 cifs: In Kconfig CONFIG_CIFS_POSIX needs depends on legacy (insecure cifs)
In reply to Sasha LevinFrom: Steve French <[email protected]>
[ Upstream commit 6e785302dad32228819d8066e5376acd15d0e6ba ]
Missing a dependency. Shouldn't show cifs posix extensions in Kconfig if CONFIG_CIFS_ALLOW_INSECURE_DIALECTS (ie SMB1 protocol) is disabled.
--- fs/cifs/Kconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/cifs/Kconfig +1 -1
@@ -111,7 +111,7 @@ config CIFS_XATTR config CIFS_POSIX bool "CIFS POSIX Extensions" - depends on CIFS_XATTR + depends on CIFS && CIFS_ALLOW_INSECURE_LEGACY && CIFS_XATTR help Enabling this option will cause the cifs client to attempt to negotiate a newer dialect with servers, such as Samba 3.0.5
Signature · 1 line
2.19.1
Sasha Levin
maintainerPATCH 16/16 i2c: scmi: Fix probe error on devices with an empty SMB0001 ACPI device node
In reply to Sasha LevinFrom: Hans de Goede <[email protected]>
[ Upstream commit 0544ee4b1ad574aec3b6379af5f5cdee42840971 ]
Some AMD based HP laptops have a SMB0001 ACPI device node which does not define any methods.
This leads to the following error in dmesg:
[ 5.222731] cmi: probe of SMB0001:00 failed with error -5
This commit makes acpi_smbus_cmi_add() return -ENODEV instead in this case silencing the error. In case of a failure of the i2c_add_adapter() call this commit now propagates the error from that call instead of -EIO.
--- drivers/i2c/busses/i2c-scmi.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/i2c/busses/i2c-scmi.c +7 -3
@@ -364,6 +364,7 @@ static int acpi_smbus_cmi_add(struct acpi_device *device) {struct acpi_smbus_cmi *smbus_cmi;const struct acpi_device_id *id; +int ret; smbus_cmi =kzalloc (sizeof (struct acpi_smbus_cmi ),GFP_KERNEL );if (!smbus_cmi)
@@ -385,8 +386,10 @@ static int acpi_smbus_cmi_add(struct acpi_device *device)acpi_walk_namespace (ACPI_TYPE_METHOD , smbus_cmi->handle,1 , acpi_smbus_cmi_query_methods,NULL , smbus_cmi,NULL ); -if (smbus_cmi->cap_info ==0 ) +if (smbus_cmi->cap_info ==0 ) { + ret = -ENODEV ; goto err; + } snprintf(smbus_cmi->adapter.name, sizeof(smbus_cmi->adapter.name), "SMBus CMI adapter %s",
@@ -397,7 +400,8 @@ static int acpi_smbus_cmi_add(struct acpi_device *device) smbus_cmi->adapter.class =I2C_CLASS_HWMON |I2C_CLASS_SPD ; smbus_cmi->adapter.dev.parent = &device->dev; -if (i2c_add_adapter (&smbus_cmi->adapter)) { + ret =i2c_add_adapter (&smbus_cmi->adapter); +if (ret) {dev_err (&device->dev,"Couldn't register adapter!\n" ); goto err; }
@@ -407,7 +411,7 @@ static int acpi_smbus_cmi_add(struct acpi_device *device) err:kfree (smbus_cmi); device->driver_data =NULL ; -return -EIO ; +return ret; }static int acpi_smbus_cmi_remove (struct acpi_device *device)
Signature · 1 line
2.19.1