4.4.22-stable review
Subsystems (7)
Greg Kroah-Hartman
maintainerPATCH 4/118 MIPS: KVM: Check for pfn noslot case
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hogan <[email protected]>
commit ba913e4f72fc9cfd03dad968dfb110eb49211d80 upstream.
When mapping a page into the guest we error check using is_error_pfn(), however this doesn't detect a value of KVM_PFN_NOSLOT, indicating an error HVA for the page. This can only happen on MIPS right now due to unusual memslot management (e.g. being moved / removed / resized), or with an Enhanced Virtual Memory (EVA) configuration where the default KVM_HVA_ERR_* and kvm_is_error_hva() definitions are unsuitable (fixed in a later patch). This case will be treated as a pfn of zero, mapping the first page of physical memory into the guest.
It would appear the MIPS KVM port wasn't updated prior to being merged (in v3.10) to take commit 81c52c56e2b4 ("KVM: do not treat noslot pfn as a error pfn") into account (merged v3.8), which converted a bunch of is_error_pfn() calls to is_error_noslot_pfn(). Switch to using is_error_noslot_pfn() instead to catch this case properly.
--- arch/mips/kvm/tlb.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/mips/kvm/tlb.c +1 -1
@@ -152,7 +152,7 @@ static int kvm_mips_map_page(struct kvm srcu_idx =srcu_read_lock (&kvm->srcu); pfn =kvm_mips_gfn_to_pfn (kvm, gfn); -if (kvm_mips_is_error_pfn (pfn)) { +if (is_error_noslot_pfn (pfn)) {kvm_err ("Couldn't get pfn for gfn %#" PRIx64"!\n" , gfn); err = -EFAULT ; goto out;
Greg Kroah-Hartman
maintainerPATCH 8/118 tipc: move linearization of buffers to generic code
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jon Paul Maloy <[email protected]>
commit c7cad0d6f70cd4ce8644ffe528a4df1cdc2e77f5 upstream.
In commit 5cbb28a4bf65c7e4 ("tipc: linearize arriving NAME_DISTR and LINK_PROTO buffers") we added linearization of NAME_DISTRIBUTOR, LINK_PROTOCOL/RESET and LINK_PROTOCOL/ACTIVATE to the function tipc_udp_recv(). The location of the change was selected in order to make the commit easily appliable to 'net' and 'stable'.
We now move this linearization to where it should be done, in the functions tipc_named_rcv() and tipc_link_proto_rcv() respectively.
--- net/tipc/link.c | 2 ++ net/tipc/name_distr.c | 1 + net/tipc/udp_media.c | 5 ----- 3 files changed, 3 insertions(+), 5 deletions(-)
net/tipc/link.c +2 -0
@@ -1262,6 +1262,8 @@ static int tipc_link_proto_rcv(struct ti/* fall thru' */ case ACTIVATE_MSG : +skb_linearize (skb); + hdr =buf_msg (skb);/* Complete own link name with peer's interface name */ if_name =strrchr (l->name,':' ) +1 ;
net/tipc/name_distr.c +1 -0
@@ -397,6 +397,7 @@ void tipc_named_rcv(struct net *net, strspin_lock_bh (&tn->nametbl_lock);for (skb =skb_dequeue (inputq); skb; skb =skb_dequeue (inputq)) { +skb_linearize (skb); msg =buf_msg (skb); mtype =msg_type (msg); item = (struct distr_item *)msg_data (msg);
net/tipc/udp_media.c +0 -5
@@ -48,7 +48,6 @@#include <linux/tipc_netlink.h> #include "core.h" #include "bearer.h" -#include "msg.h" /* IANA assigned UDP port */ #define UDP_PORT_DEFAULT 6118
@@ -224,10 +223,6 @@ static int tipc_udp_recv(struct sock *sk {struct udp_bearer *ub;struct tipc_bearer *b; -int usr =msg_user (buf_msg (skb)); - -if ((usr ==LINK_PROTOCOL ) || (usr ==NAME_DISTRIBUTOR )) -skb_linearize (skb); ub =rcu_dereference_sk_user_data (sk);if (!ub) {
Greg Kroah-Hartman
maintainerPATCH 12/118 kernfs: dont depend on d_find_any_alias() when generating notifications
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tejun Heo <[email protected]>
commit df6a58c5c5aa8ecb1e088ecead3fa33ae70181f1 upstream.
kernfs_notify_workfn() sends out file modified events for the scheduled kernfs_nodes. Because the modifications aren't from userland, it doesn't have the matching file struct at hand and can't use fsnotify_modify(). Instead, it looked up the inode and then used d_find_any_alias() to find the dentry and used fsnotify_parent() and fsnotify() directly to generate notifications.
The assumption was that the relevant dentries would have been pinned if there are listeners, which isn't true as inotify doesn't pin dentries at all and watching the parent doesn't pin the child dentries even for dnotify. This led to, for example, inotify watchers not getting notifications if the system is under memory pressure and the matching dentries got reclaimed. It can also be triggered through /proc/sys/vm/drop_caches or a remount attempt which involves shrinking dcache.
fsnotify_parent() only uses the dentry to access the parent inode, which kernfs can do easily. Update kernfs_notify_workfn() so that it uses fsnotify() directly for both the parent and target inodes without going through d_find_any_alias(). While at it, supply the target file name to fsnotify() from kernfs_node->name.
--- fs/kernfs/file.c | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-)
fs/kernfs/file.c +21 -7
@@ -833,21 +833,35 @@ repeat:mutex_lock (&kernfs_mutex);list_for_each_entry (info, &kernfs_root (kn)->supers, node) { +struct kernfs_node *parent;struct inode *inode; -struct dentry *dentry; +/* +* We want fsnotify_modify() on @kn but as the +* modifications aren't originating from userland don't +* have the matching @file available. Look up the inodes +* and generate the events manually. +*/ inode =ilookup (info->sb, kn->ino);if (!inode)continue ; - dentry =d_find_any_alias (inode); -if (dentry) { -fsnotify_parent (NULL , dentry,FS_MODIFY ); -fsnotify (inode,FS_MODIFY , inode,FSNOTIFY_EVENT_INODE , -NULL ,0 ); -dput (dentry); + parent =kernfs_get_parent (kn); +if (parent) { +struct inode *p_inode; + + p_inode =ilookup (info->sb, parent->ino); +if (p_inode) { +fsnotify (p_inode,FS_MODIFY |FS_EVENT_ON_CHILD , + inode,FSNOTIFY_EVENT_INODE , kn->name,0 ); +iput (p_inode); + } + +kernfs_put (parent); } +fsnotify (inode,FS_MODIFY , inode,FSNOTIFY_EVENT_INODE , + kn->name,0 );iput (inode); }
Greg Kroah-Hartman
maintainerPATCH 20/118 audit: fix exe_file access in audit_exe_compare
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mateusz Guzik <[email protected]>
commit 5efc244346f9f338765da3d592f7947b0afdc4b5 upstream.
Prior to the change the function would blindly deference mm, exe_file and exe_file->f_inode, each of which could have been NULL or freed.
Use get_task_exe_file to safely obtain stable exe_file.
--- kernel/audit_watch.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
kernel/audit_watch.c +5 -3
@@ -19,6 +19,7 @@* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +#include <linux/file.h> #include <linux/kernel.h> #include <linux/audit.h> #include <linux/kthread.h>
@@ -544,10 +545,11 @@ int audit_exe_compare(struct task_structunsigned long ino;dev_t dev; -rcu_read_lock (); - exe_file =rcu_dereference (tsk->mm->exe_file); + exe_file =get_task_exe_file (tsk); +if (!exe_file) +return 0 ; ino = exe_file->f_inode->i_ino; dev = exe_file->f_inode->i_sb->s_dev; -rcu_read_unlock (); +fput (exe_file);return audit_mark_compare (mark, ino, dev); }
Greg Kroah-Hartman
maintainerPATCH 21/118 dm flakey: fix reads to be issued if drop_writes configured
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mike Snitzer <[email protected]>
commit 299f6230bc6d0ccd5f95bb0fb865d80a9c7d5ccc upstream.
v4.8-rc3 commit 99f3c90d0d ("dm flakey: error READ bios during the down_interval") overlooked the 'drop_writes' feature, which is meant to allow reads to be issued rather than errored, during the down_interval.
--- drivers/md/dm-flakey.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-)
drivers/md/dm-flakey.c +16 -11
@@ -289,15 +289,13 @@ static int flakey_map(struct dm_target * pb->bio_submitted = true;/* -* Map reads as normal only if corrupt_bio_byte set. +* Error reads if neither corrupt_bio_byte or drop_writes are set. +* Otherwise, flakey_end_io() will decide if the reads should be modified. */ if (bio_data_dir (bio) ==READ ) { -/* If flags were specified, only corrupt those that match. */ -if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw ==READ ) && -all_corrupt_bio_flags_match (bio, fc)) - goto map_bio; -else +if (!fc->corrupt_bio_byte && !test_bit (DROP_WRITES , &fc->flags))return -EIO ; + goto map_bio; }/*
@@ -334,14 +332,21 @@ static int flakey_end_io(struct dm_targestruct flakey_c *fc = ti->private;struct per_bio_data *pb =dm_per_bio_data (bio,sizeof (struct per_bio_data )); -/* -* Corrupt successful READs while in down state. -*/ if (!error && pb->bio_submitted && (bio_data_dir (bio) ==READ )) { -if (fc->corrupt_bio_byte) +if (fc->corrupt_bio_byte && (fc->corrupt_bio_rw ==READ ) && +all_corrupt_bio_flags_match (bio, fc)) { +/* +* Corrupt successful matching READs while in down state. +*/ corrupt_bio_data (bio, fc); -else + + }else if (!test_bit (DROP_WRITES , &fc->flags)) { +/* +* Error read during the down_interval if drop_writes +* wasn't configured. +*/ return -EIO ; + } }return error;
Greg Kroah-Hartman
maintainerPATCH 22/118 IB/uverbs: Fix race between uverbs_close and remove_one
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
commit d1e09f304a1d9651c5059ebfeb696dc2effc9b32 upstream.
Fixes an oops that might happen if uverbs_close races with remove_one.
Both contexts may run ib_uverbs_cleanup_ucontext, it depends on the flow.
Currently, there is no protection for a case that remove_one didn't make the cleanup it runs to its end, the underlying ib_device was freed then uverbs_close will call ib_uverbs_cleanup_ucontext and OOPs.
Above might happen if uverbs_close deleted the file from the list then remove_one didn't find it and runs to its end.
Fixes to protect against that case by a new cleanup lock so that ib_uverbs_cleanup_ucontext will be called always before that remove_one is ended.
--- drivers/infiniband/core/uverbs.h | 1 drivers/infiniband/core/uverbs_main.c | 37 ++++++++++++++++++++++------------ 2 files changed, 25 insertions(+), 13 deletions(-)
drivers/infiniband/core/uverbs.h +1 -0
@@ -116,6 +116,7 @@ struct ib_uverbs_event_file {struct ib_uverbs_file {struct kref ref;struct mutex mutex; +struct mutex cleanup_mutex;/* protect cleanup */ struct ib_uverbs_device *device;struct ib_ucontext *ucontext;struct ib_event_handler event_handler;
drivers/infiniband/core/uverbs_main.c +24 -13
@@ -922,6 +922,7 @@ static int ib_uverbs_open(struct inode * file->async_file =NULL ;kref_init (&file->ref);mutex_init (&file->mutex); +mutex_init (&file->cleanup_mutex); filp->private_data = file;kobject_get (&dev->kobj);
@@ -947,18 +948,20 @@ static int ib_uverbs_close(struct inode {struct ib_uverbs_file *file = filp->private_data;struct ib_uverbs_device *dev = file->device; -struct ib_ucontext *ucontext =NULL ; + +mutex_lock (&file->cleanup_mutex); +if (file->ucontext) { +ib_uverbs_cleanup_ucontext (file, file->ucontext); + file->ucontext =NULL ; + } +mutex_unlock (&file->cleanup_mutex);mutex_lock (&file->device->lists_mutex); - ucontext = file->ucontext; - file->ucontext =NULL ;if (!file->is_closed) {list_del (&file->list); file->is_closed =1 ; }mutex_unlock (&file->device->lists_mutex); -if (ucontext) -ib_uverbs_cleanup_ucontext (file, ucontext);if (file->async_file)kref_put (&file->async_file->ref, ib_uverbs_release_event_file);
@@ -1172,22 +1175,30 @@ static void ib_uverbs_free_hw_resources(mutex_lock (&uverbs_dev->lists_mutex);while (!list_empty (&uverbs_dev->uverbs_file_list)) {struct ib_ucontext *ucontext; - file =list_first_entry (&uverbs_dev->uverbs_file_list, struct ib_uverbs_file, list); file->is_closed =1 ; - ucontext = file->ucontext;list_del (&file->list); - file->ucontext =NULL ;kref_get (&file->ref);mutex_unlock (&uverbs_dev->lists_mutex); -/* We must release the mutex before going ahead and calling -* disassociate_ucontext. disassociate_ucontext might end up -* indirectly calling uverbs_close, for example due to freeing -* the resources (e.g mmput). -*/ +ib_uverbs_event_handler (&file->event_handler, &event); + +mutex_lock (&file->cleanup_mutex); + ucontext = file->ucontext; + file->ucontext =NULL ; +mutex_unlock (&file->cleanup_mutex); + +/* At this point ib_uverbs_close cannot be running +* ib_uverbs_cleanup_ucontext +*/ if (ucontext) { +/* We must release the mutex before going ahead and +* calling disassociate_ucontext. disassociate_ucontext +* might end up indirectly calling uverbs_close, +* for example due to freeing the resources +* (e.g mmput). +*/ ib_dev->disassociate_ucontext (ucontext);ib_uverbs_cleanup_ucontext (file, ucontext); }
Greg Kroah-Hartman
maintainerPATCH 25/118 x86/AMD: Apply erratum 665 on machines without a BIOS fix
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Emanuel Czirai <[email protected]>
commit d1992996753132e2dafe955cccb2fb0714d3cfc4 upstream.
AMD F12h machines have an erratum which can cause DIV/IDIV to behave unpredictably. The workaround is to set MSRC001_1029[31] but sometimes there is no BIOS update containing that workaround so let's do it ourselves unconditionally. It is simple enough.
[ Borislav: Wrote commit message. ]
--- arch/x86/kernel/cpu/amd.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/x86/kernel/cpu/amd.c +12 -0
@@ -656,6 +656,17 @@ static void init_amd_gh(struct cpuinfo_xset_cpu_bug (c,X86_BUG_AMD_TLB_MMATCH ); } +#define MSR_AMD64_DE_CFG 0xC0011029 + +static void init_amd_ln (struct cpuinfo_x86 *c) +{ +/* +* Apply erratum 665 fix unconditionally so machines without a BIOS +* fix work. +*/ +msr_set_bit (MSR_AMD64_DE_CFG ,31 ); +} +static void init_amd_bd (struct cpuinfo_x86 *c) {u64 value;
@@ -713,6 +724,7 @@ static void init_amd(struct cpuinfo_x86case 6 :init_amd_k7 (c);break ;case 0xf :init_amd_k8 (c);break ;case 0x10 :init_amd_gh (c);break ; +case 0x12 :init_amd_ln (c);break ;case 0x15 :init_amd_bd (c);break ; }
Greg Kroah-Hartman
maintainerPATCH 29/118 iio: adc: rockchip_saradc: reset saradc controller before programming it
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Caesar Wang <[email protected]>
commit 543852af8e5902aee8f7c72c89e1513663e0f696 upstream.
SARADC controller needs to be reset before programming it, otherwise it will not function properly.
--- Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt | 7 ++ drivers/iio/adc/Kconfig | 1 drivers/iio/adc/rockchip_saradc.c | 30 ++++++++++ 3 files changed, 38 insertions(+)
Documentation/devicetree/bindings/iio/adc/rockchip-saradc.txt +7 -0
@@ -12,6 +12,11 @@ Required properties: - vref-supply: The regulator supply ADC reference voltage. - #io-channel-cells: Should be 1, see ../iio-bindings.txt +Optional properties: +- resets: Must contain an entry for each entry in reset-names if need support + this option. See ../reset/reset.txt for details. +- reset-names: Must include the name "saradc-apb". + Example: saradc: saradc@2006c000 { compatible = "rockchip,saradc";
@@ -19,6 +24,8 @@ Example: interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>; clocks = <&cru SCLK_SARADC>, <&cru PCLK_SARADC>; clock-names = "saradc", "apb_pclk"; + resets = <&cru SRST_SARADC>; + reset-names = "saradc-apb"; #io-channel-cells = <1>; vref-supply = <&vcc18>; };
drivers/iio/adc/Kconfig +1 -0
@@ -306,6 +306,7 @@ config QCOM_SPMI_VADC config ROCKCHIP_SARADC tristate "Rockchip SARADC driver" depends on ARCH_ROCKCHIP || (ARM && COMPILE_TEST) + depends on RESET_CONTROLLER help Say yes here to build support for the SARADC found in SoCs from Rockchip.
drivers/iio/adc/rockchip_saradc.c +30 -0
@@ -21,6 +21,8 @@#include <linux/of_device.h> #include <linux/clk.h> #include <linux/completion.h> +#include <linux/delay.h> +#include <linux/reset.h> #include <linux/regulator/consumer.h> #include <linux/iio/iio.h>
@@ -53,6 +55,7 @@ struct rockchip_saradc {struct clk *clk;struct completion completion;struct regulator *vref; +struct reset_control *reset;const struct rockchip_saradc_data *data;u16 last_val; };
@@ -171,6 +174,16 @@ static const struct of_device_id rockchi };MODULE_DEVICE_TABLE (of, rockchip_saradc_match); +/** +* Reset SARADC Controller. +*/ +static void rockchip_saradc_reset_controller (struct reset_control *reset) +{ +reset_control_assert (reset); +usleep_range (10 ,20 ); +reset_control_deassert (reset); +} +static int rockchip_saradc_probe (struct platform_device *pdev) {struct rockchip_saradc *info =NULL ;
@@ -199,6 +212,20 @@ static int rockchip_saradc_probe(structif (IS_ERR (info->regs))return PTR_ERR (info->regs); +/* +* The reset should be an optional property, as it should work +* with old devicetrees as well +*/ + info->reset =devm_reset_control_get (&pdev->dev,"saradc-apb" ); +if (IS_ERR (info->reset)) { + ret =PTR_ERR (info->reset); +if (ret != -ENOENT ) +return ret; + +dev_dbg (&pdev->dev,"no reset control found\n" ); + info->reset =NULL ; + } +init_completion (&info->completion); irq =platform_get_irq (pdev,0 );
@@ -233,6 +260,9 @@ static int rockchip_saradc_probe(structreturn PTR_ERR (info->vref); } +if (info->reset) +rockchip_saradc_reset_controller (info->reset); +/* * Use a default value for the converter clock. * This may become user-configurable in the future.
Greg Kroah-Hartman
maintainerPATCH 30/118 iio: adc: ti_am335x_adc: Protect FIFO1 from concurrent access
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vignesh R <[email protected]>
commit 90c43ec6997a892448f1f86180a515f59cafd8a3 upstream.
It is possible that two or more ADC channels can be simultaneously requested for raw samples, in which case there can be race in access to FIFO data resulting in loss of samples.
If am335x_tsc_se_set_once() is called again from tiadc_read_raw(), when ADC is still acquired to sample one of the channels, the second process might be put into uninterruptible sleep state. Fix these issues, by protecting FIFO access and channel configurations with a mutex. Since tiadc_read_raw() might take anywhere between few microseconds to few milliseconds to finish execution (depending on averaging and delay values supplied via DT), its better to use mutex instead of spinlock.
--- drivers/iio/adc/ti_am335x_adc.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/iio/adc/ti_am335x_adc.c +11 -3
@@ -32,6 +32,7 @@struct tiadc_device {struct ti_tscadc_dev *mfd_tscadc; +struct mutex fifo1_lock;/* to protect fifo access */ int channels;u8 channel_line[8 ];u8 channel_step[8 ];
@@ -360,6 +361,7 @@ static int tiadc_read_raw(struct iio_dev int *val, int *val2, long mask) { struct tiadc_device *adc_dev = iio_priv(indio_dev); +int ret =IIO_VAL_INT ;int i, map_val;unsigned int fifo1count, read, stepid;bool found = false;
@@ -373,6 +375,7 @@ static int tiadc_read_raw(struct iio_devif (!step_en)return -EINVAL ; +mutex_lock (&adc_dev->fifo1_lock); fifo1count =tiadc_readl (adc_dev,REG_FIFO1CNT );while (fifo1count--)tiadc_readl (adc_dev,REG_FIFO1 );
@@ -389,7 +392,8 @@ static int tiadc_read_raw(struct iio_devif (time_after (jiffies, timeout)) {am335x_tsc_se_adc_done (adc_dev->mfd_tscadc); -return -EAGAIN ; + ret = -EAGAIN ; + goto err_unlock; } } map_val = adc_dev->channel_step[chan->scan_index];
@@ -415,8 +419,11 @@ static int tiadc_read_raw(struct iio_devam335x_tsc_se_adc_done (adc_dev->mfd_tscadc);if (found == false) -return -EBUSY ; -return IIO_VAL_INT ; + ret = -EBUSY ; + +err_unlock: +mutex_unlock (&adc_dev->fifo1_lock); +return ret; }static const struct iio_info tiadc_info = {
@@ -485,6 +492,7 @@ static int tiadc_probe(struct platform_dtiadc_step_config (indio_dev);tiadc_writel (adc_dev,REG_FIFO1THR ,FIFO1_THRESHOLD ); +mutex_init (&adc_dev->fifo1_lock); err =tiadc_channel_init (indio_dev, adc_dev->channels);if (err <0 )
Greg Kroah-Hartman
maintainerPATCH 31/118 iio: adc: ti_am335x_adc: Increase timeout value waiting for ADC sample
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vignesh R <[email protected]>
commit 7175cce1c3f1d8c8840d2004f78f96a3904249b5 upstream.
Now that open delay and sample delay for each channel is configurable via DT, the default IDLE_TIMEOUT value is not enough as this is calculated based on hardcoded macros. This results in driver returning EBUSY sometimes. Fix this by increasing the timeout
value based on maximum value possible to open delay and sample delays for each channel.
--- drivers/iio/adc/ti_am335x_adc.c | 2 +- include/linux/mfd/ti_am335x_tscadc.h | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-)
drivers/iio/adc/ti_am335x_adc.c +1 -1
@@ -382,7 +382,7 @@ static int tiadc_read_raw(struct iio_devam335x_tsc_se_set_once (adc_dev->mfd_tscadc, step_en); - timeout = jiffies +usecs_to_jiffies + timeout = jiffies +msecs_to_jiffies (IDLE_TIMEOUT * adc_dev->channels);/* Wait for Fifo threshold interrupt */ while (1 ) {
include/linux/mfd/ti_am335x_tscadc.h +4 -4
@@ -138,16 +138,16 @@/* * time in us for processing a single channel, calculated as follows: * -* num cycles = open delay + (sample delay + conv time) * averaging +* max num cycles = open delay + (sample delay + conv time) * averaging * -* num cycles: 152 + (1 + 13) * 16 = 376 +* max num cycles: 262143 + (255 + 13) * 16 = 266431 * * clock frequency: 26MHz / 8 = 3.25MHz * clock period: 1 / 3.25MHz = 308ns * -* processing time: 376 * 308ns = 116us +* max processing time: 266431 * 308ns = 83ms(approx) */ -#define IDLE_TIMEOUT 116/* microsec */ +#define IDLE_TIMEOUT 83/* milliseconds */ #define TSCADC_CELLS 2
Greg Kroah-Hartman
maintainerPATCH 34/118 iio: accel: bmc150: reset chip at init time
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Olof Johansson <[email protected]>
commit 1c500840934a138bd6b13556c210516e9301fbee upstream.
In at least one known setup, the chip comes up in a state where reading the chip ID returns garbage unless it's been reset, due to noise on the wires during system boot.
All supported chips have the same reset method, and based on the datasheets they all need 1.3 or 1.8ms to recover after reset. So, do the conservative thing here and always reset the chip.
--- drivers/iio/accel/bmc150-accel-core.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/iio/accel/bmc150-accel-core.c +11 -0
@@ -68,6 +68,9 @@#define BMC150_ACCEL_REG_PMU_BW 0x10#define BMC150_ACCEL_DEF_BW 125 +#define BMC150_ACCEL_REG_RESET 0x14 +#define BMC150_ACCEL_RESET_VAL 0xB6 +#define BMC150_ACCEL_REG_INT_MAP_0 0x19#define BMC150_ACCEL_INT_MAP_0_BIT_SLOPE BIT(2)
@@ -1487,6 +1490,14 @@ static int bmc150_accel_chip_init(structint ret, i;unsigned int val; +/* +* Reset chip to get it in a known good state. A delay of 1.8ms after +* reset is required according to the data sheets of supported chips. +*/ +regmap_write (data->regmap,BMC150_ACCEL_REG_RESET , +BMC150_ACCEL_RESET_VAL ); +usleep_range (1800 ,2500 ); + ret =regmap_read (data->regmap,BMC150_ACCEL_REG_CHIP_ID , &val);if (ret <0 ) { dev_err(data->dev,
Greg Kroah-Hartman
maintainerPATCH 42/118 usb: renesas_usbhs: fix clearing the {BRDY,BEMP}STS condition
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Yoshihiro Shimoda <[email protected]>
commit 519d8bd4b5d3d82c413eac5bb42b106bb4b9ec15 upstream.
The previous driver is possible to stop the transfer wrongly. For example:
1) An interrupt happens, but not BRDY interruption.
2) Read INTSTS0. And than state->intsts0 is not set to BRDY.
3) BRDY is set to 1 here.
4) Read BRDYSTS.
5) Clear the BRDYSTS. And then. the BRDY is cleared wrongly.
Remarks:
- The INTSTS0.BRDY is read only.
- If any bits of BRDYSTS are set to 1, the BRDY is set to 1.
- If BRDYSTS is 0, the BRDY is set to 0.
So, this patch adds condition to avoid such situation. (And about NRDYSTS, this is not used for now. But, avoiding any side effects, this patch doesn't touch it.)
--- drivers/usb/renesas_usbhs/mod.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
drivers/usb/renesas_usbhs/mod.c +9 -2
@@ -282,9 +282,16 @@ static irqreturn_t usbhs_interrupt(int iif (usbhs_mod_is_host (priv))usbhs_write (priv,INTSTS1 , ~irq_state.intsts1 &INTSTS1_MAGIC ); -usbhs_write (priv,BRDYSTS , ~irq_state.brdysts); +/* +* The driver should not clear the xxxSTS after the line of +* "call irq callback functions" because each "if" statement is +* possible to call the callback function for avoiding any side effects. +*/ +if (irq_state.intsts0 &BRDY ) +usbhs_write (priv,BRDYSTS , ~irq_state.brdysts);usbhs_write (priv,NRDYSTS , ~irq_state.nrdysts); -usbhs_write (priv,BEMPSTS , ~irq_state.bempsts); +if (irq_state.intsts0 &BEMP ) +usbhs_write (priv,BEMPSTS , ~irq_state.bempsts);/* * call irq callback functions
Greg Kroah-Hartman
maintainerPATCH 45/118 USB: change bInterval default to 10 ms
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alan Stern <[email protected]>
commit 08c5cd37480f59ea39682f4585d92269be6b1424 upstream.
Some full-speed mceusb infrared transceivers contain invalid endpoint descriptors for their interrupt endpoints, with bInterval set to 0. In the past they have worked out okay with the mceusb driver, because the driver sets the bInterval field in the descriptor to 1, overwriting whatever value may have been there before. However, this approach was never sanctioned by the USB core, and in fact it does not work with xHCI controllers, because they use the bInterval value that was present when the configuration was installed.
Currently usbcore uses 32 ms as the default interval if the value in the endpoint descriptor is invalid. It turns out that these IR transceivers don't work properly unless the interval is set to 10 ms or below. To work around this mceusb problem, this patch changes the endpoint-descriptor parsing routine, making the default interval value be 10 ms rather than 32 ms.
--- drivers/usb/core/config.c | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-)
drivers/usb/core/config.c +17 -11
@@ -211,8 +211,10 @@ static int usb_parse_endpoint(struct devmemcpy (&endpoint->desc, d, n);INIT_LIST_HEAD (&endpoint->urb_list); -/* Fix up bInterval values outside the legal range. Use 32 ms if no -* proper value can be guessed. */ +/* +* Fix up bInterval values outside the legal range. +* Use 10 or 8 ms if no proper value can be guessed. +*/ i =0 ;/* i = min, j = max, n = default */ j =255 ;if (usb_endpoint_xfer_int (d)) {
@@ -221,13 +223,15 @@ static int usb_parse_endpoint(struct devcase USB_SPEED_SUPER_PLUS :case USB_SPEED_SUPER :case USB_SPEED_HIGH : -/* Many device manufacturers are using full-speed +/* +* Many device manufacturers are using full-speed * bInterval values in high-speed interrupt endpoint -* descriptors. Try to fix those and fall back to a -* 32 ms default value otherwise. */ +* descriptors. Try to fix those and fall back to an +* 8-ms default value otherwise. +*/ n =fls (d->bInterval*8 );if (n ==0 ) - n =9 ;/* 32 ms = 2^(9-1) uframes */ + n =7 ;/* 8 ms = 2^(7-1) uframes */ j =16 ;/*
@@ -242,10 +246,12 @@ static int usb_parse_endpoint(struct dev }break ;default :/* USB_SPEED_FULL or _LOW */ -/* For low-speed, 10 ms is the official minimum. +/* +* For low-speed, 10 ms is the official minimum. * But some "overclocked" devices might want faster -* polling so we'll allow it. */ - n =32 ; +* polling so we'll allow it. +*/ + n =10 ;break ; } }else if (usb_endpoint_xfer_isoc (d)) {
@@ -253,10 +259,10 @@ static int usb_parse_endpoint(struct dev j =16 ;switch (to_usb_device (ddev)->speed) {case USB_SPEED_HIGH : - n =9 ;/* 32 ms = 2^(9-1) uframes */ + n =7 ;/* 8 ms = 2^(7-1) uframes */ break ;default :/* USB_SPEED_FULL */ - n =6 ;/* 32 ms = 2^(6-1) frames */ + n =4 ;/* 8 ms = 2^(4-1) frames */ break ; } }
Greg Kroah-Hartman
maintainerPATCH 48/118 cpuset: make sure new tasks conform to the current config of the cpuset
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zefan Li <[email protected]>
commit 06f4e94898918bcad00cdd4d349313a439d6911e upstream.
A new task inherits cpus_allowed and mems_allowed masks from its parent, but if someone changes cpuset's config by writing to cpuset.cpus/cpuset.mems before this new task is inserted into the cgroup's task list, the new task won't be updated accordingly.
--- kernel/cpuset.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
kernel/cpuset.c +15 -0
@@ -2074,6 +2074,20 @@ static void cpuset_bind(struct cgroup_sumutex_unlock (&cpuset_mutex); } +/* +* Make sure the new task conform to the current state of its parent, +* which could have been changed by cpuset just after it inherits the +* state from the parent and before it sits on the cgroup's task list. +*/ +void cpuset_fork (struct task_struct *task) +{ +if (task_css_is_root (task, cpuset_cgrp_id)) +return ; + +set_cpus_allowed_ptr (task, ¤t->cpus_allowed); + task->mems_allowed = current->mems_allowed; +} +struct cgroup_subsys cpuset_cgrp_subsys = { .css_alloc = cpuset_css_alloc, .css_online = cpuset_css_online,
@@ -2084,6 +2098,7 @@ struct cgroup_subsys cpuset_cgrp_subsys .attach = cpuset_attach, .post_attach = cpuset_post_attach, .bind = cpuset_bind, + .fork = cpuset_fork, .legacy_cftypes = files, .early_init = 1, };
Greg Kroah-Hartman
maintainerPATCH 65/118 pinctrl: sunxi: fix uart1 CTS/RTS pins at PG on A23/A33
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Icenowy Zheng <[email protected]>
commit 486095fae3a8a6b1ae07c51844699d9bd5cfbebc upstream.
PG8, PG9 is said to be the CTS/RTS pins for UART1 according to the A23/33 datasheets. However, the function is wrongly named "uart2" in the pinctrl driver. This patch fixes this by modifying them to be named "uart1".
--- drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c | 4 ++-- drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-)
drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c +2 -2
@@ -485,12 +485,12 @@ static const struct sunxi_desc_pin sun8iSUNXI_PIN (SUNXI_PINCTRL_PIN (G ,8 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"uart2" ),/* RTS */ +SUNXI_FUNCTION (0x2 ,"uart1" ),/* RTS */ SUNXI_FUNCTION_IRQ_BANK (0x4 ,2 ,8 )),/* PG_EINT8 */ SUNXI_PIN (SUNXI_PINCTRL_PIN (G ,9 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"uart2" ),/* CTS */ +SUNXI_FUNCTION (0x2 ,"uart1" ),/* CTS */ SUNXI_FUNCTION_IRQ_BANK (0x4 ,2 ,9 )),/* PG_EINT9 */ SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), SUNXI_FUNCTION(0x0, "gpio_in"),
drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c +2 -2
@@ -407,12 +407,12 @@ static const struct sunxi_desc_pin sun8iSUNXI_PIN (SUNXI_PINCTRL_PIN (G ,8 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"uart2" ),/* RTS */ +SUNXI_FUNCTION (0x2 ,"uart1" ),/* RTS */ SUNXI_FUNCTION_IRQ_BANK (0x4 ,1 ,8 )),/* PG_EINT8 */ SUNXI_PIN (SUNXI_PINCTRL_PIN (G ,9 ),SUNXI_FUNCTION (0x0 ,"gpio_in" ),SUNXI_FUNCTION (0x1 ,"gpio_out" ), -SUNXI_FUNCTION (0x2 ,"uart2" ),/* CTS */ +SUNXI_FUNCTION (0x2 ,"uart1" ),/* CTS */ SUNXI_FUNCTION_IRQ_BANK (0x4 ,1 ,9 )),/* PG_EINT9 */ SUNXI_PIN(SUNXI_PINCTRL_PIN(G, 10), SUNXI_FUNCTION(0x0, "gpio_in"),
Greg Kroah-Hartman
maintainerPATCH 69/118 fuse: direct-io: dont dirty ITER_BVEC pages
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Miklos Szeredi <[email protected]>
commit 8fba54aebbdf1f999738121922e74bf796ad60ee upstream.
When reading from a loop device backed by a fuse file it deadlocks on lock_page().
This is because the page is already locked by the read() operation done on the loop device. In this case we don't want to either lock the page or dirty it.
So do what fs/direct-io.c does: only dirty the page for ITER_IOVEC vectors.
--- fs/fuse/file.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-)
fs/fuse/file.c +4 -3
@@ -540,13 +540,13 @@ void fuse_read_fill(struct fuse_req *req req->out.args[0 ].size = count; } -static void fuse_release_user_pages (struct fuse_req *req,int write) +static void fuse_release_user_pages (struct fuse_req *req,bool should_dirty) {unsigned i;for (i =0 ; i < req->num_pages; i++) {struct page *page = req->pages[i]; -if (write) +if (should_dirty)set_page_dirty_lock (page);put_page (page); }
@@ -1331,6 +1331,7 @@ ssize_t fuse_direct_io(struct fuse_io_pr loff_t *ppos, int flags) { int write = flags & FUSE_DIO_WRITE; +bool should_dirty = !write &&iter_is_iovec (iter);int cuse = flags &FUSE_DIO_CUSE ;struct file *file = io->file;struct inode *inode = file->f_mapping->host;
@@ -1375,7 +1376,7 @@ ssize_t fuse_direct_io(struct fuse_io_pr nres =fuse_send_read (req, io, pos, nbytes, owner);if (!io->async) -fuse_release_user_pages (req, !write); +fuse_release_user_pages (req, should_dirty);if (req->out.h.error) {if (!res) res = req->out.h.error;
Greg Kroah-Hartman
maintainerPATCH 72/118 ath9k: fix using sta->drv_priv before initializing it
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Felix Fietkau <[email protected]>
commit 7711aaf08ad3fc4d0e937eec1de0a63620444ce7 upstream.
A station pointer can be passed to the driver on tx, before it has been marked as associated. Since ath9k_sta_state was initializing the entry too late, it resulted in some spurious crashes.
--- drivers/net/wireless/ath/ath9k/main.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
drivers/net/wireless/ath/ath9k/main.c +4 -4
@@ -1550,13 +1550,13 @@ static int ath9k_sta_state(struct ieee80struct ath_common *common =ath9k_hw_common (sc->sc_ah);int ret =0 ; -if (old_state ==IEEE80211_STA_AUTH && - new_state ==IEEE80211_STA_ASSOC ) { +if (old_state ==IEEE80211_STA_NOTEXIST && + new_state ==IEEE80211_STA_NONE ) { ret =ath9k_sta_add (hw, vif, sta);ath_dbg (common,CONFIG ,"Add station: %pM\n" , sta->addr); - }else if (old_state ==IEEE80211_STA_ASSOC && - new_state ==IEEE80211_STA_AUTH ) { + }else if (old_state ==IEEE80211_STA_NONE && + new_state ==IEEE80211_STA_NOTEXIST ) { ret =ath9k_sta_remove (hw, vif, sta);ath_dbg (common,CONFIG ,"Remove station: %pM\n" , sta->addr);
Greg Kroah-Hartman
maintainerPATCH 79/118 mmc: dw_mmc: use resource_size_t to store physical address
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 260b31643691e8a58683a4ccc3bdf7abfd86f54a upstream.
The dw_mmc driver stores the physical address of the MMIO registers in a pointer, which requires the use of type casts, and is actually broken if anyone ever has this device on a 32-bit SoC in registers above 4GB. Gcc warns about this possibility when the driver is built with ARM LPAE enabled:
mmc/host/dw_mmc.c: In function 'dw_mci_edmac_start_dma':mmc/host/dw_mmc.c:702:17: warning: cast from pointer to integer of different size
cfg.dst_addr = (dma_addr_t)(host->phy_regs + fifo_offset);
^mmc/host/dw_mmc-pltfm.c: In function 'dw_mci_pltfm_register':mmc/host/dw_mmc-pltfm.c:63:19: warning: cast to pointer from integer of different size
host->phy_regs = (void *)(regs->start);
This changes the code to use resource_size_t, which gets rid of the warning, the bug and the useless casts.
--- drivers/mmc/host/dw_mmc-pltfm.c | 2 +- drivers/mmc/host/dw_mmc.c | 2 +- include/linux/mmc/dw_mmc.h | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-)
drivers/mmc/host/dw_mmc-pltfm.c +1 -1
@@ -60,7 +60,7 @@ int dw_mci_pltfm_register(struct platfor regs =platform_get_resource (pdev,IORESOURCE_MEM ,0 );/* Get registers' physical base address */ - host->phy_regs = (void *)(regs->start); + host->phy_regs = regs->start; host->regs =devm_ioremap_resource (&pdev->dev, regs);if (IS_ERR (host->regs))return PTR_ERR (host->regs);
drivers/mmc/host/dw_mmc.c +1 -1
@@ -699,7 +699,7 @@ static int dw_mci_edmac_start_dma(structint ret =0 ;/* Set external dma config: burst size, burst width */ - cfg.dst_addr = (dma_addr_t)(host->phy_regs + fifo_offset); + cfg.dst_addr = host->phy_regs + fifo_offset; cfg.src_addr = cfg.dst_addr; cfg.dst_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ; cfg.src_addr_width =DMA_SLAVE_BUSWIDTH_4_BYTES ;
include/linux/mmc/dw_mmc.h +1 -1
@@ -172,7 +172,7 @@ struct dw_mci {/* For edmac */ struct dw_mci_dma_slave *dms;/* Registers's physical base address */ -void *phy_regs; +resource_size_t phy_regs;u32 cmd_status;u32 data_status;
Greg Kroah-Hartman
maintainerPATCH 81/118 soc: qcom/spm: shut up uninitialized variable warning
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 00affcac69c7aae6c2cfcbc71f724e1c16d0b445 upstream.
gcc warns about the 'found' variable possibly being used uninitialized:
drivers/soc/qcom/spm.c: In function 'spm_dev_probe':drivers/soc/qcom/spm.c:305:5: error: 'found' may be used uninitialized in this function [-Werror=maybe-uninitialized]
However, the code is correct because we know that there is always at least one online CPU. This initializes the 'found' variable to zero before the loop so the compiler knows it does not have to warn about it.
--- drivers/soc/qcom/spm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/soc/qcom/spm.c +1 -1
@@ -288,7 +288,7 @@ static struct spm_driver_data *spm_get_dstruct spm_driver_data *drv =NULL ;struct device_node *cpu_node, *saw_node;int cpu; -bool found; +bool found =0 ;for_each_possible_cpu (cpu) { cpu_node =of_cpu_device_node_get (cpu);
Greg Kroah-Hartman
maintainerPATCH 82/118 kconfig: tinyconfig: provide whole choice blocks to avoid warnings
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 236dec051078a8691950f56949612b4b74107e48 upstream.
Using "make tinyconfig" produces a couple of annoying warnings that show up for build test machines all the time:
.config:966:warning: override: NOHIGHMEM changes choice state .config:965:warning: override: SLOB changes choice state .config:963:warning: override: KERNEL_XZ changes choice state .config:962:warning: override: CC_OPTIMIZE_FOR_SIZE changes choice state .config:933:warning: override: SLOB changes choice state .config:930:warning: override: CC_OPTIMIZE_FOR_SIZE changes choice state .config:870:warning: override: SLOB changes choice state .config:868:warning: override: KERNEL_XZ changes choice state .config:867:warning: override: CC_OPTIMIZE_FOR_SIZE changes choice state
I've made a previous attempt at fixing them and we discussed a number of alternatives.
I tried changing the Makefile to use "merge_config.sh -n $(fragment-list)" but couldn't get that to work properly.
This is yet another approach, based on the observation that we do want to see a warning for conflicting 'choice' options, and that we can simply make them non-conflicting by listing all other options as disabled. This is a trivial patch that we can apply independent of plans for other changes.
https://patchwork.kernel.org/patch/9212749/
--- arch/x86/configs/tiny.config | 2 ++ kernel/configs/tiny.config | 8 ++++++++ 2 files changed, 10 insertions(+)
arch/x86/configs/tiny.config +2 -0
@@ -1 +1,3 @@ CONFIG_NOHIGHMEM=y +# CONFIG_HIGHMEM4G is not set +# CONFIG_HIGHMEM64G is not set
kernel/configs/tiny.config +8 -0
@@ -1,4 +1,12 @@ +# CONFIG_CC_OPTIMIZE_FOR_PERFORMANCE is not set CONFIG_CC_OPTIMIZE_FOR_SIZE=y +# CONFIG_KERNEL_GZIP is not set +# CONFIG_KERNEL_BZIP2 is not set +# CONFIG_KERNEL_LZMA is not set CONFIG_KERNEL_XZ=y +# CONFIG_KERNEL_LZO is not set +# CONFIG_KERNEL_LZ4 is not set CONFIG_OPTIMIZE_INLINING=y +# CONFIG_SLAB is not set +# CONFIG_SLUB is not set CONFIG_SLOB=y
Greg Kroah-Hartman
maintainerPATCH 83/118 net: simplify napi_synchronize() to avoid warnings
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit facc432faa59414bd7c60c307ff1645154a66c98 upstream.
The napi_synchronize() function is defined twice: The definition for SMP builds waits for other CPUs to be done, while the uniprocessor variant just contains a barrier and ignores its argument.
In the mvneta driver, this leads to a warning about an unused variable when we lookup the NAPI struct of another CPU and then don't use it:
ethernet/marvell/mvneta.c: In function 'mvneta_percpu_notifier':ethernet/marvell/mvneta.c:2910:30: error: unused variable 'other_port' [-Werror=unused-variable]
There are no other CPUs on a UP build, so that code never runs, but gcc does not know this.
The nicest solution seems to be to turn the napi_synchronize() helper into an inline function for the UP case as well, as that leads gcc to not complain about the argument being unused. Once we do that, we can also combine the two cases into a single function definition and use if(IS_ENABLED()) rather than #ifdef to make it look a bit nicer.
The warning first came up in linux-4.4, but I failed to catch it earlier.
--- include/linux/netdevice.h | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-)
include/linux/netdevice.h +5 -6
@@ -511,7 +511,6 @@ static inline void napi_enable(struct naclear_bit (NAPI_STATE_NPSVC , &n->state); } -#ifdef CONFIG_SMP /** * napi_synchronize - wait until NAPI is not running * @n: napi context
@@ -522,12 +521,12 @@ static inline void napi_enable(struct na*/ static inline void napi_synchronize (const struct napi_struct *n) { -while (test_bit (NAPI_STATE_SCHED , &n->state)) -msleep (1 ); +if (IS_ENABLED (CONFIG_SMP )) +while (test_bit (NAPI_STATE_SCHED , &n->state)) +msleep (1 ); +else +barrier (); } -#else -# define napi_synchronize (n) barrier() -#endif enum netdev_queue_state_t { __QUEUE_STATE_DRV_XOFF,
Greg Kroah-Hartman
maintainerPATCH 91/118 microblaze: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit d0cf385160c12abd109746cad1f13e3b3e8b50b8 upstream.
--- arch/microblaze/include/asm/uaccess.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/microblaze/include/asm/uaccess.h +6 -3
@@ -373,10 +373,13 @@ extern long __user_bad(void);static inline long copy_from_user (void *to,const void __user *from,unsigned long n) { +unsigned long res = n;might_fault (); -if (access_ok (VERIFY_READ , from, n)) -return __copy_from_user (to, from, n); -return n; +if (likely (access_ok (VERIFY_READ , from, n))) + res =__copy_from_user (to, from, n); +if (unlikely (res)) +memset (to + (n - res),0 , res); +return res; }#define __copy_to_user (to, from, n) \
Greg Kroah-Hartman
maintainerPATCH 92/118 fix minor infoleak in get_user_ex()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 1c109fabbd51863475cd12ac206bdd249aee35af upstream.
get_user_ex(x, ptr) should zero x on failure. It's not a lot of a leak (at most we are leaking uninitialized 64bit value off the kernel stack, and in a fairly constrained situation, at that), but the fix is trivial, so...
--- arch/x86/include/asm/uaccess.h | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
arch/x86/include/asm/uaccess.h +5 -1
@@ -394,7 +394,11 @@ do { \#define __get_user_asm_ex (x, addr, itype, rtype, ltype) \ asm volatile("1: mov"itype" %1,%"rtype"0\n" \ "2:\n" \ - _ASM_EXTABLE_EX(1b, 2b) \ + ".section .fixup,\"ax\"\n" \ + "3:xor"itype" %"rtype"0,%"rtype"0\n" \ + " jmp 2b\n" \ + ".previous\n" \ + _ASM_EXTABLE_EX(1b, 3b) \ : ltype(x) : "m" (__m(addr)))#define __put_user_nocheck (x, ptr, size) \
Greg Kroah-Hartman
maintainerPATCH 93/118 mn10300: failing __get_user() and get_user() should zero
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 43403eabf558d2800b429cd886e996fd555aa542 upstream.
--- arch/mn10300/include/asm/uaccess.h | 1 + 1 file changed, 1 insertion(+)
arch/mn10300/include/asm/uaccess.h +1 -0
@@ -181,6 +181,7 @@ struct __large_struct { unsigned long bu"2:\n" \" .section .fixup,\"ax\"\n" \"3:\n\t" \ +" mov 0,%1\n" \" mov %3,%0\n" \" jmp 2b\n" \" .previous\n" \
Greg Kroah-Hartman
maintainerPATCH 97/118 score: fix __get_user/get_user
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit c2f18fa4cbb3ad92e033a24efa27583978ce9600 upstream.
* should zero on any failure
* __get_user() should use __copy_from_user(), not copy_from_user()
--- arch/score/include/asm/uaccess.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/score/include/asm/uaccess.h +4 -1
@@ -163,7 +163,7 @@ do { \__get_user_asm (val,"lw" , ptr); \break ; \case 8 : \ -if ((copy_from_user ((void *)&val, ptr,8 )) ==0 ) \ +if (__copy_from_user ((void *)&val, ptr,8 ) ==0 ) \ __gu_err =0 ; \else \ __gu_err = -EFAULT ; \
@@ -188,6 +188,8 @@ do { \ \if (likely (access_ok (VERIFY_READ , __gu_ptr, size))) \__get_user_common ((x), size, __gu_ptr); \ +else \ + (x) =0 ; \ \ __gu_err; \ })
@@ -201,6 +203,7 @@ do { \"2:\n" \".section .fixup,\"ax\"\n" \"3:li %0, %4\n" \ +"li %1, 0\n" \"j 2b\n" \".previous\n" \".section __ex_table,\"a\"\n" \
Greg Kroah-Hartman
maintainerPATCH 98/118 s390: get_user() should zero on failure
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit fd2d2b191fe75825c4c7a6f12f3fef35aaed7dd7 upstream.
--- arch/s390/include/asm/uaccess.h | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
arch/s390/include/asm/uaccess.h +4 -4
@@ -215,28 +215,28 @@ int __put_user_bad(void) __attribute__((__chk_user_ptr (ptr); \switch (sizeof (*(ptr))) { \case 1 : { \ -unsigned char __x; \ +unsigned char __x =0 ; \ __gu_err =__get_user_fn (&__x, ptr, \sizeof (*(ptr))); \ (x) = *(__force __typeof__(*(ptr)) *) &__x; \break ; \ }; \case 2 : { \ -unsigned short __x; \ +unsigned short __x =0 ; \ __gu_err =__get_user_fn (&__x, ptr, \sizeof (*(ptr))); \ (x) = *(__force __typeof__(*(ptr)) *) &__x; \break ; \ }; \case 4 : { \ -unsigned int __x; \ +unsigned int __x =0 ; \ __gu_err =__get_user_fn (&__x, ptr, \sizeof (*(ptr))); \ (x) = *(__force __typeof__(*(ptr)) *) &__x; \break ; \ }; \case 8 : { \ -unsigned long long __x; \ +unsigned long long __x =0 ; \ __gu_err =__get_user_fn (&__x, ptr, \sizeof (*(ptr))); \ (x) = *(__force __typeof__(*(ptr)) *) &__x; \
Greg Kroah-Hartman
maintainerPATCH 99/118 ARC: uaccess: get_user to zero out dest in cause of fault
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vineet Gupta <[email protected]>
commit 05d9d0b96e53c52a113fd783c0c97c830c8dc7af upstream.
Al reported potential issue with ARC get_user() as it wasn't clearing out destination pointer in case of fault due to bad address etc.
Verified using following
| {
| u32 bogus1 = 0xdeadbeef;
| u64 bogus2 = 0xdead;
| int rc1, rc2;
|
| pr_info("Orig values %x %llx\n", bogus1, bogus2);
| rc1 = get_user(bogus1, (u32 __user *)0x40000000);
| rc2 = get_user(bogus2, (u64 __user *)0x50000000);
| pr_info("access %d %d, new values %x %llx\n",
| rc1, rc2, bogus1, bogus2);
| }| [ARCLinux]# insmod /mnt/kernel-module/qtn.ko | Orig values deadbeef dead | access -14 -14, new values 0 0
--- arch/arc/include/asm/uaccess.h | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-)
arch/arc/include/asm/uaccess.h +9 -2
@@ -83,7 +83,10 @@"2: ;nop\n" \" .section .fixup, \"ax\"\n" \" .align 4\n" \ -"3: mov %0, %3\n" \ +"3: # return -EFAULT\n" \ +" mov %0, %3\n" \ +" # zero out dst ptr\n" \ +" mov %1, 0\n" \" j 2b\n" \" .previous\n" \" .section __ex_table, \"a\"\n" \
@@ -101,7 +104,11 @@"2: ;nop\n" \" .section .fixup, \"ax\"\n" \" .align 4\n" \ -"3: mov %0, %3\n" \ +"3: # return -EFAULT\n" \ +" mov %0, %3\n" \ +" # zero out dst ptr\n" \ +" mov %1, 0\n" \ +" mov %R1, 0\n" \" j 2b\n" \" .previous\n" \" .section __ex_table, \"a\"\n" \
Greg Kroah-Hartman
maintainerPATCH 101/118 frv: fix clear_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 3b8767a8f00cc6538ba6b1cf0f88502e2fd2eb90 upstream.
It should check access_ok(). Otherwise a bunch of places turn into trivially exploitable rootholes.
--- arch/frv/include/asm/uaccess.h | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
arch/frv/include/asm/uaccess.h +9 -3
@@ -263,19 +263,25 @@ do { \extern long __memset_user (void *dst,unsigned long count);extern long __memcpy_user (void *dst,const void *src,unsigned long count); -#define clear_user (dst,count) __memset_user(____force(dst), (count)) +#define __clear_user (dst,count) __memset_user(____force(dst), (count))#define __copy_from_user_inatomic (to, from, n) __memcpy_user((to), ____force(from), (n))#define __copy_to_user_inatomic (to, from, n) __memcpy_user(____force(to), (from), (n))#else -#define clear_user (dst,count) (memset(____force(dst), 0, (count)), 0) +#define __clear_user (dst,count) (memset(____force(dst), 0, (count)), 0)#define __copy_from_user_inatomic (to, from, n) (memcpy((to), ____force(from), (n)), 0)#define __copy_to_user_inatomic (to, from, n) (memcpy(____force(to), (from), (n)), 0)#endif -#define __clear_user clear_user +static inline unsigned long __must_check +clear_user (void __user *to,unsigned long n) +{ +if (likely (__access_ok (to, n))) + n =__clear_user (to, n); +return n; +}static inline unsigned long __must_check __copy_to_user (void __user *to,const void *from,unsigned long n)
Greg Kroah-Hartman
maintainerPATCH 102/118 cris: buggered copy_from_user/copy_to_user/clear_user
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit eb47e0293baaa3044022059f1fa9ff474bfe35cb upstream.
* copy_from_user() on access_ok() failure ought to zero the destination
* none of those primitives should skip the access_ok() check in case of small constant size.
--- arch/cris/include/asm/uaccess.h | 75 ++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 41 deletions(-)
arch/cris/include/asm/uaccess.h +34 -41
@@ -194,30 +194,6 @@ extern unsigned long __copy_user(void __extern unsigned long __copy_user_zeroing (void *to,const void __user *from,unsigned long n);extern unsigned long __do_clear_user (void __user *to,unsigned long n); -static inline unsigned long -__generic_copy_to_user (void __user *to,const void *from,unsigned long n) -{ -if (access_ok (VERIFY_WRITE , to, n)) -return __copy_user (to, from, n); -return n; -} - -static inline unsigned long -__generic_copy_from_user (void *to,const void __user *from,unsigned long n) -{ -if (access_ok (VERIFY_READ , from, n)) -return __copy_user_zeroing (to, from, n); -return n; -} - -static inline unsigned long -__generic_clear_user (void __user *to,unsigned long n) -{ -if (access_ok (VERIFY_WRITE , to, n)) -return __do_clear_user (to, n); -return n; -} -static inline long __strncpy_from_user (char *dst,const char __user *src,long count) {
@@ -282,7 +258,7 @@ __constant_copy_from_user(void *to, conselse if (n ==24 )__asm_copy_from_user_24 (to, from, ret);else - ret =__generic_copy_from_user (to, from, n); + ret =__copy_user_zeroing (to, from, n);return ret; }
@@ -333,7 +309,7 @@ __constant_copy_to_user(void __user *to,else if (n ==24 )__asm_copy_to_user_24 (to, from, ret);else - ret =__generic_copy_to_user (to, from, n); + ret =__copy_user (to, from, n);return ret; }
@@ -366,26 +342,43 @@ __constant_clear_user(void __user *to, uelse if (n ==24 )__asm_clear_24 (to, ret);else - ret =__generic_clear_user (to, n); + ret =__do_clear_user (to, n);return ret; } -#define clear_user (to, n) \ - (__builtin_constant_p(n) ? \ - __constant_clear_user(to, n) : \ - __generic_clear_user(to, n)) - -#define copy_from_user (to, from, n) \ - (__builtin_constant_p(n) ? \ - __constant_copy_from_user(to, from, n) : \ - __generic_copy_from_user(to, from, n)) - -#define copy_to_user (to, from, n) \ - (__builtin_constant_p(n) ? \ - __constant_copy_to_user(to, from, n) : \ - __generic_copy_to_user(to, from, n)) +static inline size_t clear_user (void __user *to,size_t n) +{ +if (unlikely (!access_ok (VERIFY_WRITE , to, n))) +return n; +if (__builtin_constant_p (n)) +return __constant_clear_user (to, n); +else +return __do_clear_user (to, n); +} + +static inline size_t copy_from_user (void *to,const void __user *from,size_t n) +{ +if (unlikely (!access_ok (VERIFY_READ , from, n))) { +memset (to,0 , n); +return n; + } +if (__builtin_constant_p (n)) +return __constant_copy_from_user (to, from, n); +else +return __copy_user_zeroing (to, from, n); +} + +static inline size_t copy_to_user (void __user *to,const void *from,size_t n) +{ +if (unlikely (!access_ok (VERIFY_WRITE , to, n))) +return n; +if (__builtin_constant_p (n)) +return __constant_copy_to_user (to, from, n); +else +return __copy_user (to, from, n); +}/* We let the __ versions of copy_from/to_user inline, because they're often * used in fast paths and have only a small space overhead.
Greg Kroah-Hartman
maintainerPATCH 103/118 blackfin: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 8f035983dd826d7e04f67b28acf8e2f08c347e41 upstream.
--- arch/blackfin/include/asm/uaccess.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
arch/blackfin/include/asm/uaccess.h +5 -4
@@ -177,11 +177,12 @@ static inline int bad_user_access_lengthstatic inline unsigned long __must_check copy_from_user (void *to,const void __user *from,unsigned long n) { -if (access_ok (VERIFY_READ , from, n)) +if (likely (access_ok (VERIFY_READ , from, n))) {memcpy (to, (const void __force *)from, n); -else -return n; -return 0 ; +return 0 ; + } +memset (to,0 , n); +return n; } static inline unsigned long __must_check
Greg Kroah-Hartman
maintainerPATCH 106/118 hexagon: fix strncpy_from_user() error return
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit f35c1e0671728d1c9abc405d05ef548b5fcb2fc4 upstream.
It's -EFAULT, not -1 (and contrary to the comment in there, __strnlen_user() can return 0 - on faults).
--- arch/hexagon/include/asm/uaccess.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/hexagon/include/asm/uaccess.h +2 -1
@@ -103,7 +103,8 @@ static inline long hexagon_strncpy_from_ {long res =__strnlen_user (src, n); -/* return from strnlen can't be zero -- that would be rubbish. */ +if (unlikely (!res)) +return -EFAULT ;if (res > n) {copy_from_user (dst, src, n);
Greg Kroah-Hartman
maintainerPATCH 107/118 mips: copy_from_user() must zero the destination on access_ok() failure
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit e69d700535ac43a18032b3c399c69bf4639e89a2 upstream.
--- arch/mips/include/asm/uaccess.h | 3 +++ 1 file changed, 3 insertions(+)
arch/mips/include/asm/uaccess.h +3 -0
@@ -14,6 +14,7 @@#include <linux/kernel.h> #include <linux/errno.h> #include <linux/thread_info.h> +#include <linux/string.h> #include <asm/asm-eva.h> /*
@@ -1170,6 +1171,8 @@ extern size_t __copy_in_user_eva(void *_ __cu_len =__invoke_copy_from_user (__cu_to, \ __cu_from, \ __cu_len); \ + }else { \ +memset (__cu_to,0 , __cu_len); \ } \ } \ __cu_len; \
Greg Kroah-Hartman
maintainerPATCH 112/118 openrisc: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit acb2505d0119033a80c85ac8d02dccae41271667 upstream.
... that should zero on faults. Also remove the <censored> helpful logics wrt range truncation copied from ppc32. Where it had ever been needed only in case of copy_from_user() *and* had not been merged into the mainline until a month after the need had disappeared. A decade before openrisc went into mainline, I might add...
--- arch/openrisc/include/asm/uaccess.h | 33 ++++++++++----------------------- 1 file changed, 10 insertions(+), 23 deletions(-)
arch/openrisc/include/asm/uaccess.h +10 -23
@@ -273,28 +273,20 @@ __copy_tofrom_user(void *to, const voidstatic inline unsigned long copy_from_user (void *to,const void *from,unsigned long n) { -unsigned long over; +unsigned long res = n; -if (access_ok (VERIFY_READ , from, n)) -return __copy_tofrom_user (to, from, n); -if ((unsigned long )from <TASK_SIZE ) { - over = (unsigned long )from + n -TASK_SIZE ; -return __copy_tofrom_user (to, from, n - over) + over; - } -return n; +if (likely (access_ok (VERIFY_READ , from, n))) + n =__copy_tofrom_user (to, from, n); +if (unlikely (res)) +memset (to + (n - res),0 , res); +return res; }static inline unsigned long copy_to_user (void *to,const void *from,unsigned long n) { -unsigned long over; - -if (access_ok (VERIFY_WRITE , to, n)) -return __copy_tofrom_user (to, from, n); -if ((unsigned long )to <TASK_SIZE ) { - over = (unsigned long )to + n -TASK_SIZE ; -return __copy_tofrom_user (to, from, n - over) + over; - } +if (likely (access_ok (VERIFY_WRITE , to, n))) + n =__copy_tofrom_user (to, from, n);return n; }
@@ -303,13 +295,8 @@ extern unsigned long __clear_user(void *static inline __must_check unsigned long clear_user (void *addr,unsigned long size) { - -if (access_ok (VERIFY_WRITE , addr, size)) -return __clear_user (addr, size); -if ((unsigned long )addr <TASK_SIZE ) { -unsigned long over = (unsigned long )addr + size -TASK_SIZE ; -return __clear_user (addr, size - over) + over; - } +if (likely (access_ok (VERIFY_WRITE , addr, size))) + size =__clear_user (addr, size);return size; }
Greg Kroah-Hartman
maintainerPATCH 113/118 nios2: copy_from_user() should zero the tail of destination
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit e33d1f6f72cc82fcfc3d1fb20c9e3ad83b1928fa upstream.
--- arch/nios2/include/asm/uaccess.h | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
arch/nios2/include/asm/uaccess.h +6 -3
@@ -102,9 +102,12 @@ extern long __copy_to_user(void __user *static inline long copy_from_user (void *to,const void __user *from,unsigned long n) { -if (!access_ok (VERIFY_READ , from, n)) -return n; -return __copy_from_user (to, from, n); +unsigned long res = n; +if (access_ok (VERIFY_READ , from, n)) + res =__copy_from_user (to, from, n); +if (unlikely (res)) +memset (to + (n - res),0 , res); +return res; } static inline long copy_to_user(void __user *to, const void *from,
Greg Kroah-Hartman
maintainerPATCH 115/118 sparc32: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 917400cecb4b52b5cde5417348322bb9c8272fa6 upstream.
--- arch/sparc/include/asm/uaccess_32.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/sparc/include/asm/uaccess_32.h +3 -1
@@ -328,8 +328,10 @@ static inline unsigned long copy_from_us {if (n &&__access_ok ((unsigned long ) from, n))return __copy_user ((__force void __user *) to, from, n); -else +else { +memset (to,0 , n);return n; + } }static inline unsigned long __copy_from_user (void *to,const void __user *from,unsigned long n)
Greg Kroah-Hartman
maintainerPATCH 1/118 ext4: use __GFP_NOFAIL in ext4_free_blocks()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Konstantin Khlebnikov <[email protected]>
commit adb7ef600cc9d9d15ecc934cc26af5c1379777df upstream.
This might be unexpected but pages allocated for sbi->s_buddy_cache are charged to current memory cgroup. So, GFP_NOFS allocation could fail if current task has been killed by OOM or if current memory cgroup has no free memory left. Block allocator cannot handle such failures here yet.
--- fs/ext4/mballoc.c | 47 ++++++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 19 deletions(-)
fs/ext4/mballoc.c +28 -19
@@ -815,7 +815,7 @@ static void mb_regenerate_buddy(struct e* for this page; do not hold this lock when calling this routine! */ -static int ext4_mb_init_cache (struct page *page,char *incore) +static int ext4_mb_init_cache (struct page *page,char *incore,gfp_t gfp) {ext4_group_t ngroups;int blocksize;
@@ -848,7 +848,7 @@ static int ext4_mb_init_cache(struct pag/* allocate buffer_heads to read bitmaps */ if (groups_per_page >1 ) { i =sizeof (struct buffer_head *) * groups_per_page; - bh =kzalloc (i,GFP_NOFS ); + bh =kzalloc (i, gfp);if (bh ==NULL ) { err = -ENOMEM ; goto out;
@@ -983,7 +983,7 @@ out:* are on the same page e4b->bd_buddy_page is NULL and return value is 0. */ static int ext4_mb_get_buddy_page_lock (struct super_block *sb, -ext4_group_t group,struct ext4_buddy *e4b) +ext4_group_t group,struct ext4_buddy *e4b,gfp_t gfp) {struct inode *inode =EXT4_SB (sb)->s_buddy_cache;int block, pnum, poff;
@@ -1002,7 +1002,7 @@ static int ext4_mb_get_buddy_page_lock(s block = group *2 ; pnum = block / blocks_per_page; poff = block % blocks_per_page; - page =find_or_create_page (inode->i_mapping, pnum,GFP_NOFS ); + page =find_or_create_page (inode->i_mapping, pnum, gfp);if (!page)return -ENOMEM ;BUG_ON (page->mapping != inode->i_mapping);
@@ -1016,7 +1016,7 @@ static int ext4_mb_get_buddy_page_lock(s block++; pnum = block / blocks_per_page; - page =find_or_create_page (inode->i_mapping, pnum,GFP_NOFS ); + page =find_or_create_page (inode->i_mapping, pnum, gfp);if (!page)return -ENOMEM ;BUG_ON (page->mapping != inode->i_mapping);
@@ -1042,7 +1042,7 @@ static void ext4_mb_put_buddy_page_lock(* calling this routine! */ static noinline_for_stack -int ext4_mb_init_group(struct super_block *sb, ext4_group_t group) +int ext4_mb_init_group(struct super_block *sb, ext4_group_t group, gfp_t gfp) {struct ext4_group_info *this_grp;
@@ -1062,7 +1062,7 @@ int ext4_mb_init_group(struct super_bloc* The call to ext4_mb_get_buddy_page_lock will mark the * page accessed. */ - ret =ext4_mb_get_buddy_page_lock (sb, group, &e4b); + ret =ext4_mb_get_buddy_page_lock (sb, group, &e4b, gfp);if (ret || !EXT4_MB_GRP_NEED_INIT (this_grp)) {/* * somebody initialized the group
@@ -1072,7 +1072,7 @@ int ext4_mb_init_group(struct super_bloc } page = e4b.bd_bitmap_page; - ret =ext4_mb_init_cache (page,NULL ); + ret =ext4_mb_init_cache (page,NULL , gfp);if (ret) goto err;if (!PageUptodate (page)) {
@@ -1091,7 +1091,7 @@ int ext4_mb_init_group(struct super_bloc }/* init buddy cache */ page = e4b.bd_buddy_page; - ret =ext4_mb_init_cache (page, e4b.bd_bitmap); + ret =ext4_mb_init_cache (page, e4b.bd_bitmap, gfp);if (ret) goto err;if (!PageUptodate (page)) {
@@ -1109,8 +1109,8 @@ err:* calling this routine! */ static noinline_for_stack int -ext4_mb_load_buddy (struct super_block *sb,ext4_group_t group, -struct ext4_buddy *e4b) +ext4_mb_load_buddy_gfp (struct super_block *sb,ext4_group_t group, +struct ext4_buddy *e4b,gfp_t gfp) {int blocks_per_page;int block;
@@ -1140,7 +1140,7 @@ ext4_mb_load_buddy(struct super_block *s* we need full data about the group * to make a good selection */ - ret =ext4_mb_init_group (sb, group); + ret =ext4_mb_init_group (sb, group, gfp);if (ret)return ret; }
@@ -1168,11 +1168,11 @@ ext4_mb_load_buddy(struct super_block *s* wait for it to initialize. */ page_cache_release (page); - page =find_or_create_page (inode->i_mapping, pnum,GFP_NOFS ); + page =find_or_create_page (inode->i_mapping, pnum, gfp);if (page) {BUG_ON (page->mapping != inode->i_mapping);if (!PageUptodate (page)) { - ret =ext4_mb_init_cache (page,NULL ); + ret =ext4_mb_init_cache (page,NULL , gfp);if (ret) {unlock_page (page); goto err;
@@ -1204,11 +1204,12 @@ ext4_mb_load_buddy(struct super_block *sif (page ==NULL || !PageUptodate (page)) {if (page)page_cache_release (page); - page =find_or_create_page (inode->i_mapping, pnum,GFP_NOFS ); + page =find_or_create_page (inode->i_mapping, pnum, gfp);if (page) {BUG_ON (page->mapping != inode->i_mapping);if (!PageUptodate (page)) { - ret =ext4_mb_init_cache (page, e4b->bd_bitmap); + ret =ext4_mb_init_cache (page, e4b->bd_bitmap, + gfp);if (ret) {unlock_page (page); goto err;
@@ -1247,6 +1248,12 @@ err:return ret; } +static int ext4_mb_load_buddy (struct super_block *sb,ext4_group_t group, +struct ext4_buddy *e4b) +{ +return ext4_mb_load_buddy_gfp (sb, group, e4b,GFP_NOFS ); +} +static void ext4_mb_unload_buddy (struct ext4_buddy *e4b) {if (e4b->bd_bitmap_page)
@@ -2047,7 +2054,7 @@ static int ext4_mb_good_group(struct ext/* We only do this if the grp has never been initialized */ if (unlikely (EXT4_MB_GRP_NEED_INIT (grp))) { -int ret =ext4_mb_init_group (ac->ac_sb, group); +int ret =ext4_mb_init_group (ac->ac_sb, group,GFP_NOFS );if (ret)return ret; }
@@ -4808,7 +4815,9 @@ do_more:#endif trace_ext4_mballoc_free (sb, inode, block_group, bit, count_clusters); - err =ext4_mb_load_buddy (sb, block_group, &e4b); +/* __GFP_NOFAIL: retry infinitely, ignore TIF_MEMDIE and memcg limit. */ + err =ext4_mb_load_buddy_gfp (sb, block_group, &e4b, +GFP_NOFS |__GFP_NOFAIL);if (err) goto error_return;
@@ -5210,7 +5219,7 @@ int ext4_trim_fs(struct super_block *sb, grp =ext4_get_group_info (sb, group);/* We only do this if the grp has never been initialized */ if (unlikely (EXT4_MB_GRP_NEED_INIT (grp))) { - ret =ext4_mb_init_group (sb, group); + ret =ext4_mb_init_group (sb, group,GFP_NOFS );if (ret)break ; }
Greg Kroah-Hartman
maintainerPATCH 10/118 powerpc/powernv : Drop reference added by kset_find_obj()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mukesh Ojha <[email protected]>
commit a9cbf0b2195b695cbeeeecaa4e2770948c212e9a upstream.
In a situation, where Linux kernel gets notified about duplicate error log from OPAL, it is been observed that kernel fails to remove sysfs entries (/sys/firmware/opal/elog/0xXXXXXXXX) of such error logs. This is because, we currently search the error log/dump kobject in the kset list via 'kset_find_obj()' routine. Which eventually increment the reference count by one, once it founds the kobject.
So, unless we decrement the reference count by one after it found the kobject, we would not be able to release the kobject properly later.
This patch adds the 'kobject_put()' which was missing earlier.
--- arch/powerpc/platforms/powernv/opal-dump.c | 7 ++++++- arch/powerpc/platforms/powernv/opal-elog.c | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-)
arch/powerpc/platforms/powernv/opal-dump.c +6 -1
@@ -370,6 +370,7 @@ static irqreturn_t process_dump(int irq,uint32_t dump_id, dump_size, dump_type;struct dump_obj *dump;char name[22 ]; +struct kobject *kobj; rc =dump_read_info (&dump_id, &dump_size, &dump_type);if (rc !=OPAL_SUCCESS )
@@ -381,8 +382,12 @@ static irqreturn_t process_dump(int irq,* that gracefully and not create two conflicting * entries. */ -if (kset_find_obj (dump_kset, name)) + kobj =kset_find_obj (dump_kset, name); +if (kobj) { +/* Drop reference added by kset_find_obj() */ +kobject_put (kobj);return 0 ; + } dump =create_dump_obj (dump_id, dump_size, dump_type);if (!dump)
arch/powerpc/platforms/powernv/opal-elog.c +6 -1
@@ -247,6 +247,7 @@ static irqreturn_t elog_event(int irq, vuint64_t elog_type;int rc;char name[2 +16 +1 ]; +struct kobject *kobj; rc =opal_get_elog_size (&id, &size, &type);if (rc !=OPAL_SUCCESS ) {
@@ -269,8 +270,12 @@ static irqreturn_t elog_event(int irq, v* that gracefully and not create two conflicting * entries. */ -if (kset_find_obj (elog_kset, name)) + kobj =kset_find_obj (elog_kset, name); +if (kobj) { +/* Drop reference added by kset_find_obj() */ +kobject_put (kobj);return IRQ_HANDLED ; + }create_elog_obj (log_id, elog_size, elog_type);
Greg Kroah-Hartman
maintainerPATCH 11/118 powerpc/mm: Dont alias user region to other regions below PAGE_OFFSET
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paul Mackerras <[email protected]>
commit f077aaf0754bcba0fffdbd925bc12f09cd1e38aa upstream.
In commit c60ac5693c47 ("powerpc: Update kernel VSID range", 2013-03-13) we lost a check on the region number (the top four bits of the effective address) for addresses below PAGE_OFFSET. That commit replaced a check that the top 18 bits were all zero with a check that bits 46 - 59 were zero (performed for all addresses, not just user addresses).
This means that userspace can access an address like 0x1000_0xxx_xxxx_xxxx and we will insert a valid SLB entry for it. The VSID used will be the same as if the top 4 bits were 0, but the page size will be some random value obtained by indexing beyond the end of the mm_ctx_high_slices_psize array in the paca. If that page size is the same as would be used for region 0, then userspace just has an alias of the region 0 space. If the page size is different, then no HPTE will be found for the access, and the process will get a SIGSEGV (since hash_page_mm() will refuse to create a HPTE for the bogus address).
The access beyond the end of the mm_ctx_high_slices_psize can be at most 5.5MB past the array, and so will be in RAM somewhere. Since the access is a load performed in real mode, it won't fault or crash the kernel. At most this bug could perhaps leak a little bit of information about blocks of 32 bytes of memory located at offsets of i * 512kB past the paca->mm_ctx_high_slices_psize array, for 1 <= i <= 11.
--- arch/powerpc/mm/slb_low.S | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
arch/powerpc/mm/slb_low.S +6 -1
@@ -113,7 +113,12 @@ BEGIN_FTR_SECTION END_MMU_FTR_SECTION_IFCLR(MMU_FTR_1T_SEGMENT) b slb_finish_load_1T -0: +0: /* + * For userspace addresses, make sure this is region 0. + */ + cmpdi r9, 0 + bne 8f + /* when using slices, we extract the psize off the slice bitmaps * and then we need to get the sllp encoding off the mmu_psize_defs * array.
Greg Kroah-Hartman
maintainerPATCH 13/118 pNFS: The client must not do I/O to the DS if its lease has expired
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit b88fa69eaa8649f11828158c7b65c4bcd886ebd5 upstream.
Ensure that the client conforms to the normative behaviour described in RFC5661 Section 12.7.2: "If a client believes its lease has expired, it MUST NOT send I/O to the storage device until it has validated its lease."
So ensure that we wait for the lease to be validated before using the layout.
--- fs/nfs/pnfs.c | 1 + 1 file changed, 1 insertion(+)
fs/nfs/pnfs.c +1 -0
@@ -1530,6 +1530,7 @@ pnfs_update_layout(struct inode *ino, goto out; lookup_again: +nfs4_client_recover_expired_lease (clp); first = false;spin_lock (&ino->i_lock); lo =pnfs_find_alloc_layout (ino, ctx, gfp_flags);
Greg Kroah-Hartman
maintainerPATCH 14/118 NFSv4.x: Fix a refcount leak in nfs_callback_up_net
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit 98b0f80c2396224bbbed81792b526e6c72ba9efa upstream.
On error, the callers expect us to return without bumping nn->cb_users[].
--- fs/nfs/callback.c | 1 + 1 file changed, 1 insertion(+)
fs/nfs/callback.c +1 -0
@@ -275,6 +275,7 @@ static int nfs_callback_up_net(int minor err_socks:svc_rpcb_cleanup (serv, net); err_bind: + nn->cb_users[minorversion]--;dprintk ("NFS: Couldn't create callback socket: err = %d; " "net = %p\n" , ret, net);return ret;
Greg Kroah-Hartman
maintainerPATCH 15/118 nfsd: Close race between nfsd4_release_lockowner and nfsd4_lock
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chuck Lever <[email protected]>
commit 885848186fbc2d1d8fb6d2fdc2156638ae289a46 upstream.
nfsd4_release_lockowner finds a lock owner that has no lock state, and drops cl_lock. Then release_lockowner picks up cl_lock and unhashes the lock owner.
During the window where cl_lock is dropped, I don't see anything preventing a concurrent nfsd4_lock from finding that same lock owner and adding lock state to it.
Move release_lockowner() into nfsd4_release_lockowner and hang onto the cl_lock until after the lock owner's state cannot be found again.
Found by inspection, we don't currently have a reproducer.
--- fs/nfsd/nfs4state.c | 40 +++++++++++++++++----------------------- 1 file changed, 17 insertions(+), 23 deletions(-)
fs/nfsd/nfs4state.c +17 -23
@@ -1200,27 +1200,6 @@ free_ol_stateid_reaplist(struct list_hea } } -static void release_lockowner (struct nfs4_lockowner *lo) -{ -struct nfs4_client *clp = lo->lo_owner.so_client; -struct nfs4_ol_stateid *stp; -struct list_head reaplist; - -INIT_LIST_HEAD (&reaplist); - -spin_lock (&clp->cl_lock); -unhash_lockowner_locked (lo); -while (!list_empty (&lo->lo_owner.so_stateids)) { - stp =list_first_entry (&lo->lo_owner.so_stateids, - struct nfs4_ol_stateid, st_perstateowner); -WARN_ON (!unhash_lock_stateid (stp)); -put_ol_stateid_locked (stp, &reaplist); - } -spin_unlock (&clp->cl_lock); -free_ol_stateid_reaplist (&reaplist); -nfs4_put_stateowner (&lo->lo_owner); -} -static void release_open_stateid_locks (struct nfs4_ol_stateid *open_stp,struct list_head *reaplist) {
@@ -5952,6 +5931,7 @@ nfsd4_release_lockowner(struct svc_rqst__be32 status;struct nfsd_net *nn =net_generic (SVC_NET (rqstp), nfsd_net_id);struct nfs4_client *clp; +LIST_HEAD (reaplist);dprintk ("nfsd4_release_lockowner clientid: (%08x/%08x):\n" , clid->cl_boot, clid->cl_id);
@@ -5982,9 +5962,23 @@ nfsd4_release_lockowner(struct svc_rqstnfs4_get_stateowner (sop);break ; } +if (!lo) { +spin_unlock (&clp->cl_lock); +return status; + } + +unhash_lockowner_locked (lo); +while (!list_empty (&lo->lo_owner.so_stateids)) { + stp =list_first_entry (&lo->lo_owner.so_stateids, + struct nfs4_ol_stateid, + st_perstateowner); +WARN_ON (!unhash_lock_stateid (stp)); +put_ol_stateid_locked (stp, &reaplist); + }spin_unlock (&clp->cl_lock); -if (lo) -release_lockowner (lo); +free_ol_stateid_reaplist (&reaplist); +nfs4_put_stateowner (&lo->lo_owner); +return status; }
Greg Kroah-Hartman
maintainerPATCH 16/118 pNFS: Ensure LAYOUTGET and LAYOUTRETURN are properly serialised
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit bf0291dd2267a2b9a4cd74d65249553d11bb45d6 upstream.
According to RFC5661, the client is responsible for serialising LAYOUTGET and LAYOUTRETURN to avoid ambiguity. Consider the case where we send both in parallel.
Client Server
====== ======
LAYOUTGET(seqid=X)
LAYOUTRETURN(seqid=X)
LAYOUTGET return seqid=X+1 LAYOUTRETURN return seqid=X+2
Process LAYOUTRETURN
Forget layout stateid
Process LAYOUTGET
Set seqid=X+1
The client processes the layoutget/layoutreturn in the wrong order, and since the result of the layoutreturn was to clear the only existing layout segment, the client forgets the layout stateid.
When the LAYOUTGET comes in, it is treated as having a completely new stateid, and so the client sets the wrong sequence id...
Fix is to check if there are outstanding LAYOUTGET requests before we send the LAYOUTRETURN (note that LAYOUGET will already wait if it sees an outstanding LAYOUTRETURN).
--- fs/nfs/pnfs.c | 3 +++ 1 file changed, 3 insertions(+)
fs/nfs/pnfs.c +3 -0
@@ -365,6 +365,9 @@ pnfs_layout_need_return(struct pnfs_layostatic bool pnfs_prepare_layoutreturn (struct pnfs_layout_hdr *lo) { +/* Serialise LAYOUTGET/LAYOUTRETURN */ +if (atomic_read (&lo->plh_outstanding) !=0 ) +return false;if (test_and_set_bit (NFS_LAYOUT_RETURN , &lo->plh_flags))return false; lo->plh_return_iomode =0 ;
Greg Kroah-Hartman
maintainerPATCH 17/118 NFSv4.1: Fix the CREATE_SESSION slot number accounting
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Trond Myklebust <[email protected]>
commit b519d408ea32040b1c7e10b155a3ee9a36660947 upstream.
Ensure that we conform to the algorithm described in RFC5661, section 18.36.4 for when to bump the sequence id. In essence we do it for all cases except when the RPC call timed out, or in case of the server returning NFS4ERR_DELAY or NFS4ERR_STALE_CLIENTID.
--- fs/nfs/nfs4proc.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-)
fs/nfs/nfs4proc.c +10 -2
@@ -7424,12 +7424,20 @@ static int _nfs4_proc_create_session(str status =rpc_call_sync (session->clp->cl_rpcclient, &msg,RPC_TASK_TIMEOUT );trace_nfs4_create_session (clp, status); +switch (status) { +case -NFS4ERR_STALE_CLIENTID : +case -NFS4ERR_DELAY : +case -ETIMEDOUT : +case -EACCES : +case -EAGAIN : + goto out; + }; + + clp->cl_seqid++;if (!status) {/* Verify the session's negotiated channel_attrs values */ status =nfs4_verify_channel_attrs (&args, &res);/* Increment the clientid slot sequence id */ -if (clp->cl_seqid == res.seqid) - clp->cl_seqid++;if (status) goto out;nfs4_update_session (session, &res);
Greg Kroah-Hartman
maintainerPATCH 18/118 kexec: fix double-free when failing to relocate the purgatory
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thiago Jung Bauermann <[email protected]>
commit 070c43eea5043e950daa423707ae3c77e2f48edb upstream.
If kexec_apply_relocations fails, kexec_load_purgatory frees pi->sechdrs and pi->purgatory_buf. This is redundant, because in case of error kimage_file_prepare_segments calls kimage_file_post_load_cleanup, which will also free those buffers.
This causes two warnings like the following, one for pi->sechdrs and the other for pi->purgatory_buf:
kexec-bzImage64: Loading purgatory failed
------------[ cut here ]------------
WARNING: CPU: 1 PID: 2119 at mm/vmalloc.c:1490 __vunmap+0xc1/0xd0
Trying to vfree() nonexistent vm area (ffffc90000e91000)
Modules linked in:
CPU: 1 PID: 2119 Comm: kexec Not tainted 4.8.0-rc3+ #5
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS Bochs 01/01/2011
Call Trace:
dump_stack+0x4d/0x65
__warn+0xcb/0xf0
warn_slowpath_fmt+0x4f/0x60
? find_vmap_area+0x19/0x70
? kimage_file_post_load_cleanup+0x47/0xb0
__vunmap+0xc1/0xd0
vfree+0x2e/0x70
kimage_file_post_load_cleanup+0x5e/0xb0
SyS_kexec_file_load+0x448/0x680
? putname+0x54/0x60
? do_sys_open+0x190/0x1f0
entry_SYSCALL_64_fastpath+0x13/0x8f
---[ end trace 158bb74f5950ca2b ]---Fix by setting pi->sechdrs an pi->purgatory_buf to NULL, since vfree won't try to free a NULL pointer.
--- kernel/kexec_file.c | 3 +++ 1 file changed, 3 insertions(+)
kernel/kexec_file.c +3 -0
@@ -934,7 +934,10 @@ int kexec_load_purgatory(struct kimage *return 0 ; out:vfree (pi->sechdrs); + pi->sechdrs =NULL ; +vfree (pi->purgatory_buf); + pi->purgatory_buf =NULL ;return ret; }
Greg Kroah-Hartman
maintainerPATCH 19/118 mm: introduce get_task_exe_file
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mateusz Guzik <[email protected]>
commit cd81a9170e69e018bbaba547c1fd85a585f5697a upstream.
For more convenient access if one has a pointer to the task.
As a minor nit take advantage of the fact that only task lock + rcu are needed to safely grab ->exe_file. This saves mm refcount dance.
Use the helper in proc_exe_link.
--- fs/proc/base.c | 7 +------ include/linux/mm.h | 1 + kernel/fork.c | 23 +++++++++++++++++++++++ 3 files changed, 25 insertions(+), 6 deletions(-)
fs/proc/base.c +1 -6
@@ -1545,18 +1545,13 @@ static const struct file_operations procstatic int proc_exe_link (struct dentry *dentry,struct path *exe_path) {struct task_struct *task; -struct mm_struct *mm;struct file *exe_file; task =get_proc_task (d_inode (dentry));if (!task)return -ENOENT ; - mm =get_task_mm (task); + exe_file =get_task_exe_file (task);put_task_struct (task); -if (!mm) -return -ENOENT ; - exe_file =get_mm_exe_file (mm); -mmput (mm);if (exe_file) { *exe_path = exe_file->f_path;path_get (&exe_file->f_path);
include/linux/mm.h +1 -0
@@ -1898,6 +1898,7 @@ extern void mm_drop_all_locks(struct mm_extern void set_mm_exe_file (struct mm_struct *mm,struct file *new_exe_file);extern struct file *get_mm_exe_file (struct mm_struct *mm); +extern struct file *get_task_exe_file (struct task_struct *task);extern int may_expand_vm (struct mm_struct *mm,unsigned long npages); extern struct vm_area_struct *_install_special_mapping(struct mm_struct *mm,
kernel/fork.c +23 -0
@@ -764,6 +764,29 @@ struct file *get_mm_exe_file(struct mm_sEXPORT_SYMBOL (get_mm_exe_file);/** +* get_task_exe_file - acquire a reference to the task's executable file +* +* Returns %NULL if task's mm (if any) has no associated executable file or +* this is a kernel thread with borrowed mm (see the comment above get_task_mm). +* User must release file via fput(). +*/ +struct file *get_task_exe_file (struct task_struct *task) +{ +struct file *exe_file =NULL ; +struct mm_struct *mm; + +task_lock (task); + mm = task->mm; +if (mm) { +if (!(task->flags &PF_KTHREAD )) + exe_file =get_mm_exe_file (mm); + } +task_unlock (task); +return exe_file; +} +EXPORT_SYMBOL (get_task_exe_file); + +/** * get_task_mm - acquire a reference to the task's mm * * Returns %NULL if the task has no mm. Checks PF_KTHREAD (meaning
Greg Kroah-Hartman
maintainerPATCH 2/118 fscrypto: add authorization check for setting encryption policy
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit 163ae1c6ad6299b19e22b4a35d5ab24a89791a98 upstream.
On an ext4 or f2fs filesystem with file encryption supported, a user could set an encryption policy on any empty directory(*) to which they had readonly access. This is obviously problematic, since such a directory might be owned by another user and the new encryption policy would prevent that other user from creating files in their own directory (for example).
Fix this by requiring inode_owner_or_capable() permission to set an encryption policy. This means that either the caller must own the file, or the caller must have the capability CAP_FOWNER.
(*) Or also on any regular file, for f2fs v4.6 and later and ext4
v4.8-rc1 and later; a separate bug fix is coming for that.
--- fs/ext4/crypto_policy.c | 3 +++ fs/f2fs/crypto_policy.c | 3 +++ 2 files changed, 6 insertions(+)
fs/ext4/crypto_policy.c +3 -0
@@ -102,6 +102,9 @@ static int ext4_create_encryption_contexint ext4_process_policy (const struct ext4_encryption_policy *policy,struct inode *inode) { +if (!inode_owner_or_capable (inode)) +return -EACCES ; +if (policy->version !=0 )return -EINVAL ;
fs/f2fs/crypto_policy.c +3 -0
@@ -89,6 +89,9 @@ static int f2fs_create_encryption_contexint f2fs_process_policy (const struct f2fs_encryption_policy *policy,struct inode *inode) { +if (!inode_owner_or_capable (inode)) +return -EACCES ; +if (policy->version !=0 )return -EINVAL ;
Greg Kroah-Hartman
maintainerPATCH 26/118 kvm-arm: Unmap shadow pagetables properly
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Suzuki K Poulose <[email protected]>
commit 293f293637b55db4f9f522a5a72514e98a541076 upstream.
On arm/arm64, we depend on the kvm_unmap_hva* callbacks (via mmu_notifiers::invalidate_*) to unmap the stage2 pagetables when the userspace buffer gets unmapped. However, when the Hypervisor process exits without explicit unmap of the guest buffers, the only notifier we get is kvm_arch_flush_shadow_all() (via mmu_notifier::release ) which does nothing on arm. Later this causes us to access pages that were already released [via exit_mmap() -> unmap_vmas()] when we actually get to unmap the stage2 pagetable [via kvm_arch_destroy_vm() -> kvm_free_stage2_pgd()]. This triggers crashes with CONFIG_DEBUG_PAGEALLOC, which unmaps any free'd pages from the linear map.
[ 757.644120] Unable to handle kernel paging request at virtual address ffff800661e00000 [ 757.652046] pgd = ffff20000b1a2000 [ 757.655471] [ffff800661e00000] *pgd=00000047fffe3003, *pud=00000047fcd8c003, *pmd=00000047fcc7c003, *pte=00e8004661e00712 [ 757.666492] Internal error: Oops: 96000147 [#3] PREEMPT SMP [ 757.672041] Modules linked in: [ 757.675100] CPU: 7 PID: 3630 Comm: qemu-system-aar Tainted: G D 4.8.0-rc1 #3 [ 757.683240] Hardware name: AppliedMicro X-Gene Mustang Board/X-Gene Mustang Board, BIOS 3.06.15 Aug 19 2016 [ 757.692938] task: ffff80069cdd3580 task.stack: ffff8006adb7c000 [ 757.698840] PC is at __flush_dcache_area+0x1c/0x40 [ 757.703613] LR is at kvm_flush_dcache_pmd+0x60/0x70 [ 757.708469] pc : [<ffff20000809dbdc>] lr : [<ffff2000080b4a70>] pstate: 20000145 ... [ 758.357249] [<ffff20000809dbdc>] __flush_dcache_area+0x1c/0x40 [ 758.363059] [<ffff2000080b6748>] unmap_stage2_range+0x458/0x5f0 [ 758.368954] [<ffff2000080b708c>] kvm_free_stage2_pgd+0x34/0x60 [ 758.374761] [<ffff2000080b2280>] kvm_arch_destroy_vm+0x20/0x68 [ 758.380570] [<ffff2000080aa330>] kvm_put_kvm+0x210/0x358 [ 758.385860] [<ffff2000080aa524>] kvm_vm_release+0x2c/0x40 [ 758.391239] [<ffff2000082ad234>] __fput+0x114/0x2e8 [ 758.396096] [<ffff2000082ad46c>] ____fput+0xc/0x18 [ 758.400869] [<ffff200008104658>] task_work_run+0x108/0x138 [ 758.406332] [<ffff2000080dc8ec>] do_exit+0x48c/0x10e8 [ 758.411363] [<ffff2000080dd5fc>] do_group_exit+0x6c/0x130 [ 758.416739] [<ffff2000080ed924>] get_signal+0x284/0xa18 [ 758.421943] [<ffff20000808a098>] do_signal+0x158/0x860 [ 758.427060] [<ffff20000808aad4>] do_notify_resume+0x6c/0x88 [ 758.432608] [<ffff200008083624>] work_pending+0x10/0x14 [ 758.437812] Code: 9ac32042 8b010001 d1000443 8a230000 (d50b7e20)
This patch fixes the issue by moving the kvm_free_stage2_pgd() to kvm_arch_flush_shadow_all().
--- arch/arm/kvm/arm.c | 2 -- arch/arm/kvm/mmu.c | 1 + 2 files changed, 1 insertion(+), 2 deletions(-)
arch/arm/kvm/arm.c +0 -2
@@ -155,8 +155,6 @@ void kvm_arch_destroy_vm(struct kvm *kvm {int i; -kvm_free_stage2_pgd (kvm); -for (i =0 ; i <KVM_MAX_VCPUS ; ++i) {if (kvm->vcpus[i]) {kvm_arch_vcpu_free (kvm->vcpus[i]);
arch/arm/kvm/mmu.c +1 -0
@@ -1852,6 +1852,7 @@ void kvm_arch_memslots_updated(struct kvvoid kvm_arch_flush_shadow_all (struct kvm *kvm) { +kvm_free_stage2_pgd (kvm); } void kvm_arch_flush_shadow_memslot(struct kvm *kvm,
Greg Kroah-Hartman
maintainerPATCH 27/118 iio: accel: kxsd9: Fix raw read return
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit 7ac61a062f3147dc23e3f12b9dfe7c4dd35f9cb8 upstream.
Any readings from the raw interface of the KXSD9 driver will return an empty string, because it does not return IIO_VAL_INT but rather some random value from the accelerometer to the caller.
--- drivers/iio/accel/kxsd9.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/accel/kxsd9.c +1 -0
@@ -160,6 +160,7 @@ static int kxsd9_read_raw(struct iio_devif (ret <0 ) goto error_ret; *val = ret; + ret =IIO_VAL_INT ;break ;case IIO_CHAN_INFO_SCALE : ret =spi_w8r8 (st->us,KXSD9_READ (KXSD9_REG_CTRL_C ));
Greg Kroah-Hartman
maintainerPATCH 28/118 iio: proximity: as3935: set up buffer timestamps for non-zero values
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Alison Schofield <[email protected]>
commit f8adf645db03345af2d9a8b6095b02327ea50885 upstream.
Use the iio_pollfunc_store_time parameter during triggered buffer set-up to get valid timestamps.
--- drivers/iio/proximity/as3935.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/iio/proximity/as3935.c +1 -1
@@ -392,7 +392,7 @@ static int as3935_probe(struct spi_devicreturn ret; } - ret =iio_triggered_buffer_setup (indio_dev,NULL , + ret =iio_triggered_buffer_setup (indio_dev, iio_pollfunc_store_time, &as3935_trigger_handler,NULL );if (ret) {
Greg Kroah-Hartman
maintainerPATCH 3/118 clocksource/drivers/sun4i: Clear interrupts after stopping timer in probe function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chen-Yu Tsai <[email protected]>
commit b53e7d000d9e6e9fd2c6eb6b82d2783c67fd599e upstream.
The bootloader (U-boot) sometimes uses this timer for various delays. It uses it as a ongoing counter, and does comparisons on the current counter value. The timer counter is never stopped.
In some cases when the user interacts with the bootloader, or lets it idle for some time before loading Linux, the timer may expire, and an interrupt will be pending. This results in an unexpected interrupt when the timer interrupt is enabled by the kernel, at which point the event_handler isn't set yet. This results in a NULL pointer dereference exception, panic, and no way to reboot.
Clear any pending interrupts after we stop the timer in the probe function to avoid this.
--- drivers/clocksource/sun4i_timer.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-)
drivers/clocksource/sun4i_timer.c +8 -1
@@ -123,12 +123,16 @@ static struct clock_event_device sun4i_c .set_next_event = sun4i_clkevt_next_event, }; +static void sun4i_timer_clear_interrupt (void ) +{ +writel (TIMER_IRQ_EN (0 ), timer_base +TIMER_IRQ_ST_REG ); +}static irqreturn_t sun4i_timer_interrupt (int irq,void *dev_id) {struct clock_event_device *evt = (struct clock_event_device *)dev_id; -writel (0x1 , timer_base +TIMER_IRQ_ST_REG ); +sun4i_timer_clear_interrupt (); evt->event_handler (evt);return IRQ_HANDLED ;
@@ -193,6 +197,9 @@ static void __init sun4i_timer_init(stru/* Make sure timer is stopped before playing with interrupts */ sun4i_clkevt_time_stop (0 ); +/* clear timer0 interrupt */ +sun4i_timer_clear_interrupt (); + sun4i_clockevent.cpumask = cpu_possible_mask; sun4i_clockevent.irq = irq;
Greg Kroah-Hartman
maintainerPATCH 32/118 iio: ad799x: Fix buffered capture for ad7991/ad7995/ad7999
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lars-Peter Clausen <[email protected]>
commit 7d3cc21dab5313a02f2f3ca8164529b828a030d1 upstream.
The data buffer for captured mode for the ad799x driver is allocated in the update_scan_mode() callback. This callback is not set in the iio_info struct for the ad7791/ad7995/ad7999, which means that the data buffer is not allocated when a captured transfer is started. As a result the driver crashes when the first sample is received. To fix this properly set the update_scan_mode() callback.
--- drivers/iio/adc/ad799x.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/adc/ad799x.c +1 -0
@@ -533,6 +533,7 @@ static struct attribute_group ad799x_evestatic const struct iio_info ad7991_info = { .read_raw = &ad799x_read_raw, .driver_module =THIS_MODULE , + .update_scan_mode = ad799x_update_scan_mode, };static const struct iio_info ad7993_4_7_8_noirq_info = {
Greg Kroah-Hartman
maintainerPATCH 33/118 iio: adc: at91: unbreak channel adc channel 3
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anders Darander <[email protected]>
commit c2ab447454d498e709d9011c0f2d2945ee321f9b upstream.
The driver always assumes that an input device has been created when reading channel 3. This causes a kernel panic when dereferencing st->ts_input.
The change was introduced in
commit 84882b060301 ("iio: adc: at91_adc: Add support for touchscreens without TSMR"). Earlier versions only entered that part of the if-else statement if only the following flags are set:
AT91_ADC_IER_XRDY | AT91_ADC_IER_YRDY | AT91_ADC_IER_PRDY
--- drivers/iio/adc/at91_adc.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/adc/at91_adc.c +2 -2
@@ -381,8 +381,8 @@ static irqreturn_t at91_adc_rl_interrupt st->ts_bufferedmeasure = false;input_report_key (st->ts_input,BTN_TOUCH ,0 );input_sync (st->ts_input); - }else if (status &AT91_ADC_EOC (3 )) { -/* Conversion finished */ + }else if (status &AT91_ADC_EOC (3 ) && st->ts_input) { +/* Conversion finished and we've a touchscreen */ if (st->ts_bufferedmeasure) {/* * Last measurement is always discarded, since it can
Greg Kroah-Hartman
maintainerPATCH 36/118 iio: accel: kxsd9: Fix scaling bug
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Walleij <[email protected]>
commit 307fe9dd11ae44d4f8881ee449a7cbac36e1f5de upstream.
All the scaling of the KXSD9 involves multiplication with a fraction number < 1.
However the scaling value returned from IIO_INFO_SCALE was unpredictable as only the micros of the value was assigned, and not the integer part, resulting in scaling like this:
$cat in_accel_scale
-1057462640.011978
Fix this by assigning zero to the integer part.
--- drivers/iio/accel/kxsd9.c | 1 + 1 file changed, 1 insertion(+)
drivers/iio/accel/kxsd9.c +1 -0
@@ -166,6 +166,7 @@ static int kxsd9_read_raw(struct iio_dev ret =spi_w8r8 (st->us,KXSD9_READ (KXSD9_REG_CTRL_C ));if (ret <0 ) goto error_ret; + *val =0 ; *val2 = kxsd9_micro_scales[ret &KXSD9_FS_MASK ]; ret =IIO_VAL_INT_PLUS_MICRO ;break ;
Greg Kroah-Hartman
maintainerPATCH 37/118 iio:core: fix IIO_VAL_FRACTIONAL sign handling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gregor Boirie <[email protected]>
commit 171c0091837c81ed5c949fec6966bb5afff2d1cf upstream.
7985e7c100 ("iio: Introduce a new fractional value type") introduced a new IIO_VAL_FRACTIONAL value type meant to represent rational type numbers expressed by a numerator and denominator combination.
Formating of IIO_VAL_FRACTIONAL values relies upon do_div() usage. This fails handling negative values properly since parameters are reevaluated as unsigned values.
Fix this by using div_s64_rem() instead. Computed integer part will carry properly signed value. Formatted fractional part will always be positive.
--- drivers/iio/industrialio-core.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/iio/industrialio-core.c +2 -3
@@ -447,9 +447,8 @@ ssize_t iio_format_value(char *buf, unsireturn sprintf (buf,"%d.%09u\n" , vals[0 ], vals[1 ]);case IIO_VAL_FRACTIONAL : tmp =div_s64 ((s64 )vals[0 ] *1000000000LL , vals[1 ]); - vals[1 ] =do_div (tmp,1000000000LL ); - vals[0 ] = tmp; -return sprintf (buf,"%d.%09u\n" , vals[0 ], vals[1 ]); + vals[0 ] = (int )div_s64_rem (tmp,1000000000 , &vals[1 ]); +return sprintf (buf,"%d.%09u\n" , vals[0 ],abs (vals[1 ]));case IIO_VAL_FRACTIONAL_LOG2 : tmp = (s64 )vals[0 ] *1000000000LL >> vals[1 ]; vals[1 ] =do_div (tmp,1000000000LL );
Greg Kroah-Hartman
maintainerPATCH 5/118 Revert "KVM: x86: fix missed hardware breakpoints"
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Paolo Bonzini <[email protected]>
[the change is part of 70e4da7a8ff62f2775337b705f45c804bb450454, which is already in stable kernels 4.1.y to 4.4.y. this part of the fix however was later undone, so remove the line again]
The following patches were applied in the wrong order in -stable. This is the order as they appear in Linus' tree,
[0] commit 4e422bdd2f84 ("KVM: x86: fix missed hardware breakpoints")
[1] commit 172b2386ed16 ("KVM: x86: fix missed hardware breakpoints")
[2] commit 70e4da7a8ff6 ("KVM: x86: fix root cause for missed hardware breakpoints")
but this is the order for linux-4.4.y
[1] commit fc90441e728a ("KVM: x86: fix missed hardware breakpoints")
[2] commit 25e8618619a5 ("KVM: x86: fix root cause for missed hardware breakpoints")
[0] commit 0f6e5e26e68f ("KVM: x86: fix missed hardware breakpoints")
The upshot is that KVM_DEBUGREG_RELOAD is always set when returning from kvm_arch_vcpu_load() in stable, but not in Linus' tree.
This happened because [0] and [1] are the same patch. [0] and [1] come from two different merges, and the later merge is trivially resolved; when [2] is applied it reverts both of them. Instead, when using the [1][2][0] order, patches applies normally but "KVM: x86: fix missed hardware breakpoints" is present in the final tree.
--- arch/x86/kvm/x86.c | 1 - 1 file changed, 1 deletion(-)
arch/x86/kvm/x86.c +0 -1
@@ -2735,7 +2735,6 @@ void kvm_arch_vcpu_load(struct kvm_vcpu }kvm_make_request (KVM_REQ_STEAL_UPDATE , vcpu); - vcpu->arch.switch_db_regs |=KVM_DEBUGREG_RELOAD ; }void kvm_arch_vcpu_put (struct kvm_vcpu *vcpu)
Greg Kroah-Hartman
maintainerPATCH 9/118 powerpc/tm: do not use r13 for tabort_syscall
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Nicholas Piggin <[email protected]>
commit cc7786d3ee7e3c979799db834b528db2c0834c2e upstream.
tabort_syscall runs with RI=1, so a nested recoverable machine check will load the paca into r13 and overwrite what we loaded it with, because exceptions returning to privileged mode do not restore r13.
--- arch/powerpc/kernel/entry_64.S | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
arch/powerpc/kernel/entry_64.S +6 -6
@@ -334,13 +334,13 @@ syscall_exit_work: tabort_syscall: /* Firstly we need to enable TM in the kernel */ mfmsr r10 - li r13, 1 - rldimi r10, r13, MSR_TM_LG, 63-MSR_TM_LG + li r9, 1 + rldimi r10, r9, MSR_TM_LG, 63-MSR_TM_LG mtmsrd r10, 0 /* tabort, this dooms the transaction, nothing else */ - li r13, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT) - TABORT(R13) + li r9, (TM_CAUSE_SYSCALL|TM_CAUSE_PERSISTENT) + TABORT(R9) /* * Return directly to userspace. We have corrupted user register state,
@@ -348,8 +348,8 @@ tabort_syscall: * resume after the tbegin of the aborted transaction with the * checkpointed register state. */ - li r13, MSR_RI - andc r10, r10, r13 + li r9, MSR_RI + andc r10, r10, r9 mtmsrd r10, 1 mtspr SPRN_SRR0, r11 mtspr SPRN_SRR1, r12
Greg Kroah-Hartman
maintainerPATCH 39/118 serial: 8250_mid: fix divide error bug if baud rate is 0
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andy Shevchenko <[email protected]>
commit 47b34d2ef266e2c283b514d65c8963c2ccd42474 upstream.
Since the commit c1a67b48f6a5 ("serial: 8250_pci: replace switch-case by formula for Intel MID"), the 8250 driver crashes in the byt_set_termios() function with a divide error. This is caused by the fact that a baud rate of 0 (B0) is not handled properly. Fix it by falling back to B9600 in this case.
--- drivers/tty/serial/8250/8250_mid.c | 3 +++ 1 file changed, 3 insertions(+)
drivers/tty/serial/8250/8250_mid.c +3 -0
@@ -149,6 +149,9 @@ static void mid8250_set_termios(struct uunsigned long w =BIT (24 ) -1 ;unsigned long mul, div; +/* Gracefully handle the B0 case: fall back to B9600 */ + fuart = fuart ? fuart :9600 *16 ; +if (mid->board->freq < fuart) {/* Find prescaler value that satisfies Fuart < Fref */ if (mid->board->freq > baud)
Greg Kroah-Hartman
maintainercover 4.4.22-stable review
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Sep 24 17:29:17 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.22-rc1.gz
or in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git linux-4.4.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 4.4.22-rc1
Al Viro <[email protected]>
ia64: copy_from_user() should zero the destination on access_ok() failure
Thomas Gleixner <[email protected]>
genirq/msi: Fix broken debug output
Al Viro <[email protected]>
ppc32: fix copy_from_user()
Al Viro <[email protected]>
sparc32: fix copy_from_user()
Al Viro <[email protected]>
mn10300: copy_from_user() should zero on access_ok() failure...
Al Viro <[email protected]>
nios2: copy_from_user() should zero the tail of destination
Al Viro <[email protected]>
openrisc: fix copy_from_user()
Al Viro <[email protected]>
parisc: fix copy_from_user()
Al Viro <[email protected]>
metag: copy_from_user() should zero the destination on access_ok() failure
Al Viro <[email protected]>
alpha: fix copy_from_user()
Al Viro <[email protected]>
asm-generic: make copy_from_user() zero the destination properly
Al Viro <[email protected]>
mips: copy_from_user() must zero the destination on access_ok() failure
Al Viro <[email protected]>
hexagon: fix strncpy_from_user() error return
Al Viro <[email protected]>
sh: fix copy_from_user()
Al Viro <[email protected]>
score: fix copy_from_user() and friends
Al Viro <[email protected]>
blackfin: fix copy_from_user()
Al Viro <[email protected]>
cris: buggered copy_from_user/copy_to_user/clear_user
Al Viro <[email protected]>
frv: fix clear_user()
Al Viro <[email protected]>
asm-generic: make get_user() clear the destination on errors
Vineet Gupta <[email protected]>
ARC: uaccess: get_user to zero out dest in cause of fault
Al Viro <[email protected]>
s390: get_user() should zero on failure
Al Viro <[email protected]>
score: fix __get_user/get_user
Al Viro <[email protected]>
nios2: fix __get_user()
Al Viro <[email protected]>
sh64: failing __get_user() should zero
Al Viro <[email protected]>
m32r: fix __get_user()
Al Viro <[email protected]>
mn10300: failing __get_user() and get_user() should zero
Al Viro <[email protected]>
fix minor infoleak in get_user_ex()
Al Viro <[email protected]>
microblaze: fix copy_from_user()
Al Viro <[email protected]>
avr32: fix copy_from_user()
Al Viro <[email protected]>
microblaze: fix __get_user()
Al Viro <[email protected]>
fix iov_iter_fault_in_readable()
Boris Brezillon <[email protected]>
irqchip/atmel-aic: Fix potential deadlock in ->xlate()
Boris Brezillon <[email protected]>
genirq: Provide irq_gc_{lock_irqsave,unlock_irqrestore}() helpers
Kristian H. Kristensen <[email protected]>
drm: Only use compat ioctl for addfb2 on X86/IA64
Jan Leupold <[email protected]>
drm: atmel-hlcdc: Fix vertical scaling
Arnd Bergmann <[email protected]>
net: simplify napi_synchronize() to avoid warnings
Arnd Bergmann <[email protected]>
kconfig: tinyconfig: provide whole choice blocks to avoid warnings
Arnd Bergmann <[email protected]>
soc: qcom/spm: shut up uninitialized variable warning
Arnd Bergmann <[email protected]>
pinctrl: at91-pio4: use %pr format string for resource
Arnd Bergmann <[email protected]>
mmc: dw_mmc: use resource_size_t to store physical address
Mika Kuoppala <[email protected]>
drm/i915: Avoid pointer arithmetic in calculating plane surface offset
Mike Danese <[email protected]>
mpssd: fix buffer overflow warning
Linus Torvalds <[email protected]>
gma500: remove annoying deprecation warning
Wei Yongjun <[email protected]>
ipv6: addrconf: fix dev refcont leak when DAD failed
Balbir Singh <[email protected]>
sched/core: Fix a race between try_to_wake_up() and a woken up task
Johannes Berg <[email protected]>
Revert "wext: Fix 32 bit iwpriv compatibility issue with 64 bit Kernel"
Felix Fietkau <[email protected]>
ath9k: fix using sta->drv_priv before initializing it
Guoqing Jiang <[email protected]>
md-cluster: make md-cluster also can work when compiled into kernel
Mathias Nyman <[email protected]>
xhci: fix null pointer dereference in stop command timeout function
Miklos Szeredi <[email protected]>
fuse: direct-io: don't dirty ITER_BVEC pages
Chris Mason <[email protected]>
Btrfs: remove root_log_ctx from ctx list before btrfs_sync_log returns
Ard Biesheuvel <[email protected]>
crypto: cryptd - initialize child shash_desc on import
Will Deacon <[email protected]>
arm64: spinlocks: implement smp_mb__before_spinlock() as smp_mb()
Icenowy Zheng <[email protected]>
pinctrl: sunxi: fix uart1 CTS/RTS pins at PG on A23/A33
James Hartley <[email protected]>
pinctrl: pistachio: fix mfio pll_lock pinmux
Mikulas Patocka <[email protected]>
dm crypt: fix error with too large bios
Mikulas Patocka <[email protected]>
dm log writes: move IO accounting earlier to fix error path
Vladimir Zapolskiy <[email protected]>
dm log writes: fix check of kthread_run() return value
Pawel Moll <[email protected]>
bus: arm-ccn: Fix XP watchpoint settings bitmask
Pawel Moll <[email protected]>
bus: arm-ccn: Do not attempt to configure XPs for cycle counter
Pawel Moll <[email protected]>
bus: arm-ccn: Fix PMU handling of MN
Lee Jones <[email protected]>
ARM: dts: STiH407-family: Provide interconnect clock for consumption in ST SDHCI
Johan Hovold <[email protected]>
ARM: dts: overo: fix gpmc nand on boards with ethernet
Johan Hovold <[email protected]>
ARM: dts: overo: fix gpmc nand cs0 range
Fabio Estevam <[email protected]>
ARM: dts: imx6qdl: Fix SPDIF regression
Sebastian Reichel <[email protected]>
ARM: OMAP3: hwmod data: Add sysc information for DSI
Simon Baatz <[email protected]>
ARM: kirkwood: ib62x0: fix size of u-boot environment partition
Anson Huang <[email protected]>
ARM: imx6: add missing BM_CLPCR_BYPASS_PMIC_READY setting for imx6sx
Peter Chen <[email protected]>
ARM: imx6: add missing BM_CLPCR_BYP_MMDC_CH0_LPM_HS setting for imx6ul
Keerthy <[email protected]>
ARM: AM43XX: hwmod: Fix RSTST register offset for pruss
Zefan Li <[email protected]>
cpuset: make sure new tasks conform to the current config of the cpuset
David Daney <[email protected]>
net: thunderx: Fix OOPs with ethtool --register-dump
Andrew Donnellan <[email protected]>
cxl: use pcibios_free_controller_deferred() when removing vPHBs
Alan Stern <[email protected]>
USB: change bInterval default to 10 ms
Lee Jones <[email protected]>
ARM: dts: STiH410: Handle interconnect clock required by EHCI/OHCI (USB)
Clemens Gruber <[email protected]>
usb: chipidea: udc: fix NULL ptr dereference in isr_setup_status_phase
Yoshihiro Shimoda <[email protected]>
usb: renesas_usbhs: fix clearing the {BRDY,BEMP}STS condition
Daniele Palmas <[email protected]>
USB: serial: simple: add support for another Infineon flashloader
Jimi Damon <[email protected]>
serial: 8250: added acces i/o products quad and octal serial cards
Andy Shevchenko <[email protected]>
serial: 8250_mid: fix divide error bug if baud rate is 0
Colin Ian King <[email protected]>
iio: ensure ret is initialized to zero before entering do loop
Gregor Boirie <[email protected]>
iio:core: fix IIO_VAL_FRACTIONAL sign handling
Linus Walleij <[email protected]>
iio: accel: kxsd9: Fix scaling bug
Kweh, Hock Leong <[email protected]>
iio: fix pressure data output unit in hid-sensor-attributes
Olof Johansson <[email protected]>
iio: accel: bmc150: reset chip at init time
Anders Darander <[email protected]>
iio: adc: at91: unbreak channel adc channel 3
Lars-Peter Clausen <[email protected]>
iio: ad799x: Fix buffered capture for ad7991/ad7995/ad7999
Vignesh R <[email protected]>
iio: adc: ti_am335x_adc: Increase timeout value waiting for ADC sample
Vignesh R <[email protected]>
iio: adc: ti_am335x_adc: Protect FIFO1 from concurrent access
Caesar Wang <[email protected]>
iio: adc: rockchip_saradc: reset saradc controller before programming it
Alison Schofield <[email protected]>
iio: proximity: as3935: set up buffer timestamps for non-zero values
Linus Walleij <[email protected]>
iio: accel: kxsd9: Fix raw read return
Suzuki K Poulose <[email protected]>
kvm-arm: Unmap shadow pagetables properly
Emanuel Czirai <[email protected]>
x86/AMD: Apply erratum 665 on machines without a BIOS fix
Steven Rostedt <[email protected]>
x86/paravirt: Do not trace _paravirt_ident_*() functions
Vineet Gupta <[email protected]>
ARC: mm: fix build breakage with STRICT_MM_TYPECHECKS
Jason Gunthorpe <[email protected]>
IB/uverbs: Fix race between uverbs_close and remove_one
Mike Snitzer <[email protected]>
dm flakey: fix reads to be issued if drop_writes configured
Mateusz Guzik <[email protected]>
audit: fix exe_file access in audit_exe_compare
Mateusz Guzik <[email protected]>
mm: introduce get_task_exe_file
Thiago Jung Bauermann <[email protected]>
kexec: fix double-free when failing to relocate the purgatory
Trond Myklebust <[email protected]>
NFSv4.1: Fix the CREATE_SESSION slot number accounting
Trond Myklebust <[email protected]>
pNFS: Ensure LAYOUTGET and LAYOUTRETURN are properly serialised
Chuck Lever <[email protected]>
nfsd: Close race between nfsd4_release_lockowner and nfsd4_lock
Trond Myklebust <[email protected]>
NFSv4.x: Fix a refcount leak in nfs_callback_up_net
Trond Myklebust <[email protected]>
pNFS: The client must not do I/O to the DS if it's lease has expired
Tejun Heo <[email protected]>
kernfs: don't depend on d_find_any_alias() when generating notifications
Paul Mackerras <[email protected]>
powerpc/mm: Don't alias user region to other regions below PAGE_OFFSET
Mukesh Ojha <[email protected]>
powerpc/powernv : Drop reference added by kset_find_obj()
Nicholas Piggin <[email protected]>
powerpc/tm: do not use r13 for tabort_syscall
Jon Paul Maloy <[email protected]>
tipc: move linearization of buffers to generic code
Wenwei Tao <[email protected]>
lightnvm: put bio before return
Eric Biggers <[email protected]>
fscrypto: require write access to mount to set encryption policy
Paolo Bonzini <[email protected]>
Revert "KVM: x86: fix missed hardware breakpoints"
James Hogan <[email protected]>
MIPS: KVM: Check for pfn noslot case
Chen-Yu Tsai <[email protected]>
clocksource/drivers/sun4i: Clear interrupts after stopping timer in probe function
Eric Biggers <[email protected]>
fscrypto: add authorization check for setting encryption policy
Konstantin Khlebnikov <[email protected]>
ext4: use __GFP_NOFAIL in ext4_free_blocks()
-------------
Diffstat:
.../bindings/iio/adc/rockchip-saradc.txt | 7 ++ Documentation/mic/mpssd/mpssd.c | 4 +- Makefile | 4 +- arch/alpha/include/asm/uaccess.h | 19 ++- arch/arc/include/asm/pgtable.h | 3 +- arch/arc/include/asm/uaccess.h | 11 +- arch/arm/boot/dts/imx6qdl.dtsi | 2 +- arch/arm/boot/dts/kirkwood-ib62x0.dts | 2 +- arch/arm/boot/dts/omap3-overo-base.dtsi | 4 +- .../boot/dts/omap3-overo-chestnut43-common.dtsi | 2 - arch/arm/boot/dts/omap3-overo-tobi-common.dtsi | 2 - arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi | 3 - arch/arm/boot/dts/stih407-family.dtsi | 10 +- arch/arm/boot/dts/stih410.dtsi | 12 +- arch/arm/kvm/arm.c | 2 - arch/arm/kvm/mmu.c | 1 + arch/arm/mach-imx/pm-imx6.c | 4 +- .../mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c | 1 + arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 12 ++ arch/arm/mach-omap2/prcm43xx.h | 1 + arch/arm64/include/asm/spinlock.h | 10 ++ arch/avr32/include/asm/uaccess.h | 11 +- arch/avr32/kernel/avr32_ksyms.c | 2 +- arch/avr32/lib/copy_user.S | 4 +- arch/blackfin/include/asm/uaccess.h | 9 +- arch/cris/include/asm/uaccess.h | 71 +++++------ arch/frv/include/asm/uaccess.h | 12 +- arch/hexagon/include/asm/uaccess.h | 3 +- arch/ia64/include/asm/uaccess.h | 20 ++- arch/m32r/include/asm/uaccess.h | 2 +- arch/metag/include/asm/uaccess.h | 3 +- arch/microblaze/include/asm/uaccess.h | 11 +- arch/mips/include/asm/uaccess.h | 3 + arch/mips/kvm/tlb.c | 2 +- arch/mn10300/include/asm/uaccess.h | 1 + arch/mn10300/lib/usercopy.c | 4 +- arch/nios2/include/asm/uaccess.h | 13 +- arch/openrisc/include/asm/uaccess.h | 35 ++---- arch/parisc/include/asm/uaccess.h | 6 +- arch/powerpc/include/asm/uaccess.h | 21 +--- arch/powerpc/kernel/entry_64.S | 12 +- arch/powerpc/mm/slb_low.S | 7 +- arch/powerpc/platforms/powernv/opal-dump.c | 7 +- arch/powerpc/platforms/powernv/opal-elog.c | 7 +- arch/s390/include/asm/uaccess.h | 8 +- arch/score/include/asm/uaccess.h | 46 +++---- arch/sh/include/asm/uaccess.h | 5 +- arch/sh/include/asm/uaccess_64.h | 1 + arch/sparc/include/asm/uaccess_32.h | 4 +- arch/x86/configs/tiny.config | 2 + arch/x86/include/asm/uaccess.h | 6 +- arch/x86/kernel/cpu/amd.c | 12 ++ arch/x86/kernel/paravirt.c | 4 +- arch/x86/kvm/x86.c | 1 - crypto/cryptd.c | 9 +- drivers/bus/arm-ccn.c | 27 +++- drivers/clocksource/sun4i_timer.c | 9 +- drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 10 +- drivers/gpu/drm/drm_ioc32.c | 4 + drivers/gpu/drm/gma500/cdv_intel_dp.c | 2 +- drivers/gpu/drm/i915/intel_display.c | 16 +-- drivers/gpu/drm/i915/intel_drv.h | 6 +- drivers/gpu/drm/i915/intel_sprite.c | 2 +- drivers/iio/accel/bmc150-accel-core.c | 11 ++ drivers/iio/accel/kxsd9.c | 2 + drivers/iio/adc/Kconfig | 1 + drivers/iio/adc/ad799x.c | 1 + drivers/iio/adc/at91_adc.c | 4 +- drivers/iio/adc/rockchip_saradc.c | 30 +++++ drivers/iio/adc/ti_am335x_adc.c | 16 ++- .../iio/common/hid-sensors/hid-sensor-attributes.c | 4 +- drivers/iio/industrialio-buffer.c | 4 +- drivers/iio/industrialio-core.c | 5 +- drivers/iio/proximity/as3935.c | 2 +- drivers/infiniband/core/uverbs.h | 1 + drivers/infiniband/core/uverbs_main.c | 37 ++++-- drivers/irqchip/irq-atmel-aic.c | 5 +- drivers/irqchip/irq-atmel-aic5.c | 5 +- drivers/lightnvm/rrpc.c | 4 +- drivers/md/dm-crypt.c | 7 ++ drivers/md/dm-flakey.c | 27 ++-- drivers/md/dm-log-writes.c | 6 +- drivers/md/md.c | 12 +- drivers/misc/cxl/vphb.c | 10 +- drivers/mmc/host/dw_mmc-pltfm.c | 2 +- drivers/mmc/host/dw_mmc.c | 2 +- drivers/net/ethernet/cavium/thunder/nic_reg.h | 1 - .../net/ethernet/cavium/thunder/nicvf_ethtool.c | 5 +- drivers/net/wireless/ath/ath9k/main.c | 8 +- drivers/pci/host-bridge.c | 1 + drivers/pinctrl/pinctrl-at91-pio4.c | 2 +- drivers/pinctrl/pinctrl-pistachio.c | 12 +- drivers/pinctrl/sunxi/pinctrl-sun8i-a23.c | 4 +- drivers/pinctrl/sunxi/pinctrl-sun8i-a33.c | 4 +- drivers/soc/qcom/spm.c | 2 +- drivers/tty/serial/8250/8250_mid.c | 3 + drivers/tty/serial/8250/8250_pci.c | 139 +++++++++++++++++++++ drivers/usb/chipidea/udc.c | 9 ++ drivers/usb/core/config.c | 28 +++-- drivers/usb/host/xhci-ring.c | 6 +- drivers/usb/renesas_usbhs/mod.c | 11 +- drivers/usb/serial/usb-serial-simple.c | 3 +- fs/btrfs/tree-log.c | 1 + fs/ext4/crypto_policy.c | 3 + fs/ext4/ioctl.c | 6 + fs/ext4/mballoc.c | 47 ++++--- fs/f2fs/crypto_policy.c | 3 + fs/fuse/file.c | 7 +- fs/kernfs/file.c | 28 +++-- fs/nfs/callback.c | 1 + fs/nfs/nfs4proc.c | 12 +- fs/nfs/pnfs.c | 4 + fs/nfsd/nfs4state.c | 40 +++--- fs/proc/base.c | 7 +- include/asm-generic/uaccess.h | 20 +-- include/linux/irq.h | 10 ++ include/linux/mfd/ti_am335x_tscadc.h | 8 +- include/linux/mm.h | 1 + include/linux/mmc/dw_mmc.h | 2 +- include/linux/netdevice.h | 11 +- include/linux/uio.h | 2 +- kernel/audit_watch.c | 8 +- kernel/configs/tiny.config | 8 ++ kernel/cpuset.c | 15 +++ kernel/fork.c | 23 ++++ kernel/irq/msi.c | 1 + kernel/kexec_file.c | 3 + kernel/sched/core.c | 22 ++++ lib/iov_iter.c | 24 +--- net/ipv6/addrconf.c | 2 + net/tipc/link.c | 2 + net/tipc/name_distr.c | 1 + net/tipc/udp_media.c | 5 - net/wireless/wext-core.c | 25 +--- 134 files changed, 895 insertions(+), 449 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 49/118 ARM: AM43XX: hwmod: Fix RSTST register offset for pruss
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Keerthy <[email protected]>
commit b00ccf5b684992829610d162e78a7836933a1b19 upstream.
pruss hwmod RSTST register wrongly points to PWRSTCTRL register in case of am43xx. Fix the RSTST register offset value.
This can lead to setting of wrong power state values for PER domain.
--- arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c | 1 + arch/arm/mach-omap2/prcm43xx.h | 1 + 2 files changed, 2 insertions(+)
arch/arm/mach-omap2/omap_hwmod_33xx_43xx_ipblock_data.c +1 -0
@@ -1474,6 +1474,7 @@ static void omap_hwmod_am43xx_rst(void) {RSTCTRL (am33xx_pruss_hwmod,AM43XX_RM_PER_RSTCTRL_OFFSET );RSTCTRL (am33xx_gfx_hwmod,AM43XX_RM_GFX_RSTCTRL_OFFSET ); +RSTST (am33xx_pruss_hwmod,AM43XX_RM_PER_RSTST_OFFSET );RSTST (am33xx_gfx_hwmod,AM43XX_RM_GFX_RSTST_OFFSET ); }
arch/arm/mach-omap2/prcm43xx.h +1 -0
@@ -39,6 +39,7 @@/* RM RSTST offsets */ #define AM43XX_RM_GFX_RSTST_OFFSET 0x0014 +#define AM43XX_RM_PER_RSTST_OFFSET 0x0014#define AM43XX_RM_WKUP_RSTST_OFFSET 0x0014/* CM instances */
Greg Kroah-Hartman
maintainerPATCH 50/118 ARM: imx6: add missing BM_CLPCR_BYP_MMDC_CH0_LPM_HS setting for imx6ul
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Peter Chen <[email protected]>
commit f5a49057c71433e35a4712ab8d8f00641b3e1ec0 upstream.
There is a missing BM_CLPCR_BYP_MMDC_CH0_LPM_HS setting for imx6ul, without it, the "standby" mode can't work well, the system can't be resumed.
With this commit, the "standby" mode works well.
--- arch/arm/mach-imx/pm-imx6.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-imx/pm-imx6.c +1 -1
@@ -295,7 +295,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode m val &= ~BM_CLPCR_SBYOS ;if (cpu_is_imx6sl ()) val |=BM_CLPCR_BYPASS_PMIC_READY ; -if (cpu_is_imx6sl () ||cpu_is_imx6sx ()) +if (cpu_is_imx6sl () ||cpu_is_imx6sx () ||cpu_is_imx6ul ()) val |=BM_CLPCR_BYP_MMDC_CH0_LPM_HS ;else val |=BM_CLPCR_BYP_MMDC_CH1_LPM_HS ;
Greg Kroah-Hartman
maintainerPATCH 52/118 ARM: kirkwood: ib62x0: fix size of u-boot environment partition
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Simon Baatz <[email protected]>
commit a778937888867aac17a33887d1c429120790fbc2 upstream.
Commit 148c274ea644 ("ARM: kirkwood: ib62x0: add u-boot environment partition") split the "u-boot" partition into "u-boot" and "u-boot environment". However, instead of the size of the environment, an offset was given, resulting in overlapping partitions.
--- arch/arm/boot/dts/kirkwood-ib62x0.dts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/kirkwood-ib62x0.dts +1 -1
@@ -113,7 +113,7 @@ partition@e0000 { label = "u-boot environment"; - reg = <0xe0000 0x100000>; + reg = <0xe0000 0x20000>; }; partition@100000 {
Greg Kroah-Hartman
maintainerPATCH 51/118 ARM: imx6: add missing BM_CLPCR_BYPASS_PMIC_READY setting for imx6sx
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Anson Huang <[email protected]>
commit 8aade778f787305fdbfd3c1d54e6b583601b5902 upstream.
i.MX6SX has bypass PMIC ready function, as this function is normally NOT enabled on the board design, so we need to bypass the PMIC ready pin check during DSM mode resume flow, otherwise, the internal DSM resume logic will be waiting for this signal to be ready forever and cause resume fail.
--- arch/arm/mach-imx/pm-imx6.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/mach-imx/pm-imx6.c +1 -1
@@ -310,7 +310,7 @@ int imx6_set_lpm(enum mxc_cpu_pwr_mode m val |=0x3 <<BP_CLPCR_STBY_COUNT ; val |=BM_CLPCR_VSTBY ; val |=BM_CLPCR_SBYOS ; -if (cpu_is_imx6sl ()) +if (cpu_is_imx6sl () ||cpu_is_imx6sx ()) val |=BM_CLPCR_BYPASS_PMIC_READY ;if (cpu_is_imx6sl () ||cpu_is_imx6sx () ||cpu_is_imx6ul ()) val |=BM_CLPCR_BYP_MMDC_CH0_LPM_HS ;
Greg Kroah-Hartman
maintainerPATCH 53/118 ARM: OMAP3: hwmod data: Add sysc information for DSI
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sebastian Reichel <[email protected]>
commit b46211d6dcfb81a8af66b8684a42d629183670d4 upstream.
Add missing sysconfig/sysstatus information to OMAP3 hwmod. The information has been checked against OMAP34xx and OMAP36xx TRM.
Without this change DSI block is not reset during boot, which is required for working Nokia N950 display.
--- arch/arm/mach-omap2/omap_hwmod_3xxx_data.c | 12 ++++++++++++ 1 file changed, 12 insertions(+)
arch/arm/mach-omap2/omap_hwmod_3xxx_data.c +12 -0
@@ -723,8 +723,20 @@ static struct omap_hwmod omap3xxx_dss_di* display serial interface controller */ +static struct omap_hwmod_class_sysconfig omap3xxx_dsi_sysc = { + .rev_offs =0x0000 , + .sysc_offs =0x0010 , + .syss_offs =0x0014 , + .sysc_flags = (SYSC_HAS_AUTOIDLE |SYSC_HAS_CLOCKACTIVITY | +SYSC_HAS_ENAWAKEUP |SYSC_HAS_SIDLEMODE | +SYSC_HAS_SOFTRESET |SYSS_HAS_RESET_STATUS ), + .idlemodes = (SIDLE_FORCE |SIDLE_NO |SIDLE_SMART ), + .sysc_fields = &omap_hwmod_sysc_type1, +}; +static struct omap_hwmod_class omap3xxx_dsi_hwmod_class = { .name ="dsi" , + .sysc = &omap3xxx_dsi_sysc, };static struct omap_hwmod_irq_info omap3xxx_dsi1_irqs[] = {
Greg Kroah-Hartman
maintainerPATCH 54/118 ARM: dts: imx6qdl: Fix SPDIF regression
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Fabio Estevam <[email protected]>
commit f065e9e4addd75c21bb976bb2558648bf4f61de6 upstream.
Commit 833f2cbf7091 ("ARM: dts: imx6: change the core clock of spdif") changed many more clocks than only the SPDIF core clock as stated in the commit message.
The MLB clock has been added and this causes SPDIF regression as reported by Xavi Drudis Ferran and also in this forum post:
https://forum.digikey.com/thread/34240
The MX6Q Reference Manual does not mention that MLB is a clock related to SPDIF, so change it back to a dummy clock to restore SPDIF functionality.
Thanks to Ambika for providing the fix at:
https://community.nxp.com/thread/387131
--- arch/arm/boot/dts/imx6qdl.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/imx6qdl.dtsi +1 -1
@@ -221,7 +221,7 @@ clocks = <&clks IMX6QDL_CLK_SPDIF_GCLK>, <&clks IMX6QDL_CLK_OSC>, <&clks IMX6QDL_CLK_SPDIF>, <&clks IMX6QDL_CLK_ASRC>, <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_ESAI_EXTAL>, - <&clks IMX6QDL_CLK_IPG>, <&clks IMX6QDL_CLK_MLB>, + <&clks IMX6QDL_CLK_IPG>, <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_DUMMY>, <&clks IMX6QDL_CLK_SPBA>; clock-names = "core", "rxtx0", "rxtx1", "rxtx2",
Greg Kroah-Hartman
maintainerPATCH 55/118 ARM: dts: overo: fix gpmc nand cs0 range
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 5e0568dfbfb8c13cdb69c9fd06d600593ad4b430 upstream.
The gpmc ranges property for NAND at CS0 has been broken since it was first added.
This currently prevents the nand gpmc child node from being probed:
omap-gpmc 6e000000.gpmc: /ocp/gpmc@6e000000/nand@0,0 has malformed 'reg' property
and consequently the NAND device from being registered.
--- arch/arm/boot/dts/omap3-overo-base.dtsi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/arm/boot/dts/omap3-overo-base.dtsi +1 -1
@@ -223,7 +223,7 @@ }; &gpmc { - ranges = <0 0 0x00000000 0x20000000>; + ranges = <0 0 0x30000000 0x1000000>; /* CS0 */ nand@0,0 { linux,mtd-name= "micron,mt29c4g96maz";
Greg Kroah-Hartman
maintainerPATCH 56/118 ARM: dts: overo: fix gpmc nand on boards with ethernet
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 153b58ea932b2d0642fa5cd41c93bb0555f3f09b upstream.
The gpmc ranges property for NAND at CS0 was being overridden by later includes that defined gpmc ethernet nodes, effectively breaking NAND on these systems:
omap-gpmc 6e000000.gpmc: /ocp/gpmc@6e000000/nand@0,0 has malformed 'reg' property
Instead of redefining the NAND range in every such dtsi, define all currently used ranges in omap3-overo-base.dtsi.
--- arch/arm/boot/dts/omap3-overo-base.dtsi | 4 +++- arch/arm/boot/dts/omap3-overo-chestnut43-common.dtsi | 2 -- arch/arm/boot/dts/omap3-overo-tobi-common.dtsi | 2 -- arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi | 3 --- 4 files changed, 3 insertions(+), 8 deletions(-)
arch/arm/boot/dts/omap3-overo-base.dtsi +3 -1
@@ -223,7 +223,9 @@ }; &gpmc { - ranges = <0 0 0x30000000 0x1000000>; /* CS0 */ + ranges = <0 0 0x30000000 0x1000000>, /* CS0 */ + <4 0 0x2b000000 0x1000000>, /* CS4 */ + <5 0 0x2c000000 0x1000000>; /* CS5 */ nand@0,0 { linux,mtd-name= "micron,mt29c4g96maz";
arch/arm/boot/dts/omap3-overo-chestnut43-common.dtsi +0 -2
@@ -55,8 +55,6 @@ #include "omap-gpmc-smsc9221.dtsi" &gpmc { - ranges = <5 0 0x2c000000 0x1000000>; /* CS5 */ - ethernet@gpmc { reg = <5 0 0xff>; interrupt-parent = <&gpio6>;
arch/arm/boot/dts/omap3-overo-tobi-common.dtsi +0 -2
@@ -27,8 +27,6 @@ #include "omap-gpmc-smsc9221.dtsi" &gpmc { - ranges = <5 0 0x2c000000 0x1000000>; /* CS5 */ - ethernet@gpmc { reg = <5 0 0xff>; interrupt-parent = <&gpio6>;
arch/arm/boot/dts/omap3-overo-tobiduo-common.dtsi +0 -3
@@ -15,9 +15,6 @@ #include "omap-gpmc-smsc9221.dtsi" &gpmc { - ranges = <4 0 0x2b000000 0x1000000>, /* CS4 */ - <5 0 0x2c000000 0x1000000>; /* CS5 */ - smsc1: ethernet@gpmc { reg = <5 0 0xff>; interrupt-parent = <&gpio6>;
Greg Kroah-Hartman
maintainerPATCH 40/118 serial: 8250: added acces i/o products quad and octal serial cards
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jimi Damon <[email protected]>
commit c8d192428f52f244130b84650ad616df09f2b1e1 upstream.
Added devices ids for acces i/o products quad and octal serial cards that make use of existing Pericom PI7C9X7954 and PI7C9X7958 configurations .
--- drivers/tty/serial/8250/8250_pci.c | 139 +++++++++++++++++++++++++++++++++++++ 1 file changed, 139 insertions(+)
drivers/tty/serial/8250/8250_pci.c +139 -0
@@ -1952,6 +1952,43 @@ pci_wch_ch38x_setup(struct serial_privat#define PCI_DEVICE_ID_PERICOM_PI7C9X7954 0x7954#define PCI_DEVICE_ID_PERICOM_PI7C9X7958 0x7958 +#define PCI_VENDOR_ID_ACCESIO 0x494f +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB 0x1051 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S 0x1053 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB 0x105C +#define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S 0x105E +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB 0x1091 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2 0x1093 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB 0x1099 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4 0x109B +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB 0x10D1 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM 0x10D3 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB 0x10DA +#define PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM 0x10DC +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1 0x1108 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2 0x1110 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2 0x1111 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4 0x1118 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4 0x1119 +#define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S 0x1152 +#define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S 0x115A +#define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2 0x1190 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2 0x1191 +#define PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4 0x1198 +#define PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4 0x1199 +#define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM 0x11D0 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4 0x105A +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4 0x105B +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8 0x106A +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8 0x106B +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4 0x1098 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8 0x10A9 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM 0x10D9 +#define PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM 0x10E9 +#define PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM 0x11D8 + + +/* Unknown vendors/cards - this should not be in linux/pci_ids.h */ #define PCI_SUBDEVICE_ID_UNKNOWN_0x1584 0x1584#define PCI_SUBDEVICE_ID_UNKNOWN_0x1588 0x1588
@@ -5120,6 +5157,108 @@ static struct pci_device_id serial_pci_t0 , 0, pbn_pericom_PI7C9X7958 },/* +* ACCES I/O Products quad +*/ + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SDB, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2S, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SDB, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4S, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_2DB, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_2, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4DB, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM232_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_2SMDB, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_2SM, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SMDB, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_COM_4SM, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_1, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_2, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_2, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM422_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM485_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2S, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4S, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_2, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_2, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM232_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_MPCIE_ICM232_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_2SM, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7954 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM422_8, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM485_8, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_4, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM232_8, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_4SM, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_COM_8SM, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, + { PCI_VENDOR_ID_ACCESIO, PCI_DEVICE_ID_ACCESIO_PCIE_ICM_4SM, +PCI_ANY_ID ,PCI_ANY_ID ,0 ,0 , + pbn_pericom_PI7C9X7958 }, +/* * Topic TP560 Data/Fax/Voice 56k modem (reported by Evan Clarke) */ { PCI_VENDOR_ID_TOPIC, PCI_DEVICE_ID_TOPIC_TP560,
Greg Kroah-Hartman
maintainerPATCH 58/118 bus: arm-ccn: Fix PMU handling of MN
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pawel Moll <[email protected]>
commit 4e486cba285ff06a1f28f0fc2991dde1482d1dcf upstream.
The "Miscellaneous Node" fell through cracks of node initialisation, as its ID is shared with HN-I.
This patch treats MN as a special case (which it is), adding separate validation check for it and pre-defining the node ID in relevant events descriptions. That way one can simply run:
# perf stat -a -e ccn/mn_ecbarrier/ <workload>
Additionally, direction in the MN pseudo-events XP watchpoint definitions is corrected to be "TX" (1) as they are defined from the crosspoint point of view (thus barriers are transmitted from XP to MN).
--- drivers/bus/arm-ccn.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
drivers/bus/arm-ccn.c +16 -3
@@ -187,6 +187,7 @@ struct arm_ccn {struct arm_ccn_component *xp;struct arm_ccn_dt dt; +int mn_id; };
@@ -326,6 +327,7 @@ struct arm_ccn_pmu_event {static ssize_t arm_ccn_pmu_event_show (struct device *dev,struct device_attribute *attr,char *buf) { +struct arm_ccn *ccn =pmu_to_arm_ccn (dev_get_drvdata (dev));struct arm_ccn_pmu_event *event =container_of (attr, struct arm_ccn_pmu_event, attr);ssize_t res;
@@ -352,6 +354,9 @@ static ssize_t arm_ccn_pmu_event_show(st res +=snprintf (buf + res,PAGE_SIZE - res,",cmp_l=?,cmp_h=?,mask=?" );break ; +case CCN_TYPE_MN : + res +=snprintf (buf + res,PAGE_SIZE - res,",node=%d" , ccn->mn_id); +break ;default : res +=snprintf (buf + res,PAGE_SIZE - res,",node=?" );break ;
@@ -381,9 +386,9 @@ static umode_t arm_ccn_pmu_events_is_vis }static struct arm_ccn_pmu_event arm_ccn_pmu_events[] = { -CCN_EVENT_MN (eobarrier,"dir=0,vc=0,cmp_h=0x1c00" ,CCN_IDX_MASK_OPCODE ), -CCN_EVENT_MN (ecbarrier,"dir=0,vc=0,cmp_h=0x1e00" ,CCN_IDX_MASK_OPCODE ), -CCN_EVENT_MN (dvmop,"dir=0,vc=0,cmp_h=0x2800" ,CCN_IDX_MASK_OPCODE ), +CCN_EVENT_MN (eobarrier,"dir=1,vc=0,cmp_h=0x1c00" ,CCN_IDX_MASK_OPCODE ), +CCN_EVENT_MN (ecbarrier,"dir=1,vc=0,cmp_h=0x1e00" ,CCN_IDX_MASK_OPCODE ), +CCN_EVENT_MN (dvmop,"dir=1,vc=0,cmp_h=0x2800" ,CCN_IDX_MASK_OPCODE ),CCN_EVENT_HNI (txdatflits,"dir=1,vc=3" ,CCN_IDX_MASK_ANY ),CCN_EVENT_HNI (rxdatflits,"dir=0,vc=3" ,CCN_IDX_MASK_ANY ),CCN_EVENT_HNI (txreqflits,"dir=1,vc=0" ,CCN_IDX_MASK_ANY ),
@@ -757,6 +762,12 @@ static int arm_ccn_pmu_event_init(struct/* Validate node/xp vs topology */ switch (type) { +case CCN_TYPE_MN : +if (node_xp != ccn->mn_id) { +dev_warn (ccn->dev,"Invalid MN ID %d!\n" , node_xp); +return -EINVAL ; + } +break ;case CCN_TYPE_XP :if (node_xp >= ccn->num_xps) {dev_warn (ccn->dev,"Invalid XP ID %d!\n" , node_xp);
@@ -1368,6 +1379,8 @@ static int arm_ccn_init_nodes(struct armswitch (type) {case CCN_TYPE_MN : + ccn->mn_id = id; +return 0 ;case CCN_TYPE_DT :return 0 ;case CCN_TYPE_XP :
Greg Kroah-Hartman
maintainerPATCH 57/118 ARM: dts: STiH407-family: Provide interconnect clock for consumption in ST SDHCI
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lee Jones <[email protected]>
commit 78567f135d9bbbaf4538f63656d3e4d957c35fe9 upstream.
The STiH4{07,10} platform contains some interconnect clocks which are used by various IPs. If these clocks aren't handled correctly by ST's SDHCI driver MMC will break and the following output can be observed:
[ 13.916949] mmc0: Timeout waiting for hardware interrupt. [ 13.922349] sdhci: =========== REGISTER DUMP (mmc0)=========== [ 13.928175] sdhci: Sys addr: 0x00000000 | Version: 0x00001002 [ 13.933999] sdhci: Blk size: 0x00007040 | Blk cnt: 0x00000001 [ 13.939825] sdhci: Argument: 0x00fffff0 | Trn mode: 0x00000013 [ 13.945650] sdhci: Present: 0x1fff0206 | Host ctl: 0x00000011 [ 13.951475] sdhci: Power: 0x0000000f | Blk gap: 0x00000080 [ 13.957300] sdhci: Wake-up: 0x00000000 | Clock: 0x00003f07 [ 13.963126] sdhci: Timeout: 0x00000004 | Int stat: 0x00000000 [ 13.968952] sdhci: Int enab: 0x02ff008b | Sig enab: 0x02ff008b [ 13.974777] sdhci: AC12 err: 0x00000000 | Slot int: 0x00000000 [ 13.980602] sdhci: Caps: 0x21ed3281 | Caps_1: 0x00000000 [ 13.986428] sdhci: Cmd: 0x0000063a | Max curr: 0x00000000 [ 13.992252] sdhci: Host ctl2: 0x00000000 [ 13.996166] sdhci: ADMA Err: 0x00000000 | ADMA Ptr: 0x7c048200 [ 14.001990] sdhci: =========================================== [ 14.009802] mmc0: Got data interrupt 0x02000000 even though no data operation was in progress.
--- arch/arm/boot/dts/stih407-family.dtsi | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
arch/arm/boot/dts/stih407-family.dtsi +6 -4
@@ -497,8 +497,9 @@ interrupt-names = "mmcirq"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_mmc0>; - clock-names = "mmc"; - clocks = <&clk_s_c0_flexgen CLK_MMC_0>; + clock-names = "mmc", "icn"; + clocks = <&clk_s_c0_flexgen CLK_MMC_0>, + <&clk_s_c0_flexgen CLK_RX_ICN_HVA>; bus-width = <8>; non-removable; };
@@ -512,8 +513,9 @@ interrupt-names = "mmcirq"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sd1>; - clock-names = "mmc"; - clocks = <&clk_s_c0_flexgen CLK_MMC_1>; + clock-names = "mmc", "icn"; + clocks = <&clk_s_c0_flexgen CLK_MMC_1>, + <&clk_s_c0_flexgen CLK_RX_ICN_HVA>; resets = <&softreset STIH407_MMC1_SOFTRESET>; bus-width = <4>; };
Greg Kroah-Hartman
maintainerPATCH 59/118 bus: arm-ccn: Do not attempt to configure XPs for cycle counter
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pawel Moll <[email protected]>
commit b7c1beb278e8e3dc664ed3df3fc786db126120a9 upstream.
Fuzzing the CCN perf driver revealed a small but definitely dangerous mistake in the event setup code. When a cycle counter is requested, the driver should not reconfigure the events bus at all, otherwise it will corrupt (in most but the simplest cases) its configuration and may end up accessing XP array out of its bounds and corrupting control registers.
--- drivers/bus/arm-ccn.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/bus/arm-ccn.c +4 -0
@@ -895,6 +895,10 @@ static void arm_ccn_pmu_xp_dt_config(strstruct arm_ccn_component *xp;u32 val, dt_cfg; +/* Nothing to do for cycle counter */ +if (hw->idx ==CCN_IDX_PMU_CYCLE_COUNTER ) +return ; +if (CCN_CONFIG_TYPE (event->attr.config) ==CCN_TYPE_XP ) xp = &ccn->xp[CCN_CONFIG_XP (event->attr.config)];else
Greg Kroah-Hartman
maintainerPATCH 60/118 bus: arm-ccn: Fix XP watchpoint settings bitmask
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pawel Moll <[email protected]>
commit b928466b2169e061822daad48ecf55b005445547 upstream.
The code setting XP watchpoint comparator and mask registers should, in order to be fully compliant with specification, zero one or more most significant bits of each field. In both L cases it means zeroing bit 63. The bitmask doing this was wrong, though, zeroing bit 60 instead. Fortunately, due to a lucky coincidence, this turned out to be fairly innocent with the existing hardware.
Fixed now.
--- drivers/bus/arm-ccn.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/bus/arm-ccn.c +2 -2
@@ -1001,7 +1001,7 @@ static void arm_ccn_pmu_xp_watchpoint_co/* Comparison values */ writel (cmp_l &0xffffffff , source->base +CCN_XP_DT_CMP_VAL_L (wp)); -writel ((cmp_l >>32 ) &0xefffffff , +writel ((cmp_l >>32 ) &0x7fffffff , source->base +CCN_XP_DT_CMP_VAL_L (wp) +4 );writel (cmp_h &0xffffffff , source->base +CCN_XP_DT_CMP_VAL_H (wp)); writel((cmp_h >> 32) & 0x0fffffff,
@@ -1009,7 +1009,7 @@ static void arm_ccn_pmu_xp_watchpoint_co/* Mask */ writel (mask_l &0xffffffff , source->base +CCN_XP_DT_CMP_MASK_L (wp)); -writel ((mask_l >>32 ) &0xefffffff , +writel ((mask_l >>32 ) &0x7fffffff , source->base +CCN_XP_DT_CMP_MASK_L (wp) +4 );writel (mask_h &0xffffffff , source->base +CCN_XP_DT_CMP_MASK_H (wp)); writel((mask_h >> 32) & 0x0fffffff,
Greg Kroah-Hartman
maintainerPATCH 61/118 dm log writes: fix check of kthread_run() return value
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Vladimir Zapolskiy <[email protected]>
commit 91e630d9ae6de6f740ef7c8176736eb55366833e upstream.
The kthread_run() function returns either a valid task_struct or ERR_PTR() value, check for NULL is invalid. This change fixes potential for oops, e.g. in OOM situation.
--- drivers/md/dm-log-writes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/md/dm-log-writes.c +2 -2
@@ -456,9 +456,9 @@ static int log_writes_ctr(struct dm_targ goto bad; } - ret = -EINVAL ; lc->log_kthread =kthread_run (log_writes_kthread, lc,"log-write" ); -if (!lc->log_kthread) { +if (IS_ERR (lc->log_kthread)) { + ret =PTR_ERR (lc->log_kthread); ti->error ="Couldn't alloc kthread" ;dm_put_device (ti, lc->dev);dm_put_device (ti, lc->logdev);
Greg Kroah-Hartman
maintainerPATCH 63/118 dm crypt: fix error with too large bios
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit 4e870e948fbabf62b78e8410f04c67703e7c816b upstream.
When dm-crypt processes writes, it allocates a new bio in crypt_alloc_buffer(). The bio is allocated from a bio set and it can have at most BIO_MAX_PAGES vector entries, however the incoming bio can be larger (e.g. if it was allocated by bcache). If the incoming bio is larger, bio_alloc_bioset() fails and an error is returned.
To avoid the error, we test for a too large bio in the function crypt_map() and use dm_accept_partial_bio() to split the bio. dm_accept_partial_bio() trims the current bio to the desired size and asks DM core to send another bio with the rest of the data.
--- drivers/md/dm-crypt.c | 7 +++++++ 1 file changed, 7 insertions(+)
drivers/md/dm-crypt.c +7 -0
@@ -1920,6 +1920,13 @@ static int crypt_map(struct dm_target *treturn DM_MAPIO_REMAPPED ; } +/* +* Check if bio is too large, split as needed. +*/ +if (unlikely (bio->bi_iter.bi_size > (BIO_MAX_PAGES <<PAGE_SHIFT )) && +bio_data_dir (bio) ==WRITE ) +dm_accept_partial_bio (bio, ((BIO_MAX_PAGES <<PAGE_SHIFT ) >>SECTOR_SHIFT )); + io =dm_per_bio_data (bio, cc->per_bio_data_size);crypt_io_init (io, cc, bio,dm_target_offset (ti, bio->bi_iter.bi_sector)); io->ctx.req = (struct ablkcipher_request *)(io +1 );
Greg Kroah-Hartman
maintainerPATCH 62/118 dm log writes: move IO accounting earlier to fix error path
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mikulas Patocka <[email protected]>
commit a5d60783df61fbb67b7596b8a0f6b4b2e05251d5 upstream.
Move log_one_block()'s atomic_inc(&lc->io_blocks) before bio_alloc() to fix a bug that the target hangs if bio_alloc() fails. The error path does put_io_block(lc), so atomic_inc(&lc->io_blocks) must occur before invoking the error path to avoid underflow of lc->io_blocks.
--- drivers/md/dm-log-writes.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/md/dm-log-writes.c +1 -1
@@ -258,12 +258,12 @@ static int log_one_block(struct log_writ goto out; sector++; +atomic_inc (&lc->io_blocks); bio =bio_alloc (GFP_KERNEL , block->vec_cnt);if (!bio) {DMERR ("Couldn't alloc log bio" ); goto error; } -atomic_inc (&lc->io_blocks); bio->bi_iter.bi_size =0 ; bio->bi_iter.bi_sector = sector; bio->bi_bdev = lc->logdev->bdev;
Greg Kroah-Hartman
maintainerPATCH 64/118 pinctrl: pistachio: fix mfio pll_lock pinmux
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: James Hartley <[email protected]>
commit a32ac2912f97d7ea9b67eb67bb4aa30b9156a88e upstream.
A previous patch attempted to fix the pinmuxes for mfio 84 - 89, but it omitted a change to pistachio_pin_group pistachio_groups, which results in incorrect pll_lock signals being routed.
Apply the correct mux settings throughout the driver.
--- drivers/pinctrl/pinctrl-pistachio.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/pinctrl/pinctrl-pistachio.c +6 -6
@@ -809,17 +809,17 @@ static const struct pistachio_pin_group PADS_FUNCTION_SELECT2, 12, 0x3),MFIO_MUX_PIN_GROUP (83 ,MIPS_PLL_LOCK ,MIPS_TRACE_DATA ,USB_DEBUG ,PADS_FUNCTION_SELECT2 ,14 ,0x3 ), -MFIO_MUX_PIN_GROUP (84 ,SYS_PLL_LOCK ,MIPS_TRACE_DATA ,USB_DEBUG , +MFIO_MUX_PIN_GROUP (84 ,AUDIO_PLL_LOCK ,MIPS_TRACE_DATA ,USB_DEBUG ,PADS_FUNCTION_SELECT2 ,16 ,0x3 ), -MFIO_MUX_PIN_GROUP (85 ,WIFI_PLL_LOCK ,MIPS_TRACE_DATA ,SDHOST_DEBUG , +MFIO_MUX_PIN_GROUP (85 ,RPU_V_PLL_LOCK ,MIPS_TRACE_DATA ,SDHOST_DEBUG ,PADS_FUNCTION_SELECT2 ,18 ,0x3 ), -MFIO_MUX_PIN_GROUP (86 ,BT_PLL_LOCK ,MIPS_TRACE_DATA ,SDHOST_DEBUG , +MFIO_MUX_PIN_GROUP (86 ,RPU_L_PLL_LOCK ,MIPS_TRACE_DATA ,SDHOST_DEBUG ,PADS_FUNCTION_SELECT2 ,20 ,0x3 ), -MFIO_MUX_PIN_GROUP (87 ,RPU_V_PLL_LOCK ,DREQ2 ,SOCIF_DEBUG , +MFIO_MUX_PIN_GROUP (87 ,SYS_PLL_LOCK ,DREQ2 ,SOCIF_DEBUG ,PADS_FUNCTION_SELECT2 ,22 ,0x3 ), -MFIO_MUX_PIN_GROUP (88 ,RPU_L_PLL_LOCK ,DREQ3 ,SOCIF_DEBUG , +MFIO_MUX_PIN_GROUP (88 ,WIFI_PLL_LOCK ,DREQ3 ,SOCIF_DEBUG ,PADS_FUNCTION_SELECT2 ,24 ,0x3 ), -MFIO_MUX_PIN_GROUP (89 ,AUDIO_PLL_LOCK ,DREQ4 ,DREQ5 , +MFIO_MUX_PIN_GROUP (89 ,BT_PLL_LOCK ,DREQ4 ,DREQ5 ,PADS_FUNCTION_SELECT2 ,26 ,0x3 ),PIN_GROUP (TCK ,"tck" ), PIN_GROUP(TRSTN, "trstn"),
Greg Kroah-Hartman
maintainerPATCH 66/118 arm64: spinlocks: implement smp_mb__before_spinlock() as smp_mb()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Will Deacon <[email protected]>
commit 872c63fbf9e153146b07f0cece4da0d70b283eeb upstream.
smp_mb__before_spinlock() is intended to upgrade a spin_lock() operation to a full barrier, such that prior stores are ordered with respect to loads and stores occuring inside the critical section.
Unfortunately, the core code defines the barrier as smp_wmb(), which is insufficient to provide the required ordering guarantees when used in conjunction with our load-acquire-based spinlock implementation.
This patch overrides the arm64 definition of smp_mb__before_spinlock() to map to a full smp_mb().
--- arch/arm64/include/asm/spinlock.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
arch/arm64/include/asm/spinlock.h +10 -0
@@ -312,4 +312,14 @@ static inline int arch_read_trylock(arch#define arch_read_relax (lock) cpu_relax()#define arch_write_relax (lock) cpu_relax() +/* +* Accesses appearing in program order before a spin_lock() operation +* can be reordered with accesses inside the critical section, by virtue +* of arch_spin_lock being constructed using acquire semantics. +* +* In cases where this is problematic (e.g. try_to_wake_up), an +* smp_mb__before_spinlock() can restore the required ordering. +*/ +#define smp_mb__before_spinlock () smp_mb() +#endif /* __ASM_SPINLOCK_H */
Greg Kroah-Hartman
maintainerPATCH 67/118 crypto: cryptd - initialize child shash_desc on import
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ard Biesheuvel <[email protected]>
commit 0bd2223594a4dcddc1e34b15774a3a4776f7749e upstream.
When calling .import() on a cryptd ahash_request, the structure members that describe the child transform in the shash_desc need to be initialized like they are when calling .init()
--- crypto/cryptd.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
crypto/cryptd.c +7 -2
@@ -594,9 +594,14 @@ static int cryptd_hash_export(struct ahastatic int cryptd_hash_import (struct ahash_request *req,const void *in) { -struct cryptd_hash_request_ctx *rctx =ahash_request_ctx (req); +struct crypto_ahash *tfm =crypto_ahash_reqtfm (req); +struct cryptd_hash_ctx *ctx =crypto_ahash_ctx (tfm); +struct shash_desc *desc =cryptd_shash_desc (req); -return crypto_shash_import (&rctx->desc, in); + desc->tfm = ctx->child; + desc->flags = req->base.flags; + +return crypto_shash_import (desc, in); } static int cryptd_create_hash(struct crypto_template *tmpl, struct rtattr **tb,
Greg Kroah-Hartman
maintainerPATCH 41/118 USB: serial: simple: add support for another Infineon flashloader
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Palmas <[email protected]>
commit f190fd92458da3e869b4e2c6289e2c617490ae53 upstream.
This patch adds support for Infineon flashloader 0x8087/0x0801.
The flashloader is used in Telit LE940B modem family with Telit flashing application.
--- drivers/usb/serial/usb-serial-simple.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
drivers/usb/serial/usb-serial-simple.c +2 -1
@@ -54,7 +54,8 @@ DEVICE(funsoft, FUNSOFT_IDS);/* Infineon Flashloader driver */ #define FLASHLOADER_IDS () \ { USB_DEVICE_INTERFACE_CLASS(0x058b, 0x0041, USB_CLASS_CDC_DATA) }, \ - { USB_DEVICE(0x8087, 0x0716) } + { USB_DEVICE(0x8087, 0x0716) }, \ + { USB_DEVICE(0x8087, 0x0801) }DEVICE (flashloader,FLASHLOADER_IDS );/* Google Serial USB SubClass */
Greg Kroah-Hartman
maintainerPATCH 68/118 Btrfs: remove root_log_ctx from ctx list before btrfs_sync_log returns
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Chris Mason <[email protected]>
commit cbd60aa7cd17d81a434234268c55192862147439 upstream.
We use a btrfs_log_ctx structure to pass information into the tree log commit, and get error values out. It gets added to a per log-transaction list which we walk when things go bad.
Commit d1433debe added an optimization to skip waiting for the log commit, but didn't take root_log_ctx out of the list. This patch makes sure we remove things before exiting.
--- fs/btrfs/tree-log.c | 1 + 1 file changed, 1 insertion(+)
fs/btrfs/tree-log.c +1 -0
@@ -2850,6 +2850,7 @@ int btrfs_sync_log(struct btrfs_trans_haif (log_root_tree->log_transid_committed >= root_log_ctx.log_transid) {blk_finish_plug (&plug); +list_del_init (&root_log_ctx.list);mutex_unlock (&log_root_tree->log_mutex); ret = root_log_ctx.log_ret; goto out;
Greg Kroah-Hartman
maintainerPATCH 70/118 xhci: fix null pointer dereference in stop command timeout function
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mathias Nyman <[email protected]>
commit bcf42aa60c2832510b9be0f30c090bfd35bb172d upstream.
The stop endpoint command has its own 5 second timeout timer. If the timeout function is triggered between USB3 and USB2 host removal it will try to call usb_hc_died(xhci_to_hcd(xhci)->primary_hcd)
the ->primary_hcd will be set to NULL at USB3 hcd removal.
Fix this by first checking if the PCI host is being removed, and also by using only xhci_to_hcd() as it will always return the primary hcd.
--- drivers/usb/host/xhci-ring.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-)
drivers/usb/host/xhci-ring.c +5 -1
@@ -846,6 +846,10 @@ void xhci_stop_endpoint_command_watchdogspin_lock_irqsave (&xhci->lock, flags); ep->stop_cmds_pending--; +if (xhci->xhc_state &XHCI_STATE_REMOVING ) { +spin_unlock_irqrestore (&xhci->lock, flags); +return ; + }if (xhci->xhc_state &XHCI_STATE_DYING ) {xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb, "Stop EP timer ran, but another timer marked "
@@ -899,7 +903,7 @@ void xhci_stop_endpoint_command_watchdogspin_unlock_irqrestore (&xhci->lock, flags);xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb,"Calling usb_hc_died()" ); -usb_hc_died (xhci_to_hcd (xhci)->primary_hcd); +usb_hc_died (xhci_to_hcd (xhci));xhci_dbg_trace (xhci, trace_xhci_dbg_cancel_urb,"xHCI host controller is dead." ); }
Greg Kroah-Hartman
maintainerPATCH 71/118 md-cluster: make md-cluster also can work when compiled into kernel
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Guoqing Jiang <[email protected]>
commit 47a7b0d8888c04c9746812820b6e60553cc77bbc upstream.
The md-cluster is compiled as module by default,
if it is compiled by built-in way, then we can't
make md-cluster works.
[64782.630008] md/raid1:md127: active with 2 out of 2 mirrors [64782.630528] md-cluster module not found. [64782.630530] md127: Could not setup cluster service (-2)
--- drivers/md/md.c | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-)
drivers/md/md.c +4 -8
@@ -7572,16 +7572,12 @@ EXPORT_SYMBOL(unregister_md_cluster_operint md_setup_cluster (struct mddev *mddev,int nodes) { -int err; - - err =request_module ("md-cluster" ); -if (err) { -pr_err ("md-cluster module not found.\n" ); -return -ENOENT ; - } - +if (!md_cluster_ops) +request_module ("md-cluster" );spin_lock (&pers_lock); +/* ensure module won't be unloaded */ if (!md_cluster_ops || !try_module_get (md_cluster_mod)) { +pr_err ("can't find md-cluster module or get it's reference.\n" );spin_unlock (&pers_lock);return -ENOENT ; }
Greg Kroah-Hartman
maintainerPATCH 73/118 Revert "wext: Fix 32 bit iwpriv compatibility issue with 64 bit Kernel"
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johannes Berg <[email protected]>
commit 4d0bd46a4d55383f7b925e6cf7865a77e0f0e020 upstream.
This reverts commit 3d5fdff46c4b2b9534fa2f9fc78e90a48e0ff724.
Ben Hutchings pointed out that the commit isn't safe since it assumes that the structure used by the driver is iw_point, when in fact there's no way to know about that.
Fortunately, the only driver in the tree that ever runs this code path is the wilc1000 staging driver, so it doesn't really matter.
Clearly I should have investigated this better before applying, sorry.
--- net/wireless/wext-core.c | 25 ++----------------------- 1 file changed, 2 insertions(+), 23 deletions(-)
net/wireless/wext-core.c +2 -23
@@ -955,29 +955,8 @@ static int wireless_process_ioctl(structreturn private (dev, iwr, cmd, info, handler); }/* Old driver API : call driver ioctl handler */ -if (dev->netdev_ops->ndo_do_ioctl) { -#ifdef CONFIG_COMPAT -if (info->flags &IW_REQUEST_FLAG_COMPAT ) { -int ret =0 ; -struct iwreq iwr_lcl; -struct compat_iw_point *iwp_compat = (void *) &iwr->u.data; - -memcpy (&iwr_lcl, iwr,sizeof (struct iwreq )); - iwr_lcl.u.data.pointer =compat_ptr (iwp_compat->pointer); - iwr_lcl.u.data.length = iwp_compat->length; - iwr_lcl.u.data.flags = iwp_compat->flags; - - ret = dev->netdev_ops->ndo_do_ioctl (dev, (void *) &iwr_lcl, cmd); - - iwp_compat->pointer =ptr_to_compat (iwr_lcl.u.data.pointer); - iwp_compat->length = iwr_lcl.u.data.length; - iwp_compat->flags = iwr_lcl.u.data.flags; - -return ret; - } else -#endif -return dev->netdev_ops->ndo_do_ioctl (dev, ifr, cmd); - } +if (dev->netdev_ops->ndo_do_ioctl) +return dev->netdev_ops->ndo_do_ioctl (dev, ifr, cmd);return -EOPNOTSUPP ; }
Greg Kroah-Hartman
maintainerPATCH 74/118 sched/core: Fix a race between try_to_wake_up() and a woken up task
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Balbir Singh <[email protected]>
commit 135e8c9250dd5c8c9aae5984fde6f230d0cbfeaf upstream.
The origin of the issue I've seen is related to
a missing memory barrier between check for task->state and the check for task->on_rq.
The task being woken up is already awake from a schedule() and is doing the following:
do {
schedule()
set_current_state(TASK_(UN)INTERRUPTIBLE);
} while (!cond);The waker, actually gets stuck doing the following in try_to_wake_up():
while (p->on_cpu) cpu_relax();
Analysis:
The instance I've seen involves the following race:
CPU1 CPU2
while () {
if (cond)
break;
do {
schedule();
set_current_state(TASK_UN..) } while (!cond);
wakeup_routine()
spin_lock_irqsave(wait_lock)
raw_spin_lock_irqsave(wait_lock) wake_up_process()
} try_to_wake_up()
set_current_state(TASK_RUNNING); ..
list_del(&waiter.list);
CPU2 wakes up CPU1, but before it can get the wait_lock and set current state to TASK_RUNNING the following occurs:
CPU3
wakeup_routine()
raw_spin_lock_irqsave(wait_lock)
if (!list_empty)
wake_up_process()
try_to_wake_up()
raw_spin_lock_irqsave(p->pi_lock)
..
if (p->on_rq && ttwu_wakeup())
..
while (p->on_cpu)
cpu_relax()
..
CPU3 tries to wake up the task on CPU1 again since it finds it on the wait_queue, CPU1 is spinning on wait_lock, but immediately after CPU2, CPU3 got it.
CPU3 checks the state of p on CPU1, it is TASK_UNINTERRUPTIBLE and the task is spinning on the wait_lock. Interestingly since p->on_rq is checked under pi_lock, I've noticed that try_to_wake_up() finds p->on_rq to be 0. This was the most confusing bit of the analysis, but p->on_rq is changed under runqueue lock, rq_lock, the p->on_rq check is not reliable without this fix IMHO. The race is visible (based on the analysis) only when ttwu_queue() does a remote wakeup via ttwu_queue_remote. In which case the p->on_rq change is not done uder the pi_lock.
The result is that after a while the entire system locks up on the raw_spin_irqlock_save(wait_lock) and the holder spins infintely
Reproduction of the issue:
The issue can be reproduced after a long run on my system with 80 threads and having to tweak available memory to very low and running memory stress-ng mmapfork test. It usually takes a long time to reproduce. I am trying to work on a test case that can reproduce the issue faster, but thats work in progress. I am still testing the changes on my still in a loop and the tests seem OK thus far.
Big thanks to Benjamin and Nick for helping debug this as well. Ben helped catch the missing barrier, Nick caught every missing bit in my theory.
[ Updated comment to clarify matching barriers. Many
architectures do not have a full barrier in switch_to() so that cannot be relied upon. ]
--- kernel/sched/core.c | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+)
kernel/sched/core.c +22 -0
@@ -1945,6 +1945,28 @@ try_to_wake_up(struct task_struct *p, un success =1 ;/* we're going to change ->state */ cpu =task_cpu (p); +/* +* Ensure we load p->on_rq _after_ p->state, otherwise it would +* be possible to, falsely, observe p->on_rq == 0 and get stuck +* in smp_cond_load_acquire() below. +* +* sched_ttwu_pending() try_to_wake_up() +* [S] p->on_rq = 1; [L] P->state +* UNLOCK rq->lock -----. +* \ +* +--- RMB +* schedule() / +* LOCK rq->lock -----' +* UNLOCK rq->lock +* +* [task p] +* [S] p->state = UNINTERRUPTIBLE [L] p->on_rq +* +* Pairs with the UNLOCK+LOCK on rq->lock from the +* last wakeup of our task and the schedule that got our task +* current. +*/ +smp_rmb ();if (p->on_rq &&ttwu_remote (p, wake_flags)) goto stat;
Greg Kroah-Hartman
maintainerPATCH 75/118 ipv6: addrconf: fix dev refcont leak when DAD failed
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Wei Yongjun <[email protected]>
commit 751eb6b6042a596b0080967c1a529a9fe98dac1d upstream.
In general, when DAD detected IPv6 duplicate address, ifp->state will be set to INET6_IFADDR_STATE_ERRDAD and DAD is stopped by a delayed work, the call tree should be like this:
ndisc_recv_ns
-> addrconf_dad_failure <- missing ifp put
-> addrconf_mod_dad_work
-> schedule addrconf_dad_work()
-> addrconf_dad_stop() <- missing ifp hold before call itaddrconf_dad_failure() called with ifp refcont holding but not put. addrconf_dad_work() call addrconf_dad_stop() without extra holding refcount. This will not cause any issue normally.
But the race between addrconf_dad_failure() and addrconf_dad_work() may cause ifp refcount leak and netdevice can not be unregister, dmesg show the following messages:
IPv6: eth0: IPv6 duplicate address fe80::XX:XXXX:XXXX:XX detected!
...unregister_netdevice: waiting for eth0 to become free. Usage count = 1
to workqueue")
--- net/ipv6/addrconf.c | 2 ++ 1 file changed, 2 insertions(+)
net/ipv6/addrconf.c +2 -0
@@ -1898,6 +1898,7 @@ errdad:spin_unlock_bh (&ifp->lock);addrconf_mod_dad_work (ifp,0 ); +in6_ifa_put (ifp); }/* Join to solicited addr multicast group.
@@ -3609,6 +3610,7 @@ static void addrconf_dad_work(struct woraddrconf_dad_begin (ifp); goto out; }else if (action ==DAD_ABORT ) { +in6_ifa_hold (ifp);addrconf_dad_stop (ifp,1 ); goto out; }
Greg Kroah-Hartman
maintainerPATCH 76/118 gma500: remove annoying deprecation warning
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Linus Torvalds <[email protected]>
commit 166c5a6ef765653848161e6f4af81c05e4b3ecf6 upstream.
In commit e45708976aea ("drm/dp-helper: Move the legacy helpers to gma500") the legacy i2c helpers were moved to the only remaining user of them, the gma500 driver. Together with that move, i2c_dp_aux_add_bus() was marked deprecated and started warning about its remaining use.
It's now been a year and a half of annoying warning, and apparently nobody cares enough about gma500 to try to move it along to the more modern models.
Get rid of the warning - if even the gma500 people don't care enough, then they should certainly not spam other innocent developers with a warning that might hide other, much more real issues.
--- drivers/gpu/drm/gma500/cdv_intel_dp.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/gpu/drm/gma500/cdv_intel_dp.c +1 -1
@@ -220,7 +220,7 @@ i2c_dp_aux_prepare_bus(struct i2c_adapte* FIXME: This is the old dp aux helper, gma500 is the last driver that needs to * be ported over to the new helper code in drm_dp_helper.c like i915 or radeon. */ -static int __deprecated +static int i2c_dp_aux_add_bus (struct i2c_adapter *adapter) {int error;
Greg Kroah-Hartman
maintainerPATCH 43/118 usb: chipidea: udc: fix NULL ptr dereference in isr_setup_status_phase
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Clemens Gruber <[email protected]>
commit 6f3c4fb6d05e63c9c6d8968302491c3a5457be61 upstream.
Problems with the signal integrity of the high speed USB data lines or noise on reference ground lines can cause the i.MX6 USB controller to violate USB specs and exhibit unexpected behavior.
It was observed that USBi_UI interrupts were triggered first and when isr_setup_status_phase was called, ci->status was NULL, which lead to a NULL pointer dereference kernel panic.
This patch fixes the kernel panic, emits a warning once and returns -EPIPE to halt the device and let the host get stalled.
It also adds a comment to point people, who are experiencing this issue, to their USB hardware design.
--- drivers/usb/chipidea/udc.c | 9 +++++++++ 1 file changed, 9 insertions(+)
drivers/usb/chipidea/udc.c +9 -0
@@ -939,6 +939,15 @@ static int isr_setup_status_phase(structint retval;struct ci_hw_ep *hwep; +/* +* Unexpected USB controller behavior, caused by bad signal integrity +* or ground reference problems, can lead to isr_setup_status_phase +* being called with ci->status equal to NULL. +* If this situation occurs, you should review your USB hardware design. +*/ +if (WARN_ON_ONCE (!ci->status)) +return -EPIPE ; + hwep = (ci->ep0_dir ==TX ) ? ci->ep0out : ci->ep0in; ci->status->context = ci; ci->status->complete = isr_setup_status_complete;
Greg Kroah-Hartman
maintainerPATCH 44/118 ARM: dts: STiH410: Handle interconnect clock required by EHCI/OHCI (USB)
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Lee Jones <[email protected]>
commit 7e9d2850a8db4e0d85a20bb692198bf2cc4be3b7 upstream.
The STiH4{07,10} platform contains some interconnect clocks which are used by various IPs. If this clock isn't handled correctly by ST's EHCI/OHCI drivers, their hub won't be found, the following error be shown and the result will be non-working USB:
[ 97.221963] hub 2-1:1.0: hub_ext_port_status failed (err = -110)
--- arch/arm/boot/dts/stih410.dtsi | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
arch/arm/boot/dts/stih410.dtsi +8 -4
@@ -41,7 +41,8 @@ compatible = "st,st-ohci-300x"; reg = <0x9a03c00 0x100>; interrupts = <GIC_SPI 180 IRQ_TYPE_NONE>; - clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>; + clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>, + <&clk_s_c0_flexgen CLK_RX_ICN_DISP_0>; resets = <&powerdown STIH407_USB2_PORT0_POWERDOWN>, <&softreset STIH407_USB2_PORT0_SOFTRESET>; reset-names = "power", "softreset";
@@ -57,7 +58,8 @@ interrupts = <GIC_SPI 151 IRQ_TYPE_NONE>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usb0>; - clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>; + clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>, + <&clk_s_c0_flexgen CLK_RX_ICN_DISP_0>; resets = <&powerdown STIH407_USB2_PORT0_POWERDOWN>, <&softreset STIH407_USB2_PORT0_SOFTRESET>; reset-names = "power", "softreset";
@@ -71,7 +73,8 @@ compatible = "st,st-ohci-300x"; reg = <0x9a83c00 0x100>; interrupts = <GIC_SPI 181 IRQ_TYPE_NONE>; - clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>; + clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>, + <&clk_s_c0_flexgen CLK_RX_ICN_DISP_0>; resets = <&powerdown STIH407_USB2_PORT1_POWERDOWN>, <&softreset STIH407_USB2_PORT1_SOFTRESET>; reset-names = "power", "softreset";
@@ -87,7 +90,8 @@ interrupts = <GIC_SPI 153 IRQ_TYPE_NONE>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_usb1>; - clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>; + clocks = <&clk_s_c0_flexgen CLK_TX_ICN_DISP_0>, + <&clk_s_c0_flexgen CLK_RX_ICN_DISP_0>; resets = <&powerdown STIH407_USB2_PORT1_POWERDOWN>, <&softreset STIH407_USB2_PORT1_SOFTRESET>; reset-names = "power", "softreset";
Greg Kroah-Hartman
maintainerPATCH 46/118 cxl: use pcibios_free_controller_deferred() when removing vPHBs
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Andrew Donnellan <[email protected]>
commit 6f38a8b9a45833495dc878c335c5431cd98a16ed upstream.
When cxl removes a vPHB, it's possible that the pci_controller may be freed before all references to the devices on the vPHB have been released. This in turn causes an invalid memory access when the devices are eventually released, as pcibios_release_device() attempts to call the phb's release_device hook.
In cxl_pci_vphb_remove(), remove the existing call to pcibios_free_controller(). Instead, use pcibios_free_controller_deferred() to free the pci_controller after all devices have been released. Export pci_set_host_bridge_release() so we can do this.
--- drivers/misc/cxl/vphb.c | 10 +++++++++- drivers/pci/host-bridge.c | 1 + 2 files changed, 10 insertions(+), 1 deletion(-)
drivers/misc/cxl/vphb.c +9 -1
@@ -258,6 +258,11 @@ int cxl_pci_vphb_add(struct cxl_afu *afuif (phb->bus ==NULL )return -ENXIO ; +/* Set release hook on root bus */ +pci_set_host_bridge_release (to_pci_host_bridge (phb->bus->bridge), + pcibios_free_controller_deferred, + (void *) phb); +/* Claim resources. This might need some rework as well depending * whether we are doing probe-only or not, like assigning unassigned * resources etc...
@@ -293,7 +298,10 @@ void cxl_pci_vphb_remove(struct cxl_afu afu->phb =NULL ;pci_remove_root_bus (phb->bus); -pcibios_free_controller (phb); +/* +* We don't free phb here - that's handled by +* pcibios_free_controller_deferred() +*/ }struct cxl_afu *cxl_pci_to_afu (struct pci_dev *dev)
drivers/pci/host-bridge.c +1 -0
@@ -44,6 +44,7 @@ void pci_set_host_bridge_release(struct bridge->release_fn = release_fn; bridge->release_data = release_data; } +EXPORT_SYMBOL_GPL (pci_set_host_bridge_release);void pcibios_resource_to_bus (struct pci_bus *bus,struct pci_bus_region *region,struct resource *res)
Greg Kroah-Hartman
maintainerPATCH 47/118 net: thunderx: Fix OOPs with ethtool --register-dump
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: David Daney <[email protected]>
commit 1423661fed2c40d6d71b5e2e3aa390f85157f9d5 upstream.
The ethtool_ops .get_regs function attempts to read the nonexistent register NIC_QSET_SQ_0_7_CNM_CHG, which produces a "bus error" type OOPs.
Fix by not attempting to read, and removing the definition of, NIC_QSET_SQ_0_7_CNM_CHG. A zero is written into the register dump to keep the layout unchanged.
--- drivers/net/ethernet/cavium/thunder/nic_reg.h | 1 - drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c | 5 ++++- 2 files changed, 4 insertions(+), 2 deletions(-)
drivers/net/ethernet/cavium/thunder/nic_reg.h +0 -1
@@ -170,7 +170,6 @@#define NIC_QSET_SQ_0_7_DOOR (0x010838)#define NIC_QSET_SQ_0_7_STATUS (0x010840)#define NIC_QSET_SQ_0_7_DEBUG (0x010848) -#define NIC_QSET_SQ_0_7_CNM_CHG (0x010860)#define NIC_QSET_SQ_0_7_STAT_0_1 (0x010900)#define NIC_QSET_RBDR_0_1_CFG (0x010C00)
drivers/net/ethernet/cavium/thunder/nicvf_ethtool.c +4 -1
@@ -380,7 +380,10 @@ static void nicvf_get_regs(struct net_de p[i++] =nicvf_queue_reg_read (nic,NIC_QSET_SQ_0_7_DOOR , q); p[i++] =nicvf_queue_reg_read (nic,NIC_QSET_SQ_0_7_STATUS , q); p[i++] =nicvf_queue_reg_read (nic,NIC_QSET_SQ_0_7_DEBUG , q); - p[i++] =nicvf_queue_reg_read (nic,NIC_QSET_SQ_0_7_CNM_CHG , q); +/* Padding, was NIC_QSET_SQ_0_7_CNM_CHG, which +* produces bus errors when read +*/ + p[i++] =0 ; p[i++] =nicvf_queue_reg_read (nic,NIC_QSET_SQ_0_7_STAT_0_1 , q); reg_offset =NIC_QSET_SQ_0_7_STAT_0_1 | (1 <<3 ); p[i++] =nicvf_queue_reg_read (nic, reg_offset, q);
Greg Kroah-Hartman
maintainerPATCH 38/118 iio: ensure ret is initialized to zero before entering do loop
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Colin Ian King <[email protected]>
commit 5dba4b14bafe801083d01e1f400816df7e5a8f2e upstream.
A recent fix to iio_buffer_read_first_n_outer removed ret from being set by a return from wait_event_interruptible and also added a continue in a loop which causes the variable ret to not be set when it reaches the end of the loop. Fix this by initializing ret to zero.
Also remove extraneous white space at the end of the loop.
--- drivers/iio/industrialio-buffer.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/industrialio-buffer.c +2 -2
@@ -110,7 +110,7 @@ ssize_t iio_buffer_read_first_n_outer(stDEFINE_WAIT_FUNC (wait, woken_wake_function);size_t datum_size;size_t to_wait; -int ret; +int ret =0 ;if (!indio_dev->info)return -ENODEV ;
@@ -153,7 +153,7 @@ ssize_t iio_buffer_read_first_n_outer(st ret = rb->access->read_first_n (rb, n, buf);if (ret ==0 && (filp->f_flags &O_NONBLOCK )) ret = -EAGAIN ; - }while (ret ==0 ); + }while (ret ==0 );remove_wait_queue (&rb->pollq, &wait);return ret;
Greg Kroah-Hartman
maintainerPATCH 90/118 avr32: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 8630c32275bac2de6ffb8aea9d9b11663e7ad28e upstream.
really ugly, but apparently avr32 compilers turns access_ok() into something so bad that they want it in assembler. Left that way, zeroing added in inline wrapper.
--- arch/avr32/include/asm/uaccess.h | 11 ++++++++++- arch/avr32/kernel/avr32_ksyms.c | 2 +- arch/avr32/lib/copy_user.S | 4 ++-- 3 files changed, 13 insertions(+), 4 deletions(-)
arch/avr32/include/asm/uaccess.h +10 -1
@@ -74,7 +74,7 @@ extern __kernel_size_t __copy_user(voidextern __kernel_size_t copy_to_user (void __user *to,const void *from,__kernel_size_t n); -extern __kernel_size_t copy_from_user (void *to,const void __user *from, +extern __kernel_size_t ___copy_from_user (void *to,const void __user *from,__kernel_size_t n); static inline __kernel_size_t __copy_to_user(void __user *to, const void *from,
@@ -88,6 +88,15 @@ static inline __kernel_size_t __copy_fro {return __copy_user (to, (const void __force *)from, n); } +static inline __kernel_size_t copy_from_user (void *to, +const void __user *from, +__kernel_size_t n) +{ +size_t res =___copy_from_user (to, from, n); +if (unlikely (res)) +memset (to + (n - res),0 , res); +return res; +}#define __copy_to_user_inatomic __copy_to_user#define __copy_from_user_inatomic __copy_from_user
arch/avr32/kernel/avr32_ksyms.c +1 -1
@@ -36,7 +36,7 @@ EXPORT_SYMBOL(copy_page);/* * Userspace access stuff. */ -EXPORT_SYMBOL (copy_from_user); +EXPORT_SYMBOL (___copy_from_user);EXPORT_SYMBOL (copy_to_user);EXPORT_SYMBOL (__copy_user);EXPORT_SYMBOL (strncpy_from_user);
arch/avr32/lib/copy_user.S +2 -2
@@ -25,11 +25,11 @@ .align 1 .global copy_from_user .type copy_from_user, @function -copy_from_user: +___copy_from_user: branch_if_kernel r8, __copy_user ret_if_privileged r8, r11, r10, r10 rjmp __copy_user - .size copy_from_user, . - copy_from_user + .size ___copy_from_user, . - ___copy_from_user .global copy_to_user .type copy_to_user, @function
Greg Kroah-Hartman
maintainerPATCH 94/118 m32r: fix __get_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit c90a3bc5061d57e7931a9b7ad14784e1a0ed497d upstream.
--- arch/m32r/include/asm/uaccess.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/m32r/include/asm/uaccess.h +1 -1
@@ -219,7 +219,7 @@ extern int fixup_exception(struct pt_reg#define __get_user_nocheck (x, ptr, size) \ ({ \ long __gu_err = 0; \ - unsigned long __gu_val; \ + unsigned long __gu_val = 0; \ might_fault(); \ __get_user_size(__gu_val, (ptr), (size), __gu_err); \ (x) = (__force __typeof__(*(ptr)))__gu_val; \
Greg Kroah-Hartman
maintainerPATCH 95/118 sh64: failing __get_user() should zero
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit c6852389228df9fb3067f94f3b651de2a7921b36 upstream.
It could be done in exception-handling bits in __get_user_b() et.al., but the surgery involved would take more knowledge of sh64 details than I have or _want_ to have.
--- arch/sh/include/asm/uaccess_64.h | 1 + 1 file changed, 1 insertion(+)
arch/sh/include/asm/uaccess_64.h +1 -0
@@ -24,6 +24,7 @@#define __get_user_size (x,ptr,size,retval) \ do { \ retval = 0; \ + x = 0; \ switch (size) { \ case 1: \ retval = __get_user_asm_b((void *)&x, \
Greg Kroah-Hartman
maintainerPATCH 96/118 nios2: fix __get_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 2e29f50ad5e23db37dde9be71410d95d50241ecd upstream.
a) should not leave crap on fault
b) should _not_ require access_ok() in any cases.
--- arch/nios2/include/asm/uaccess.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/nios2/include/asm/uaccess.h +2 -2
@@ -139,7 +139,7 @@ extern long strnlen_user(const char __us#define __get_user_unknown (val, size, ptr, err) do { \ err = 0; \ - if (copy_from_user(&(val), ptr, size)) { \ + if (__copy_from_user(&(val), ptr, size)) { \ err = -EFAULT; \ } \ } while (0)
@@ -166,7 +166,7 @@ do { \ ({ \ long __gu_err = -EFAULT; \ const __typeof__(*(ptr)) __user *__gu_ptr = (ptr); \ - unsigned long __gu_val; \ + unsigned long __gu_val = 0; \ __get_user_common(__gu_val, sizeof(*(ptr)), __gu_ptr, __gu_err);\ (x) = (__force __typeof__(x))__gu_val; \ __gu_err; \
Greg Kroah-Hartman
maintainerPATCH 100/118 asm-generic: make get_user() clear the destination on errors
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 9ad18b75c2f6e4a78ce204e79f37781f8815c0fa upstream.
both for access_ok() failures and for faults halfway through
--- include/asm-generic/uaccess.h | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
include/asm-generic/uaccess.h +7 -3
@@ -230,14 +230,18 @@ extern int __put_user_bad(void) __attribmight_fault (); \access_ok (VERIFY_READ , __p,sizeof (*ptr)) ? \ __get_user((x), (__typeof__(*(ptr)) *)__p) : \ - -EFAULT ; \ + ((x) = (__typeof__ (*(ptr )))0 ,-EFAULT ); \ })#ifndef __get_user_fnstatic inline int __get_user_fn (size_t size,const void __user *ptr,void *x) { - size =__copy_from_user (x, ptr, size); -return size ? -EFAULT : size; +size_t n =__copy_from_user (x, ptr, size); +if (unlikely (n)) { +memset (x + (size - n),0 , n); +return -EFAULT ; + } +return 0 ; }#define __get_user_fn (sz, u, k) __get_user_fn(sz, u, k)
Greg Kroah-Hartman
maintainerPATCH 104/118 score: fix copy_from_user() and friends
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit b615e3c74621e06cd97f86373ca90d43d6d998aa upstream.
--- arch/score/include/asm/uaccess.h | 41 +++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 21 deletions(-)
arch/score/include/asm/uaccess.h +20 -21
@@ -301,35 +301,34 @@ extern int __copy_tofrom_user(void *to,static inline unsigned long copy_from_user (void *to,const void *from,unsigned long len) { -unsigned long over; +unsigned long res = len; -if (access_ok (VERIFY_READ , from, len)) -return __copy_tofrom_user (to, from, len); +if (likely (access_ok (VERIFY_READ , from, len))) + res =__copy_tofrom_user (to, from, len); -if ((unsigned long )from <TASK_SIZE ) { - over = (unsigned long )from + len -TASK_SIZE ; -return __copy_tofrom_user (to, from, len - over) + over; - } -return len; +if (unlikely (res)) +memset (to + (len - res),0 , res); + +return res; }static inline unsigned long copy_to_user (void *to,const void *from,unsigned long len) { -unsigned long over; - -if (access_ok (VERIFY_WRITE , to, len)) -return __copy_tofrom_user (to, from, len); +if (likely (access_ok (VERIFY_WRITE , to, len))) + len =__copy_tofrom_user (to, from, len); -if ((unsigned long )to <TASK_SIZE ) { - over = (unsigned long )to + len -TASK_SIZE ; -return __copy_tofrom_user (to, from, len - over) + over; - }return len; } -#define __copy_from_user (to, from, len) \ - __copy_tofrom_user((to), (from), (len)) +static inline unsigned long +__copy_from_user (void *to,const void *from,unsigned long len) +{ +unsigned long left =__copy_tofrom_user (to, from, len); +if (unlikely (left)) +memset (to + (len - left),0 , left); +return left; +}#define __copy_to_user (to, from, len) \ __copy_tofrom_user((to), (from), (len))
@@ -343,17 +342,17 @@ __copy_to_user_inatomic(void *to, conststatic inline unsigned long __copy_from_user_inatomic (void *to,const void *from,unsigned long len) { -return __copy_from_user (to, from, len); +return __copy_tofrom_user (to, from, len); } -#define __copy_in_user (to, from, len) __copy_from_user(to, from, len) +#define __copy_in_user (to, from, len) __copy_tofrom_user(to, from, len)static inline unsigned long copy_in_user (void *to,const void *from,unsigned long len) {if (access_ok (VERIFY_READ , from, len) &&access_ok (VERFITY_WRITE , to, len)) -return copy_from_user (to, from, len); +return __copy_tofrom_user (to, from, len); }/*
Greg Kroah-Hartman
maintainerPATCH 105/118 sh: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 6e050503a150b2126620c1a1e9b3a368fcd51eac upstream.
--- arch/sh/include/asm/uaccess.h | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
arch/sh/include/asm/uaccess.h +4 -1
@@ -151,7 +151,10 @@ copy_from_user(void *to, const void __us__kernel_size_t __copy_size = (__kernel_size_t ) n;if (__copy_size &&__access_ok (__copy_from, __copy_size)) -return __copy_user (to, from, __copy_size); + __copy_size =__copy_user (to, from, __copy_size); + +if (unlikely (__copy_size)) +memset (to + (n - __copy_size),0 , __copy_size);return __copy_size; }
Greg Kroah-Hartman
maintainerPATCH 108/118 asm-generic: make copy_from_user() zero the destination properly
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 2545e5da080b4839dd859e3b09343a884f6ab0e3 upstream.
... in all cases, including the failing access_ok()
Note that some architectures using asm-generic/uaccess.h have __copy_from_user() not zeroing the tail on failure halfway through. This variant works either way.
--- include/asm-generic/uaccess.h | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-)
include/asm-generic/uaccess.h +6 -4
@@ -261,11 +261,13 @@ extern int __get_user_bad(void) __attribstatic inline long copy_from_user (void *to,const void __user * from,unsigned long n) { +unsigned long res = n;might_fault (); -if (access_ok (VERIFY_READ , from, n)) -return __copy_from_user (to, from, n); -else -return n; +if (likely (access_ok (VERIFY_READ , from, n))) + res =__copy_from_user (to, from, n); +if (unlikely (res)) +memset (to + (n - res),0 , res); +return res; } static inline long copy_to_user(void __user *to,
Greg Kroah-Hartman
maintainerPATCH 109/118 alpha: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 2561d309dfd1555e781484af757ed0115035ddb3 upstream.
it should clear the destination even when access_ok() fails.
--- arch/alpha/include/asm/uaccess.h | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-)
arch/alpha/include/asm/uaccess.h +8 -11
@@ -371,14 +371,6 @@ __copy_tofrom_user_nocheck(void *to, conreturn __cu_len; } -extern inline long -__copy_tofrom_user (void *to,const void *from,long len,const void __user *validate) -{ -if (__access_ok ((unsigned long )validate, len,get_fs ())) - len =__copy_tofrom_user_nocheck (to, from, len); -return len; -} -#define __copy_to_user (to, from, n) \ ({ \ __chk_user_ptr(to); \
@@ -393,17 +385,22 @@ __copy_tofrom_user(void *to, const void#define __copy_to_user_inatomic __copy_to_user#define __copy_from_user_inatomic __copy_from_user -extern inline long copy_to_user (void __user *to,const void *from,long n) { -return __copy_tofrom_user ((__force void *)to, from, n, to); +if (likely (__access_ok ((unsigned long )to, n,get_fs ()))) + n =__copy_tofrom_user_nocheck ((__force void *)to, from, n); +return n; }extern inline long copy_from_user (void *to,const void __user *from,long n) { -return __copy_tofrom_user (to, (__force void *)from, n, from); +if (likely (__access_ok ((unsigned long )from, n,get_fs ()))) + n =__copy_tofrom_user_nocheck (to, (__force void *)from, n); +else +memset (to,0 , n); +return n; }extern void __do_clear_user (void );
Greg Kroah-Hartman
maintainerPATCH 111/118 parisc: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit aace880feea38875fbc919761b77e5732a3659ef upstream.
--- arch/parisc/include/asm/uaccess.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-)
arch/parisc/include/asm/uaccess.h +4 -2
@@ -10,6 +10,7 @@#include <asm-generic/uaccess-unaligned.h> #include <linux/bug.h> +#include <linux/string.h> #define VERIFY_READ 0#define VERIFY_WRITE 1
@@ -245,13 +246,14 @@ static inline unsigned long __must_check unsigned long n) {int sz =__compiletime_object_size (to); -int ret = -EFAULT ; +unsigned long ret = n;if (likely (sz ==-1 || !__builtin_constant_p (n) || sz >= n)) ret =__copy_from_user (to, from, n);else copy_from_user_overflow (); - +if (unlikely (ret)) +memset (to + (n - ret),0 , ret);return ret; }
Greg Kroah-Hartman
maintainerPATCH 110/118 metag: copy_from_user() should zero the destination on access_ok() failure
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 8ae95ed4ae5fc7c3391ed668b2014c9e2079533b upstream.
--- arch/metag/include/asm/uaccess.h | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-)
arch/metag/include/asm/uaccess.h +2 -1
@@ -204,8 +204,9 @@ extern unsigned long __must_check __copystatic inline unsigned long copy_from_user (void *to,const void __user *from,unsigned long n) { -if (access_ok (VERIFY_READ , from, n)) +if (likely (access_ok (VERIFY_READ , from, n)))return __copy_user_zeroing (to, from, n); +memset (to,0 , n);return n; }
Greg Kroah-Hartman
maintainerPATCH 114/118 mn10300: copy_from_user() should zero on access_ok() failure...
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit ae7cc577ec2a4a6151c9e928fd1f595d953ecef1 upstream.
--- arch/mn10300/lib/usercopy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)
arch/mn10300/lib/usercopy.c +3 -1
@@ -9,7 +9,7 @@* as published by the Free Software Foundation; either version * 2 of the Licence, or (at your option) any later version. */ -#include <asm/uaccess.h> +#include <linux/uaccess.h> unsigned long __generic_copy_to_user (void *to,const void *from,unsigned long n)
@@ -24,6 +24,8 @@ __generic_copy_from_user(void *to, const {if (access_ok (VERIFY_READ , from, n))__copy_user_zeroing (to, from, n); +else +memset (to,0 , n);return n; }
Greg Kroah-Hartman
maintainerPATCH 116/118 ppc32: fix copy_from_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit 224264657b8b228f949b42346e09ed8c90136a8e upstream.
should clear on access_ok() failures. Also remove the useless range truncation logics.
--- arch/powerpc/include/asm/uaccess.h | 21 ++------------------- 1 file changed, 2 insertions(+), 19 deletions(-)
arch/powerpc/include/asm/uaccess.h +2 -19
@@ -323,30 +323,17 @@ extern unsigned long __copy_tofrom_user(static inline unsigned long copy_from_user (void *to,const void __user *from,unsigned long n) { -unsigned long over; - -if (access_ok (VERIFY_READ , from, n)) +if (likely (access_ok (VERIFY_READ , from, n)))return __copy_tofrom_user ((__force void __user *)to, from, n); -if ((unsigned long )from <TASK_SIZE ) { - over = (unsigned long )from + n -TASK_SIZE ; -return __copy_tofrom_user ((__force void __user *)to, from, - n - over) + over; - } ++memset (to,0 , n);return n; }static inline unsigned long copy_to_user (void __user *to,const void *from,unsigned long n) { -unsigned long over; -if (access_ok (VERIFY_WRITE , to, n))return __copy_tofrom_user (to, (__force void __user *)from, n); -if ((unsigned long )to <TASK_SIZE ) { - over = (unsigned long )to + n -TASK_SIZE ; -return __copy_tofrom_user (to, (__force void __user *)from, - n - over) + over; - }return n; }
@@ -437,10 +424,6 @@ static inline unsigned long clear_user(vmight_fault ();if (likely (access_ok (VERIFY_WRITE , addr, size)))return __clear_user (addr, size); -if ((unsigned long )addr <TASK_SIZE ) { -unsigned long over = (unsigned long )addr + size -TASK_SIZE ; -return __clear_user (addr, size - over) + over; - }return size; }
Greg Kroah-Hartman
maintainerPATCH 117/118 genirq/msi: Fix broken debug output
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thomas Gleixner <[email protected]>
commit 4364e1a29be16b2783c0bcbc263f61236af64281 upstream.
virq is not required to be the same for all msi descs. Use the base irq number from the desc in the debug printk.
--- kernel/irq/msi.c | 1 + 1 file changed, 1 insertion(+)
kernel/irq/msi.c +1 -0
@@ -298,6 +298,7 @@ int msi_domain_alloc_irqs(struct irq_dom ops->msi_finish (&arg,0 );for_each_msi_entry (desc, dev) { + virq = desc->irq;if (desc->nvec_used ==1 )dev_dbg (dev,"irq %d for MSI\n" , virq);else
Greg Kroah-Hartman
maintainerPATCH 118/118 ia64: copy_from_user() should zero the destination on access_ok() failure
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit a5e541f796f17228793694d64b507f5f57db4cd7 upstream.
--- arch/ia64/include/asm/uaccess.h | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-)
arch/ia64/include/asm/uaccess.h +9 -11
@@ -263,17 +263,15 @@ __copy_from_user (void *to, const void _ __cu_len; \ }) -#define copy_from_user (to, from, n) \ -({ \ - void *__cu_to = (to); \ - const void __user *__cu_from = (from); \ - long __cu_len = (n); \ - \ - __chk_user_ptr(__cu_from); \ - if (__access_ok(__cu_from, __cu_len, get_fs())) \ - __cu_len = __copy_user((__force void __user *) __cu_to, __cu_from, __cu_len); \ - __cu_len; \ -}) +static inline unsigned long +copy_from_user (void *to,const void __user *from,unsigned long n) +{ +if (likely (__access_ok (from, n,get_fs ()))) + n =__copy_user ((__force void __user *) to, from, n); +else +memset (to,0 , n); +return n; +}#define __copy_in_user (to, from, size) __copy_user((to), (from), (size))
Greg Kroah-Hartman
maintainerPATCH 84/118 drm: atmel-hlcdc: Fix vertical scaling
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jan Leupold <[email protected]>
commit d31ed3f05763644840c654a384eaefa94c097ba2 upstream.
The code is applying the same scaling for the X and Y components, thus making the scaling feature only functional when both components have the same scaling factor.
Do the s/_w/_h/ replacement where appropriate to fix vertical scaling.
--- drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-)
drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_plane.c +5 -5
@@ -316,19 +316,19 @@ atmel_hlcdc_plane_update_pos_and_size(stu32 *coeff_tab = heo_upscaling_ycoef;u32 max_memsize; -if (state->crtc_w < state->src_w) +if (state->crtc_h < state->src_h) coeff_tab = heo_downscaling_ycoef;for (i =0 ; i <ARRAY_SIZE (heo_upscaling_ycoef); i++)atmel_hlcdc_layer_update_cfg (&plane->layer,33 + i,0xffffffff , coeff_tab[i]); - factor = ((8 *256 * state->src_w) - (256 *4 )) / - state->crtc_w; + factor = ((8 *256 * state->src_h) - (256 *4 )) / + state->crtc_h; factor++; - max_memsize = ((factor * state->crtc_w) + (256 *4 )) / + max_memsize = ((factor * state->crtc_h) + (256 *4 )) /2048 ; -if (max_memsize > state->src_w) +if (max_memsize > state->src_h) factor--; factor_reg |= (factor <<16 ) |0x80000000 ; }
Greg Kroah-Hartman
maintainerPATCH 85/118 drm: Only use compat ioctl for addfb2 on X86/IA64
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kristian H. Kristensen <[email protected]>
commit 47a66e45d7a7613322549c2475ea9d809baaf514 upstream.
Similar to struct drm_update_draw, struct drm_mode_fb_cmd2 has an unaligned 64 bit field (modifier). This get packed differently between 32 bit and 64 bit modes on architectures that can handle unaligned 64 bit access (X86 and IA64). Other architectures pack the structs the same and don't need the compat wrapper. Use the same condition for drm_mode_fb_cmd2 as we use for drm_update_draw.
Note that only the modifier will be packed differently between compat and non-compat versions.
--- drivers/gpu/drm/drm_ioc32.c | 4 ++++ 1 file changed, 4 insertions(+)
drivers/gpu/drm/drm_ioc32.c +4 -0
@@ -1015,6 +1015,7 @@ static int compat_drm_wait_vblank(structreturn 0 ; } +#if defined(CONFIG_X86) || defined(CONFIG_IA64) typedef struct drm_mode_fb_cmd232 { u32 fb_id; u32 width;
@@ -1071,6 +1072,7 @@ static int compat_drm_mode_addfb2(structreturn 0 ; } +#endif static drm_ioctl_compat_t *drm_compat_ioctls[] = { [DRM_IOCTL_NR (DRM_IOCTL_VERSION32 )] = compat_drm_version,
@@ -1104,7 +1106,9 @@ static drm_ioctl_compat_t *drm_compat_io [DRM_IOCTL_NR(DRM_IOCTL_UPDATE_DRAW32)] = compat_drm_update_draw, #endif [DRM_IOCTL_NR(DRM_IOCTL_WAIT_VBLANK32)] = compat_drm_wait_vblank, +#if defined(CONFIG_X86) || defined(CONFIG_IA64) [DRM_IOCTL_NR(DRM_IOCTL_MODE_ADDFB232)] = compat_drm_mode_addfb2, +#endif }; /**
Greg Kroah-Hartman
maintainerPATCH 86/118 genirq: Provide irq_gc_{lock_irqsave,unlock_irqrestore}() helpers
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit ebf9ff753c041b296241990aef76163bbb2cc9c8 upstream.
Some irqchip drivers need to take the generic chip lock outside of the irq context.
Provide the irq_gc_{lock_irqsave,unlock_irqrestore}() helpers to allow one to disable irqs while entering a critical section protected by gc->lock.
Note that we do not provide optimized version of these helpers for !SMP, because they are not called from the hot-path.
[ tglx: Added a comment when these helpers should be [not] used ]
--- include/linux/irq.h | 10 ++++++++++ 1 file changed, 10 insertions(+)
include/linux/irq.h +10 -0
@@ -916,6 +916,16 @@ static inline void irq_gc_lock(struct irstatic inline void irq_gc_unlock (struct irq_chip_generic *gc) { }#endif +/* +* The irqsave variants are for usage in non interrupt code. Do not use +* them in irq_chip callbacks. Use irq_gc_lock() instead. +*/ +#define irq_gc_lock_irqsave (gc, flags) \ + raw_spin_lock_irqsave(&(gc)->lock, flags) + +#define irq_gc_unlock_irqrestore (gc, flags) \ + raw_spin_unlock_irqrestore(&(gc)->lock, flags) +static inline void irq_reg_writel (struct irq_chip_generic *gc,u32 val,int reg_offset) {
Greg Kroah-Hartman
maintainerPATCH 87/118 irqchip/atmel-aic: Fix potential deadlock in ->xlate()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Boris Brezillon <[email protected]>
commit 5eb0d6eb3fac3daa60d9190eed9fa41cf809c756 upstream.
aic5_irq_domain_xlate() and aic_irq_domain_xlate() take the generic chip lock without disabling interrupts, which can lead to a deadlock if an interrupt occurs while the lock is held in one of these functions.
Replace irq_gc_{lock,unlock}() calls by irq_gc_{lock_irqsave,unlock_irqrestore}() ones to prevent this bug from happening.
--- drivers/irqchip/irq-atmel-aic.c | 5 +++-- drivers/irqchip/irq-atmel-aic5.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-)
drivers/irqchip/irq-atmel-aic.c +3 -2
@@ -176,6 +176,7 @@ static int aic_irq_domain_xlate(struct i {struct irq_domain_chip_generic *dgc = d->gc;struct irq_chip_generic *gc; +unsigned long flags;unsigned smr;int idx;int ret;
@@ -194,12 +195,12 @@ static int aic_irq_domain_xlate(struct i gc = dgc->gc[idx]; -irq_gc_lock (gc); +irq_gc_lock_irqsave (gc, flags); smr =irq_reg_readl (gc,AT91_AIC_SMR (*out_hwirq)); ret =aic_common_set_priority (intspec[2 ], &smr);if (!ret)irq_reg_writel (gc, smr,AT91_AIC_SMR (*out_hwirq)); -irq_gc_unlock (gc); +irq_gc_unlock_irqrestore (gc, flags);return ret; }
drivers/irqchip/irq-atmel-aic5.c +3 -2
@@ -258,6 +258,7 @@ static int aic5_irq_domain_xlate(struct unsigned int *out_type) {struct irq_chip_generic *bgc =irq_get_domain_generic_chip (d,0 ); +unsigned long flags;unsigned smr;int ret;
@@ -269,13 +270,13 @@ static int aic5_irq_domain_xlate(structif (ret)return ret; -irq_gc_lock (bgc); +irq_gc_lock_irqsave (bgc, flags);irq_reg_writel (bgc, *out_hwirq,AT91_AIC5_SSR ); smr =irq_reg_readl (bgc,AT91_AIC5_SMR ); ret =aic_common_set_priority (intspec[2 ], &smr);if (!ret)irq_reg_writel (bgc, intspec[2 ] | smr,AT91_AIC5_SMR ); -irq_gc_unlock (bgc); +irq_gc_unlock_irqrestore (bgc, flags);return ret; }
Greg Kroah-Hartman
maintainerPATCH 89/118 microblaze: fix __get_user()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit e98b9e37ae04562d52c96f46b3cf4c2e80222dc1 upstream.
--- arch/microblaze/include/asm/uaccess.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
arch/microblaze/include/asm/uaccess.h +1 -1
@@ -227,7 +227,7 @@ extern long __user_bad(void);#define __get_user (x, ptr) \ ({ \ - unsigned long __gu_val; \ + unsigned long __gu_val = 0; \/*unsigned long __gu_ptr = (unsigned long)(ptr);*/ \long __gu_err; \switch (sizeof (*(ptr))) { \
Greg Kroah-Hartman
maintainerPATCH 88/118 fix iov_iter_fault_in_readable()
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Al Viro <[email protected]>
commit d4690f1e1cdabb4d61207b6787b1605a0dc0aeab upstream.
... by turning it into what used to be multipages counterpart
--- include/linux/uio.h | 2 +- lib/iov_iter.c | 24 ++---------------------- 2 files changed, 3 insertions(+), 23 deletions(-)
include/linux/uio.h +1 -1
@@ -76,7 +76,7 @@ size_t iov_iter_copy_from_user_atomic(st struct iov_iter *i, unsigned long offset, size_t bytes);void iov_iter_advance (struct iov_iter *i,size_t bytes);int iov_iter_fault_in_readable (struct iov_iter *i,size_t bytes); -int iov_iter_fault_in_multipages_readable (struct iov_iter *i,size_t bytes); +#define iov_iter_fault_in_multipages_readable iov_iter_fault_in_readablesize_t iov_iter_single_seg_count (const struct iov_iter *i);size_t copy_page_to_iter (struct page *page,size_t offset,size_t bytes,struct iov_iter *i);
lib/iov_iter.c +2 -22
@@ -298,33 +298,13 @@ done: }/* -* Fault in the first iovec of the given iov_iter, to a maximum length -* of bytes. Returns 0 on success, or non-zero if the memory could not be -* accessed (ie. because it is an invalid address). -* -* writev-intensive code may want this to prefault several iovecs -- that -* would be possible (callers must not rely on the fact that _only_ the -* first iovec will be faulted with the current implementation). -*/ -int iov_iter_fault_in_readable (struct iov_iter *i,size_t bytes) -{ -if (!(i->type & (ITER_BVEC |ITER_KVEC ))) { -char __user *buf = i->iov->iov_base + i->iov_offset; - bytes =min (bytes, i->iov->iov_len - i->iov_offset); -return fault_in_pages_readable (buf, bytes); - } -return 0 ; -} -EXPORT_SYMBOL (iov_iter_fault_in_readable); - -/* * Fault in one or more iovecs of the given iov_iter, to a maximum length of * bytes. For each iovec, fault in each page that constitutes the iovec. * * Return 0 on success, or non-zero if the memory could not be accessed (i.e. * because it is an invalid address). */ -int iov_iter_fault_in_multipages_readable (struct iov_iter *i,size_t bytes) +int iov_iter_fault_in_readable (struct iov_iter *i,size_t bytes) {size_t skip = i->iov_offset;const struct iovec *iov;
@@ -341,7 +321,7 @@ int iov_iter_fault_in_multipages_readabl }return 0 ; } -EXPORT_SYMBOL (iov_iter_fault_in_multipages_readable); +EXPORT_SYMBOL (iov_iter_fault_in_readable); void iov_iter_init(struct iov_iter *i, int direction, const struct iovec *iov, unsigned long nr_segs,
Greg Kroah-Hartman
maintainerPATCH 80/118 pinctrl: at91-pio4: use %pr format string for resource
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit 32844138e31347fc0f61d3bf2d7b9c4583f189e3 upstream.
resource_size_t may be defined as 32 or 64 bit depending on configuration, so it cannot be printed using the normal format strings, as gcc correctly warns:
pinctrl-at91-pio4.c: In function 'atmel_pinctrl_probe':
pinctrl-at91-pio4.c:1003:41: warning: format '%u' expects argument of type 'unsigned int', but argument 5 has type 'resource_size_t {aka long long unsigned int}' [-Wformat=]
dev_dbg(dev, "bank %i: hwirq=%u\n", i, res->start);
This changes the format string to use the special "%pr" format string that prints a resource, and changes the arguments so we the resource structure directly.
--- drivers/pinctrl/pinctrl-at91-pio4.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/pinctrl/pinctrl-at91-pio4.c +1 -1
@@ -1002,7 +1002,7 @@ static int atmel_pinctrl_probe(struct pl atmel_pioctrl->irqs[i] = res->start;irq_set_chained_handler (res->start, atmel_gpio_irq_handler);irq_set_handler_data (res->start, atmel_pioctrl); -dev_dbg (dev,"bank %i: hwirq=%u\n" , i, res->start); +dev_dbg (dev,"bank %i: irq=%pr\n" , i, res); } atmel_pioctrl->irq_domain = irq_domain_add_linear(dev->of_node,
Greg Kroah-Hartman
maintainerPATCH 35/118 iio: fix pressure data output unit in hid-sensor-attributes
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kweh, Hock Leong <[email protected]>
commit 36afb176d3c9580651d7f410ed7f000ec48b5137 upstream.
According to IIO ABI definition, IIO_PRESSURE data output unit is kilopascal:
http://lxr.free-electrons.com/source/Documentation/ABI/testing/sysfs-bus-iio
This patch fix output unit of HID pressure sensor IIO driver from pascal to kilopascal to follow IIO ABI definition.
--- drivers/iio/common/hid-sensors/hid-sensor-attributes.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/iio/common/hid-sensors/hid-sensor-attributes.c +2 -2
@@ -56,8 +56,8 @@ static struct { {HID_USAGE_SENSOR_ALS, 0, 1, 0}, {HID_USAGE_SENSOR_ALS, HID_USAGE_SENSOR_UNITS_LUX, 1, 0}, - {HID_USAGE_SENSOR_PRESSURE, 0, 100000, 0}, - {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 1, 0}, + {HID_USAGE_SENSOR_PRESSURE, 0, 100, 0}, + {HID_USAGE_SENSOR_PRESSURE, HID_USAGE_SENSOR_UNITS_PASCAL, 0, 1000}, };static int pow_10 (unsigned power)
Greg Kroah-Hartman
maintainerPATCH 6/118 fscrypto: require write access to mount to set encryption policy
In reply to Greg Kroah-Hartman4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Biggers <[email protected]>
commit ba63f23d69a3a10e7e527a02702023da68ef8a6d upstream.
Since setting an encryption policy requires writing metadata to the filesystem, it should be guarded by mnt_want_write/mnt_drop_write. Otherwise, a user could cause a write to a frozen or readonly filesystem. This was handled correctly by f2fs but not by ext4. Make fscrypt_process_policy() handle it rather than relying on the filesystem to get it right.
--- fs/ext4/ioctl.c | 6 ++++++ 1 file changed, 6 insertions(+)
fs/ext4/ioctl.c +6 -0
@@ -629,7 +629,13 @@ resizefs_out: goto encryption_policy_out; } + err =mnt_want_write_file (filp); +if (err) + goto encryption_policy_out; + err =ext4_process_policy (&policy, inode); + +mnt_drop_write_file (filp); encryption_policy_out:return err;#else
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Greg,
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Holger
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Sep 24 17:29:17 UTC 2016. Anything received after that time might be too late.
Build results:
total: 149 pass: 136 fail: 13 Failed builds: avr32:defconfig avr32:allnoconfig avr32:merisc_defconfig avr32:atngw100mkii_evklcd101_defconfig powerpc:defconfig powerpc:allmodconfig powerpc:allnoconfig powerpc:ppc6xx_defconfig powerpc:mpc83xx_defconfig powerpc:tqm8xx_defconfig powerpc:85xx/sbc8548_defconfig powerpc:83xx/mpc834x_mds_defconfig powerpc:86xx/sbc8641d_defconfig
Qemu test results:
total: 101 pass: 90 fail: 11 Failed tests: openrisc:or1ksim_defconfig powerpc:mac99:nosmp:ppc_book3s_defconfig powerpc:g3beige:nosmp:ppc_book3s_defconfig powerpc:mac99:smp:ppc_book3s_defconfig powerpc:virtex-ml507:44x/virtex5_defconfig powerpc:mpc8548cds:85xx/mpc85xx_cds_defconfig powerpc:mpc8548cds:smpdev:85xx/mpc85xx_cds_defconfig powerpc:bamboo:44x/bamboo_defconfig powerpc:mac99:ppc64_book3s_defconfig:nosmp powerpc:mac99:ppc64_book3s_defconfig:smp4 powerpc:pseries:pseries_defconfig
Build errors:
avr32:
arch/avr32/kernel/built-in.o: In function `arch_ptrace':
(.text+0x810): undefined reference to ___copy_from_user' arch/avr32/kernel/built-in.o:(___ksymtab+___copy_from_user+0x0): undefined reference to ___copy_from_user'kernel/built-in.o: In function `devm_request_resource':
(.text+0x52c8): undefined reference to ___copy_from_user' kernel/built-in.o: In function proc_do_large_bitmap':
(.text+0x588c): undefined reference to ___copy_from_user' kernel/built-in.o: In function proc_dostring':
(.text+0x5b20): undefined reference to ___copy_from_user' kernel/built-in.o:sysctl.c:(.text+0x6088): more undefined references to ___copy_from_user' follow
Hmm .. I've seen that before. Looks like a missing commit from upstream. I'll check later tonight.
---
powerpc:
drivers/misc/cxl/vphb.c:263:9: error: 'pcibios_free_controller_deferred' undeclared
arch/powerpc/include/asm/uaccess.h: In function 'copy_from_user':arch/powerpc/include/asm/uaccess.h:328:1: error: wrong type argument to unary plus
+ memset(to, 0, n);
I'll have to look into those.
---
runtime:
qemu openrisc crashes with a NULL pointer dereference. There is no backtrace; I'll have to bisect.
qemu ppc all fail to build with "drivers/misc/cxl/vphb.c:263:9: error:
'pcibios_free_controller_deferred' undeclared".
Details are available at http://kerneltests.org/builders.
Guenter
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Sep 24 17:29:17 UTC 2016. Anything received after that time might be too late.
avr32:
upstream patch 65c0044ca8d7 ("avr32: fix 'undefined reference to `___copy_from_user'")
is needed in both v4.4 and v4.7 to fix the build problem.
ppc:
5b675d932899 ("ppc32: fix copy_from_user()")
is corrupt in both v4.4 and v4.7.
e5767a13d7cb ("cxl: use pcibios_free_controller_deferred() when removing vPHBs")
does not apply to v4.4 nor to v4.7 (and isn't marked stable ???).
openrisc:
upstream patch 8e4b72054f55 ("openrisc: fix the fix of copy_from_user()")
is needed in both v4.4 and v4.7 to fix the runtime problem.
Guenter
Greg Kroah-Hartman
maintainerQuoted 4 lines · Guenter Roeck
ppc:
5b675d932899("ppc32: fixcopy_from_user()")
is corrupt in both v4.4 and v4.7.
Ugh, my fault, now fixed up.
greg k-h
Greg Kroah-Hartman
maintainerQuoted 2 lines · Guenter Roeck
e5767a13d7cb("cxl: usepcibios_free_controller_deferred()when removing vPHBs")
does not apply to v4.4 nor to v4.7 (and isn't marked stable ???).
I don't understand what you mean here. It did apply, and it was marked for stable inclusion. It is commit 6f38a8b9a45833495dc878c335c5431cd98a16ed in Linus's tree. Does it break the build?
thanks,
greg k-h
Greg Kroah-Hartman
maintainerQuoted 6 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Quoted 3 lines
Responses should be made by Sat Sep 24 17:29:17 UTC 2016. Anything received after that time might be too late.
avr32:
upstream patch
65c0044ca8d7("avr32: fix 'undefined reference to `___copy_from_user'")
is needed in both v4.4 and v4.7 to fix the build problem.
Now applied, thanks.
greg k-h
Greg Kroah-Hartman
maintainerQuoted 6 lines · Guenter Roeck
Quoted 5 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Quoted 8 lines
Quoted 3 lines
Responses should be made by Sat Sep 24 17:29:17 UTC 2016. Anything received after that time might be too late.
openrisc:
upstream patch
8e4b72054f55("openrisc: fix the fix ofcopy_from_user()")
is needed in both v4.4 and v4.7 to fix the runtime problem.
Now applied.
So, I think we should have fixed all of the build issues, but I do still have that question for you about the cxl driver that I don't understand.
thanks,
greg k-h
Greg Kroah-Hartman
maintainerQuoted 11 lines · Holger Hoffst�tte
Quoted 4 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Greg,
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Really? I just put them there as I was pondering applying them, waiting for the network maintainer to send me some more patches, or not. They aren't all correct, and are missing some patches, I just haven't gotten the chance to do the work yet.
Why do you think they should go into this release?
thanks,
greg k-h
Quoted 7 lines · Greg Kroah-Hartman
Quoted 3 lines · Holger Hoffstätte
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Really? I just put them there as I was pondering applying them, waiting for the network maintainer to send me some more patches, or not. They
Ahh..alright then.
Quoted 1 line
Why do you think they should go into this release?
Never mind - they are not really urgent. I just had most of them merged locally already and was just wondering.
thanks.
Holger
Greg Kroah-Hartman
maintainerQuoted 9 lines · Holger Hoffst�tte
Quoted 7 lines · Greg Kroah-Hartman
Quoted 3 lines · Holger Hoffst�tte
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Really? I just put them there as I was pondering applying them, waiting for the network maintainer to send me some more patches, or not. They
Quoted 6 lines
Ahh..alright then.
Quoted 1 line
Why do you think they should go into this release?
Never mind - they are not really urgent. I just had most of them merged locally already and was just wondering.
If you have them merged, and tested, mind sending them to me with your tested-by mark on them? That way I know they work and can focus on the ones that will require backporting effort.
thanks,
greg k-h
Holger Hoffstätte
Acked-by Alexander Duyck Tested-by Acked-by Martin KaFai Lau Tested-by Acked-by Dmitry Adamushko Reviewed-by Acked-by Neal Cardwell Reviewed-by Cong Wang Tested-by Acked-by Yuchung Cheng Acked-by Neal Cardwell Tested-by(trimmed To:)
Quoted 12 lines · Greg Kroah-Hartman
Quoted 11 lines · Holger Hoffstätte
Quoted 7 lines · Greg Kroah-Hartman
Quoted 3 lines · Holger Hoffstätte
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Really? I just put them there as I was pondering applying them, waiting for the network maintainer to send me some more patches, or not. They
Ahh..alright then.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
Why do you think they should go into this release?
Never mind - they are not really urgent. I just had most of them merged locally already and was just wondering.
If you have them merged, and tested, mind sending them to me with your tested-by mark on them? That way I know they work and can focus on the ones that will require backporting effort.
Attached. All with Tested-By are working and have done so for some time without issue (mixed ipv4/6 network in various functions).
ipv6-addrconf-fix-dev-refcont-leak-when-dad-failed:
seems to be already applied from a previous series, not sure which.
tcp-cwnd-does-not-increase-in-tcp-yeah:
For this I can only offer a Reviewed-by: since I cannot test it, but I did check that the code does what the comment says, and it merges/compiles cleanly.
Hope this helps.
Holger
Quoted 1 line
From foo@baz Wed Sep 21 12:45:10 CEST 2016
From: David Forster <[email protected]>
Date: Wed, 3 Aug 2016 15:13:01 +0100
Subject: ipv4: panic in leaf_walk_rcu due to stale node pointer
From: David Forster <[email protected]>
[ Upstream commit 94d9f1c5906b20053efe375b6d66610bca4b8b64 ]
Panic occurs when issuing "cat /proc/net/route" whilst populating FIB with > 1M routes.
Use of cached node pointer in fib_route_get_idx is unsafe.
BUG: unable to handle kernel paging request at ffffc90001630024 IP: [<ffffffff814cf6a0>] leaf_walk_rcu+0x10/0xe0 PGD 11b08d067 PUD 11b08e067 PMD dac4b067 PTE 0 Oops: 0000 [#1] SMP Modules linked in: nfsd auth_rpcgss oid_registry nfs_acl nfs lockd grace fscac snd_hda_codec_generic snd_hda_intel snd_hda_codec snd_hda_core snd_hwdep virti acpi_cpufreq button parport_pc ppdev lp parport autofs4 ext4 crc16 mbcache jbd tio_ring virtio floppy uhci_hcd ehci_hcd usbcore usb_common libata scsi_mod CPU: 1 PID: 785 Comm: cat Not tainted 4.2.0-rc8+ #4 Hardware name: Bochs Bochs, BIOS Bochs 01/01/2007 task: ffff8800da1c0bc0 ti: ffff88011a05c000 task.ti: ffff88011a05c000 RIP: 0010:[<ffffffff814cf6a0>] [<ffffffff814cf6a0>] leaf_walk_rcu+0x10/0xe0 RSP: 0018:ffff88011a05fda0 EFLAGS: 00010202 RAX: ffff8800d8a40c00 RBX: ffff8800da4af940 RCX: ffff88011a05ff20 RDX: ffffc90001630020 RSI: 0000000001013531 RDI: ffff8800da4af950 RBP: 0000000000000000 R08: ffff8800da1f9a00 R09: 0000000000000000 R10: ffff8800db45b7e4 R11: 0000000000000246 R12: ffff8800da4af950 R13: ffff8800d97a74c0 R14: 0000000000000000 R15: ffff8800d97a7480 FS: 00007fd3970e0700(0000) GS:ffff88011fd00000(0000) knlGS:0000000000000000 CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b CR2: ffffc90001630024 CR3: 000000011a7e4000 CR4: 00000000000006e0 Stack: ffffffff814d00d3 0000000000000000 ffff88011a05ff20 ffff8800da1f9a00 ffffffff811dd8b9 0000000000000800 0000000000020000 00007fd396f35000 ffffffff811f8714 0000000000003431 ffffffff8138dce0 0000000000000f80 Call Trace: [<ffffffff814d00d3>] ? fib_route_seq_start+0x93/0xc0 [<ffffffff811dd8b9>] ? seq_read+0x149/0x380 [<ffffffff811f8714>] ? fsnotify+0x3b4/0x500 [<ffffffff8138dce0>] ? process_echoes+0x70/0x70 [<ffffffff8121cfa7>] ? proc_reg_read+0x47/0x70 [<ffffffff811bb823>] ? __vfs_read+0x23/0xd0 [<ffffffff811bbd42>] ? rw_verify_area+0x52/0xf0 [<ffffffff811bbe61>] ? vfs_read+0x81/0x120 [<ffffffff811bcbc2>] ? SyS_read+0x42/0xa0 [<ffffffff81549ab2>] ? entry_SYSCALL_64_fastpath+0x16/0x75 Code: 48 85 c0 75 d8 f3 c3 31 c0 c3 f3 c3 66 66 66 66 66 66 2e 0f 1f 84 00 00
a 04 89 f0 33 02 44 89 c9 48 d3 e8 0f b6 4a 05 49 89
RIP [<ffffffff814cf6a0>] leaf_walk_rcu+0x10/0xe0
RSP <ffff88011a05fda0>
CR2: ffffc90001630024
--- net/ipv4/fib_trie.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-)
net/ipv4/fib_trie.c +2 -6
@@ -2453,9 +2453,7 @@ struct fib_route_iter {static struct key_vector *fib_route_get_idx (struct fib_route_iter *iter,loff_t pos) { -struct fib_table *tb = iter->main_tb;struct key_vector *l, **tp = &iter->tnode; -struct trie *t;t_key key;/* use cache location of next-to-find key */
@@ -2463,8 +2461,6 @@ static struct key_vector *fib_route_get_ pos -= iter->pos; key = iter->key; }else { - t = (struct trie *)tb->tb_data; - iter->tnode = t->kv; iter->pos =0 ; key =0 ; }
@@ -2505,12 +2501,12 @@ static void *fib_route_seq_start(structreturn NULL ; iter->main_tb = tb; + t = (struct trie *)tb->tb_data; + iter->tnode = t->kv;if (*pos !=0 )return fib_route_get_idx (iter, *pos); - t = (struct trie *)tb->tb_data; - iter->tnode = t->kv; iter->pos =0 ; iter->key =0 ;
Quoted 1 line
From foo@baz Wed Sep 21 12:45:10 CEST 2016
From: Dave Jones <[email protected]>
Date: Fri, 2 Sep 2016 14:39:50 -0400
Subject: ipv6: release dst in ping_v6_sendmsg
From: Dave Jones <[email protected]>
[ Upstream commit 03c2778a938aaba0893f6d6cdc29511d91a79848 ]
Neither the failure or success paths of ping_v6_sendmsg release the dst it acquires. This leads to a flood of warnings from "net/core/dst.c:288 dst_release" on older kernels that don't have 8bf4ada2e21378816b28205427ee6b0e1ca4c5f1 backported.
That patch optimistically hoped this had been fixed post 3.10, but it seems at least one case wasn't, where I've seen this triggered a lot from machines doing unprivileged icmp sockets.
--- net/ipv6/ping.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-)
net/ipv6/ping.c +7 -2
@@ -150,8 +150,10 @@ int ping_v6_sendmsg(struct sock *sk, str rt = (struct rt6_info *) dst; np =inet6_sk (sk); -if (!np) -return -EBADF ; +if (!np) { + err = -EBADF ; + goto dst_err_out; + }if (!fl6.flowi6_oif &&ipv6_addr_is_multicast (&fl6.daddr)) fl6.flowi6_oif = np->mcast_oif;
@@ -186,6 +188,9 @@ int ping_v6_sendmsg(struct sock *sk, str }release_sock (sk); +dst_err_out: +dst_release (dst); +if (err)return err;
Quoted 1 line
From foo@baz Wed Sep 21 12:45:10 CEST 2016
From: Artem Germanov <[email protected]>
Date: Wed, 7 Sep 2016 10:49:36 -0700
Subject: tcp: cwnd does not increase in TCP YeAH
From: Artem Germanov <[email protected]>
[ Upstream commit db7196a0d0984b933ccf2cd6a60e26abf466e8a3 ]
Commit 76174004a0f19785a328f40388e87e982bbf69b9
(tcp: do not slow start when cwnd equals ssthresh ) introduced regression in TCP YeAH. Using 100ms delay 1% loss virtual ethernet link kernel 4.2 shows bandwidth ~500KB/s for single TCP connection and kernel 4.3 and above (including 4.8-rc4) shows bandwidth ~100KB/s.
That is caused by stalled cwnd when cwnd equals ssthresh. This patch
fixes it by proper increasing cwnd in this case.
--- net/ipv4/tcp_yeah.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/ipv4/tcp_yeah.c +1 -1
@@ -75,7 +75,7 @@ static void tcp_yeah_cong_avoid(struct sif (!tcp_is_cwnd_limited (sk))return ; -if (tp->snd_cwnd <= tp->snd_ssthresh) +if (tcp_in_slow_start (tp))tcp_slow_start (tp, acked);else if (!yeah->doing_reno_now) {
Quoted 1 line
From foo@baz Wed Sep 21 12:45:10 CEST 2016
From: Eric Dumazet <[email protected]>
Date: Wed, 17 Aug 2016 05:56:26 -0700
Subject: tcp: fix use after free in tcp_xmit_retransmit_queue()
From: Eric Dumazet <[email protected]>
[ Upstream commit bb1fceca22492109be12640d49f5ea5a544c6bb4 ]
When tcp_sendmsg() allocates a fresh and empty skb, it puts it at the tail of the write queue using tcp_add_write_queue_tail()
Then it attempts to copy user data into this fresh skb.
If the copy fails, we undo the work and remove the fresh skb.
Unfortunately, this undo lacks the change done to tp->highest_sack and we can leave a dangling pointer (to a freed skb)
Later, tcp_xmit_retransmit_queue() can dereference this pointer and access freed memory. For regular kernels where memory is not unmapped, this might cause SACK bugs because tcp_highest_sack_seq() is buggy, returning garbage instead of tp->snd_nxt, but with various debug features like CONFIG_DEBUG_PAGEALLOC, this can crash the kernel.
This bug was found by Marco Grassi thanks to syzkaller.
--- include/net/tcp.h | 2 ++ 1 file changed, 2 insertions(+)
include/net/tcp.h +2 -0
@@ -1510,6 +1510,8 @@ static inline void tcp_check_send_head(s {if (sk->sk_send_head == skb_unlinked) sk->sk_send_head =NULL ; +if (tcp_sk (sk)->highest_sack == skb_unlinked) +tcp_sk (sk)->highest_sack =NULL ; }static inline void tcp_init_send_head (struct sock *sk)
Quoted 1 line
From foo@baz Wed Sep 21 12:45:10 CEST 2016
From: Eric Dumazet <[email protected]>
Date: Mon, 22 Aug 2016 11:31:10 -0700
Subject: tcp: properly scale window in tcp_v[46]_reqsk_send_ack()
From: Eric Dumazet <[email protected]>
[ Upstream commit 20a2b49fc538540819a0c552877086548cff8d8d ]
When sending an ack in SYN_RECV state, we must scale the offered window if wscale option was negotiated and accepted.
Tested:
Following packetdrill test demonstrates the issue :
0.000 socket(..., SOCK_STREAM, IPPROTO_TCP) = 3 +0 setsockopt(3, SOL_SOCKET, SO_REUSEADDR, [1], 4) = 0
+0 bind(3, ..., ...) = 0
+0 listen(3, 1) = 0
// Establish a connection.
+0 < S 0:0(0) win 20000 <mss 1000,sackOK,wscale 7, nop, TS val 100 ecr 0> +0 > S. 0:0(0) ack 1 win 28960 <mss 1460,sackOK, TS val 100 ecr 100, nop, wscale 7>
+0 < . 1:11(10) ack 1 win 156 <nop,nop,TS val 99 ecr 100> // check that window is properly scaled !
+0 > . 1:1(0) ack 1 win 226 <nop,nop,TS val 200 ecr 100>
--- net/ipv4/tcp_ipv4.c | 8 +++++++- net/ipv6/tcp_ipv6.c | 8 +++++++- 2 files changed, 14 insertions(+), 2 deletions(-)
net/ipv4/tcp_ipv4.c +7 -1
@@ -808,8 +808,14 @@ static void tcp_v4_reqsk_send_ack(constu32 seq = (sk->sk_state ==TCP_LISTEN ) ?tcp_rsk (req)->snt_isn +1 :tcp_sk (sk)->snd_nxt; +/* RFC 7323 2.3 +* The window field (SEG.WND) of every outgoing segment, with the +* exception of <SYN> segments, MUST be right-shifted by +* Rcv.Wind.Shift bits: +*/ tcp_v4_send_ack(sock_net(sk), skb, seq, - tcp_rsk(req)->rcv_nxt, req->rsk_rcv_wnd, + tcp_rsk(req)->rcv_nxt, + req->rsk_rcv_wnd >> inet_rsk(req)->rcv_wscale, tcp_time_stamp, req->ts_recent, 0,
net/ipv6/tcp_ipv6.c +7 -1
@@ -932,9 +932,15 @@ static void tcp_v6_reqsk_send_ack(const/* sk->sk_state == TCP_LISTEN -> for regular TCP_SYN_RECV * sk->sk_state == TCP_SYN_RECV -> for Fast Open. */ +/* RFC 7323 2.3 +* The window field (SEG.WND) of every outgoing segment, with the +* exception of <SYN> segments, MUST be right-shifted by +* Rcv.Wind.Shift bits: +*/ tcp_v6_send_ack (sk, skb, (sk->sk_state ==TCP_LISTEN ) ?tcp_rsk (req)->snt_isn +1 :tcp_sk (sk)->snd_nxt, -tcp_rsk (req)->rcv_nxt, req->rsk_rcv_wnd, +tcp_rsk (req)->rcv_nxt, + req->rsk_rcv_wnd >>inet_rsk (req)->rcv_wscale, tcp_time_stamp, req->ts_recent, sk->sk_bound_dev_if,tcp_v6_md5_do_lookup (sk, &ipv6_hdr (skb)->daddr),0 ,0 );
Quoted 9 lines · Greg Kroah-Hartman
Quoted 2 lines · Guenter Roeck
e5767a13d7cb("cxl: usepcibios_free_controller_deferred()when removing vPHBs")
does not apply to v4.4 nor to v4.7 (and isn't marked stable ???).I don't understand what you mean here. It did apply, and it was marked for stable inclusion. It is commit
6f38a8b9a45833495dc878c335c5431cd98a16edin Linus's tree. Does it break the build?
drivers/misc/cxl/vphb.c: In function 'cxl_pci_vphb_add':drivers/misc/cxl/vphb.c:263:9: error: 'pcibios_free_controller_deferred' undeclared
Yes, it does break the build, by calling a function which does not exist in 4.4 or 4.7.
Sorry, the Cc: stable was dropped in the 4.4/4.7 versions, so I didn't see it. I meant to say "it doesn't build".
You will either have to drop e5767a13d7cb. or you'll also need commit 2dd9c11b9d4 ("powerpc/pseries: use pci_host_bridge.release_fn() to kfree(phb)") from upstream. I didn't check though if that applies (or works) with the older kernels.
Guenter
Greg Kroah-Hartman
maintainerQuoted 14 lines · Guenter Roeck
Quoted 9 lines · Greg Kroah-Hartman
Quoted 2 lines · Guenter Roeck
e5767a13d7cb("cxl: usepcibios_free_controller_deferred()when removing vPHBs")
does not apply to v4.4 nor to v4.7 (and isn't marked stable ???).I don't understand what you mean here. It did apply, and it was marked for stable inclusion. It is commit
6f38a8b9a45833495dc878c335c5431cd98a16edin Linus's tree. Does it break the build?
drivers/misc/cxl/vphb.c: In function 'cxl_pci_vphb_add':drivers/misc/cxl/vphb.c:263:9: error: 'pcibios_free_controller_deferred' undeclared
Quoted 8 lines
Yes, it does break the build, by calling a function which does not exist in 4.4 or 4.7.
Sorry, the Cc: stable was dropped in the 4.4/4.7 versions, so I didn't see it. I meant to say "it doesn't build".
You will either have to drop
e5767a13d7cb. or you'll also need commit2dd9c11b9d4("powerpc/pseries: usepci_host_bridge.release_fn()to kfree(phb)") from upstream. I didn't check though if that applies (or works) with the older kernels.
I'm going to drop it, thanks for pointing this out, I should have caught it earlier too...
greg k-h
Greg Kroah-Hartman
maintainerQuoted 30 lines · Holger Hoffst�tte
(trimmed To:)
Quoted 12 lines · Greg Kroah-Hartman
Quoted 11 lines · Holger Hoffst�tte
Quoted 7 lines · Greg Kroah-Hartman
Quoted 3 lines · Holger Hoffst�tte
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Really? I just put them there as I was pondering applying them, waiting for the network maintainer to send me some more patches, or not. They
Ahh..alright then.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
Why do you think they should go into this release?
Never mind - they are not really urgent. I just had most of them merged locally already and was just wondering.
If you have them merged, and tested, mind sending them to me with your tested-by mark on them? That way I know they work and can focus on the ones that will require backporting effort.
Attached. All with Tested-By are working and have done so for some time without issue (mixed ipv4/6 network in various functions).
ipv6-addrconf-fix-dev-refcont-leak-when-dad-failed:
seems to be already applied from a previous series, not sure which.
Quoted 6 lines
tcp-cwnd-does-not-increase-in-tcp-yeah:
For this I can only offer a Reviewed-by: since I cannot test it, but I did check that the code does what the comment says, and it merges/compiles cleanly.Hope this helps.
It does, I'll queue these up for the next round, many thanks.
greg k-h
Greg Kroah-Hartman
maintainerQuoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Guenter Roeck
Quoted 9 lines · Greg Kroah-Hartman
Quoted 2 lines · Guenter Roeck
e5767a13d7cb("cxl: usepcibios_free_controller_deferred()when removing vPHBs")
does not apply to v4.4 nor to v4.7 (and isn't marked stable ???).I don't understand what you mean here. It did apply, and it was marked for stable inclusion. It is commit
6f38a8b9a45833495dc878c335c5431cd98a16edin Linus's tree. Does it break the build?
drivers/misc/cxl/vphb.c: In function 'cxl_pci_vphb_add':drivers/misc/cxl/vphb.c:263:9: error: 'pcibios_free_controller_deferred' undeclaredYes, it does break the build, by calling a function which does not exist in 4.4 or 4.7.
Sorry, the Cc: stable was dropped in the 4.4/4.7 versions, so I didn't see it. I meant to say "it doesn't build".
Quoted 6 lines
Quoted 3 lines
You will either have to drop
e5767a13d7cb. or you'll also need commit2dd9c11b9d4("powerpc/pseries: usepci_host_bridge.release_fn()to kfree(phb)") from upstream. I didn't check though if that applies (or works) with the older kernels.I'm going to drop it, thanks for pointing this out, I should have caught it earlier too...
Should be removed, hopefully all will build properly...
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 4.4.22 release. There are 118 patches in this series, all will be posted as a response to this one. If anyone has any issues with these being applied, please let me know.
Responses should be made by Sat Sep 24 17:29:17 UTC 2016. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
kernel.org/pub/linux/kernel/v4.x/stable-review/patch-4.4.22-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-4.4.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Signature · 5 lines
Shuah Khan Sr. Linux Kernel Developer Open Source Innovation Group Samsung Research America(Silicon Valley) [email protected]
Greg Kroah-Hartman
maintainerQuoted 31 lines · Greg Kroah-Hartman
Quoted 30 lines · Holger Hoffst�tte
(trimmed To:)
Quoted 12 lines · Greg Kroah-Hartman
Quoted 11 lines · Holger Hoffst�tte
Quoted 7 lines · Greg Kroah-Hartman
Quoted 3 lines · Holger Hoffst�tte
did you forget to add the -net patches in stable-queue.git/tree/net-4.4 or are they on hold for some reason? I think they were supposed to go into .22.
Really? I just put them there as I was pondering applying them, waiting for the network maintainer to send me some more patches, or not. They
Ahh..alright then.
Quoted 8 lines
Quoted 4 lines
Quoted 1 line
Why do you think they should go into this release?
Never mind - they are not really urgent. I just had most of them merged locally already and was just wondering.
If you have them merged, and tested, mind sending them to me with your tested-by mark on them? That way I know they work and can focus on the ones that will require backporting effort.
Attached. All with Tested-By are working and have done so for some time without issue (mixed ipv4/6 network in various functions).
ipv6-addrconf-fix-dev-refcont-leak-when-dad-failed:
seems to be already applied from a previous series, not sure which.
Quoted 8 lines
Quoted 6 lines
tcp-cwnd-does-not-increase-in-tcp-yeah:
For this I can only offer a Reviewed-by: since I cannot test it, but I did check that the code does what the comment says, and it merges/compiles cleanly.Hope this helps.
It does, I'll queue these up for the next round, many thanks.
Now all applied, thanks again!
greg k-h
Re: [PATCH 4.4 048/118] cpuset: make sure new tasks conform to the current config of the cpuset
In reply to Greg Kroah-HartmanQuoted 25 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zefan Li <[email protected]>
commit
06f4e94898918bcad00cdd4d349313a439d6911eupstream.A new task inherits
cpus_allowedandmems_allowedmasks from its parent, but if someone changes cpuset's config by writing to cpuset.cpus/cpuset.mems before this new task is inserted into the cgroup's task list, the new task won't be updated accordingly.Signed-off-by Zefan Li <[email protected]>Signed-off-by Tejun Heo <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- kernel/cpuset.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
kernel/cpuset.c static void cpuset_bind(struct cgroup_su · line 2082
Quoted 9 lines
kernel/cpuset.c +6
-0@@ -2074,6 +2074,20 @@ static void cpuset_bind(struct cgroup_sumutex_unlock (&cpuset_mutex); } +/* +* Make sure the new task conform to the current state of its parent, +* which could have been changed by cpuset just after it inherits the +* state from the parent and before it sits on the cgroup's task list. +*/ +void cpuset_fork (struct task_struct *task)
This causes a build warning:
kernel/cpuset.c:2101:2: warning: (near initialization for 'cpuset_cgrp_subsys.fork') [enabled by default] .fork = cpuset_fork,
^
where fork op in 4.4 kernel has still priv argument that was dropped recently.
Takashi
Greg Kroah-Hartman
maintainerRe: [PATCH 4.4 048/118] cpuset: make sure new tasks conform to the current config of the cpuset
Quoted 39 lines · Takashi Iwai
Quoted 25 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zefan Li <[email protected]>
commit
06f4e94898918bcad00cdd4d349313a439d6911eupstream.A new task inherits
cpus_allowedandmems_allowedmasks from its parent, but if someone changes cpuset's config by writing to cpuset.cpus/cpuset.mems before this new task is inserted into the cgroup's task list, the new task won't be updated accordingly.Signed-off-by Zefan Li <[email protected]>Signed-off-by Tejun Heo <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- kernel/cpuset.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)kernel/cpuset.c static void cpuset_bind(struct cgroup_su · line 2082
Quoted 9 lines
kernel/cpuset.c +6
-0@@ -2074,6 +2074,20 @@ static void cpuset_bind(struct cgroup_sumutex_unlock (&cpuset_mutex); } +/* +* Make sure the new task conform to the current state of its parent, +* which could have been changed by cpuset just after it inherits the +* state from the parent and before it sits on the cgroup's task list. +*/ +void cpuset_fork (struct task_struct *task)This causes a build warning:
Quoted 6 lines
kernel/cpuset.c:2101:2: warning: (near initialization for 'cpuset_cgrp_subsys.fork') [enabled by default] .fork =cpuset_fork,
^where fork op in 4.4 kernel has still priv argument that was dropped recently.
Thanks, I have a patch in my tree already for this and it will show up in the next release.
greg k-h
Re: [PATCH 4.4 048/118] cpuset: make sure new tasks conform to the current config of the cpuset
Quoted 45 lines · Greg Kroah-Hartman
Quoted 43 lines · Takashi Iwai
Quoted 25 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Zefan Li <[email protected]>
commit
06f4e94898918bcad00cdd4d349313a439d6911eupstream.A new task inherits
cpus_allowedandmems_allowedmasks from its parent, but if someone changes cpuset's config by writing to cpuset.cpus/cpuset.mems before this new task is inserted into the cgroup's task list, the new task won't be updated accordingly.Signed-off-by Zefan Li <[email protected]>Signed-off-by Tejun Heo <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- kernel/cpuset.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)kernel/cpuset.c static void cpuset_bind(struct cgroup_su · line 2082
Quoted 9 lines
kernel/cpuset.c +6
-0@@ -2074,6 +2074,20 @@ static void cpuset_bind(struct cgroup_sumutex_unlock (&cpuset_mutex); } +/* +* Make sure the new task conform to the current state of its parent, +* which could have been changed by cpuset just after it inherits the +* state from the parent and before it sits on the cgroup's task list. +*/ +void cpuset_fork (struct task_struct *task)This causes a build warning:
kernel/cpuset.c:2101:2: warning: (near initialization for 'cpuset_cgrp_subsys.fork') [enabled by default] .fork =cpuset_fork,
^
Quoted 5 lines
Quoted 2 lines
where fork op in 4.4 kernel has still priv argument that was dropped recently.
Thanks, I have a patch in my tree already for this and it will show up in the next release.
Great, thanks!
Takashi
Quoted 21 lines · Greg Kroah-Hartman
Quoted 20 lines · Greg Kroah-Hartman
Quoted 19 lines · Guenter Roeck
Quoted 9 lines · Greg Kroah-Hartman
Quoted 2 lines · Guenter Roeck
e5767a13d7cb("cxl: usepcibios_free_controller_deferred()when removing vPHBs")
does not apply to v4.4 nor to v4.7 (and isn't marked stable ???).I don't understand what you mean here. It did apply, and it was marked for stable inclusion. It is commit
6f38a8b9a45833495dc878c335c5431cd98a16edin Linus's tree. Does it break the build?
drivers/misc/cxl/vphb.c: In function 'cxl_pci_vphb_add':drivers/misc/cxl/vphb.c:263:9: error: 'pcibios_free_controller_deferred' undeclaredYes, it does break the build, by calling a function which does not exist in 4.4 or 4.7.
Sorry, the Cc: stable was dropped in the 4.4/4.7 versions, so I didn't see it. I meant to say "it doesn't build".
Quoted 9 lines
Quoted 6 lines
Quoted 3 lines
You will either have to drop
e5767a13d7cb. or you'll also need commit2dd9c11b9d4("powerpc/pseries: usepci_host_bridge.release_fn()to kfree(phb)") from upstream. I didn't check though if that applies (or works) with the older kernels.I'm going to drop it, thanks for pointing this out, I should have caught it earlier too...
Should be removed, hopefully all will build properly...
It would've been helpful if Mauricio and I were Cc'd on this, but in any case I was away for most of last week :)
Looks like I suggested that 2dd9c11b9d4 be Cc: stable on the list but that didn't quite make it in to the final commit. Probably didn't help that our patches were then applied to powerpc#fixes in the wrong order...
2dd9c11b9d4 applies cleanly on top of 4.4 and works for me in the cxl case. Mauricio - any objections from the pseries/dlpar side?
Andrew
Signature · 2 lines
Andrew Donnellan OzLabs, ADL Canberra [email protected] IBM Australia Limited
Quoted 2 lines · Andrew Donnellan
2dd9c11b9d4applies cleanly on top of 4.4 and works for me in the cxl case. Mauricio - any objections from the pseries/dlpar side?
No objections.
Signature · 2 lines
Mauricio Faria de Oliveira IBM Linux Technology Center
Re: [PATCH 4.4 022/118] IB/uverbs: Fix race between uverbs_close and remove_one
In reply to Greg Kroah-HartmanQuoted 114 lines · Greg Kroah-Hartman
4.4-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jason Gunthorpe <[email protected]>
commit
d1e09f304a1d9651c5059ebfeb696dc2effc9b32upstream.Fixes an oops that might happen if
uverbs_closeraces withremove_one.Both contexts may run
ib_uverbs_cleanup_ucontext, it depends on the flow.Currently, there is no protection for a case that
remove_onedidn't make the cleanup it runs to its end, the underlyingib_devicewas freed thenuverbs_closewill callib_uverbs_cleanup_ucontextand OOPs.Above might happen if
uverbs_closedeleted the file from the list thenremove_onedidn't find it and runs to its end.Fixes to protect against that case by a new cleanup lock so that
ib_uverbs_cleanup_ucontextwill be called always before thatremove_oneis ended.Fixes 35d4a0b63dc0 ("IB/uverbs: Fix race between ib_uverbs_open and remove_one")Reported-by Devesh Sharma <[email protected]>Signed-off-by Jason Gunthorpe <[email protected]>Signed-off-by Yishai Hadas <[email protected]>Signed-off-by Leon Romanovsky <[email protected]>Signed-off-by Doug Ledford <[email protected]>Signed-off-by Greg Kroah-Hartman <[email protected]>--- drivers/infiniband/core/uverbs.h | 1 drivers/infiniband/core/uverbs_main.c | 37 ++++++++++++++++++++++------------ 2 files changed, 25 insertions(+), 13 deletions(-)drivers/infiniband/core/uverbs.h +1
-0@@ -116,6 +116,7 @@ struct ib_uverbs_event_file {struct ib_uverbs_file {struct kref ref;struct mutex mutex; +struct mutex cleanup_mutex;/* protect cleanup */ struct ib_uverbs_device *device;struct ib_ucontext *ucontext;struct ib_event_handler event_handler;drivers/infiniband/core/uverbs_main.c +18
-13@@ -922,6 +922,7 @@ static int ib_uverbs_open(struct inode * file->async_file =NULL ;kref_init (&file->ref);mutex_init (&file->mutex); +mutex_init (&file->cleanup_mutex); filp->private_data = file;kobject_get (&dev->kobj);@@ -947,18 +948,20 @@ static int ib_uverbs_close(struct inode {struct ib_uverbs_file *file = filp->private_data;struct ib_uverbs_device *dev = file->device; -struct ib_ucontext *ucontext =NULL ; + +mutex_lock (&file->cleanup_mutex); +if (file->ucontext) { +ib_uverbs_cleanup_ucontext (file, file->ucontext); + file->ucontext =NULL ; + } +mutex_unlock (&file->cleanup_mutex);mutex_lock (&file->device->lists_mutex); - ucontext = file->ucontext; - file->ucontext =NULL ;if (!file->is_closed) {list_del (&file->list); file->is_closed =1 ; }mutex_unlock (&file->device->lists_mutex); -if (ucontext) -ib_uverbs_cleanup_ucontext (file, ucontext);if (file->async_file)kref_put (&file->async_file->ref, ib_uverbs_release_event_file);@@ -1172,22 +1175,30 @@ static void ib_uverbs_free_hw_resources(mutex_lock (&uverbs_dev->lists_mutex);while (!list_empty (&uverbs_dev->uverbs_file_list)) {struct ib_ucontext *ucontext; - file =list_first_entry (&uverbs_dev->uverbs_file_list, struct ib_uverbs_file, list); file->is_closed =1 ; - ucontext = file->ucontext;list_del (&file->list); - file->ucontext =NULL ;kref_get (&file->ref);mutex_unlock (&uverbs_dev->lists_mutex); -/* We must release the mutex before going ahead and calling -* disassociate_ucontext. disassociate_ucontext might end up -* indirectly calling uverbs_close, for example due to freeing -* the resources (e.g mmput). -*/ +ib_uverbs_event_handler (&file->event_handler, &event); + +mutex_lock (&file->cleanup_mutex); + ucontext = file->ucontext; + file->ucontext =NULL ; +mutex_unlock (&file->cleanup_mutex); + +/* At this point ib_uverbs_close cannot be running +* ib_uverbs_cleanup_ucontext +*/
drivers/infiniband/core/uverbs_main.c static void ib_uverbs_free_hw_resources( · line 1204
Quoted 10 lines
drivers/infiniband/core/uverbs_main.c +6
-0if (ucontext) { +/* We must release the mutex before going ahead and +* calling disassociate_ucontext. disassociate_ucontext +* might end up indirectly calling uverbs_close, +* for example due to freeing the resources +* (e.g mmput). +*/ ib_dev->disassociate_ucontext (ucontext);ib_uverbs_cleanup_ucontext (file, ucontext); }
Another code-quality (not stable) comment. We're told again and again to "lock data, not code", e.g.
"And as Alan Cox says, “Lock data, not code”." (Unreliable Guide To Locking, Rusty Russel, Documentation/DocBook/kernel-locking.tmpl)
"Big Fat Rule: Locks that simply wrap code regions are hard to understand and prone to race conditions. Lock data, not code." (Linux Kernel Development Second Edition, Robert Love)
This lock is literally called "cleanup mutex" and it's not really documented what data it protects. Is there a better solution here?
Vegard
Re: [PATCH 4.4 022/118] IB/uverbs: Fix race between uverbs_close and remove_one
Quoted 2 lines · Vegard Nossum
This lock is literally called "cleanup mutex" and it's not really documented what data it protects. Is there a better solution here?
I agree it is very complex and hard to understand. This is why it needed patching :| The mutex is in fact pretty much locking code. (ensuring that ib_uverbs_cleanup_ucontext only runs on one thread during this race)
There are at least three locks involved in this process. I didn't see any obvious way to extend any of the other locks to handle this case.
The argument against most simple solutions (eg a rw lock rather than the srcu) has been performance on these paths.
Jason
Greg Kroah-Hartman
maintainerQuoted 5 lines · Mauricio Faria de Oliveira
Quoted 2 lines · Andrew Donnellan
2dd9c11b9d4applies cleanly on top of 4.4 and works for me in the cxl case. Mauricio - any objections from the pseries/dlpar side?No objections.
Thanks, have queued them up now.
greg k-h