5.0.1-stable review
Subsystems (3)
Greg Kroah-Hartman
maintainercover 5.0.1-stable review
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-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-5.0.y
and the diffstat can be found below.
thanks,
greg k-h
-------------
Pseudo-Shortlog of commits:
Greg Kroah-Hartman <[email protected]>
Linux 5.0.1-rc1
YueHaibing <[email protected]>
exec: Fix mem leak in kernel_read_file
Matthias Kaehlcke <[email protected]>
Bluetooth: Fix locking in bt_accept_enqueue() for BH context
Kai-Heng Feng <[email protected]>
Bluetooth: btrtl: Restore old logic to assume firmware is already loaded
Luis Chamberlain <[email protected]>
selftests: firmware: fix verify_reqs() return value
Luis Chamberlain <[email protected]>
Revert "selftests: firmware: remove use of non-standard diff -Z option"
Luis Chamberlain <[email protected]>
Revert "selftests: firmware: add CONFIG_FW_LOADER_USER_HELPER_FALLBACK to config"
Karoly Pados <[email protected]>
USB: serial: cp210x: fix GPIO in autosuspend
Johan Hovold <[email protected]>
gnss: sirf: fix premature wakeup interrupt enable
Max Filippov <[email protected]>
xtensa: fix get_wchan
Bart Van Assche <[email protected]>
aio: Fix locking in aio_poll()
Liu Xiang <[email protected]>
MIPS: irq: Allocate accurate order pages for irq stack
Arnd Bergmann <[email protected]>
alpha: wire up io_pgetevents system call
Gustavo A. R. Silva <[email protected]>
applicom: Fix potential Spectre v1 vulnerabilities
Balaji Manoharan <[email protected]>
usb: xhci: Fix for Enabling USB ROLE SWITCH QUIRK on INTEL_SUNRISEPOINT_LP_XHCI
Thierry Reding <[email protected]>
xhci: tegra: Prevent error pointer dereference
Pavel Tikhomirov <[email protected]>
tracing: Fix event filters and triggers to handle negative numbers
Kirill A. Shutemov <[email protected]>
x86/boot/compressed/64: Do not read legacy ROM on EFI system
Jiaxun Yang <[email protected]>
x86/CPU/AMD: Set the CPB bit unconditionally on F17h
Erik Hugne <[email protected]>
tipc: fix RDM/DGRAM connect() regression
Ido Schimmel <[email protected]>
team: Free BPF filter when unregistering netdev
Kai-Heng Feng <[email protected]>
sky2: Disable MSI on Dell Inspiron 1545 and Gateway P-79
Xin Long <[email protected]>
sctp: call iov_iter_revert() after sending ABORT
Kristian Evensen <[email protected]>
qmi_wwan: Add support for Quectel EG12/EM12
YueHaibing <[email protected]>
net-sysfs: Fix mem leak in netdev_register_kobject
Eric Dumazet <[email protected]>
net: sched: put back q.qlen into a single location
Kavya Sree Kotagiri <[email protected]>
net: mscc: Enable all ports in QSGMII
Heiner Kallweit <[email protected]>
net: dsa: mv8e6xxx: fix number of internal PHYs for 88E6x90 family
Heiner Kallweit <[email protected]>
net: dsa: mv88e6xxx: handle unknown duplex modes gracefully in mv88e6xxx_port_set_duplex
Heiner Kallweit <[email protected]>
net: dsa: mv88e6xxx: add call to mv88e6xxx_ports_cmode_init to probe for new DSA framework
Ido Schimmel <[email protected]>
ip6mr: Do not call __IP6_INC_STATS() from preemptible context
Tetsuo Handa <[email protected]>
staging: android: ashmem: Avoid range_alloc() allocation with ashmem_mutex held.
Tetsuo Handa <[email protected]>
staging: android: ashmem: Don't call fallocate() with ashmem_mutex held.
Qing Xia <[email protected]>
staging: android: ion: fix sys heap pool's gfp_flags
Ajay Singh <[email protected]>
staging: wilc1000: fix to set correct value for 'vif_num'
Gustavo A. R. Silva <[email protected]>
staging: comedi: ni_660x: fix missing break in switch statement
Gao Xiang <[email protected]>
staging: erofs: fix illegal address access under memory pressure
Gao Xiang <[email protected]>
staging: erofs: fix race of initializing xattrs of a inode at the same time
Sheng Yong <[email protected]>
staging: erofs: fix memleak of inode's shared xattr array
Gao Xiang <[email protected]>
staging: erofs: fix fast symlink w/o xattr when fs xattr is on
Geert Uytterhoeven <[email protected]>
driver core: Postpone DMA tear-down until after devres release
Mans Rullgard <[email protected]>
USB: serial: ftdi_sio: add ID for Hjelmslund Electronics USB485
Ivan Mironov <[email protected]>
USB: serial: cp210x: add ID for Ingenico 3070
Daniele Palmas <[email protected]>
USB: serial: option: add Telit ME910 ECM composition
Todd Kjos <[email protected]>
binder: create node flag to request sender's security context
Gao Xiang <[email protected]>
staging: erofs: fix mis-acted TAIL merging behavior
Viresh Kumar <[email protected]>
cpufreq: Use struct kobj_attribute instead of struct global_attr
-------------
Diffstat:
Makefile | 4 +- arch/alpha/kernel/syscalls/syscall.tbl | 1 + arch/mips/kernel/irq.c | 4 +- arch/x86/boot/compressed/pgtable_64.c | 19 +++- arch/x86/kernel/cpu/amd.c | 8 +- arch/xtensa/kernel/process.c | 4 +- drivers/android/binder.c | 106 +++++++++++++++++----- drivers/base/dd.c | 2 +- drivers/bluetooth/btrtl.c | 10 +- drivers/char/applicom.c | 35 ++++--- drivers/cpufreq/cpufreq.c | 6 +- drivers/cpufreq/intel_pstate.c | 23 ++--- drivers/gnss/sirf.c | 32 ++++--- drivers/net/dsa/mv88e6xxx/chip.c | 13 +-- drivers/net/dsa/mv88e6xxx/port.c | 2 +- drivers/net/ethernet/marvell/sky2.c | 24 ++++- drivers/net/ethernet/mscc/ocelot_board.c | 14 ++- drivers/net/team/team_mode_loadbalance.c | 15 +++ drivers/net/usb/qmi_wwan.c | 26 ++++-- drivers/staging/android/ashmem.c | 67 +++++++++----- drivers/staging/android/ion/ion_system_heap.c | 2 +- drivers/staging/comedi/drivers/ni_660x.c | 1 + drivers/staging/erofs/inode.c | 8 +- drivers/staging/erofs/internal.h | 11 ++- drivers/staging/erofs/unzip_vle.c | 77 ++++++++++------ drivers/staging/erofs/xattr.c | 65 ++++++++++--- drivers/staging/wilc1000/linux_wlan.c | 4 +- drivers/usb/host/xhci-pci.c | 1 + drivers/usb/host/xhci-tegra.c | 4 +- drivers/usb/serial/cp210x.c | 12 +++ drivers/usb/serial/ftdi_sio.c | 2 + drivers/usb/serial/ftdi_sio_ids.h | 6 ++ drivers/usb/serial/option.c | 2 + fs/aio.c | 12 ++- fs/exec.c | 2 +- include/linux/cpufreq.h | 12 +-- include/net/bluetooth/bluetooth.h | 2 +- include/net/sch_generic.h | 31 +++---- include/uapi/linux/android/binder.h | 19 ++++ kernel/trace/trace_events_filter.c | 5 +- net/bluetooth/af_bluetooth.c | 16 +++- net/bluetooth/l2cap_sock.c | 2 +- net/bluetooth/rfcomm/sock.c | 2 +- net/bluetooth/sco.c | 2 +- net/core/gen_stats.c | 2 - net/core/net-sysfs.c | 3 + net/ipv6/ip6mr.c | 8 +- net/sched/sch_generic.c | 13 ++- net/sctp/socket.c | 1 + net/tipc/socket.c | 2 +- tools/testing/selftests/firmware/config | 1 - tools/testing/selftests/firmware/fw_filesystem.sh | 9 +- tools/testing/selftests/firmware/fw_lib.sh | 2 +- 53 files changed, 521 insertions(+), 235 deletions(-)
Greg Kroah-Hartman
maintainerPATCH 1/46 cpufreq: Use struct kobj_attribute instead of struct global_attr
5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Viresh Kumar <[email protected]>
commit 625c85a62cb7d3c79f6e16de3cfa972033658250 upstream.
The cpufreq_global_kobject is created using kobject_create_and_add() helper, which assigns the kobj_type as dynamic_kobj_ktype and show/store routines are set to kobj_attr_show() and kobj_attr_store().
These routines pass struct kobj_attribute as an argument to the show/store callbacks. But all the cpufreq files created using the cpufreq_global_kobject expect the argument to be of type struct attribute. Things work fine currently as no one accesses the "attr" argument. We may not see issues even if the argument is used, as struct kobj_attribute has struct attribute as its first element and so they will both get same address.
But this is logically incorrect and we should rather use struct kobj_attribute instead of struct global_attr in the cpufreq core and drivers and the show/store callbacks should take struct kobj_attribute as argument instead.
This bug is caught using CFI CLANG builds in android kernel which catches mismatch in function prototypes for such callbacks.
--- drivers/cpufreq/cpufreq.c | 6 +++--- drivers/cpufreq/intel_pstate.c | 23 ++++++++++++----------- include/linux/cpufreq.h | 12 ++---------- 3 files changed, 17 insertions(+), 24 deletions(-)
drivers/cpufreq/cpufreq.c +3 -3
@@ -545,13 +545,13 @@ EXPORT_SYMBOL_GPL(cpufreq_policy_transit* SYSFS INTERFACE * *********************************************************************/ static ssize_t show_boost (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {return sprintf (buf,"%d\n" , cpufreq_driver->boost_enabled); } -static ssize_t store_boost (struct kobject *kobj,struct attribute *attr, -const char *buf,size_t count) +static ssize_t store_boost (struct kobject *kobj,struct kobj_attribute *attr, +const char *buf,size_t count) {int ret, enable;
drivers/cpufreq/intel_pstate.c +12 -11
@@ -895,7 +895,7 @@ static void intel_pstate_update_policies/************************** sysfs begin ************************/ #define show_one (file_name, object) \ static ssize_t show_##file_name \ - (struct kobject *kobj, struct attribute *attr, char *buf) \ + (struct kobject *kobj, struct kobj_attribute *attr, char *buf) \ { \ return sprintf(buf, "%u\n", global.object); \ }
@@ -904,7 +904,7 @@ static ssize_t intel_pstate_show_status(static int intel_pstate_update_status (const char *buf,size_t size);static ssize_t show_status (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {ssize_t ret;
@@ -915,7 +915,7 @@ static ssize_t show_status(struct kobjecreturn ret; } -static ssize_t store_status (struct kobject *a,struct attribute *b, +static ssize_t store_status (struct kobject *a,struct kobj_attribute *b,const char *buf,size_t count) {char *p =memchr (buf,'\n' , count);
@@ -929,7 +929,7 @@ static ssize_t store_status(struct kobje }static ssize_t show_turbo_pct (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {struct cpudata *cpu;int total, no_turbo, turbo_pct;
@@ -955,7 +955,7 @@ static ssize_t show_turbo_pct(struct kob }static ssize_t show_num_pstates (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {struct cpudata *cpu;int total;
@@ -976,7 +976,7 @@ static ssize_t show_num_pstates(struct k }static ssize_t show_no_turbo (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {ssize_t ret;
@@ -998,7 +998,7 @@ static ssize_t show_no_turbo(struct kobjreturn ret; } -static ssize_t store_no_turbo (struct kobject *a,struct attribute *b, +static ssize_t store_no_turbo (struct kobject *a,struct kobj_attribute *b,const char *buf,size_t count) {unsigned int input;
@@ -1045,7 +1045,7 @@ static ssize_t store_no_turbo(struct kobreturn count; } -static ssize_t store_max_perf_pct (struct kobject *a,struct attribute *b, +static ssize_t store_max_perf_pct (struct kobject *a,struct kobj_attribute *b,const char *buf,size_t count) {unsigned int input;
@@ -1075,7 +1075,7 @@ static ssize_t store_max_perf_pct(structreturn count; } -static ssize_t store_min_perf_pct (struct kobject *a,struct attribute *b, +static ssize_t store_min_perf_pct (struct kobject *a,struct kobj_attribute *b,const char *buf,size_t count) {unsigned int input;
@@ -1107,12 +1107,13 @@ static ssize_t store_min_perf_pct(struct }static ssize_t show_hwp_dynamic_boost (struct kobject *kobj, -struct attribute *attr,char *buf) +struct kobj_attribute *attr,char *buf) {return sprintf (buf,"%u\n" , hwp_boost); } -static ssize_t store_hwp_dynamic_boost (struct kobject *a,struct attribute *b, +static ssize_t store_hwp_dynamic_boost (struct kobject *a, +struct kobj_attribute *b,const char *buf,size_t count) {unsigned int input;
include/linux/cpufreq.h +2 -10
@@ -254,20 +254,12 @@ __ATTR(_name, 0644, show_##_name, store_static struct freq_attr _name = \ __ATTR(_name, 0200, NULL, store_##_name) -struct global_attr { -struct attribute attr; -ssize_t (*show)(struct kobject *kobj, -struct attribute *attr,char *buf); -ssize_t (*store)(struct kobject *a,struct attribute *b, -const char *c,size_t count); -}; -#define define_one_global_ro (_name) \ -static struct global_attr _name = \ +static struct kobj_attribute _name = \ __ATTR(_name, 0444, show_##_name, NULL)#define define_one_global_rw (_name) \ -static struct global_attr _name = \ +static struct kobj_attribute _name = \ __ATTR(_name, 0644, show_##_name, store_##_name)
Greg Kroah-Hartman
maintainerPATCH 2/46 staging: erofs: fix mis-acted TAIL merging behavior
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit a112152f6f3a2a88caa6f414d540bd49e406af60 upstream.
EROFS has an optimized path called TAIL merging, which is designed to merge multiple reads and the corresponding decompressions into one if these requests read continuous pages almost at the same time.
In general, it behaves as follows:
________________________________________________________________
... | TAIL . HEAD | PAGE | PAGE | TAIL . HEAD | ...
_____|_combined page A_|________|________|_combined page B_|____
1 ] -> [ 2 ] -> [ 3If the above three reads are requested in the order 1-2-3, it will generate a large work chain rather than 3 individual work chains to reduce scheduling overhead and boost up sequential read.
However, if Read 2 is processed slightly earlier than Read 1, currently it still generates 2 individual work chains (chain 1, 2) but it does in-place decompression for combined page A, moreover, if chain 2 decompresses ahead of chain 1, it will be a race and lead to corrupted decompressed page. This patch fixes it.
--- drivers/staging/erofs/unzip_vle.c | 70 ++++++++++++++++++++++++-------------- 1 file changed, 45 insertions(+), 25 deletions(-)
drivers/staging/erofs/unzip_vle.c +45 -25
@@ -107,15 +107,30 @@ enum z_erofs_vle_work_role {Z_EROFS_VLE_WORK_SECONDARY ,Z_EROFS_VLE_WORK_PRIMARY ,/* -* The current work has at least been linked with the following -* processed chained works, which means if the processing page -* is the tail partial page of the work, the current work can -* safely use the whole page, as illustrated below: -* +--------------+-------------------------------------------+ -* | tail page | head page (of the previous work) | -* +--------------+-------------------------------------------+ -* /\ which belongs to the current work -* [ (*) this page can be used for the current work itself. ] +* The current work was the tail of an exist chain, and the previous +* processed chained works are all decided to be hooked up to it. +* A new chain should be created for the remaining unprocessed works, +* therefore different from Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED, +* the next work cannot reuse the whole page in the following scenario: +* ________________________________________________________________ +* | tail (partial) page | head (partial) page | +* | (belongs to the next work) | (belongs to the current work) | +* |_______PRIMARY_FOLLOWED_______|________PRIMARY_HOOKED___________| +*/ +Z_EROFS_VLE_WORK_PRIMARY_HOOKED , +/* +* The current work has been linked with the processed chained works, +* and could be also linked with the potential remaining works, which +* means if the processing page is the tail partial page of the work, +* the current work can safely use the whole page (since the next work +* is under control) for in-place decompression, as illustrated below: +* ________________________________________________________________ +* | tail (partial) page | head (partial) page | +* | (of the current work) | (of the previous work) | +* | PRIMARY_FOLLOWED or | | +* |_____PRIMARY_HOOKED____|____________PRIMARY_FOLLOWED____________| +* +* [ (*) the above page can be used for the current work itself. ] */ Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED ,Z_EROFS_VLE_WORK_MAX
@@ -315,10 +330,10 @@ static int z_erofs_vle_work_add_page(return ret ?0 : -EAGAIN ; } -static inline bool try_to_claim_workgroup ( -struct z_erofs_vle_workgroup *grp, -z_erofs_vle_owned_workgrp_t *owned_head, -bool *hosted) +static enum z_erofs_vle_work_role +try_to_claim_workgroup (struct z_erofs_vle_workgroup *grp, +z_erofs_vle_owned_workgrp_t *owned_head, +bool *hosted) {DBG_BUGON (*hosted == true);
@@ -332,6 +347,9 @@ retry: *owned_head = &grp->next; *hosted = true; +/* lucky, I am the followee :) */ +return Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED ; + }else if (grp->next ==Z_EROFS_VLE_WORKGRP_TAIL ) {/* * type 2, link to the end of a existing open chain,
@@ -341,12 +359,11 @@ retry:if (cmpxchg (&grp->next,Z_EROFS_VLE_WORKGRP_TAIL , *owned_head) !=Z_EROFS_VLE_WORKGRP_TAIL ) goto retry; - *owned_head =Z_EROFS_VLE_WORKGRP_TAIL ; - }else -return false;/* :( better luck next time */ +return Z_EROFS_VLE_WORK_PRIMARY_HOOKED ; + } -return true;/* lucky, I am the followee :) */ +return Z_EROFS_VLE_WORK_PRIMARY ;/* :( better luck next time */ }struct z_erofs_vle_work_finder {
@@ -424,12 +441,9 @@ z_erofs_vle_work_lookup(const struct z_e *f->hosted = false;if (!primary) *f->role =Z_EROFS_VLE_WORK_SECONDARY ; -/* claim the workgroup if possible */ -else if (try_to_claim_workgroup (grp, f->owned_head, f->hosted)) - *f->role =Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED ; -else - *f->role =Z_EROFS_VLE_WORK_PRIMARY ; - +else /* claim the workgroup if possible */ + *f->role =try_to_claim_workgroup (grp, f->owned_head, + f->hosted);return work; }
@@ -493,6 +507,9 @@ z_erofs_vle_work_register(const struct zreturn work; } +#define builder_is_hooked (builder) \ + ((builder)->role >= Z_EROFS_VLE_WORK_PRIMARY_HOOKED) +#define builder_is_followed (builder) \ ((builder)->role >= Z_EROFS_VLE_WORK_PRIMARY_FOLLOWED)
@@ -686,7 +703,7 @@ static int z_erofs_do_read_page(struct zstruct z_erofs_vle_work_builder *const builder = &fe->builder;const loff_t offset =page_offset (page); -bool tight =builder_is_followed (builder); +bool tight =builder_is_hooked (builder);struct z_erofs_vle_work *work = builder->work;enum z_erofs_cache_alloctype cache_strategy;
@@ -740,7 +757,7 @@ repeat: map->m_plen /PAGE_SIZE , cache_strategy, page_pool, GFP_KERNEL); - tight &=builder_is_followed (builder); + tight &=builder_is_hooked (builder); work = builder->work; hitted: cur = end - min_t(unsigned int, offset + end - map->m_la, end);
@@ -755,6 +772,9 @@ hitted: (tight ?Z_EROFS_PAGE_TYPE_EXCLUSIVE : Z_EROFS_VLE_PAGE_TYPE_TAIL_SHARED)); +if (cur) + tight &=builder_is_followed (builder); + retry: err =z_erofs_vle_work_add_page (builder, page, page_type);/* should allocate an additional staging page for pagevec */
Greg Kroah-Hartman
maintainerPATCH 3/46 binder: create node flag to request senders security context
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Todd Kjos <[email protected]>
commit ec74136ded792deed80780a2f8baf3521eeb72f9 upstream.
To allow servers to verify client identity, allow a node flag to be set that causes the sender's security context to be delivered with the transaction. The BR_TRANSACTION command is extended in BR_TRANSACTION_SEC_CTX to contain a pointer to the security context string.
--- drivers/android/binder.c | 106 ++++++++++++++++++++++++++++-------- include/uapi/linux/android/binder.h | 19 ++++++ 2 files changed, 102 insertions(+), 23 deletions(-)
drivers/android/binder.c +83 -23
@@ -329,6 +329,8 @@ struct binder_error {* (invariant after initialized) * @min_priority: minimum scheduling priority * (invariant after initialized) +* @txn_security_ctx: require sender's security context +* (invariant after initialized) * @async_todo: list of async work items * (protected by @proc->inner_lock) *
@@ -365,6 +367,7 @@ struct binder_node {* invariant after initialization */ u8 accept_fds:1; + u8 txn_security_ctx:1;u8 min_priority; };bool has_async_transaction;
@@ -615,6 +618,7 @@ struct binder_transaction {long saved_priority;kuid_t sender_euid;struct list_head fd_fixups; +binder_uintptr_t security_ctx;/** * @lock: protects @from, @to_proc, and @to_thread *
@@ -1152,6 +1156,7 @@ static struct binder_node *binder_init_n node->work.type =BINDER_WORK_NODE ; node->min_priority = flags &FLAT_BINDER_FLAG_PRIORITY_MASK ; node->accept_fds = !!(flags &FLAT_BINDER_FLAG_ACCEPTS_FDS ); + node->txn_security_ctx = !!(flags &FLAT_BINDER_FLAG_TXN_SECURITY_CTX );spin_lock_init (&node->lock);INIT_LIST_HEAD (&node->work.entry);INIT_LIST_HEAD (&node->async_todo);
@@ -2778,6 +2783,8 @@ static void binder_transaction(struct bibinder_size_t last_fixup_min_off =0 ;struct binder_context *context = proc->context;int t_debug_id =atomic_inc_return (&binder_last_id); +char *secctx =NULL ; +u32 secctx_sz =0 ; e =binder_transaction_log_add (&binder_transaction_log); e->debug_id = t_debug_id;
@@ -3020,6 +3027,20 @@ static void binder_transaction(struct bi t->flags = tr->flags; t->priority =task_nice (current); +if (target_node && target_node->txn_security_ctx) { +u32 secid; + +security_task_getsecid (proc->tsk, &secid); + ret =security_secid_to_secctx (secid, &secctx, &secctx_sz); +if (ret) { + return_error =BR_FAILED_REPLY ; + return_error_param = ret; + return_error_line = __LINE__; + goto err_get_secctx_failed; + } + extra_buffers_size +=ALIGN (secctx_sz,sizeof (u64)); + } +trace_binder_transaction (reply, t, target_node); t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
@@ -3036,6 +3057,19 @@ static void binder_transaction(struct bi t->buffer =NULL ; goto err_binder_alloc_buf_failed; } +if (secctx) { +size_t buf_offset =ALIGN (tr->data_size,sizeof (void *)) + +ALIGN (tr->offsets_size,sizeof (void *)) + +ALIGN (extra_buffers_size,sizeof (void *)) - +ALIGN (secctx_sz,sizeof (u64)); +char *kptr = t->buffer->data + buf_offset; + + t->security_ctx = (uintptr_t )kptr + +binder_alloc_get_user_buffer_offset (&target_proc->alloc); +memcpy (kptr, secctx, secctx_sz); +security_release_secctx (secctx, secctx_sz); + secctx =NULL ; + } t->buffer->debug_id = t->debug_id; t->buffer->transaction = t; t->buffer->target_node = target_node;
@@ -3305,6 +3339,9 @@ err_copy_data_failed: t->buffer->transaction =NULL ;binder_alloc_free_buf (&target_proc->alloc, t->buffer); err_binder_alloc_buf_failed: +if (secctx) +security_release_secctx (secctx, secctx_sz); +err_get_secctx_failed:kfree (tcomplete);binder_stats_deleted (BINDER_STAT_TRANSACTION_COMPLETE ); err_alloc_tcomplete_failed:
@@ -4036,11 +4073,13 @@ retry:while (1 ) {uint32_t cmd; -struct binder_transaction_data tr; +struct binder_transaction_data_secctx tr; +struct binder_transaction_data *trd = &tr.transaction_data;struct binder_work *w =NULL ;struct list_head *list =NULL ;struct binder_transaction *t =NULL ;struct binder_thread *t_from; +size_t trsize =sizeof (*trd);binder_inner_proc_lock (proc);if (!binder_worklist_empty_ilocked (&thread->todo))
@@ -4240,8 +4279,8 @@ retry:if (t->buffer->target_node) {struct binder_node *target_node = t->buffer->target_node; - tr.target.ptr = target_node->ptr; - tr.cookie = target_node->cookie; + trd->target.ptr = target_node->ptr; + trd->cookie = target_node->cookie; t->saved_priority =task_nice (current);if (t->priority < target_node->min_priority && !(t->flags &TF_ONE_WAY ))
@@ -4251,22 +4290,23 @@ retry:binder_set_nice (target_node->min_priority); cmd =BR_TRANSACTION ; }else { - tr.target.ptr =0 ; - tr.cookie =0 ; + trd->target.ptr =0 ; + trd->cookie =0 ; cmd =BR_REPLY ; } - tr.code = t->code; - tr.flags = t->flags; - tr.sender_euid =from_kuid (current_user_ns (), t->sender_euid); + trd->code = t->code; + trd->flags = t->flags; + trd->sender_euid =from_kuid (current_user_ns (), t->sender_euid); t_from =binder_get_txn_from (t);if (t_from) {struct task_struct *sender = t_from->proc->tsk; - tr.sender_pid =task_tgid_nr_ns (sender, -task_active_pid_ns (current)); + trd->sender_pid = +task_tgid_nr_ns (sender, +task_active_pid_ns (current)); }else { - tr.sender_pid =0 ; + trd->sender_pid =0 ; } ret =binder_apply_fd_fixups (t);
@@ -4297,15 +4337,20 @@ retry: }continue ; } - tr.data_size = t->buffer->data_size; - tr.offsets_size = t->buffer->offsets_size; - tr.data.ptr.buffer = (binder_uintptr_t) + trd->data_size = t->buffer->data_size; + trd->offsets_size = t->buffer->offsets_size; + trd->data.ptr.buffer = (binder_uintptr_t) ((uintptr_t )t->buffer->data +binder_alloc_get_user_buffer_offset (&proc->alloc)); - tr.data.ptr.offsets = tr.data.ptr.buffer + + trd->data.ptr.offsets = trd->data.ptr.buffer +ALIGN (t->buffer->data_size,sizeof (void *)); + tr.secctx = t->security_ctx; +if (t->security_ctx) { + cmd =BR_TRANSACTION_SEC_CTX ; + trsize =sizeof (tr); + }if (put_user (cmd, (uint32_t __user *)ptr)) {if (t_from)binder_thread_dec_tmpref (t_from);
@@ -4316,7 +4361,7 @@ retry:return -EFAULT ; } ptr +=sizeof (uint32_t ); -if (copy_to_user (ptr, &tr,sizeof (tr))) { +if (copy_to_user (ptr, &tr, trsize)) {if (t_from)binder_thread_dec_tmpref (t_from);
@@ -4325,7 +4370,7 @@ retry:return -EFAULT ; } - ptr +=sizeof (tr); + ptr += trsize;trace_binder_transaction_received (t);binder_stat_br (proc, thread, cmd);
@@ -4333,16 +4378,18 @@ retry:"%d:%d %s %d %d:%d, cmd %d size %zd-%zd ptr %016llx-%016llx\n" , proc->pid, thread->pid, (cmd ==BR_TRANSACTION ) ?"BR_TRANSACTION" : -"BR_REPLY" , + (cmd ==BR_TRANSACTION_SEC_CTX ) ? +"BR_TRANSACTION_SEC_CTX" :"BR_REPLY" , t->debug_id, t_from ? t_from->proc->pid :0 , t_from ? t_from->pid :0 , cmd, t->buffer->data_size, t->buffer->offsets_size, - (u64)tr.data.ptr.buffer, (u64)tr.data.ptr.offsets); + (u64 )trd->data.ptr.buffer, + (u64)trd->data.ptr.offsets);if (t_from)binder_thread_dec_tmpref (t_from); t->buffer->allow_user_free =1 ; -if (cmd ==BR_TRANSACTION && !(t->flags &TF_ONE_WAY )) { +if (cmd !=BR_REPLY && !(t->flags &TF_ONE_WAY )) {binder_inner_proc_lock (thread->proc); t->to_parent = thread->transaction_stack; t->to_thread = thread;
@@ -4690,7 +4737,8 @@ out:return ret; } -static int binder_ioctl_set_ctx_mgr (struct file *filp) +static int binder_ioctl_set_ctx_mgr (struct file *filp, +struct flat_binder_object *fbo) {int ret =0 ;struct binder_proc *proc = filp->private_data;
@@ -4719,7 +4767,7 @@ static int binder_ioctl_set_ctx_mgr(stru }else { context->binder_context_mgr_uid = curr_euid; } - new_node =binder_new_node (proc,NULL ); + new_node =binder_new_node (proc, fbo);if (!new_node) { ret = -ENOMEM ; goto out;
@@ -4842,8 +4890,20 @@ static long binder_ioctl(struct file *fibinder_inner_proc_unlock (proc);break ; } +case BINDER_SET_CONTEXT_MGR_EXT : { +struct flat_binder_object fbo; + +if (copy_from_user (&fbo, ubuf,sizeof (fbo))) { + ret = -EINVAL ; + goto err; + } + ret =binder_ioctl_set_ctx_mgr (filp, &fbo); +if (ret) + goto err; +break ; + }case BINDER_SET_CONTEXT_MGR : - ret =binder_ioctl_set_ctx_mgr (filp); + ret =binder_ioctl_set_ctx_mgr (filp,NULL );if (ret) goto err;break ;
include/uapi/linux/android/binder.h +19 -0
@@ -41,6 +41,14 @@ enum {enum {FLAT_BINDER_FLAG_PRIORITY_MASK =0xff ,FLAT_BINDER_FLAG_ACCEPTS_FDS =0x100 , + +/** +* @FLAT_BINDER_FLAG_TXN_SECURITY_CTX: request security contexts +* +* Only when set, causes senders to include their security +* context +*/ +FLAT_BINDER_FLAG_TXN_SECURITY_CTX =0x1000 , };#ifdef BINDER_IPC_32BIT
@@ -218,6 +226,7 @@ struct binder_node_info_for_ref {#define BINDER_VERSION _IOWR('b', 9, struct binder_version)#define BINDER_GET_NODE_DEBUG_INFO _IOWR('b', 11, struct binder_node_debug_info)#define BINDER_GET_NODE_INFO_FOR_REF _IOWR('b', 12, struct binder_node_info_for_ref) +#define BINDER_SET_CONTEXT_MGR_EXT _IOW('b', 13, struct flat_binder_object)/* * NOTE: Two special error codes you should check for when calling
@@ -276,6 +285,11 @@ struct binder_transaction_data { } data; }; +struct binder_transaction_data_secctx { +struct binder_transaction_data transaction_data; +binder_uintptr_t secctx; +}; +struct binder_transaction_data_sg {struct binder_transaction_data transaction_data;binder_size_t buffers_size;
@@ -311,6 +325,11 @@ enum binder_driver_return_protocol {BR_OK =_IO ('r' ,1 ),/* No parameters! */ +BR_TRANSACTION_SEC_CTX =_IOR ('r' ,2 , + struct binder_transaction_data_secctx), +/* +* binder_transaction_data_secctx: the received command. +*/ BR_TRANSACTION = _IOR('r', 2, struct binder_transaction_data), BR_REPLY = _IOR('r', 3, struct binder_transaction_data),/*
Greg Kroah-Hartman
maintainerPATCH 4/46 USB: serial: option: add Telit ME910 ECM composition
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Daniele Palmas <[email protected]>
commit 6431866b6707d27151be381252d6eef13025cfce upstream.
This patch adds Telit ME910 family ECM composition 0x1102.
--- drivers/usb/serial/option.c | 2 ++ 1 file changed, 2 insertions(+)
drivers/usb/serial/option.c +2 -0
@@ -1148,6 +1148,8 @@ static const struct usb_device_id option .driver_info = NCTRL(0) | RSVD(1) | RSVD(3) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_ME910_DUAL_MODEM), .driver_info = NCTRL(0) | RSVD(3) }, + { USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1102, 0xff), /* Telit ME910 (ECM) */ + .driver_info = NCTRL(0) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910), .driver_info = NCTRL(0) | RSVD(1) | RSVD(2) }, { USB_DEVICE(TELIT_VENDOR_ID, TELIT_PRODUCT_LE910_USBCFG4),
Greg Kroah-Hartman
maintainerPATCH 5/46 USB: serial: cp210x: add ID for Ingenico 3070
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ivan Mironov <[email protected]>
commit dd9d3d86b08d6a106830364879c42c78db85389c upstream.
Here is how this device appears in kernel log:
usb 3-1: new full-speed USB device number 18 using xhci_hcd usb 3-1: New USB device found, idVendor=0b00, idProduct=3070 usb 3-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3 usb 3-1: Product: Ingenico 3070
usb 3-1: Manufacturer: Silicon Labs
usb 3-1: SerialNumber: 0001
Apparently this is a POS terminal with embedded USB-to-Serial converter.
--- drivers/usb/serial/cp210x.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/serial/cp210x.c +1 -0
@@ -61,6 +61,7 @@ static const struct usb_device_id id_tab { USB_DEVICE(0x08e6, 0x5501) }, /* Gemalto Prox-PU/CU contactless smartcard reader */ { USB_DEVICE(0x08FD, 0x000A) }, /* Digianswer A/S , ZigBee/802.15.4 MAC Device */ { USB_DEVICE(0x0908, 0x01FF) }, /* Siemens RUGGEDCOM USB Serial Console */ + { USB_DEVICE(0x0B00, 0x3070) }, /* Ingenico 3070 */ { USB_DEVICE(0x0BED, 0x1100) }, /* MEI (TM) Cashflow-SC Bill/Voucher Acceptor */ { USB_DEVICE(0x0BED, 0x1101) }, /* MEI series 2000 Combo Acceptor */ { USB_DEVICE(0x0FCF, 0x1003) }, /* Dynastream ANT development board */
Greg Kroah-Hartman
maintainerPATCH 6/46 USB: serial: ftdi_sio: add ID for Hjelmslund Electronics USB485
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Mans Rullgard <[email protected]>
commit 8d7fa3d4ea3f0ca69554215e87411494e6346fdc upstream.
This adds the USB ID of the Hjelmslund Electronics USB485 Iso stick.
--- drivers/usb/serial/ftdi_sio.c | 2 ++ drivers/usb/serial/ftdi_sio_ids.h | 6 ++++++ 2 files changed, 8 insertions(+)
drivers/usb/serial/ftdi_sio.c +2 -0
@@ -1025,6 +1025,8 @@ static const struct usb_device_id id_tab { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_BT_USB_PID) }, { USB_DEVICE(CYPRESS_VID, CYPRESS_WICED_WL_USB_PID) }, { USB_DEVICE(AIRBUS_DS_VID, AIRBUS_DS_P8GR) }, +/* EZPrototypes devices */ + { USB_DEVICE(EZPROTOTYPES_VID, HJELMSLUND_USB485_ISO_PID) }, { } /* Terminating entry */ };
drivers/usb/serial/ftdi_sio_ids.h +6 -0
@@ -1309,6 +1309,12 @@#define IONICS_PLUGCOMPUTER_PID 0x0102/* +* EZPrototypes (PID reseller) +*/ +#define EZPROTOTYPES_VID 0x1c40 +#define HJELMSLUND_USB485_ISO_PID 0x0477 + +/* * Dresden Elektronik Sensor Terminal Board */ #define DE_VID 0x1cf1/* Vendor ID */
Greg Kroah-Hartman
maintainerPATCH 7/46 driver core: Postpone DMA tear-down until after devres release
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Geert Uytterhoeven <[email protected]>
commit 376991db4b6464e906d699ef07681e2ffa8ab08c upstream.
When unbinding the (IOMMU-enabled) R-Car SATA device on Salvator-XS (R-Car H3 ES2.0), in preparation of rebinding against vfio-platform for device pass-through for virtualization:
echo ee300000.sata > /sys/bus/platform/drivers/sata_rcar/unbind
the kernel crashes with:
Unable to handle kernel paging request at virtual address ffffffbf029ffffc
Mem abort info:
ESR = 0x96000006
Exception class = DABT (current EL), IL = 32 bits
SET = 0, FnV = 0
EA = 0, S1PTW = 0
Data abort info:
ISV = 0, ISS = 0x00000006
CM = 0, WnR = 0
swapper pgtable: 4k pages, 39-bit VAs, pgdp = 000000007e8c586c [ffffffbf029ffffc] pgd=000000073bfc6003, pud=000000073bfc6003, pmd=0000000000000000
Internal error: Oops: 96000006 [#1] SMP Modules linked in: CPU: 0 PID: 1098 Comm: bash Not tainted 5.0.0-rc5-salvator-x-00452-g37596f884f4318ef #287 Hardware name: Renesas Salvator-X 2nd version board based on r8a7795 ES2.0+ (DT) pstate: 60400005 (nZCv daif +PAN -UAO) pc : __free_pages+0x8/0x58 lr : __dma_direct_free_pages+0x50/0x5c
sp : ffffff801268baa0
x29: ffffff801268baa0 x28: 0000000000000000
x27: ffffffc6f9c60bf0 x26: ffffffc6f9c60bf0
x25: ffffffc6f9c60810 x24: 0000000000000000
x23: 00000000fffff000 x22: ffffff8012145000
x21: 0000000000000800 x20: ffffffbf029fffc8
x19: 0000000000000000 x18: ffffffc6f86c42c8
x17: 0000000000000000 x16: 0000000000000070
x15: 0000000000000003 x14: 0000000000000000
x13: ffffff801103d7f8 x12: 0000000000000028
x11: ffffff8011117604 x10: 0000000000009ad8
x9 : ffffff80110126d0 x8 : ffffffc6f7563000
x7 : 6b6b6b6b6b6b6b6b x6 : 0000000000000018
x5 : ffffff8011cf3cc8 x4 : 0000000000004000
x3 : 0000000000080000 x2 : 0000000000000001
x1 : 0000000000000000 x0 : ffffffbf029fffc8 Process bash (pid: 1098, stack limit = 0x00000000c38e3e32)
Call trace: __free_pages+0x8/0x58 __dma_direct_free_pages+0x50/0x5c arch_dma_free+0x1c/0x98 dma_direct_free+0x14/0x24 dma_free_attrs+0x9c/0xdc dmam_release+0x18/0x20 release_nodes+0x25c/0x28c devres_release_all+0x48/0x4c device_release_driver_internal+0x184/0x1f0 device_release_driver+0x14/0x1c unbind_store+0x70/0xb8 drv_attr_store+0x24/0x34 sysfs_kf_write+0x4c/0x64 kernfs_fop_write+0x154/0x1c4 __vfs_write+0x34/0x164 vfs_write+0xb4/0x16c ksys_write+0x5c/0xbc __arm64_sys_write+0x14/0x1c el0_svc_common+0x98/0x114 el0_svc_handler+0x1c/0x24 el0_svc+0x8/0xc Code: d51b4234 17fffffa a9bf7bfd 910003fd (b9403404) ---[ end trace 8c564cdd3a1a840f ]---
While I've bisected this to commit e8e683ae9a736407 ("iommu/of: Fix probe-deferral"), and reverting that commit on post-v5.0-rc4 kernels does fix the problem, this turned out to be a red herring.
On arm64, arch_teardown_dma_ops() resets dev->dma_ops to NULL. Hence if a driver has used a managed DMA allocation API, the allocated DMA memory will be freed using the direct DMA ops, while it may have been allocated using a custom DMA ops (iommu_dma_ops in this case).
Fix this by reversing the order of the calls to devres_release_all() and arch_teardown_dma_ops().
--- drivers/base/dd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/base/dd.c +1 -1
@@ -968,9 +968,9 @@ static void __device_release_driver(stru drv->remove (dev);device_links_driver_cleanup (dev); -arch_teardown_dma_ops (dev);devres_release_all (dev); +arch_teardown_dma_ops (dev); dev->driver =NULL ;dev_set_drvdata (dev,NULL );if (dev->pm_domain && dev->pm_domain->dismiss)
Greg Kroah-Hartman
maintainerPATCH 8/46 staging: erofs: fix fast symlink w/o xattr when fs xattr is on
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit 7077fffcb0b0b65dc75e341306aeef4d0e7f2ec6 upstream.
Currently, this will hit a BUG_ON for these symlinks as follows:
- kernel message
------------[ cut here ]------------ kernel BUG at drivers/staging/erofs/xattr.c:59! SMP PTI CPU: 1 PID: 1170 Comm: getllxattr Not tainted 4.20.0-rc6+ #92 Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.10.2-2.fc27 04/01/2014 RIP: 0010:init_inode_xattrs+0x22b/0x270 Code: 48 0f 45 ea f0 ff 4d 34 74 0d 41 83 4c 24 e0 01 31 c0 e9 00 fe ff ff 48 89 ef e8 e0 31 9e ff eb e9 89 e8 e9 ef fd ff ff 0f 0$ <0f> 0b 48 89 ef e8 fb f6 9c ff 48 8b 45 08 a8 01 75 24 f0 ff 4d 34 RSP: 0018:ffffa03ac026bdf8 EFLAGS: 00010246 ------------[ cut here ]------------ ... Call Trace: erofs_listxattr+0x30/0x2c0 ? selinux_inode_listxattr+0x5a/0x80 ? kmem_cache_alloc+0x33/0x170 ? security_inode_listxattr+0x27/0x40 listxattr+0xaf/0xc0 path_listxattr+0x5a/0xa0 do_syscall_64+0x43/0xf0 entry_SYSCALL_64_after_hwframe+0x44/0xa9 ... ---[ end trace 3c24b49408dc0c72 ]---
Fix it by checking ->xattr_isize in init_inode_xattrs(), and it also fixes improper return value -ENOTSUPP (it should be -ENODATA if xattr is enabled) for those inodes.
--- drivers/staging/erofs/inode.c | 8 ++++---- drivers/staging/erofs/xattr.c | 25 ++++++++++++++++++++----- 2 files changed, 24 insertions(+), 9 deletions(-)
drivers/staging/erofs/inode.c +4 -4
@@ -185,16 +185,16 @@ static int fill_inode(struct inode *inod/* setup the new inode */ if (S_ISREG (inode->i_mode)) {#ifdef CONFIG_EROFS_FS_XATTR -if (vi->xattr_isize) - inode->i_op = &erofs_generic_xattr_iops; + inode->i_op = &erofs_generic_xattr_iops;#endif inode->i_fop = &generic_ro_fops; }else if (S_ISDIR (inode->i_mode)) { inode->i_op = #ifdef CONFIG_EROFS_FS_XATTR - vi->xattr_isize ? &erofs_dir_xattr_iops : -#endif + &erofs_dir_xattr_iops; +#else &erofs_dir_iops; +#endif inode->i_fop = &erofs_dir_fops; }else if (S_ISLNK (inode->i_mode)) {/* by default, page_get_link is used for symlink */
drivers/staging/erofs/xattr.c +20 -5
@@ -56,7 +56,26 @@ static int init_inode_xattrs(struct inodreturn 0 ; vi =EROFS_V (inode); -BUG_ON (!vi->xattr_isize); + +/* +* bypass all xattr operations if ->xattr_isize is not greater than +* sizeof(struct erofs_xattr_ibody_header), in detail: +* 1) it is not enough to contain erofs_xattr_ibody_header then +* ->xattr_isize should be 0 (it means no xattr); +* 2) it is just to contain erofs_xattr_ibody_header, which is on-disk +* undefined right now (maybe use later with some new sb feature). +*/ +if (vi->xattr_isize ==sizeof (struct erofs_xattr_ibody_header )) { +errln ("xattr_isize %d of nid %llu is not supported yet" , + vi->xattr_isize, vi->nid); +return -ENOTSUPP ; + }else if (vi->xattr_isize <sizeof (struct erofs_xattr_ibody_header )) { +if (unlikely (vi->xattr_isize)) { +DBG_BUGON (1 ); +return -EIO ;/* xattr ondisk layout error */ + } +return -ENOATTR ; + } sb = inode->i_sb; sbi =EROFS_SB (sb);
@@ -422,7 +441,6 @@ static int erofs_xattr_generic_get(const struct dentry *unused, struct inode *inode, const char *name, void *buffer, size_t size) { - struct erofs_vnode *const vi = EROFS_V(inode); struct erofs_sb_info *const sbi = EROFS_I_SB(inode);switch (handler->flags) {
@@ -440,9 +458,6 @@ static int erofs_xattr_generic_get(constreturn -EINVAL ; } -if (!vi->xattr_isize) -return -ENOATTR ; -return erofs_getxattr (inode, handler->flags, name, buffer, size); }
Greg Kroah-Hartman
maintainerPATCH 9/46 staging: erofs: fix memleak of inodes shared xattr array
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Sheng Yong <[email protected]>
commit 3b1b5291f79d040d549d7c746669fc30e8045b9b upstream.
If it fails to read a shared xattr page, the inode's shared xattr array is not freed. The next time the inode's xattr is accessed, the previously allocated array is leaked.
--- drivers/staging/erofs/xattr.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
drivers/staging/erofs/xattr.c +4 -1
@@ -111,8 +111,11 @@ static int init_inode_xattrs(struct inod it.page =erofs_get_meta_page (sb, ++it.blkaddr,S_ISDIR (inode->i_mode)); -if (IS_ERR (it.page)) +if (IS_ERR (it.page)) { +kfree (vi->xattr_shared_xattrs); + vi->xattr_shared_xattrs =NULL ;return PTR_ERR (it.page); + } it.kaddr =kmap_atomic (it.page); atomic_map = true;
Greg Kroah-Hartman
maintainerPATCH 10/46 staging: erofs: fix race of initializing xattrs of a inode at the same time
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit 62dc45979f3f8cb0ea67302a93bff686f0c46c5a upstream.
In real scenario, there could be several threads accessing xattrs of the same xattr-uninitialized inode, and init_inode_xattrs() almost at the same time.
That's actually an unexpected behavior, this patch closes the race.
--- drivers/staging/erofs/internal.h | 11 +++++++--- drivers/staging/erofs/xattr.c | 41 +++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 15 deletions(-)
drivers/staging/erofs/internal.h +8 -3
@@ -354,12 +354,17 @@ static inline erofs_off_t iloc(struct erreturn blknr_to_addr (sbi->meta_blkaddr) + (nid << sbi->islotbits); } -#define inode_set_inited_xattr (inode) (EROFS_V(inode)->flags |= 1) -#define inode_has_inited_xattr (inode) (EROFS_V(inode)->flags & 1) +/* atomic flag definitions */ +#define EROFS_V_EA_INITED_BIT 0 + +/* bitlock definitions (arranged in reverse order) */ +#define EROFS_V_BL_XATTR_BIT (BITS_PER_LONG - 1)struct erofs_vnode {erofs_nid_t nid; -unsigned int flags; + +/* atomic flags (including bitlocks) */ +unsigned long flags;unsigned char data_mapping_mode;/* inline size in bytes */
drivers/staging/erofs/xattr.c +29 -12
90 lines not on this page · raw message
Greg Kroah-Hartman
maintainerPATCH 11/46 staging: erofs: fix illegal address access under memory pressure
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gao Xiang <[email protected]>
commit 1e5ceeab6929585512c63d05911d6657064abf7b upstream.
Considering a read request with two decompressed file pages, If a decompression work cannot be started on the previous page due to memory pressure but in-memory LTP map lookup is done, builder->work should be still NULL.
Moreover, if the current page also belongs to the same map, it won't try to start the decompression work again and then run into trouble.
This patch aims to solve the above issue only with little changes as much as possible in order to make the fix backport easier.
kernel message is:
<4>[1051408.015930s]SLUB: Unable to allocate memory on node -1, gfp=0x2408040(GFP_NOFS|__GFP_ZERO) <4>[1051408.015930s] cache: erofs_compress, object size: 144, buffer size: 144, default order: 0, min order: 0 <4>[1051408.015930s] node 0: slabs: 98, objs: 2744, free: 0
* Cannot allocate the decompression work
<3>[1051408.015960s]erofs: z_erofs_vle_normalaccess_readpages, readahead error at page 1008 of nid 5391488
* Note that the previous page was failed to read
<0>[1051408.015960s]Internal error: Accessing user space memory outside uaccess.h routines: 96000005 [#1] PREEMPT SMP
...
<4>[1051408.015991s]Hardware name: kirin710 (DT)
...
<4>[1051408.016021s]PC is at z_erofs_vle_work_add_page+0xa0/0x17c
<4>[1051408.016021s]LR is at z_erofs_do_read_page+0x12c/0xcf0
...
<4>[1051408.018096s][<ffffff80c6fb0fd4>] z_erofs_vle_work_add_page+0xa0/0x17c <4>[1051408.018096s][<ffffff80c6fb3814>] z_erofs_vle_normalaccess_readpages+0x1a0/0x37c <4>[1051408.018096s][<ffffff80c6d670b8>] read_pages+0x70/0x190 <4>[1051408.018127s][<ffffff80c6d6736c>] __do_page_cache_readahead+0x194/0x1a8 <4>[1051408.018127s][<ffffff80c6d59318>] filemap_fault+0x398/0x684 <4>[1051408.018127s][<ffffff80c6d8a9e0>] __do_fault+0x8c/0x138 <4>[1051408.018127s][<ffffff80c6d8f90c>] handle_pte_fault+0x730/0xb7c <4>[1051408.018127s][<ffffff80c6d8fe04>] __handle_mm_fault+0xac/0xf4 <4>[1051408.018157s][<ffffff80c6d8fec8>] handle_mm_fault+0x7c/0x118 <4>[1051408.018157s][<ffffff80c8c52998>] do_page_fault+0x354/0x474 <4>[1051408.018157s][<ffffff80c8c52af8>] do_translation_fault+0x40/0x48 <4>[1051408.018157s][<ffffff80c6c002f4>] do_mem_abort+0x80/0x100
<4>[1051408.018310s]---[ end trace 9f4009a3283bd78b ]---
--- drivers/staging/erofs/unzip_vle.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-)
drivers/staging/erofs/unzip_vle.c +6 -1
@@ -721,8 +721,12 @@ repeat:/* lucky, within the range of the current map_blocks */ if (offset + cur >= map->m_la && - offset + cur < map->m_la + map->m_llen) + offset + cur < map->m_la + map->m_llen) { +/* didn't get a valid unzip work previously (very rare) */ +if (!builder->work) + goto restart_now; goto hitted; + }/* go ahead the next map_blocks */ debugln ("%s: [out-of-range] pos %llu" , __func__, offset + cur);
@@ -736,6 +740,7 @@ repeat:if (unlikely (err)) goto err_out; +restart_now:if (unlikely (!(map->m_flags &EROFS_MAP_MAPPED ))) goto hitted;
Greg Kroah-Hartman
maintainerPATCH 12/46 staging: comedi: ni_660x: fix missing break in switch statement
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
commit 479826cc86118e0d87e5cefb3df5b748e0480924 upstream.
Add missing break statement in order to prevent the code from falling through to the default case and return -EINVAL every time.
This bug was found thanks to the ongoing efforts to enable -Wimplicit-fallthrough.
--- drivers/staging/comedi/drivers/ni_660x.c | 1 + 1 file changed, 1 insertion(+)
drivers/staging/comedi/drivers/ni_660x.c +1 -0
@@ -656,6 +656,7 @@ static int ni_660x_set_pfi_routing(struccase NI_660X_PFI_OUTPUT_DIO :if (chan >31 )return -EINVAL ; +break ;default :return -EINVAL ; }
Greg Kroah-Hartman
maintainerPATCH 13/46 staging: wilc1000: fix to set correct value for vif_num
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ajay Singh <[email protected]>
commit dda037057a572f5c82ac2499eb4e6fb17600ba3e upstream.
Set correct value in '->vif_num' for the total number of interfaces and set '->idx' value using 'i'.
--- drivers/staging/wilc1000/linux_wlan.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/staging/wilc1000/linux_wlan.c +2 -2
@@ -1086,8 +1086,8 @@ int wilc_netdev_init(struct wilc **wilc, vif->wilc = *wilc; vif->ndev = ndev; wl->vif[i] = vif; - wl->vif_num = i; - vif->idx = wl->vif_num; + wl->vif_num = i +1 ; + vif->idx = i; ndev->netdev_ops = &wilc_netdev_ops;
Greg Kroah-Hartman
maintainerPATCH 14/46 staging: android: ion: fix sys heap pools gfp_flags
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Qing Xia <[email protected]>
commit 9bcf065e28122588a6cbee08cf847826dacbb438 upstream.
In the first loop, gfp_flags will be modified to high_order_gfp_flags, and there will be no chance to change back to low_order_gfp_flags.
--- drivers/staging/android/ion/ion_system_heap.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/staging/android/ion/ion_system_heap.c +1 -1
@@ -223,10 +223,10 @@ static void ion_system_heap_destroy_poolstatic int ion_system_heap_create_pools (struct ion_page_pool **pools) {int i; -gfp_t gfp_flags = low_order_gfp_flags;for (i =0 ; i <NUM_ORDERS ; i++) {struct ion_page_pool *pool; +gfp_t gfp_flags = low_order_gfp_flags;if (orders[i] >4 ) gfp_flags = high_order_gfp_flags;
Greg Kroah-Hartman
maintainerPATCH 15/46 staging: android: ashmem: Dont call fallocate() with ashmem_mutex held.
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit fb4415a12632f0b9078a0aa80c16745d48fcfc74 upstream.
syzbot is hitting lockdep warnings [1][2][3]. This patch tries to fix the warning by eliminating ashmem_shrink_scan() => {shmem|vfs}_fallocate() sequence.
[1] https://syzkaller.appspot.com/bug?id=87c399f6fa6955006080b24142e2ce7680295ad4
[2] https://syzkaller.appspot.com/bug?id=7ebea492de7521048355fc84210220e1038a7908
[3] https://syzkaller.appspot.com/bug?id=e02419c12131c24e2a957ea050c2ab6dcbbc3270
--- drivers/staging/android/ashmem.c | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-)
drivers/staging/android/ashmem.c +20 -5
@@ -75,6 +75,9 @@ struct ashmem_range {/* LRU list of unpinned pages, protected by ashmem_mutex */ static LIST_HEAD (ashmem_lru_list); +static atomic_t ashmem_shrink_inflight =ATOMIC_INIT (0 ); +static DECLARE_WAIT_QUEUE_HEAD (ashmem_shrink_wait); +/* * long lru_count - The count of pages on our LRU list. *
@@ -438,7 +441,6 @@ out:static unsigned long ashmem_shrink_scan (struct shrinker *shrink,struct shrink_control *sc) { -struct ashmem_range *range, *next;unsigned long freed =0 ;/* We might recurse into filesystem code, so bail out if necessary */
@@ -448,21 +450,33 @@ ashmem_shrink_scan(struct shrinker *shriif (!mutex_trylock (&ashmem_mutex))return -1 ; -list_for_each_entry_safe (range, next, &ashmem_lru_list, lru) { +while (!list_empty (&ashmem_lru_list)) { +struct ashmem_range *range = +list_first_entry (&ashmem_lru_list,typeof (*range), lru);loff_t start = range->pgstart *PAGE_SIZE ;loff_t end = (range->pgend +1 ) *PAGE_SIZE ; +struct file *f = range->asma->file; - range->asma->file->f_op->fallocate (range->asma->file, -FALLOC_FL_PUNCH_HOLE |FALLOC_FL_KEEP_SIZE , - start, end - start); +get_file (f); +atomic_inc (&ashmem_shrink_inflight); range->purged =ASHMEM_WAS_PURGED ;lru_del (range); freed +=range_size (range); +mutex_unlock (&ashmem_mutex); + f->f_op->fallocate (f, +FALLOC_FL_PUNCH_HOLE |FALLOC_FL_KEEP_SIZE , + start, end - start); +fput (f); +if (atomic_dec_and_test (&ashmem_shrink_inflight)) +wake_up_all (&ashmem_shrink_wait); +if (!mutex_trylock (&ashmem_mutex)) + goto out;if (--sc->nr_to_scan <=0 )break ; }mutex_unlock (&ashmem_mutex); +out:return freed; }
@@ -713,6 +727,7 @@ static int ashmem_pin_unpin(struct ashmereturn -EFAULT ;mutex_lock (&ashmem_mutex); +wait_event (ashmem_shrink_wait, !atomic_read (&ashmem_shrink_inflight));if (!asma->file) goto out_unlock;
Greg Kroah-Hartman
maintainerPATCH 16/46 staging: android: ashmem: Avoid range_alloc() allocation with ashmem_mutex held.
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Tetsuo Handa <[email protected]>
commit ecd182cbf4e107928077866399100228d2359c60 upstream.
ashmem_pin() is calling range_shrink() without checking whether range_alloc() succeeded. Also, doing memory allocation with ashmem_mutex held should be avoided because ashmem_shrink_scan() tries to hold it.
Therefore, move memory allocation for range_alloc() to ashmem_pin_unpin() and make range_alloc() not to fail.
This patch is mostly meant for backporting purpose for fuzz testing on stable/distributor kernels, for there is a plan to remove this code in near future.
--- drivers/staging/android/ashmem.c | 42 ++++++++++++++++++++++----------------- 1 file changed, 24 insertions(+), 18 deletions(-)
drivers/staging/android/ashmem.c +24 -18
@@ -171,19 +171,15 @@ static inline void lru_del(struct ashmem* @end: The ending page (inclusive) * * This function is protected by ashmem_mutex. -* -* Return: 0 if successful, or -ENOMEM if there is an error */ -static int range_alloc (struct ashmem_area *asma, -struct ashmem_range *prev_range,unsigned int purged, -size_t start,size_t end) +static void range_alloc (struct ashmem_area *asma, +struct ashmem_range *prev_range,unsigned int purged, +size_t start,size_t end, +struct ashmem_range **new_range) { -struct ashmem_range *range; - - range =kmem_cache_zalloc (ashmem_range_cachep,GFP_KERNEL ); -if (!range) -return -ENOMEM ; +struct ashmem_range *range = *new_range; + *new_range =NULL ; range->asma = asma; range->pgstart = start; range->pgend = end;
@@ -193,8 +189,6 @@ static int range_alloc(struct ashmem_areif (range_on_lru (range))lru_add (range); - -return 0 ; }/**
@@ -596,7 +590,8 @@ static int get_name(struct ashmem_area ** * Caller must hold ashmem_mutex. */ -static int ashmem_pin (struct ashmem_area *asma,size_t pgstart,size_t pgend) +static int ashmem_pin (struct ashmem_area *asma,size_t pgstart,size_t pgend, +struct ashmem_range **new_range) {struct ashmem_range *range, *next;int ret =ASHMEM_NOT_PURGED ;
@@ -649,7 +644,7 @@ static int ashmem_pin(struct ashmem_area* second half and adjust the first chunk's endpoint. */ range_alloc (asma, range, range->purged, - pgend +1 , range->pgend); + pgend +1 , range->pgend, new_range);range_shrink (range, range->pgstart, pgstart -1 );break ; }
@@ -663,7 +658,8 @@ static int ashmem_pin(struct ashmem_area* * Caller must hold ashmem_mutex. */ -static int ashmem_unpin (struct ashmem_area *asma,size_t pgstart,size_t pgend) +static int ashmem_unpin (struct ashmem_area *asma,size_t pgstart,size_t pgend, +struct ashmem_range **new_range) {struct ashmem_range *range, *next;unsigned int purged =ASHMEM_NOT_PURGED ;
@@ -689,7 +685,8 @@ restart: } } -return range_alloc (asma, range, purged, pgstart, pgend); +range_alloc (asma, range, purged, pgstart, pgend, new_range); +return 0 ; }/*
@@ -722,10 +719,17 @@ static int ashmem_pin_unpin(struct ashmestruct ashmem_pin pin;size_t pgstart, pgend;int ret = -EINVAL ; +struct ashmem_range *range =NULL ;if (copy_from_user (&pin, p,sizeof (pin)))return -EFAULT ; +if (cmd ==ASHMEM_PIN || cmd ==ASHMEM_UNPIN ) { + range =kmem_cache_zalloc (ashmem_range_cachep,GFP_KERNEL ); +if (!range) +return -ENOMEM ; + } +mutex_lock (&ashmem_mutex);wait_event (ashmem_shrink_wait, !atomic_read (&ashmem_shrink_inflight));
@@ -750,10 +754,10 @@ static int ashmem_pin_unpin(struct ashmeswitch (cmd) {case ASHMEM_PIN : - ret =ashmem_pin (asma, pgstart, pgend); + ret =ashmem_pin (asma, pgstart, pgend, &range);break ;case ASHMEM_UNPIN : - ret =ashmem_unpin (asma, pgstart, pgend); + ret =ashmem_unpin (asma, pgstart, pgend, &range);break ;case ASHMEM_GET_PIN_STATUS : ret =ashmem_get_pin_status (asma, pgstart, pgend);
@@ -762,6 +766,8 @@ static int ashmem_pin_unpin(struct ashme out_unlock:mutex_unlock (&ashmem_mutex); +if (range) +kmem_cache_free (ashmem_range_cachep, range);return ret; }
Greg Kroah-Hartman
maintainerPATCH 17/46 ip6mr: Do not call __IP6_INC_STATS() from preemptible context
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 87c11f1ddbbad38ad8bad47af133a8208985fbdf ]
Similar to commit 44f49dd8b5a6 ("ipmr: fix possible race resulting from improper usage of IP_INC_STATS_BH() in preemptible context."), we cannot assume preemption is disabled when incrementing the counter and accessing a per-CPU variable.
Preemption can be enabled when we add a route in process context that corresponds to packets stored in the unresolved queue, which are then forwarded using this route [1].
Fix this by using IP6_INC_STATS() which takes care of disabling preemption on architectures where it is needed.
[1]
[ 157.451447] BUG: using __this_cpu_add() in preemptible [00000000] code: smcrouted/2314 [ 157.460409] caller is ip6mr_forward2+0x73e/0x10e0 [ 157.460434] CPU: 3 PID: 2314 Comm: smcrouted Not tainted 5.0.0-rc7-custom-03635-g22f2712113f1 #1336 [ 157.460449] Hardware name: Mellanox Technologies Ltd. MSN2100-CB2FO/SA001017, BIOS 5.6.5 06/07/2016 [ 157.460461] Call Trace: [ 157.460486] dump_stack+0xf9/0x1be [ 157.460553] check_preemption_disabled+0x1d6/0x200 [ 157.460576] ip6mr_forward2+0x73e/0x10e0 [ 157.460705] ip6_mr_forward+0x9a0/0x1510 [ 157.460771] ip6mr_mfc_add+0x16b3/0x1e00 [ 157.461155] ip6_mroute_setsockopt+0x3cb/0x13c0 [ 157.461384] do_ipv6_setsockopt.isra.8+0x348/0x4060 [ 157.462013] ipv6_setsockopt+0x90/0x110 [ 157.462036] rawv6_setsockopt+0x4a/0x120 [ 157.462058] __sys_setsockopt+0x16b/0x340 [ 157.462198] __x64_sys_setsockopt+0xbf/0x160 [ 157.462220] do_syscall_64+0x14d/0x610 [ 157.462349] entry_SYSCALL_64_after_hwframe+0x49/0xbe
--- net/ipv6/ip6mr.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
net/ipv6/ip6mr.c +4 -4
@@ -1964,10 +1964,10 @@ int ip6mr_compat_ioctl(struct sock *sk,static inline int ip6mr_forward2_finish (struct net *net,struct sock *sk,struct sk_buff *skb) { -__IP6_INC_STATS (net,ip6_dst_idev (skb_dst (skb)), -IPSTATS_MIB_OUTFORWDATAGRAMS ); -__IP6_ADD_STATS (net,ip6_dst_idev (skb_dst (skb)), -IPSTATS_MIB_OUTOCTETS , skb->len); +IP6_INC_STATS (net,ip6_dst_idev (skb_dst (skb)), +IPSTATS_MIB_OUTFORWDATAGRAMS ); +IP6_ADD_STATS (net,ip6_dst_idev (skb_dst (skb)), +IPSTATS_MIB_OUTOCTETS , skb->len);return dst_output (net, sk, skb); }
Greg Kroah-Hartman
maintainerPATCH 18/46 net: dsa: mv88e6xxx: add call to mv88e6xxx_ports_cmode_init to probe for new DSA framework
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 3acca1dd17060332cfab15693733cdaf9fba1c90 ]
In the original patch I missed to add mv88e6xxx_ports_cmode_init() to the second probe function, the one for the new DSA framework.
--- drivers/net/dsa/mv88e6xxx/chip.c | 1 + 1 file changed, 1 insertion(+)
drivers/net/dsa/mv88e6xxx/chip.c +1 -0
@@ -4847,6 +4847,7 @@ static int mv88e6xxx_probe(struct mdio_dif (err) goto out; +mv88e6xxx_ports_cmode_init (chip);mv88e6xxx_phy_init (chip);if (chip->info->ops->get_eeprom) {
Greg Kroah-Hartman
maintainerPATCH 19/46 net: dsa: mv88e6xxx: handle unknown duplex modes gracefully in mv88e6xxx_port_set_duplex
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit c6195a8bdfc62a7cecf7df685e64847a4b700275 ]
When testing another issue I faced the problem that mv88e6xxx_port_setup_mac() failed due to DUPLEX_UNKNOWN being passed as argument to mv88e6xxx_port_set_duplex(). We should handle this case gracefully and return -EOPNOTSUPP, like e.g. mv88e6xxx_port_set_speed() is doing it.
--- drivers/net/dsa/mv88e6xxx/port.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
drivers/net/dsa/mv88e6xxx/port.c +1 -1
@@ -190,7 +190,7 @@ int mv88e6xxx_port_set_duplex(struct mv8/* normal duplex detection */ break ;default : -return -EINVAL ; +return -EOPNOTSUPP ; } err =mv88e6xxx_port_write (chip, port,MV88E6XXX_PORT_MAC_CTL , reg);
Greg Kroah-Hartman
maintainerPATCH 20/46 net: dsa: mv8e6xxx: fix number of internal PHYs for 88E6x90 family
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Heiner Kallweit <[email protected]>
[ Upstream commit 95150f29ae480276e76368cdf8a9524b5a96c0ca ]
Ports 9 and 10 don't have internal PHY's but are (dependent on the version) SERDES/SGMII/XAUI/RXAUI ports.
v2:
- fix it for all 88E6x90 family members
--- drivers/net/dsa/mv88e6xxx/chip.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-)
drivers/net/dsa/mv88e6xxx/chip.c +6 -6
@@ -4222,7 +4222,7 @@ static const struct mv88e6xxx_info mv88e .name = "Marvell 88E6190", .num_databases = 4096, .num_ports = 11, /* 10 + Z80 */ - .num_internal_phys = 11, + .num_internal_phys = 9, .num_gpio = 16, .max_vid = 8191, .port_base_addr = 0x0,
@@ -4245,7 +4245,7 @@ static const struct mv88e6xxx_info mv88e .name = "Marvell 88E6190X", .num_databases = 4096, .num_ports = 11, /* 10 + Z80 */ - .num_internal_phys = 11, + .num_internal_phys = 9, .num_gpio = 16, .max_vid = 8191, .port_base_addr = 0x0,
@@ -4268,7 +4268,7 @@ static const struct mv88e6xxx_info mv88e .name = "Marvell 88E6191", .num_databases = 4096, .num_ports = 11, /* 10 + Z80 */ - .num_internal_phys = 11, + .num_internal_phys = 9, .max_vid = 8191, .port_base_addr = 0x0, .phy_base_addr = 0x0,
@@ -4315,7 +4315,7 @@ static const struct mv88e6xxx_info mv88e .name = "Marvell 88E6290", .num_databases = 4096, .num_ports = 11, /* 10 + Z80 */ - .num_internal_phys = 11, + .num_internal_phys = 9, .num_gpio = 16, .max_vid = 8191, .port_base_addr = 0x0,
@@ -4477,7 +4477,7 @@ static const struct mv88e6xxx_info mv88e .name = "Marvell 88E6390", .num_databases = 4096, .num_ports = 11, /* 10 + Z80 */ - .num_internal_phys = 11, + .num_internal_phys = 9, .num_gpio = 16, .max_vid = 8191, .port_base_addr = 0x0,
@@ -4500,7 +4500,7 @@ static const struct mv88e6xxx_info mv88e .name = "Marvell 88E6390X", .num_databases = 4096, .num_ports = 11, /* 10 + Z80 */ - .num_internal_phys = 11, + .num_internal_phys = 9, .num_gpio = 16, .max_vid = 8191, .port_base_addr = 0x0,
Greg Kroah-Hartman
maintainerPATCH 21/46 net: mscc: Enable all ports in QSGMII
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kavya Sree Kotagiri <[email protected]>
[ Upstream commit 084e5bb16bd7dc2b551bbd9fb358bf73e03ee8d8 ]
When Ocelot phy-mode is QSGMII, all 4 ports involved in QSGMII shall be kept out of reset and
Tx lanes shall be enabled to pass the data.
--- drivers/net/ethernet/mscc/ocelot_board.c | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-)
drivers/net/ethernet/mscc/ocelot_board.c +11 -3
@@ -267,6 +267,7 @@ static int mscc_ocelot_probe(struct platstruct phy *serdes;void __iomem *regs;char res_name[8 ]; +int phy_mode;u32 port;if (of_property_read_u32 (portnp,"reg" , &port))
@@ -292,11 +293,11 @@ static int mscc_ocelot_probe(struct platif (err)return err; - err =of_get_phy_mode (portnp); -if (err <0 ) + phy_mode =of_get_phy_mode (portnp); +if (phy_mode <0 ) ocelot->ports[port]->phy_mode =PHY_INTERFACE_MODE_NA ;else - ocelot->ports[port]->phy_mode = err; + ocelot->ports[port]->phy_mode = phy_mode;switch (ocelot->ports[port]->phy_mode) {case PHY_INTERFACE_MODE_NA :
@@ -304,6 +305,13 @@ static int mscc_ocelot_probe(struct platcase PHY_INTERFACE_MODE_SGMII :break ;case PHY_INTERFACE_MODE_QSGMII : +/* Ensure clock signals and speed is set on all +* QSGMII links +*/ +ocelot_port_writel (ocelot->ports[port], +DEV_CLOCK_CFG_LINK_SPEED + (OCELOT_SPEED_1000 ), +DEV_CLOCK_CFG );break ;default : dev_err(ocelot->dev,
Greg Kroah-Hartman
maintainerPATCH 22/46 net: sched: put back q.qlen into a single location
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Eric Dumazet <[email protected]>
[ Upstream commit 46b1c18f9deb326a7e18348e668e4c7ab7c7458b ]
In the series fc8b81a5981f ("Merge branch 'lockless-qdisc-series'") John made the assumption that the data path had no need to read the qdisc qlen (number of packets in the qdisc).
It is true when pfifo_fast is used as the root qdisc, or as direct MQ/MQPRIO children.
But pfifo_fast can be used as leaf in class full qdiscs, and existing logic needs to access the child qlen in an efficient way.
HTB breaks badly, since it uses cl->leaf.q->q.qlen in :
htb_activate() -> WARN_ON()
htb_dequeue_tree() to decide if a class can be htb_deactivated when it has no more packets.
HFSC, DRR, CBQ, QFQ have similar issues, and some calls to qdisc_tree_reduce_backlog() also read q.qlen directly.
Using qdisc_qlen_sum() (which iterates over all possible cpus) in the data path is a non starter.
It seems we have to put back qlen in a central location, at least for stable kernels.
For all qdisc but pfifo_fast, qlen is guarded by the qdisc lock, so the existing q.qlen{++|--} are correct.
For 'lockless' qdisc (pfifo_fast so far), we need to use atomic_{inc|dec}() because the spinlock might be not held (for example from pfifo_fast_enqueue() and pfifo_fast_dequeue())
This patch adds atomic_qlen (in the same location than qlen) and renames the following helpers, since we want to express they can be used without qdisc lock, and that qlen is no longer percpu.
- qdisc_qstats_cpu_qlen_dec -> qdisc_qstats_atomic_qlen_dec()
- qdisc_qstats_cpu_qlen_inc -> qdisc_qstats_atomic_qlen_inc()
Later (net-next) we might revert this patch by tracking all these qlen uses and replace them by a more efficient method (not having to access a precise qlen, but an empty/non_empty status that might be less expensive to maintain/track).
Another possibility is to have a legacy pfifo_fast version that would be used when used a a child qdisc, since the parent qdisc needs a spinlock anyway. But then, future lockless qdiscs would also have the same problem.
--- include/net/sch_generic.h | 31 +++++++++++++------------------ net/core/gen_stats.c | 2 -- net/sched/sch_generic.c | 13 ++++++------- 3 files changed, 19 insertions(+), 27 deletions(-)
include/net/sch_generic.h +13 -18
@@ -51,7 +51,10 @@ struct qdisc_size_table {struct qdisc_skb_head {struct sk_buff *head;struct sk_buff *tail; -__u32 qlen; +union { +u32 qlen; +atomic_t atomic_qlen; + };spinlock_t lock; };
@@ -408,27 +411,19 @@ static inline void qdisc_cb_private_valiBUILD_BUG_ON (sizeof (qcb->data) < sz); } -static inline int qdisc_qlen_cpu (const struct Qdisc *q) -{ -return this_cpu_ptr (q->cpu_qstats)->qlen; -} -static inline int qdisc_qlen (const struct Qdisc *q) {return q->q.qlen; } -static inline int qdisc_qlen_sum (const struct Qdisc *q) +static inline u32 qdisc_qlen_sum (const struct Qdisc *q) { -__u32 qlen = q->qstats.qlen; -int i; +u32 qlen = q->qstats.qlen; -if (q->flags &TCQ_F_NOLOCK ) { -for_each_possible_cpu (i) - qlen +=per_cpu_ptr (q->cpu_qstats, i)->qlen; - }else { +if (q->flags &TCQ_F_NOLOCK ) + qlen +=atomic_read (&q->q.atomic_qlen); +else qlen += q->q.qlen; - }return qlen; }
@@ -825,14 +820,14 @@ static inline void qdisc_qstats_cpu_backthis_cpu_add (sch->cpu_qstats->backlog,qdisc_pkt_len (skb)); } -static inline void qdisc_qstats_cpu_qlen_inc (struct Qdisc *sch) +static inline void qdisc_qstats_atomic_qlen_inc (struct Qdisc *sch) { -this_cpu_inc (sch->cpu_qstats->qlen); +atomic_inc (&sch->q.atomic_qlen); } -static inline void qdisc_qstats_cpu_qlen_dec (struct Qdisc *sch) +static inline void qdisc_qstats_atomic_qlen_dec (struct Qdisc *sch) { -this_cpu_dec (sch->cpu_qstats->qlen); +atomic_dec (&sch->q.atomic_qlen); }static inline void qdisc_qstats_cpu_requeues_inc (struct Qdisc *sch)
net/core/gen_stats.c +0 -2
@@ -291,7 +291,6 @@ __gnet_stats_copy_queue_cpu(struct gnet_for_each_possible_cpu (i) {const struct gnet_stats_queue *qcpu =per_cpu_ptr (q, i); - qstats->qlen =0 ; qstats->backlog += qcpu->backlog; qstats->drops += qcpu->drops; qstats->requeues += qcpu->requeues;
@@ -307,7 +306,6 @@ void __gnet_stats_copy_queue(struct gnetif (cpu) {__gnet_stats_copy_queue_cpu (qstats, cpu); }else { - qstats->qlen = q->qlen; qstats->backlog = q->backlog; qstats->drops = q->drops; qstats->requeues = q->requeues;
net/sched/sch_generic.c +6 -7
@@ -68,7 +68,7 @@ static inline struct sk_buff *__skb_dequ skb =__skb_dequeue (&q->skb_bad_txq);if (qdisc_is_percpu_stats (q)) {qdisc_qstats_cpu_backlog_dec (q, skb); -qdisc_qstats_cpu_qlen_dec (q); +qdisc_qstats_atomic_qlen_dec (q); }else {qdisc_qstats_backlog_dec (q, skb); q->q.qlen--;
@@ -108,7 +108,7 @@ static inline void qdisc_enqueue_skb_badif (qdisc_is_percpu_stats (q)) {qdisc_qstats_cpu_backlog_inc (q, skb); -qdisc_qstats_cpu_qlen_inc (q); +qdisc_qstats_atomic_qlen_inc (q); }else {qdisc_qstats_backlog_inc (q, skb); q->q.qlen++;
@@ -147,7 +147,7 @@ static inline int dev_requeue_skb_lockedqdisc_qstats_cpu_requeues_inc (q);qdisc_qstats_cpu_backlog_inc (q, skb); -qdisc_qstats_cpu_qlen_inc (q); +qdisc_qstats_atomic_qlen_inc (q); skb = next; }
@@ -252,7 +252,7 @@ static struct sk_buff *dequeue_skb(struc skb =__skb_dequeue (&q->gso_skb);if (qdisc_is_percpu_stats (q)) {qdisc_qstats_cpu_backlog_dec (q, skb); -qdisc_qstats_cpu_qlen_dec (q); +qdisc_qstats_atomic_qlen_dec (q); }else {qdisc_qstats_backlog_dec (q, skb); q->q.qlen--;
@@ -645,7 +645,7 @@ static int pfifo_fast_enqueue(struct sk_if (unlikely (err))return qdisc_drop_cpu (skb, qdisc, to_free); -qdisc_qstats_cpu_qlen_inc (qdisc); +qdisc_qstats_atomic_qlen_inc (qdisc);/* Note: skb can not be used after skb_array_produce(), * so we better not use qdisc_qstats_cpu_backlog_inc() */
@@ -670,7 +670,7 @@ static struct sk_buff *pfifo_fast_dequeuif (likely (skb)) {qdisc_qstats_cpu_backlog_dec (qdisc, skb);qdisc_bstats_cpu_update (qdisc, skb); -qdisc_qstats_cpu_qlen_dec (qdisc); +qdisc_qstats_atomic_qlen_dec (qdisc); }return skb;
@@ -714,7 +714,6 @@ static void pfifo_fast_reset(struct Qdisstruct gnet_stats_queue *q =per_cpu_ptr (qdisc->cpu_qstats, i); q->backlog =0 ; - q->qlen =0 ; } }
Greg Kroah-Hartman
maintainerPATCH 23/46 net-sysfs: Fix mem leak in netdev_register_kobject
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: YueHaibing <[email protected]>
[ Upstream commit 895a5e96dbd6386c8e78e5b78e067dcc67b7f0ab ]
syzkaller report this:
BUG: memory leak
unreferenced object 0xffff88837a71a500 (size 256):
comm "syz-executor.2", pid 9770, jiffies 4297825125 (age 17.843s)
hex dump (first 32 bytes):
00 00 00 00 ad 4e ad de ff ff ff ff 00 00 00 00 .....N..........
ff ff ff ff ff ff ff ff 20 c0 ef 86 ff ff ff ff ........ .......
backtrace:
[<00000000db12624b>] netdev_register_kobject+0x124/0x2e0 net/core/net-sysfs.c:1751
[<00000000dc49a994>] register_netdevice+0xcc1/0x1270 net/core/dev.c:8516
[<00000000e5f3fea0>] tun_set_iff drivers/net/tun.c:2649 [inline]
[<00000000e5f3fea0>] __tun_chr_ioctl+0x2218/0x3d20 drivers/net/tun.c:2883
[<000000001b8ac127>] vfs_ioctl fs/ioctl.c:46 [inline]
[<000000001b8ac127>] do_vfs_ioctl+0x1a5/0x10e0 fs/ioctl.c:690
[<0000000079b269f8>] ksys_ioctl+0x89/0xa0 fs/ioctl.c:705
[<00000000de649beb>] __do_sys_ioctl fs/ioctl.c:712 [inline]
[<00000000de649beb>] __se_sys_ioctl fs/ioctl.c:710 [inline]
[<00000000de649beb>] __x64_sys_ioctl+0x74/0xb0 fs/ioctl.c:710
[<000000007ebded1e>] do_syscall_64+0xc8/0x580 arch/x86/entry/common.c:290
[<00000000db315d36>] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[<00000000115be9bb>] 0xffffffffffffffffIt should call kset_unregister to free 'dev->queues_kset'
in error path of register_queue_kobjects, otherwise will cause a mem leak.
--- net/core/net-sysfs.c | 3 +++ 1 file changed, 3 insertions(+)
net/core/net-sysfs.c +3 -0
@@ -1547,6 +1547,9 @@ static int register_queue_kobjects(struc error:netdev_queue_update_kobjects (dev, txq,0 );net_rx_queue_update_kobjects (dev, rxq,0 ); +#ifdef CONFIG_SYSFS +kset_unregister (dev->queues_kset); +#endif return error; }
Greg Kroah-Hartman
maintainerPATCH 24/46 qmi_wwan: Add support for Quectel EG12/EM12
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kristian Evensen <[email protected]>
[ Upstream commit 822e44b45eb991c63487c5e2ce7d636411870a8d ]
Quectel EG12 (module)/EM12 (M.2 card) is a Cat. 12 LTE modem. The modem behaves in the same way as the EP06, so the "set DTR"-quirk must be applied and the diagnostic-interface check performed. Since the diagnostic-check now applies to more modems, I have renamed the function from quectel_ep06_diag_detected() to quectel_diag_detected().
--- drivers/net/usb/qmi_wwan.c | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-)
drivers/net/usb/qmi_wwan.c +18 -8
@@ -976,6 +976,13 @@ static const struct usb_device_id produc 0xff), .driver_info = (unsigned long )&qmi_wwan_info_quirk_dtr, }, + { /* Quectel EG12/EM12 */ +USB_DEVICE_AND_INTERFACE_INFO (0x2c7c ,0x0512 , +USB_CLASS_VENDOR_SPEC , +USB_SUBCLASS_VENDOR_SPEC , +0xff ), + .driver_info = (unsigned long)&qmi_wwan_info_quirk_dtr, + }, /* 3. Combined interface devices matching on interface number */ {QMI_FIXED_INTF(0x0408, 0xea42, 4)}, /* Yota / Megafon M100-1 */
@@ -1343,17 +1350,20 @@ static bool quectel_ec20_detected(structreturn false; } -static bool quectel_ep06_diag_detected (struct usb_interface *intf) +static bool quectel_diag_detected (struct usb_interface *intf) {struct usb_device *dev =interface_to_usbdev (intf);struct usb_interface_descriptor intf_desc = intf->cur_altsetting->desc; +u16 id_vendor =le16_to_cpu (dev->descriptor.idVendor); +u16 id_product =le16_to_cpu (dev->descriptor.idProduct); -if (le16_to_cpu (dev->descriptor.idVendor) ==0x2c7c && -le16_to_cpu (dev->descriptor.idProduct) ==0x0306 && - intf_desc.bNumEndpoints ==2 ) -return true; +if (id_vendor !=0x2c7c || intf_desc.bNumEndpoints !=2 ) +return false; -return false; +if (id_product ==0x0306 || id_product ==0x0512 ) +return true; +else +return false; } static int qmi_wwan_probe(struct usb_interface *intf,
@@ -1390,13 +1400,13 @@ static int qmi_wwan_probe(struct usb_intreturn -ENODEV ; } -/* Quectel EP06/EM06/EG06 supports dynamic interface configuration, so +/* Several Quectel modems supports dynamic interface configuration, so * we need to match on class/subclass/protocol. These values are * identical for the diagnostic- and QMI-interface, but bNumEndpoints is * different. Ignore the current interface if the number of endpoints * the number for the diag interface (two). */ -if (quectel_ep06_diag_detected (intf)) +if (quectel_diag_detected (intf))return -ENODEV ;return usbnet_probe (intf, id);
Greg Kroah-Hartman
maintainerPATCH 25/46 sctp: call iov_iter_revert() after sending ABORT
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <[email protected]>
[ Upstream commit 901efe12318b1ea8d3e2c88a7b75ed6e6d5d7245 ]
The user msg is also copied to the abort packet when doing SCTP_ABORT in sctp_sendmsg_check_sflags(). When SCTP_SENDALL is set, iov_iter_revert() should have been called for sending abort on the next asoc with copying this msg. Otherwise, memcpy_from_msg() in sctp_make_abort_user() will fail and return error.
--- net/sctp/socket.c | 1 + 1 file changed, 1 insertion(+)
net/sctp/socket.c +1 -0
@@ -1866,6 +1866,7 @@ static int sctp_sendmsg_check_sflags(strpr_debug ("%s: aborting association:%p\n" , __func__, asoc);sctp_primitive_ABORT (net, asoc, chunk); +iov_iter_revert (&msg->msg_iter, msg_len);return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 26/46 sky2: Disable MSI on Dell Inspiron 1545 and Gateway P-79
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai-Heng Feng <[email protected]>
[ Upstream commit b33b7cd6fd86478dd2890a9abeb6f036aa01fdf7 ]
Some sky2 chips fire IRQ after S3, before the driver is fully resumed:
[ 686.804877] do_IRQ: 1.37 No irq handler for vector
This is likely a platform bug that device isn't fully quiesced during S3. Use MSI-X, maskable MSI or INTx can prevent this issue from happening.
Since MSI-X and maskable MSI are not supported by this device, fallback to use INTx on affected platforms.
--- drivers/net/ethernet/marvell/sky2.c | 24 +++++++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-)
drivers/net/ethernet/marvell/sky2.c +23 -1
@@ -46,6 +46,7 @@#include <linux/mii.h> #include <linux/of_device.h> #include <linux/of_net.h> +#include <linux/dmi.h> #include <asm/irq.h>
@@ -93,7 +94,7 @@ static int copybreak __read_mostly = 128module_param (copybreak, int,0 );MODULE_PARM_DESC (copybreak,"Receive copy threshold" ); -static int disable_msi =0 ; +static int disable_msi =-1 ;module_param (disable_msi, int,0 );MODULE_PARM_DESC (disable_msi,"Disable Message Signaled Interrupt (MSI)" );
@@ -4917,6 +4918,24 @@ static const char *sky2_name(u8 chipid,return buf; } +static const struct dmi_system_id msi_blacklist[] = { + { + .ident ="Dell Inspiron 1545" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Dell Inc." ), +DMI_MATCH (DMI_PRODUCT_NAME ,"Inspiron 1545" ), + }, + }, + { + .ident ="Gateway P-79" , + .matches = { +DMI_MATCH (DMI_SYS_VENDOR ,"Gateway" ), +DMI_MATCH (DMI_PRODUCT_NAME ,"P-79" ), + }, + }, + {} +}; +static int sky2_probe (struct pci_dev *pdev,const struct pci_device_id *ent) {struct net_device *dev, *dev1;
@@ -5028,6 +5047,9 @@ static int sky2_probe(struct pci_dev *pd goto err_out_free_pci; } +if (disable_msi ==-1 ) + disable_msi = !!dmi_check_system (msi_blacklist); +if (!disable_msi &&pci_enable_msi (pdev) ==0 ) { err =sky2_test_msi (hw);if (err) {
Greg Kroah-Hartman
maintainerPATCH 27/46 team: Free BPF filter when unregistering netdev
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Ido Schimmel <[email protected]>
[ Upstream commit 692c31bd4054212312396b1d303bffab2c5b93a7 ]
When team is used in loadbalance mode a BPF filter can be used to provide a hash which will determine the Tx port.
When the netdev is later unregistered the filter is not freed which results in memory leaks [1].
Fix by freeing the program and the corresponding filter when unregistering the netdev.
[1]
unreferenced object 0xffff8881dbc47cc8 (size 16):
comm "teamd", pid 3068, jiffies 4294997779 (age 438.247s) hex dump (first 16 bytes):
a3 00 6b 6b 6b 6b 6b 6b 88 a5 82 e1 81 88 ff ff ..kkkkkk........
backtrace:
[<000000008a3b47e3>] team_nl_cmd_options_set+0x88f/0x11b0
[<00000000c4f4f27e>] genl_family_rcv_msg+0x78f/0x1080
[<00000000610ef838>] genl_rcv_msg+0xca/0x170
[<00000000a281df93>] netlink_rcv_skb+0x132/0x380
[<000000004d9448a2>] genl_rcv+0x29/0x40
[<000000000321b2f4>] netlink_unicast+0x4c0/0x690
[<000000008c25dffb>] netlink_sendmsg+0x929/0xe10
[<00000000068298c5>] sock_sendmsg+0xc8/0x110
[<0000000082a61ff0>] ___sys_sendmsg+0x77a/0x8f0
[<00000000663ae29d>] __sys_sendmsg+0xf7/0x250
[<0000000027c5f11a>] do_syscall_64+0x14d/0x610
[<000000006cfbc8d3>] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[<00000000e23197e2>] 0xffffffffffffffff
unreferenced object 0xffff8881e182a588 (size 2048):
comm "teamd", pid 3068, jiffies 4294997780 (age 438.247s)
hex dump (first 32 bytes):
20 00 00 00 02 00 00 00 30 00 00 00 28 f0 ff ff .......0...(...
07 00 00 00 00 00 00 00 28 00 00 00 00 00 00 00 ........(.......
backtrace:
[<000000002daf01fb>] lb_bpf_func_set+0x45c/0x6d0
[<000000008a3b47e3>] team_nl_cmd_options_set+0x88f/0x11b0
[<00000000c4f4f27e>] genl_family_rcv_msg+0x78f/0x1080
[<00000000610ef838>] genl_rcv_msg+0xca/0x170
[<00000000a281df93>] netlink_rcv_skb+0x132/0x380
[<000000004d9448a2>] genl_rcv+0x29/0x40
[<000000000321b2f4>] netlink_unicast+0x4c0/0x690
[<000000008c25dffb>] netlink_sendmsg+0x929/0xe10
[<00000000068298c5>] sock_sendmsg+0xc8/0x110
[<0000000082a61ff0>] ___sys_sendmsg+0x77a/0x8f0
[<00000000663ae29d>] __sys_sendmsg+0xf7/0x250
[<0000000027c5f11a>] do_syscall_64+0x14d/0x610
[<000000006cfbc8d3>] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[<00000000e23197e2>] 0xffffffffffffffff--- drivers/net/team/team_mode_loadbalance.c | 15 +++++++++++++++ 1 file changed, 15 insertions(+)
drivers/net/team/team_mode_loadbalance.c +15 -0
@@ -325,6 +325,20 @@ static int lb_bpf_func_set(struct team *return 0 ; } +static void lb_bpf_func_free (struct team *team) +{ +struct lb_priv *lb_priv =get_lb_priv (team); +struct bpf_prog *fp; + +if (!lb_priv->ex->orig_fprog) +return ; + +__fprog_destroy (lb_priv->ex->orig_fprog); + fp =rcu_dereference_protected (lb_priv->fp, +lockdep_is_held (&team->lock)); +bpf_prog_destroy (fp); +} +static int lb_tx_method_get (struct team *team,struct team_gsetter_ctx *ctx) {struct lb_priv *lb_priv =get_lb_priv (team);
@@ -639,6 +653,7 @@ static void lb_exit(struct team *team)team_options_unregister (team, lb_options,ARRAY_SIZE (lb_options)); +lb_bpf_func_free (team);cancel_delayed_work_sync (&lb_priv->ex->stats.refresh_dw);free_percpu (lb_priv->pcpu_stats);kfree (lb_priv->ex);
Greg Kroah-Hartman
maintainerPATCH 28/46 tipc: fix RDM/DGRAM connect() regression
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Erik Hugne <[email protected]>
[ Upstream commit 0e63208915a8d7590d0a6218dadb2a6a00ac705a ]
Fix regression bug introduced in
commit 365ad353c256 ("tipc: reduce risk of user starvation during link congestion")
Only signal -EDESTADDRREQ for RDM/DGRAM if we don't have a cached sockaddr.
--- net/tipc/socket.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
net/tipc/socket.c +1 -1
@@ -1333,7 +1333,7 @@ static int __tipc_sendmsg(struct socketif (unlikely (!dest)) { dest = &tsk->peer; -if (!syn || dest->family !=AF_TIPC ) +if (!syn && dest->family !=AF_TIPC )return -EDESTADDRREQ ; }
Greg Kroah-Hartman
maintainerPATCH 29/46 x86/CPU/AMD: Set the CPB bit unconditionally on F17h
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Jiaxun Yang <[email protected]>
commit 0237199186e7a4aa5310741f0a6498a20c820fd7 upstream.
Some F17h models do not have CPB set in CPUID even though the CPU supports it. Set the feature bit unconditionally on all F17h.
[ bp: Rewrite commit message and patch. ]
--- arch/x86/kernel/cpu/amd.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-)
arch/x86/kernel/cpu/amd.c +3 -5
@@ -819,11 +819,9 @@ static void init_amd_bd(struct cpuinfo_xstatic void init_amd_zn (struct cpuinfo_x86 *c) {set_cpu_cap (c,X86_FEATURE_ZEN ); -/* -* Fix erratum 1076: CPB feature bit not being set in CPUID. It affects -* all up to and including B1. -*/ -if (c->x86_model <=1 && c->x86_stepping <=1 ) + +/* Fix erratum 1076: CPB feature bit not being set in CPUID. */ +if (!cpu_has (c,X86_FEATURE_CPB ))set_cpu_cap (c,X86_FEATURE_CPB ); }
Greg Kroah-Hartman
maintainerPATCH 30/46 x86/boot/compressed/64: Do not read legacy ROM on EFI system
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
commit 6f913de3231e1d70a871135b38219da7810df218 upstream.
EFI systems do not necessarily provide a legacy ROM. If the ROM is missing the memory is not mapped at all.
Trying to dereference values in the legacy ROM area leads to a crash on Macbook Pro.
Only look for values in the legacy ROM area for non-EFI system.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202351
--- arch/x86/boot/compressed/pgtable_64.c | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-)
arch/x86/boot/compressed/pgtable_64.c +16 -3
@@ -1,5 +1,7 @@ +#include <linux/efi.h> #include <asm/e820/types.h> #include <asm/processor.h> +#include <asm/efi.h> #include "pgtable.h" #include "../string.h"
@@ -37,9 +39,10 @@ int cmdline_find_option_bool(const charstatic unsigned long find_trampoline_placement (void ) { -unsigned long bios_start, ebda_start; +unsigned long bios_start =0 , ebda_start =0 ;unsigned long trampoline_start;struct boot_e820_entry *entry; +char *signature;int i;/*
@@ -47,8 +50,18 @@ static unsigned long find_trampoline_pla* This code is based on reserve_bios_regions(). */ - ebda_start = *(unsigned short *)0x40e <<4 ; - bios_start = *(unsigned short *)0x413 <<10 ; +/* +* EFI systems may not provide legacy ROM. The memory may not be mapped +* at all. +* +* Only look for values in the legacy ROM for non-EFI system. +*/ + signature = (char *)&boot_params->efi_info.efi_loader_signature; +if (strncmp (signature,EFI32_LOADER_SIGNATURE ,4 ) && +strncmp (signature,EFI64_LOADER_SIGNATURE ,4 )) { + ebda_start = *(unsigned short *)0x40e <<4 ; + bios_start = *(unsigned short *)0x413 <<10 ; + }if (bios_start <BIOS_START_MIN || bios_start >BIOS_START_MAX ) bios_start =BIOS_START_MAX ;
Re: [PATCH 5.0 30/46] x86/boot/compressed/64: Do not read legacy ROM on EFI system
Quoted 78 lines · Greg Kroah-Hartman
5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
commit
6f913de3231e1d70a871135b38219da7810df218upstream.EFI systems do not necessarily provide a legacy ROM. If the ROM is missing
the memory is not mapped at all.Trying to dereference values in the legacy ROM area leads to a crash on Macbook Pro.
Only look for values in the legacy ROM area for non-EFI system.
Fixes 3548e131ec6a ("x86/boot/compressed/64: Find a place for 32-bittrampoline")
Reported-by Pitam Mitra <[email protected]>Signed-off-by Kirill A. Shutemov <[email protected]>Signed-off-by Thomas Gleixner <[email protected]>Tested-by Bockjoo Kim <[email protected]>Link:
https://lkml.kernel.org/r/[email protected]
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202351Signed-off-by Greg Kroah-Hartman <[email protected]>---
arch/x86/boot/compressed/pgtable_64.c| 19 ++++++++++++++++---1 file changed, 16 insertions(+), 3 deletions(-)arch/x86/boot/compressed/pgtable_64.c +6
-3@@ -1,5 +1,7 @@ +#include <linux/efi.h> #include <asm/e820/types.h> #include <asm/processor.h> +#include <asm/efi.h> #include "pgtable.h" #include "../string.h" @@ -37,9 +39,10 @@ int cmdline_find_option_bool(const charstatic unsigned long find_trampoline_placement (void ) { -unsigned long bios_start, ebda_start; +unsigned long bios_start =0 , ebda_start =0 ;unsigned long trampoline_start;struct boot_e820_entry *entry; +char *signature;int i;/* @@ -47,8 +50,18 @@ static unsigned long find_trampoline_pla* This code is based on reserve_bios_regions(). */ - ebda_start = *(unsigned short *)0x40e <<4 ; - bios_start = *(unsigned short *)0x413 <<10 ; +/* +* EFI systems may not provide legacy ROM. The memory may not be mapped
arch/x86/boot/compressed/pgtable_64.c +10
-0+* at all. +* +* Only look for values in the legacy ROM for non-EFI system. +*/ + signature = (char *)&boot_params->efi_info.efi_loader_signature; +if (strncmp (signature,EFI32_LOADER_SIGNATURE ,4 ) && +strncmp (signature,EFI64_LOADER_SIGNATURE ,4 )) { + ebda_start = *(unsigned short *)0x40e <<4 ; + bios_start = *(unsigned short *)0x413 <<10 ; + }
Quoted 2 lines
if (bios_start < BIOS_START_MIN || bios_start > BIOS_START_MAX) bios_start = BIOS_START_MAX;
Only one objection: the explanation is nonsensical.
Signature · 1 line
Sent from my Android device with K-9 Mail. Please excuse my brevity.
Greg Kroah-Hartman
maintainerRe: [PATCH 5.0 30/46] x86/boot/compressed/64: Do not read legacy ROM on EFI system
Quoted 79 lines · On Sat, Mar 09, 2019 at 10:10:19PM -0800, [email protected] wrote:
Quoted 78 lines · Greg Kroah-Hartman
5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kirill A. Shutemov <[email protected]>
commit
6f913de3231e1d70a871135b38219da7810df218upstream.EFI systems do not necessarily provide a legacy ROM. If the ROM is missing
the memory is not mapped at all.Trying to dereference values in the legacy ROM area leads to a crash on Macbook Pro.
Only look for values in the legacy ROM area for non-EFI system.
Fixes 3548e131ec6a ("x86/boot/compressed/64: Find a place for 32-bittrampoline")
Reported-by Pitam Mitra <[email protected]>Signed-off-by Kirill A. Shutemov <[email protected]>Signed-off-by Thomas Gleixner <[email protected]>Tested-by Bockjoo Kim <[email protected]>Link:
https://lkml.kernel.org/r/[email protected]
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202351Signed-off-by Greg Kroah-Hartman <[email protected]>---
arch/x86/boot/compressed/pgtable_64.c| 19 ++++++++++++++++---1 file changed, 16 insertions(+), 3 deletions(-)arch/x86/boot/compressed/pgtable_64.c +6
-3@@ -1,5 +1,7 @@ +#include <linux/efi.h> #include <asm/e820/types.h> #include <asm/processor.h> +#include <asm/efi.h> #include "pgtable.h" #include "../string.h" @@ -37,9 +39,10 @@ int cmdline_find_option_bool(const charstatic unsigned long find_trampoline_placement (void ) { -unsigned long bios_start, ebda_start; +unsigned long bios_start =0 , ebda_start =0 ;unsigned long trampoline_start;struct boot_e820_entry *entry; +char *signature;int i;/* @@ -47,8 +50,18 @@ static unsigned long find_trampoline_pla* This code is based on reserve_bios_regions(). */ - ebda_start = *(unsigned short *)0x40e <<4 ; - bios_start = *(unsigned short *)0x413 <<10 ; +/* +* EFI systems may not provide legacy ROM. The memory may not be mapped
arch/x86/boot/compressed/pgtable_64.c +10
-0+* at all. +* +* Only look for values in the legacy ROM for non-EFI system. +*/ + signature = (char *)&boot_params->efi_info.efi_loader_signature; +if (strncmp (signature,EFI32_LOADER_SIGNATURE ,4 ) && +strncmp (signature,EFI64_LOADER_SIGNATURE ,4 )) { + ebda_start = *(unsigned short *)0x40e <<4 ; + bios_start = *(unsigned short *)0x413 <<10 ; + }
Quoted 4 lines
Quoted 2 lines
if (bios_start < BIOS_START_MIN || bios_start > BIOS_START_MAX) bios_start = BIOS_START_MAX;Only one objection: the explanation is nonsensical.
Heh, take it up with the original submitter, I don't change the changelog text after it hits Linus's tree :)
greg k-h
Re: [PATCH 5.0 30/46] x86/boot/compressed/64: Do not read legacy ROM on EFI system
Quoted 90 lines · Greg Kroah-Hartman
Quoted 1 line · On Sat, Mar 09, 2019 at 10:10:19PM -0800, [email protected] wrote:
On March 8, 2019 4:50:03 AM PST, Greg Kroah-Hartman
Quoted 1 line · <[email protected]> wrote:
Quoted 1 line
5.0-stable review patch. If anyone has any objections, please let
me
Quoted 6 lines
Quoted 6 lines
know.
------------------
From: Kirill A. Shutemov <[email protected]>
Quoted 7 lines
Quoted 7 lines
commit
6f913de3231e1d70a871135b38219da7810df218upstream.EFI systems do not necessarily provide a legacy ROM. If the ROM is missing
the memory is not mapped at all.Trying to dereference values in the legacy ROM area leads to a crash
on
Quoted 5 lines
Quoted 5 lines
Macbook Pro.
Only look for values in the legacy ROM area for non-EFI system.
Fixes 3548e131ec6a ("x86/boot/compressed/64: Find a place for32-bit
Quoted 60 lines
Quoted 9 lines
trampoline")
Reported-by Pitam Mitra <[email protected]>Signed-off-by Kirill A. Shutemov <[email protected]>Signed-off-by Thomas Gleixner <[email protected]>Tested-by Bockjoo Kim <[email protected]>Link:
https://lkml.kernel.org/r/[email protected]
Quoted 49 lines
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=202351
Signed-off-by Greg Kroah-Hartman <[email protected]>---
arch/x86/boot/compressed/pgtable_64.c| 19 ++++++++++++++++---1 file changed, 16 insertions(+), 3 deletions(-)arch/x86/boot/compressed/pgtable_64.c +6
-3@@ -1,5 +1,7 @@ +#include <linux/efi.h> #include <asm/e820/types.h> #include <asm/processor.h> +#include <asm/efi.h> #include "pgtable.h" #include "../string.h" @@ -37,9 +39,10 @@ int cmdline_find_option_bool(const charstatic unsigned long find_trampoline_placement (void ) { -unsigned long bios_start, ebda_start; +unsigned long bios_start =0 , ebda_start =0 ;unsigned long trampoline_start;struct boot_e820_entry *entry; +char *signature;int i;/* @@ -47,8 +50,18 @@ static unsigned long find_trampoline_pla* This code is based on reserve_bios_regions(). */ - ebda_start = *(unsigned short *)0x40e <<4 ; - bios_start = *(unsigned short *)0x413 <<10 ; +/* +* EFI systems may not provide legacy ROM. The memory may not be mapped
arch/x86/boot/compressed/pgtable_64.c +10
-0+* at all. +* +* Only look for values in the legacy ROM for non-EFI system. +*/ + signature = (char *)&boot_params->efi_info.efi_loader_signature; +if (strncmp (signature,EFI32_LOADER_SIGNATURE ,4 ) && +strncmp (signature,EFI64_LOADER_SIGNATURE ,4 )) { + ebda_start = *(unsigned short *)0x40e <<4 ; + bios_start = *(unsigned short *)0x413 <<10 ; + }Quoted 4 lines
Quoted 2 lines
if (bios_start < BIOS_START_MIN || bios_start > BIOS_START_MAX) bios_start = BIOS_START_MAX;Only one objection: the explanation is nonsensical.
Quoted 4 lines
Heh, take it up with the original submitter, I don't change the changelog text after it hits Linus's tree :)
greg k-h
:)
Signature · 1 line
Sent from my Android device with K-9 Mail. Please excuse my brevity.
Re: [PATCH 5.0 30/46] x86/boot/compressed/64: Do not read legacy ROM on EFI system
In reply to [email protected]Quoted 20 lines · On Sat, Mar 09, 2019 at 10:10:19PM -0800, [email protected] wrote:
Quoted 20 lines
arch/x86/boot/compressed/pgtable_64.c +2
-2@@ -47,8 +50,18 @@ static unsigned long find_trampoline_pla* This code is based on reserve_bios_regions(). */ - ebda_start = *(unsigned short *)0x40e <<4 ; - bios_start = *(unsigned short *)0x413 <<10 ; +/* +* EFI systems may not provide legacy ROM. The memory may not be mapped
arch/x86/boot/compressed/pgtable_64.c +10
-0+* at all. +* +* Only look for values in the legacy ROM for non-EFI system. +*/ + signature = (char *)&boot_params->efi_info.efi_loader_signature; +if (strncmp (signature,EFI32_LOADER_SIGNATURE ,4 ) && +strncmp (signature,EFI64_LOADER_SIGNATURE ,4 )) { + ebda_start = *(unsigned short *)0x40e <<4 ; + bios_start = *(unsigned short *)0x413 <<10 ; + }
Quoted 4 lines
Quoted 2 lines
if (bios_start < BIOS_START_MIN || bios_start > BIOS_START_MAX) bios_start = BIOS_START_MAX;Only one objection: the explanation is nonsensical.
Well, that's the best explanation I've come up with :/
I would be glad for any insight here.
Signature · 1 line
Kirill A. Shutemov
Greg Kroah-Hartman
maintainerPATCH 31/46 tracing: Fix event filters and triggers to handle negative numbers
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Pavel Tikhomirov <[email protected]>
commit 6a072128d262d2b98d31626906a96700d1fc11eb upstream.
Then tracing syscall exit event it is extremely useful to filter exit codes equal to some negative value, to react only to required errors. But negative numbers does not work:
[root@snorch sys_exit_read]# echo "ret == -1" > filter
bash: echo: write error: Invalid argument [root@snorch sys_exit_read]# cat filter
ret == -1
^
parse_error: Invalid value (did you forget quotes)?
Similar thing happens when setting triggers.
These is a regression in v4.17 introduced by the commit mentioned below, testing without these commit shows no problem with negative numbers.
--- kernel/trace/trace_events_filter.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)
kernel/trace/trace_events_filter.c +4 -1
@@ -1301,7 +1301,7 @@ static int parse_pred(const char *str, v/* go past the last quote */ i++; - }else if (isdigit (str[i])) { + }else if (isdigit (str[i]) || str[i] =='-' ) {/* Make sure the field is not a string */ if (is_string_field (field)) {
@@ -1314,6 +1314,9 @@ static int parse_pred(const char *str, v goto err_free; } +if (str[i] =='-' ) + i++; +/* We allow 0xDEADBEEF */ while (isalnum (str[i])) i++;
Greg Kroah-Hartman
maintainerPATCH 32/46 xhci: tegra: Prevent error pointer dereference
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Thierry Reding <[email protected]>
commit 0326ccb5feac6eac35ba6254260e2774277cd976 upstream.
During initialization, the host and super-speed power domains will contain an ERR_PTR() encoded error code rather than being NULL. To avoid a crash, use a !IS_ERR_OR_NULL() condition during cleanup.
--- drivers/usb/host/xhci-tegra.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
drivers/usb/host/xhci-tegra.c +2 -2
@@ -941,9 +941,9 @@ static void tegra_xusb_powerdomain_removdevice_link_del (tegra->genpd_dl_ss);if (tegra->genpd_dl_host)device_link_del (tegra->genpd_dl_host); -if (tegra->genpd_dev_ss) +if (!IS_ERR_OR_NULL (tegra->genpd_dev_ss))dev_pm_domain_detach (tegra->genpd_dev_ss, true); -if (tegra->genpd_dev_host) +if (!IS_ERR_OR_NULL (tegra->genpd_dev_host))dev_pm_domain_detach (tegra->genpd_dev_host, true); }
Greg Kroah-Hartman
maintainerPATCH 33/46 usb: xhci: Fix for Enabling USB ROLE SWITCH QUIRK on INTEL_SUNRISEPOINT_LP_XHCI
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Balaji Manoharan <[email protected]>
commit 8fde481ef3674ae5ad0dbfef4df18ff507c5675a upstream.
This fix enables USB role feature on intel commercial nuc platform which is based on Kabylake chipset.
--- drivers/usb/host/xhci-pci.c | 1 + 1 file changed, 1 insertion(+)
drivers/usb/host/xhci-pci.c +1 -0
@@ -194,6 +194,7 @@ static void xhci_pci_quirks(struct devic xhci->quirks |=XHCI_SSIC_PORT_UNUSED ;if (pdev->vendor ==PCI_VENDOR_ID_INTEL && (pdev->device ==PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI || + pdev->device ==PCI_DEVICE_ID_INTEL_SUNRISEPOINT_LP_XHCI || pdev->device ==PCI_DEVICE_ID_INTEL_APL_XHCI )) xhci->quirks |=XHCI_INTEL_USB_ROLE_SW ; if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
Greg Kroah-Hartman
maintainerPATCH 34/46 applicom: Fix potential Spectre v1 vulnerabilities
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Gustavo A. R. Silva <[email protected]>
commit d7ac3c6ef5d8ce14b6381d52eb7adafdd6c8bb3c upstream.
IndexCard is indirectly controlled by user-space, hence leading to a potential exploitation of the Spectre variant 1 vulnerability.
This issue was detected with the help of Smatch:
drivers/char/applicom.c:418 ac_write() warn: potential spectre issue 'apbs' [r] drivers/char/applicom.c:728 ac_ioctl() warn: potential spectre issue 'apbs' [r] (local cap)
Fix this by sanitizing IndexCard before using it to index apbs.
Notice that given that speculation windows are large, the policy is to kill the speculation on the first load and not worry if it can be completed with a dependent load/store [1].
[1] https://lore.kernel.org/lkml/[email protected]/
--- drivers/char/applicom.c | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-)
drivers/char/applicom.c +24 -11
@@ -32,6 +32,7 @@#include <linux/wait.h> #include <linux/init.h> #include <linux/fs.h> +#include <linux/nospec.h> #include <asm/io.h> #include <linux/uaccess.h>
@@ -386,7 +387,11 @@ static ssize_t ac_write(struct file *fil TicCard = st_loc.tic_des_from_pc;/* tic number to send */ IndexCard = NumCard -1 ; -if ((NumCard <1 ) || (NumCard >MAX_BOARD ) || !apbs[IndexCard].RamIO) +if (IndexCard >=MAX_BOARD ) +return -EINVAL ; + IndexCard =array_index_nospec (IndexCard,MAX_BOARD ); + +if (!apbs[IndexCard].RamIO)return -EINVAL ;#ifdef DEBUG
@@ -697,6 +702,7 @@ static long ac_ioctl(struct file *file,unsigned char IndexCard;void __iomem *pmem;int ret =0 ; +static int warncount =10 ;volatile unsigned char byte_reset_it;struct st_ram_io *adgl;void __user *argp = (void __user *)arg;
@@ -711,16 +717,12 @@ static long ac_ioctl(struct file *file,mutex_lock (&ac_mutex); IndexCard = adgl->num_card-1 ; -if (cmd !=6 && ((IndexCard >=MAX_BOARD ) || !apbs[IndexCard].RamIO)) { -static int warncount =10 ; -if (warncount) { -printk (KERN_WARNING "APPLICOM driver IOCTL, bad board number %d\n" ,(int )IndexCard+1 ); - warncount--; - } -kfree (adgl); -mutex_unlock (&ac_mutex); -return -EINVAL ; - } +if (cmd !=6 && IndexCard >=MAX_BOARD ) + goto err; + IndexCard =array_index_nospec (IndexCard,MAX_BOARD ); + +if (cmd !=6 && !apbs[IndexCard].RamIO) + goto err;switch (cmd) {
@@ -838,5 +840,16 @@ static long ac_ioctl(struct file *file,kfree (adgl);mutex_unlock (&ac_mutex);return 0 ; + +err: +if (warncount) { +pr_warn ("APPLICOM driver IOCTL, bad board number %d\n" , + (int )IndexCard +1 ); + warncount--; + } +kfree (adgl); +mutex_unlock (&ac_mutex); +return -EINVAL ; + }
Greg Kroah-Hartman
maintainerPATCH 35/46 alpha: wire up io_pgetevents system call
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Arnd Bergmann <[email protected]>
commit d012d1325ba523b8ef3e55ba79c943e220154fdc upstream.
The io_pgetevents system call was added in linux-4.18 but has no entry for alpha:
warning: #warning syscall io_pgetevents not implemented [-Wcpp]
Assign a the next system call number here.
--- arch/alpha/kernel/syscalls/syscall.tbl | 1 + 1 file changed, 1 insertion(+)
arch/alpha/kernel/syscalls/syscall.tbl +1 -0
@@ -451,3 +451,4 @@ 520 common preadv2 sys_preadv2 521 common pwritev2 sys_pwritev2 522 common statx sys_statx +523 common io_pgetevents sys_io_pgetevents
Greg Kroah-Hartman
maintainerPATCH 36/46 MIPS: irq: Allocate accurate order pages for irq stack
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Liu Xiang <[email protected]>
commit 72faa7a773ca59336f3c889e878de81445c5a85c upstream.
The irq_pages is the number of pages for irq stack, but not the order which is needed by __get_free_pages().
We can use get_order() to calculate the accurate order.
--- arch/mips/kernel/irq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/mips/kernel/irq.c +2 -2
@@ -52,6 +52,7 @@ asmlinkage void spurious_interrupt(void)void __init init_IRQ (void ) {int i; +unsigned int order =get_order (IRQ_STACK_SIZE );for (i =0 ; i <NR_IRQS ; i++)irq_set_noprobe (i);
@@ -62,8 +63,7 @@ void __init init_IRQ(void)arch_init_irq ();for_each_possible_cpu (i) { -int irq_pages =IRQ_STACK_SIZE /PAGE_SIZE ; -void *s = (void *)__get_free_pages (GFP_KERNEL , irq_pages); +void *s = (void *)__get_free_pages (GFP_KERNEL , order); irq_stack[i] = s; pr_debug("CPU%d IRQ stack at 0x%p - 0x%p\n", i,
Greg Kroah-Hartman
maintainerPATCH 37/46 aio: Fix locking in aio_poll()
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Bart Van Assche <[email protected]>
commit d3d6a18d7d351cbcc9b33dbedf710e65f8ce1595 upstream.
wake_up_locked() may but does not have to be called with interrupts disabled. Since the fuse filesystem calls wake_up_locked() without disabling interrupts aio_poll_wake() may be called with interrupts enabled. Since the kioctx.ctx_lock may be acquired from IRQ context, all code that acquires that lock from thread context must disable interrupts. Hence change the spin_trylock() call in aio_poll_wake() into a spin_trylock_irqsave() call. This patch fixes the following lockdep complaint:
=====================================================
WARNING: SOFTIRQ-safe -> SOFTIRQ-unsafe lock order detected 5.0.0-rc4-next-20190131 #23 Not tainted
-----------------------------------------------------
syz-executor2/13779 [HC0[0]:SC0[0]:HE0:SE1] is trying to acquire:0000000098ac1230 (&fiq->waitq){+.+.}, at: spin_lock include/linux/spinlock.h:329 [inline] 0000000098ac1230 (&fiq->waitq){+.+.}, at: aio_poll fs/aio.c:1772 [inline] 0000000098ac1230 (&fiq->waitq){+.+.}, at: __io_submit_one fs/aio.c:1875 [inline] 0000000098ac1230 (&fiq->waitq){+.+.}, at: io_submit_one+0xedf/0x1cf0 fs/aio.c:1908
and this task is already holding:000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: spin_lock_irq include/linux/spinlock.h:354 [inline] 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: aio_poll fs/aio.c:1771 [inline] 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: __io_submit_one fs/aio.c:1875 [inline] 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: io_submit_one+0xeb6/0x1cf0 fs/aio.c:1908 which would create a new lock dependency:
(&(&ctx->ctx_lock)->rlock){..-.} -> (&fiq->waitq){+.+.}
but this new dependency connects a SOFTIRQ-irq-safe lock:
(&(&ctx->ctx_lock)->rlock){..-.}
... which became SOFTIRQ-irq-safe at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826 __raw_spin_lock_irq include/linux/spinlock_api_smp.h:128 [inline] _raw_spin_lock_irq+0x60/0x80 kernel/locking/spinlock.c:160 spin_lock_irq include/linux/spinlock.h:354 [inline] free_ioctx_users+0x2d/0x4a0 fs/aio.c:610 percpu_ref_put_many include/linux/percpu-refcount.h:285 [inline] percpu_ref_put include/linux/percpu-refcount.h:301 [inline] percpu_ref_call_confirm_rcu lib/percpu-refcount.c:123 [inline] percpu_ref_switch_to_atomic_rcu+0x3e7/0x520 lib/percpu-refcount.c:158 __rcu_reclaim kernel/rcu/rcu.h:240 [inline] rcu_do_batch kernel/rcu/tree.c:2486 [inline] invoke_rcu_callbacks kernel/rcu/tree.c:2799 [inline] rcu_core+0x928/0x1390 kernel/rcu/tree.c:2780 __do_softirq+0x266/0x95a kernel/softirq.c:292 run_ksoftirqd kernel/softirq.c:654 [inline] run_ksoftirqd+0x8e/0x110 kernel/softirq.c:646 smpboot_thread_fn+0x6ab/0xa10 kernel/smpboot.c:164 kthread+0x357/0x430 kernel/kthread.c:247 ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:352
to a SOFTIRQ-irq-unsafe lock:
(&fiq->waitq){+.+.}
... which became SOFTIRQ-irq-unsafe at:
...
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826 __raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline] _raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144 spin_lock include/linux/spinlock.h:329 [inline] flush_bg_queue+0x1f3/0x3c0 fs/fuse/dev.c:415 fuse_request_queue_background+0x2d1/0x580 fs/fuse/dev.c:676 fuse_request_send_background+0x58/0x120 fs/fuse/dev.c:687 fuse_send_init fs/fuse/inode.c:989 [inline] fuse_fill_super+0x13bb/0x1730 fs/fuse/inode.c:1214 mount_nodev+0x68/0x110 fs/super.c:1392 fuse_mount+0x2d/0x40 fs/fuse/inode.c:1239 legacy_get_tree+0xf2/0x200 fs/fs_context.c:590 vfs_get_tree+0x123/0x450 fs/super.c:1481 do_new_mount fs/namespace.c:2610 [inline] do_mount+0x1436/0x2c40 fs/namespace.c:2932 ksys_mount+0xdb/0x150 fs/namespace.c:3148 __do_sys_mount fs/namespace.c:3162 [inline] __se_sys_mount fs/namespace.c:3159 [inline] __x64_sys_mount+0xbe/0x150 fs/namespace.c:3159 do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290 entry_SYSCALL_64_after_hwframe+0x49/0xbe
other info that might help us debug this:
Possible interrupt unsafe locking scenario:
CPU0 CPU1
---- ----
lock(&fiq->waitq);
local_irq_disable();
lock(&(&ctx->ctx_lock)->rlock);
lock(&fiq->waitq);
<Interrupt>
lock(&(&ctx->ctx_lock)->rlock);*** DEADLOCK ***
1 lock held by syz-executor2/13779:
#0: 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: spin_lock_irq include/linux/spinlock.h:354 [inline] #0: 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: aio_poll fs/aio.c:1771 [inline] #0: 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: __io_submit_one fs/aio.c:1875 [inline] #0: 000000003c46111c (&(&ctx->ctx_lock)->rlock){..-.}, at: io_submit_one+0xeb6/0x1cf0 fs/aio.c:1908
the dependencies between SOFTIRQ-irq-safe lock and the holding lock:
-> (&(&ctx->ctx_lock)->rlock){..-.} {
IN-SOFTIRQ-W at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock_irq include/linux/spinlock_api_smp.h:128 [inline]
_raw_spin_lock_irq+0x60/0x80 kernel/locking/spinlock.c:160
spin_lock_irq include/linux/spinlock.h:354 [inline]
free_ioctx_users+0x2d/0x4a0 fs/aio.c:610
percpu_ref_put_many include/linux/percpu-refcount.h:285 [inline]
percpu_ref_put include/linux/percpu-refcount.h:301 [inline]
percpu_ref_call_confirm_rcu lib/percpu-refcount.c:123 [inline]
percpu_ref_switch_to_atomic_rcu+0x3e7/0x520 lib/percpu-refcount.c:158
__rcu_reclaim kernel/rcu/rcu.h:240 [inline]
rcu_do_batch kernel/rcu/tree.c:2486 [inline]
invoke_rcu_callbacks kernel/rcu/tree.c:2799 [inline]
rcu_core+0x928/0x1390 kernel/rcu/tree.c:2780
__do_softirq+0x266/0x95a kernel/softirq.c:292
run_ksoftirqd kernel/softirq.c:654 [inline]
run_ksoftirqd+0x8e/0x110 kernel/softirq.c:646
smpboot_thread_fn+0x6ab/0xa10 kernel/smpboot.c:164
kthread+0x357/0x430 kernel/kthread.c:247
ret_from_fork+0x3a/0x50 arch/x86/entry/entry_64.S:352
INITIAL USE at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock_irq include/linux/spinlock_api_smp.h:128 [inline]
_raw_spin_lock_irq+0x60/0x80 kernel/locking/spinlock.c:160
spin_lock_irq include/linux/spinlock.h:354 [inline]
__do_sys_io_cancel fs/aio.c:2052 [inline]
__se_sys_io_cancel fs/aio.c:2035 [inline]
__x64_sys_io_cancel+0xd5/0x5a0 fs/aio.c:2035
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
}
... key at: [<ffffffff8a574140>] __key.52370+0x0/0x40
... acquired at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144
spin_lock include/linux/spinlock.h:329 [inline]
aio_poll fs/aio.c:1772 [inline]
__io_submit_one fs/aio.c:1875 [inline]
io_submit_one+0xedf/0x1cf0 fs/aio.c:1908
__do_sys_io_submit fs/aio.c:1953 [inline]
__se_sys_io_submit fs/aio.c:1923 [inline]
__x64_sys_io_submit+0x1bd/0x580 fs/aio.c:1923
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbethe dependencies between the lock to be acquired
and SOFTIRQ-irq-unsafe lock:
-> (&fiq->waitq){+.+.} {
HARDIRQ-ON-W at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144
spin_lock include/linux/spinlock.h:329 [inline]
flush_bg_queue+0x1f3/0x3c0 fs/fuse/dev.c:415
fuse_request_queue_background+0x2d1/0x580 fs/fuse/dev.c:676
fuse_request_send_background+0x58/0x120 fs/fuse/dev.c:687
fuse_send_init fs/fuse/inode.c:989 [inline]
fuse_fill_super+0x13bb/0x1730 fs/fuse/inode.c:1214
mount_nodev+0x68/0x110 fs/super.c:1392
fuse_mount+0x2d/0x40 fs/fuse/inode.c:1239
legacy_get_tree+0xf2/0x200 fs/fs_context.c:590
vfs_get_tree+0x123/0x450 fs/super.c:1481
do_new_mount fs/namespace.c:2610 [inline]
do_mount+0x1436/0x2c40 fs/namespace.c:2932
ksys_mount+0xdb/0x150 fs/namespace.c:3148
__do_sys_mount fs/namespace.c:3162 [inline]
__se_sys_mount fs/namespace.c:3159 [inline]
__x64_sys_mount+0xbe/0x150 fs/namespace.c:3159
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
SOFTIRQ-ON-W at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144
spin_lock include/linux/spinlock.h:329 [inline]
flush_bg_queue+0x1f3/0x3c0 fs/fuse/dev.c:415
fuse_request_queue_background+0x2d1/0x580 fs/fuse/dev.c:676
fuse_request_send_background+0x58/0x120 fs/fuse/dev.c:687
fuse_send_init fs/fuse/inode.c:989 [inline]
fuse_fill_super+0x13bb/0x1730 fs/fuse/inode.c:1214
mount_nodev+0x68/0x110 fs/super.c:1392
fuse_mount+0x2d/0x40 fs/fuse/inode.c:1239
legacy_get_tree+0xf2/0x200 fs/fs_context.c:590
vfs_get_tree+0x123/0x450 fs/super.c:1481
do_new_mount fs/namespace.c:2610 [inline]
do_mount+0x1436/0x2c40 fs/namespace.c:2932
ksys_mount+0xdb/0x150 fs/namespace.c:3148
__do_sys_mount fs/namespace.c:3162 [inline]
__se_sys_mount fs/namespace.c:3159 [inline]
__x64_sys_mount+0xbe/0x150 fs/namespace.c:3159
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
INITIAL USE at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144
spin_lock include/linux/spinlock.h:329 [inline]
flush_bg_queue+0x1f3/0x3c0 fs/fuse/dev.c:415
fuse_request_queue_background+0x2d1/0x580 fs/fuse/dev.c:676
fuse_request_send_background+0x58/0x120 fs/fuse/dev.c:687
fuse_send_init fs/fuse/inode.c:989 [inline]
fuse_fill_super+0x13bb/0x1730 fs/fuse/inode.c:1214
mount_nodev+0x68/0x110 fs/super.c:1392
fuse_mount+0x2d/0x40 fs/fuse/inode.c:1239
legacy_get_tree+0xf2/0x200 fs/fs_context.c:590
vfs_get_tree+0x123/0x450 fs/super.c:1481
do_new_mount fs/namespace.c:2610 [inline]
do_mount+0x1436/0x2c40 fs/namespace.c:2932
ksys_mount+0xdb/0x150 fs/namespace.c:3148
__do_sys_mount fs/namespace.c:3162 [inline]
__se_sys_mount fs/namespace.c:3159 [inline]
__x64_sys_mount+0xbe/0x150 fs/namespace.c:3159
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
}
... key at: [<ffffffff8a60dec0>] __key.43450+0x0/0x40
... acquired at:
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144
spin_lock include/linux/spinlock.h:329 [inline]
aio_poll fs/aio.c:1772 [inline]
__io_submit_one fs/aio.c:1875 [inline]
io_submit_one+0xedf/0x1cf0 fs/aio.c:1908
__do_sys_io_submit fs/aio.c:1953 [inline]
__se_sys_io_submit fs/aio.c:1923 [inline]
__x64_sys_io_submit+0x1bd/0x580 fs/aio.c:1923
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe
stack backtrace:
CPU: 0 PID: 13779 Comm: syz-executor2 Not tainted 5.0.0-rc4-next-20190131 #23
Hardware name: Google Google Compute Engine/Google Compute Engine, BIOS Google 01/01/2011
Call Trace:
__dump_stack lib/dump_stack.c:77 [inline]
dump_stack+0x172/0x1f0 lib/dump_stack.c:113
print_bad_irq_dependency kernel/locking/lockdep.c:1573 [inline]
check_usage.cold+0x60f/0x940 kernel/locking/lockdep.c:1605
check_irq_usage kernel/locking/lockdep.c:1650 [inline]
check_prev_add_irq kernel/locking/lockdep_states.h:8 [inline]
check_prev_add kernel/locking/lockdep.c:1860 [inline]
check_prevs_add kernel/locking/lockdep.c:1968 [inline]
validate_chain kernel/locking/lockdep.c:2339 [inline]
__lock_acquire+0x1f12/0x4790 kernel/locking/lockdep.c:3320
lock_acquire+0x16f/0x3f0 kernel/locking/lockdep.c:3826
__raw_spin_lock include/linux/spinlock_api_smp.h:142 [inline]
_raw_spin_lock+0x2f/0x40 kernel/locking/spinlock.c:144
spin_lock include/linux/spinlock.h:329 [inline]
aio_poll fs/aio.c:1772 [inline]
__io_submit_one fs/aio.c:1875 [inline]
io_submit_one+0xedf/0x1cf0 fs/aio.c:1908
__do_sys_io_submit fs/aio.c:1953 [inline]
__se_sys_io_submit fs/aio.c:1923 [inline]
__x64_sys_io_submit+0x1bd/0x580 fs/aio.c:1923
do_syscall_64+0x103/0x610 arch/x86/entry/common.c:290
entry_SYSCALL_64_after_hwframe+0x49/0xbe--- fs/aio.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-)
fs/aio.c +9 -3
@@ -1680,6 +1680,7 @@ static int aio_poll_wake(struct wait_que struct poll_iocb *req = container_of(wait, struct poll_iocb, wait); struct aio_kiocb *iocb = container_of(req, struct aio_kiocb, poll);__poll_t mask =key_to_poll (key); +unsigned long flags; req->woken = true;
@@ -1688,10 +1689,15 @@ static int aio_poll_wake(struct wait_queif (!(mask & req->events))return 0 ; -/* try to complete the iocb inline if we can: */ -if (spin_trylock (&iocb->ki_ctx->ctx_lock)) { +/* +* Try to complete the iocb inline if we can. Use +* irqsave/irqrestore because not all filesystems (e.g. fuse) +* call this function with IRQs disabled and because IRQs +* have to be disabled before ctx_lock is obtained. +*/ +if (spin_trylock_irqsave (&iocb->ki_ctx->ctx_lock, flags)) {list_del (&iocb->ki_list); -spin_unlock (&iocb->ki_ctx->ctx_lock); +spin_unlock_irqrestore (&iocb->ki_ctx->ctx_lock, flags);list_del_init (&req->wait.entry);aio_poll_complete (iocb, mask);
Greg Kroah-Hartman
maintainerPATCH 38/46 xtensa: fix get_wchan
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Max Filippov <[email protected]>
commit d90b88fd3653f1fb66ecc6571b860d5a5749fa56 upstream.
Stack unwinding is implemented incorrectly in xtensa get_wchan: instead of extracting a0 and a1 registers from the spill location under the stack pointer it extracts a word pointed to by the stack pointer and subtracts 4 or 3 from it.
--- arch/xtensa/kernel/process.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
arch/xtensa/kernel/process.c +2 -2
@@ -321,8 +321,8 @@ unsigned long get_wchan(struct task_stru/* Stack layout: sp-4: ra, sp-3: sp' */ - pc =MAKE_PC_FROM_RA (*(unsigned long *)sp -4 , sp); - sp = *(unsigned long *)sp -3 ; + pc =MAKE_PC_FROM_RA (SPILL_SLOT (sp,0 ), sp); + sp =SPILL_SLOT (sp,1 ); }while (count++ <16 );return 0 ; }
Greg Kroah-Hartman
maintainerPATCH 39/46 gnss: sirf: fix premature wakeup interrupt enable
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Johan Hovold <[email protected]>
commit 82f844c22588bf47132c82faeda50b6db473162c upstream.
Make sure the receiver is powered (and booted) before enabling the wakeup interrupt to avoid spurious interrupts due to a floating input.
Similarly, disable the interrupt before powering off on probe errors and on unbind.
--- drivers/gnss/sirf.c | 32 +++++++++++++++++--------------- 1 file changed, 17 insertions(+), 15 deletions(-)
drivers/gnss/sirf.c +17 -15
@@ -310,30 +310,26 @@ static int sirf_probe(struct serdev_devi ret = -ENODEV ; goto err_put_device; } + + ret =regulator_enable (data->vcc); +if (ret) + goto err_put_device; + +/* Wait for chip to boot into hibernate mode. */ +msleep (SIRF_BOOT_DELAY ); }if (data->wakeup) { ret =gpiod_to_irq (data->wakeup);if (ret <0 ) - goto err_put_device; - + goto err_disable_vcc; data->irq = ret; - ret =devm_request_threaded_irq (dev, data->irq,NULL , - sirf_wakeup_handler, + ret =request_threaded_irq (data->irq,NULL , sirf_wakeup_handler,IRQF_TRIGGER_RISING |IRQF_TRIGGER_FALLING |IRQF_ONESHOT ,"wakeup" , data);if (ret) - goto err_put_device; - } - -if (data->on_off) { - ret =regulator_enable (data->vcc); -if (ret) - goto err_put_device; - -/* Wait for chip to boot into hibernate mode */ -msleep (SIRF_BOOT_DELAY ); + goto err_disable_vcc; }if (IS_ENABLED (CONFIG_PM )) {
@@ -342,7 +338,7 @@ static int sirf_probe(struct serdev_devi }else { ret =sirf_runtime_resume (dev);if (ret <0 ) - goto err_disable_vcc; + goto err_free_irq; } ret =gnss_register_device (gdev);
@@ -356,6 +352,9 @@ err_disable_rpm:pm_runtime_disable (dev); elsesirf_runtime_suspend (dev ); +err_free_irq: +if (data->wakeup) +free_irq (data->irq, data); err_disable_vcc:if (data->on_off)regulator_disable (data->vcc);
@@ -376,6 +375,9 @@ static void sirf_remove(struct serdev_deelse sirf_runtime_suspend (&serdev->dev); +if (data->wakeup) +free_irq (data->irq, data); +if (data->on_off)regulator_disable (data->vcc);
Greg Kroah-Hartman
maintainerPATCH 40/46 USB: serial: cp210x: fix GPIO in autosuspend
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Karoly Pados <[email protected]>
commit 7b0b644b9aa2de5032db0f468fddca091d0b7b90 upstream.
Current GPIO code in cp210x fails to take USB autosuspend into account, making it practically impossible to use GPIOs with autosuspend enabled without user configuration. Fix this like for ftdi_sio in a previous patch. Tested on a CP2102N.
--- drivers/usb/serial/cp210x.c | 11 +++++++++++ 1 file changed, 11 insertions(+)
drivers/usb/serial/cp210x.c +11 -0
@@ -1354,8 +1354,13 @@ static int cp210x_gpio_get(struct gpio_cif (priv->partnum ==CP210X_PARTNUM_CP2105 ) req_type =REQTYPE_INTERFACE_TO_HOST ; + result =usb_autopm_get_interface (serial->interface); +if (result) +return result; + result =cp210x_read_vendor_block (serial, req_type,CP210X_READ_LATCH , &buf,sizeof (buf)); +usb_autopm_put_interface (serial->interface);if (result <0 )return result;
@@ -1376,6 +1381,10 @@ static void cp210x_gpio_set(struct gpio_ buf.mask =BIT (gpio); + result =usb_autopm_get_interface (serial->interface); +if (result) + goto out; +if (priv->partnum ==CP210X_PARTNUM_CP2105 ) { result = cp210x_write_vendor_block(serial, REQTYPE_HOST_TO_INTERFACE,
@@ -1393,6 +1402,8 @@ static void cp210x_gpio_set(struct gpio_ NULL, 0, USB_CTRL_SET_TIMEOUT); } +usb_autopm_put_interface (serial->interface); +out:if (result <0 ) {dev_err (&serial->interface->dev,"failed to set GPIO value: %d\n" , result);
Greg Kroah-Hartman
maintainerPATCH 41/46 Revert "selftests: firmware: add CONFIG_FW_LOADER_USER_HELPER_FALLBACK to config"
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis Chamberlain <[email protected]>
commit d2b284d356e9758d2bafd505d482e3c9433ef424 upstream.
This reverts commit 7492902e8d22b568463897fa967c0886764cf034.
The commit tried to address an issue discovered by Dan where he got a message saying:
'usermode helper disabled so ignoring test'.
Dans's commit is forcing CONFIG_FW_LOADER_USER_HELPER_FALLBACK but just having CONFIG_FW_LOADER_USER_HELPER suffices to emulate the_FALLBACK functionality.
Dan's commit is trying to fix an issue which is hidden from a previous commit. That issue will be addressed properly next.
--- tools/testing/selftests/firmware/config | 1 - 1 file changed, 1 deletion(-)
tools/testing/selftests/firmware/config +0 -1
@@ -1,6 +1,5 @@ CONFIG_TEST_FIRMWARE=y CONFIG_FW_LOADER=y CONFIG_FW_LOADER_USER_HELPER=y -CONFIG_FW_LOADER_USER_HELPER_FALLBACK=y CONFIG_IKCONFIG=y CONFIG_IKCONFIG_PROC=y
Greg Kroah-Hartman
maintainerPATCH 42/46 Revert "selftests: firmware: remove use of non-standard diff -Z option"
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis Chamberlain <[email protected]>
commit 13ac7db09c914e4991a08b7ad578267d5cdd9856 upstream.
This reverts commit f70b472e937bb659a7b7a14e64f07308e230888c.
This breaks testing on Debian, and this patch was NACKed anyway. The proper way to address this is a quirk for busybox as that is where the issue is present.
--- tools/testing/selftests/firmware/fw_filesystem.sh | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-)
tools/testing/selftests/firmware/fw_filesystem.sh +6 -3
@@ -155,8 +155,11 @@ read_firmwares() { for i in $(seq 0 3); do config_set_read_fw_idx $i - # Verify the contents match - if ! diff -q "$FW" $DIR/read_firmware 2>/dev/null ; then + # Verify the contents are what we expect. + # -Z required for now -- check for yourself, md5sum + # on $FW and DIR/read_firmware will yield the same. Even + # cmp agrees, so something is off. + if ! diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then echo "request #$i: firmware was not loaded" >&2 exit 1 fi
@@ -168,7 +171,7 @@ read_firmwares_expect_nofile() for i in $(seq 0 3); do config_set_read_fw_idx $i # Ensures contents differ - if diff -q "$FW" $DIR/read_firmware 2>/dev/null ; then + if diff -q -Z "$FW" $DIR/read_firmware 2>/dev/null ; then echo "request $i: file was not expected to match" >&2 exit 1 fi
Greg Kroah-Hartman
maintainerPATCH 43/46 selftests: firmware: fix verify_reqs() return value
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Luis Chamberlain <[email protected]>
commit 344c0152d878922365464b7140c74c2a5e073d99 upstream.
commit a6a9be9270c87 ("selftests: firmware: return Kselftest Skip code for skipped tests") by Shuah modified failures to return the special error code of $ksft_skip (4). We have a corner case issue where we *do* want to verify_reqs().
--- tools/testing/selftests/firmware/fw_lib.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
tools/testing/selftests/firmware/fw_lib.sh +1 -1
@@ -91,7 +91,7 @@ verify_reqs() if [ "$TEST_REQS_FW_SYSFS_FALLBACK" = "yes" ]; then if [ ! "$HAS_FW_LOADER_USER_HELPER" = "yes" ]; then echo "usermode helper disabled so ignoring test" - exit $ksft_skip + exit 0 fi fi }
Greg Kroah-Hartman
maintainerPATCH 44/46 Bluetooth: btrtl: Restore old logic to assume firmware is already loaded
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Kai-Heng Feng <[email protected]>
commit 00df214b1faae520880cc5c57e206f21239ef741 upstream.
Realtek bluetooth may not work after reboot:
[ 12.446130] Bluetooth: hci0: RTL: rtl: unknown IC info, lmp subver a99e, hci rev 826c, hci ver 0008
This is a regression introduced by commit 26503ad25de8 ("Bluetooth:
btrtl: split the device initialization into smaller parts"). The new logic errors out early when no matching IC info can be found, in this case it means the firmware is already loaded.
So let's assume the firmware is already loaded when we can't find matching IC info, like the old logic did.
Bugzilla: https://bugzilla.kernel.org/show_bug.cgi?id=201921
--- drivers/bluetooth/btrtl.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-)
drivers/bluetooth/btrtl.c +7 -3
@@ -552,10 +552,9 @@ struct btrtl_device_info *btrtl_initiali hdev->bus);if (!btrtl_dev->ic_info) { -rtl_dev_err (hdev,"rtl: unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x" , +rtl_dev_info (hdev,"rtl: unknown IC info, lmp subver %04x, hci rev %04x, hci ver %04x" , lmp_subver, hci_rev, hci_ver); - ret = -EINVAL ; - goto err_free; +return btrtl_dev; }if (btrtl_dev->ic_info->has_rom_version) {
@@ -610,6 +609,11 @@ int btrtl_download_firmware(struct hci_d* standard btusb. Once that firmware is uploaded, the subver changes * to a different value. */ +if (!btrtl_dev->ic_info) { +rtl_dev_info (hdev,"rtl: assuming no firmware upload needed\n" ); +return 0 ; + } +switch (btrtl_dev->ic_info->lmp_subver) {case RTL_ROM_LMP_8723A :case RTL_ROM_LMP_3499 :
Greg Kroah-Hartman
maintainerPATCH 45/46 Bluetooth: Fix locking in bt_accept_enqueue() for BH context
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: Matthias Kaehlcke <[email protected]>
commit c4f5627f7eeecde1bb6b646d8c0907b96dc2b2a6 upstream.
With commit e16337622016 ("Bluetooth: Handle bt_accept_enqueue() socket atomically") lock_sock[_nested]() is used to acquire the socket lock before manipulating the socket. lock_sock[_nested]() may block, which is problematic since bt_accept_enqueue() can be called in bottom half context (e.g. from rfcomm_connect_ind()):
[<ffffff80080d81ec>] __might_sleep+0x4c/0x80 [<ffffff800876c7b0>] lock_sock_nested+0x24/0x58 [<ffffff8000d7c27c>] bt_accept_enqueue+0x48/0xd4 [bluetooth] [<ffffff8000e67d8c>] rfcomm_connect_ind+0x190/0x218 [rfcomm]
Add a parameter to bt_accept_enqueue() to indicate whether the function is called from BH context, and acquire the socket lock with bh_lock_sock_nested() if that's the case.
Also adapt all callers of bt_accept_enqueue() to pass the new parameter:
- l2cap_sock_new_connection_cb()
- uses lock_sock() to lock the parent socket => process context
- rfcomm_connect_ind()
- acquires the parent socket lock with bh_lock_sock() => BH context
- __sco_chan_add()
- called from sco_chan_add(), which is called from sco_connect(). parent is NULL, hence bt_accept_enqueue() isn't called in this code path and we can ignore it
- also called from sco_conn_ready(). uses bh_lock_sock() to acquire the parent lock => BH context
--- include/net/bluetooth/bluetooth.h | 2 +- net/bluetooth/af_bluetooth.c | 16 +++++++++++++--- net/bluetooth/l2cap_sock.c | 2 +- net/bluetooth/rfcomm/sock.c | 2 +- net/bluetooth/sco.c | 2 +- 5 files changed, 17 insertions(+), 7 deletions(-)
include/net/bluetooth/bluetooth.h +1 -1
@@ -276,7 +276,7 @@ int bt_sock_ioctl(struct socket *sock,int bt_sock_wait_state (struct sock *sk,int state,unsigned long timeo);int bt_sock_wait_ready (struct sock *sk,unsigned long flags); -void bt_accept_enqueue (struct sock *parent,struct sock *sk); +void bt_accept_enqueue (struct sock *parent,struct sock *sk,bool bh);void bt_accept_unlink (struct sock *sk);struct sock *bt_accept_dequeue (struct sock *parent,struct socket *newsock);
net/bluetooth/af_bluetooth.c +13 -3
@@ -154,15 +154,25 @@ void bt_sock_unlink(struct bt_sock_list }EXPORT_SYMBOL (bt_sock_unlink); -void bt_accept_enqueue (struct sock *parent,struct sock *sk) +void bt_accept_enqueue (struct sock *parent,struct sock *sk,bool bh) {BT_DBG ("parent %p, sk %p" , parent, sk);sock_hold (sk); -lock_sock_nested (sk,SINGLE_DEPTH_NESTING ); + +if (bh) +bh_lock_sock_nested (sk); +else +lock_sock_nested (sk,SINGLE_DEPTH_NESTING ); +list_add_tail (&bt_sk (sk)->accept_q, &bt_sk (parent)->accept_q);bt_sk (sk)->parent = parent; -release_sock (sk); + +if (bh) +bh_unlock_sock (sk); +else +release_sock (sk); + parent->sk_ack_backlog++; }EXPORT_SYMBOL (bt_accept_enqueue);
net/bluetooth/l2cap_sock.c +1 -1
@@ -1252,7 +1252,7 @@ static struct l2cap_chan *l2cap_sock_newl2cap_sock_init (sk, parent); -bt_accept_enqueue (parent, sk); +bt_accept_enqueue (parent, sk, false);release_sock (parent);
net/bluetooth/rfcomm/sock.c +1 -1
@@ -988,7 +988,7 @@ int rfcomm_connect_ind(struct rfcomm_sesrfcomm_pi (sk)->channel = channel; sk->sk_state =BT_CONFIG ; -bt_accept_enqueue (parent, sk); +bt_accept_enqueue (parent, sk, true);/* Accept connection and return socket DLC */ *d =rfcomm_pi (sk)->dlc;
net/bluetooth/sco.c +1 -1
@@ -193,7 +193,7 @@ static void __sco_chan_add(struct sco_co conn->sk = sk;if (parent) -bt_accept_enqueue (parent, sk); +bt_accept_enqueue (parent, sk, true); } static int sco_chan_add(struct sco_conn *conn, struct sock *sk,
Greg Kroah-Hartman
maintainerPATCH 46/46 exec: Fix mem leak in kernel_read_file
In reply to Greg Kroah-Hartman5.0-stable review patch. If anyone has any objections, please let me know.
------------------
From: YueHaibing <[email protected]>
commit f612acfae86af7ecad754ae6a46019be9da05b8e upstream.
syzkaller report this:
BUG: memory leak
unreferenced object 0xffffc9000488d000 (size 9195520):
comm "syz-executor.0", pid 2752, jiffies 4294787496 (age 18.757s)
hex dump (first 32 bytes):
ff ff ff ff ff ff ff ff a8 00 00 00 01 00 00 00 ................
02 00 00 00 00 00 00 00 80 a1 7a c1 ff ff ff ff ..........z.....
backtrace:
[<000000000863775c>] __vmalloc_node mm/vmalloc.c:1795 [inline]
[<000000000863775c>] __vmalloc_node_flags mm/vmalloc.c:1809 [inline]
[<000000000863775c>] vmalloc+0x8c/0xb0 mm/vmalloc.c:1831
[<000000003f668111>] kernel_read_file+0x58f/0x7d0 fs/exec.c:924
[<000000002385813f>] kernel_read_file_from_fd+0x49/0x80 fs/exec.c:993
[<0000000011953ff1>] __do_sys_finit_module+0x13b/0x2a0 kernel/module.c:3895
[<000000006f58491f>] do_syscall_64+0x147/0x600 arch/x86/entry/common.c:290
[<00000000ee78baf4>] entry_SYSCALL_64_after_hwframe+0x49/0xbe
[<00000000241f889b>] 0xffffffffffffffffIt should goto 'out_free' lable to free allocated buf while kernel_read fails.
--- fs/exec.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)
fs/exec.c +1 -1
@@ -932,7 +932,7 @@ int kernel_read_file(struct file *file, bytes =kernel_read (file, *buf + pos, i_size - pos, &pos);if (bytes <0 ) { ret = bytes; - goto out; + goto out_free; }if (bytes ==0 )
Jon Hunter
maintainerQuoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.0.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.0:
11 builds: 11 pass, 0 fail
22 boots: 22 pass, 0 fail
28 tests: 28 pass, 0 failLinux version: 5.0.1-rc1-gbe3f501
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,
tegra194-p2972-0000, tegra20-ventana,
tegra210-p2371-2180, tegra30-cardhu-a04Cheers
Jon
Signature · 1 line
nvpublic
Greg Kroah-Hartman
maintainerQuoted 22 lines · Jon Hunter
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 8 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.0.y
and the diffstat can be found below.thanks,
greg k-h
All tests passing for Tegra ...
Test results for stable-v5.0:
Quoted 9 lines
11 builds: 11 pass, 0 fail 22 boots: 22 pass, 0 fail 28 tests: 28 pass, 0 failLinux version: 5.0.1-rc1-gbe3f501
Boards tested: tegra124-jetson-tk1, tegra186-p2771-0000,tegra194-p2972-0000, tegra20-ventana, tegra210-p2371-2180, tegra30-cardhu-a04
Wonderful, thanks for testing all 3 of these and letting me know.
greg k-h
Quoted 9 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.0.y
and the diffstat can be found below.thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
thanks,
-- Shuah
Greg Kroah-Hartman
maintainerQuoted 15 lines · shuah
Quoted 14 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.0.y
and the diffstat can be found below.
Quoted 6 lines
Quoted 4 lines
thanks,
greg k-h
Compiled and booted on my test system. No dmesg regressions.
Thanks for testing all three of these and letting me know.
greg k-h
Quoted 10 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
Quoted 9 lines
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.0.y
and the diffstat can be found below.thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm, x86_64, and i386.
Summary
------------------------------------------------------------------------
kernel: 5.0.1-rc1
git repo: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git
git branch: linux-5.0.y
git commit: be3f50196584696914e058aaa2aa5b06a4662f2a
git describe: v5.0-47-gbe3f50196584
Test details: https://qa-reports.linaro.org/lkft/linux-stable-rc-5.0-oe/build/v5.0-47-gbe3f50196584
No regressions (compared to build v5.0-17-g4b26bbfb55b6)
No fixes (compared to build v5.0-17-g4b26bbfb55b6)
Ran 23152 total tests in the following environments and test suites.
Environments
--------------
- dragonboard-410c
- hi6220-hikey
- i386
- juno-r2
- qemu_arm
- qemu_arm64
- qemu_i386
- qemu_x86_64
- x15
- x86
Test Suites
-----------
* boot
* install-android-platform-tools-r2600
* kselftest
* libhugetlbfs
* ltp-cap_bounds-tests
* ltp-commands-tests
* ltp-containers-tests
* ltp-cpuhotplug-tests
* ltp-cve-tests
* ltp-dio-tests
* ltp-fcntl-locktests-tests
* ltp-filecaps-tests
* ltp-fs-tests
* ltp-fs_bind-tests
* ltp-fs_perms_simple-tests
* ltp-fsx-tests
* ltp-hugetlb-tests
* ltp-io-tests
* ltp-ipc-tests
* ltp-math-tests
* ltp-mm-tests
* ltp-nptl-tests
* ltp-pty-tests
* ltp-sched-tests
* ltp-securebits-tests
* ltp-syscalls-tests
* ltp-timers-tests
* spectre-meltdown-checker-test
* ltp-open-posix-tests
* kselftest-vsyscall-mode-native
* kselftest-vsyscall-mode-none
Signature · 2 lines
Linaro LKFT https://lkft.linaro.org
Greg Kroah-Hartman
maintainerQuoted 17 lines · Naresh Kamboju
Quoted 15 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
The whole patch series can be found in one patch at:
https://www.kernel.org/pub/linux/kernel/v5.x/stable-review/patch-5.0.1-rc1.gzor in the git tree and branch at:
git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.gitlinux-5.0.y
and the diffstat can be found below.
Quoted 7 lines
Quoted 4 lines
thanks,
greg k-h
Results from Linaro’s test farm.
No regressions on arm64, arm,x86_64, and i386.
Great, thanks for testing all of these and letting me know.
greg k-h
Quoted 8 lines · Greg Kroah-Hartman
This is the start of the stable review cycle for the 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 343 pass: 343 fail: 0
Guenter
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 5.0.1 release. There are 46 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 Sun Mar 10 12:48:36 UTC 2019. Anything received after that time might be too late.
Build results:
total: 159 pass: 159 fail: 0 Qemu test results: total: 343 pass: 343 fail: 0
Wonderful, thanks for testing all of these and letting me know.
greg k-h