Merge 4.9.209 into android-4.9-q
Changes in 4.9.209 PM / devfreq: Don't fail devfreq_dev_release if not in list RDMA/cma: add missed unregister_pernet_subsys in init failure scsi: lpfc: Fix memory leak on lpfc_bsg_write_ebuf_set func scsi: qla2xxx: Don't call qlt_async_event twice scsi: iscsi: qla4xxx: fix double free in probe scsi: libsas: stop discovering if oob mode is disconnected usb: gadget: fix wrong endpoint desc md: raid1: check rdev before reference in raid1_sync_request func s390/cpum_sf: Adjust sampling interval to avoid hitting sample limits s390/cpum_sf: Avoid SBD overflow condition in irq handler IB/mlx4: Follow mirror sequence of device add during device removal xen-blkback: prevent premature module unload xen/balloon: fix ballooned page accounting without hotplug enabled PM / hibernate: memory_bm_find_bit(): Tighten node optimisation xfs: fix mount failure crash on invalid iclog memory access taskstats: fix data-race drm: limit to INT_MAX in create_blob ioctl Revert "perf report: Add warning when libunwind not compiled in" ALSA: ice1724: Fix sleep-in-atomic in Infrasonic Quartet support code MIPS: Avoid VDSO ABI breakage due to global register variable mm/zsmalloc.c: fix the migrated zspage statistics. memcg: account security cred as well to kmemcg locks: print unsigned ino in /proc/locks dmaengine: Fix access to uninitialized dma_slave_caps compat_ioctl: block: handle Persistent Reservations ata: libahci_platform: Export again ahci_platform_<en/dis>able_phys() ata: ahci_brcm: Allow optional reset controller to be used ata: ahci_brcm: Fix AHCI resources management gpiolib: fix up emulated open drain outputs tracing: Have the histogram compare functions convert to u64 first ALSA: cs4236: fix error return comparison of an unsigned integer ftrace: Avoid potential division by zero in function profiler arm64: Revert support for execute-only user mappings PM / devfreq: Check NULL governor in available_governors_show nfsd4: fix up replay_matches_cache() xfs: don't check for AG deadlock for realtime files in bunmapi Bluetooth: btusb: fix PM leak in error case of setup Bluetooth: delete a stray unlock Bluetooth: Fix memory leak in hci_connect_le_scan media: flexcop-usb: ensure -EIO is returned on error condition regulator: ab8500: Remove AB8505 USB regulator media: usb: fix memory leak in af9005_identify_state tty: serial: msm_serial: Fix lockup for sysrq and oops fix compat handling of FICLONERANGE, FIDEDUPERANGE and FS_IOC_FIEMAP drm/mst: Fix MST sideband up-reply failure handling powerpc/pseries/hvconsole: Fix stack overread via udbg rxrpc: Fix possible NULL pointer access in ICMP handling ath9k_htc: Modify byte order for an error message ath9k_htc: Discard undersized packets net: add annotations on hh->hh_len lockless accesses s390/smp: fix physical to logical CPU map for SMT xen/blkback: Avoid unmapping unmapped grant pages locking/x86: Remove the unused atomic_inc_short() methd pstore/ram: Write new dumps to start of recycled zones locking/spinlock/debug: Fix various data races netfilter: ctnetlink: netns exit must wait for callbacks efi/gop: Return EFI_NOT_FOUND if there are no usable GOPs efi/gop: Return EFI_SUCCESS if a usable GOP was found efi/gop: Fix memory leak in __gop_query32/64() ARM: vexpress: Set-up shared OPP table instead of individual for each CPU netfilter: uapi: Avoid undefined left-shift in xt_sctp.h spi: spi-cavium-thunderx: Add missing pci_release_regions() ARM: dts: am437x-gp/epos-evm: fix panel compatible samples: bpf: Replace symbol compare of trace_event powerpc: Ensure that swiotlb buffer is allocated from low memory bnx2x: Do not handle requests from VFs after parity bnx2x: Fix logic to get total no. of PFs per engine net: usb: lan78xx: Fix error message format specifier rfkill: Fix incorrect check to avoid NULL pointer dereference ASoC: wm8962: fix lambda value regulator: rn5t618: fix module aliases kconfig: don't crash on NULL expressions in expr_eq() perf/x86/intel: Fix PT PMI handling net: stmmac: RX buffer size must be 16 byte aligned block: fix memleak when __blk_rq_map_user_iov() is failed parisc: Fix compiler warnings in debug_core.c llc2: Fix return statement of llc_stat_ev_rx_null_dsap_xid_c (and _test_c) macvlan: do not assume mac_header is set in macvlan_broadcast() net: stmmac: dwmac-sunxi: Allow all RGMII modes net: usb: lan78xx: fix possible skb leak pkt_sched: fq: do not accept silly TCA_FQ_QUANTUM sctp: free cmd->obj.chunk for the unprocessed SCTP_CMD_REPLY tcp: fix "old stuff" D-SACK causing SACK to be treated as D-SACK vxlan: fix tos value before xmit vlan: vlan_changelink() should propagate errors net: sch_prio: When ungrafting, replace with FIFO vlan: fix memory leak in vlan_dev_set_egress_priority USB: core: fix check for duplicate endpoints USB: serial: option: add Telit ME910G1 0x110a composition Linux 4.9.209 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I37562d713bddce2ead7934800c3f9e231884c43f
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 208
|
||||
SUBLEVEL = 209
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
};
|
||||
|
||||
lcd0: display {
|
||||
compatible = "osddisplays,osd057T0559-34ts", "panel-dpi";
|
||||
compatible = "osddisplays,osd070t1718-19ts", "panel-dpi";
|
||||
label = "lcd";
|
||||
|
||||
panel-timing {
|
||||
|
||||
@@ -41,7 +41,7 @@
|
||||
};
|
||||
|
||||
lcd0: display {
|
||||
compatible = "osddisplays,osd057T0559-34ts", "panel-dpi";
|
||||
compatible = "osddisplays,osd070t1718-19ts", "panel-dpi";
|
||||
label = "lcd";
|
||||
|
||||
panel-timing {
|
||||
|
||||
@@ -555,8 +555,9 @@ static struct clk *ve_spc_clk_register(struct device *cpu_dev)
|
||||
|
||||
static int __init ve_spc_clk_init(void)
|
||||
{
|
||||
int cpu;
|
||||
int cpu, cluster;
|
||||
struct clk *clk;
|
||||
bool init_opp_table[MAX_CLUSTERS] = { false };
|
||||
|
||||
if (!info)
|
||||
return 0; /* Continue only if SPC is initialised */
|
||||
@@ -582,8 +583,17 @@ static int __init ve_spc_clk_init(void)
|
||||
continue;
|
||||
}
|
||||
|
||||
cluster = topology_physical_package_id(cpu_dev->id);
|
||||
if (init_opp_table[cluster])
|
||||
continue;
|
||||
|
||||
if (ve_init_opp_table(cpu_dev))
|
||||
pr_warn("failed to initialise cpu%d opp table\n", cpu);
|
||||
else if (dev_pm_opp_set_sharing_cpus(cpu_dev,
|
||||
topology_core_cpumask(cpu_dev->id)))
|
||||
pr_warn("failed to mark OPPs shared for cpu%d\n", cpu);
|
||||
else
|
||||
init_opp_table[cluster] = true;
|
||||
}
|
||||
|
||||
platform_device_register_simple("vexpress-spc-cpufreq", -1, NULL, 0);
|
||||
|
||||
@@ -77,13 +77,12 @@
|
||||
#define PAGE_COPY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)
|
||||
#define PAGE_READONLY __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN | PTE_UXN)
|
||||
#define PAGE_READONLY_EXEC __pgprot(_PAGE_DEFAULT | PTE_USER | PTE_NG | PTE_PXN)
|
||||
#define PAGE_EXECONLY __pgprot(_PAGE_DEFAULT | PTE_NG | PTE_PXN)
|
||||
|
||||
#define __P000 PAGE_NONE
|
||||
#define __P001 PAGE_READONLY
|
||||
#define __P010 PAGE_COPY
|
||||
#define __P011 PAGE_COPY
|
||||
#define __P100 PAGE_EXECONLY
|
||||
#define __P100 PAGE_READONLY_EXEC
|
||||
#define __P101 PAGE_READONLY_EXEC
|
||||
#define __P110 PAGE_COPY_EXEC
|
||||
#define __P111 PAGE_COPY_EXEC
|
||||
@@ -92,7 +91,7 @@
|
||||
#define __S001 PAGE_READONLY
|
||||
#define __S010 PAGE_SHARED
|
||||
#define __S011 PAGE_SHARED
|
||||
#define __S100 PAGE_EXECONLY
|
||||
#define __S100 PAGE_READONLY_EXEC
|
||||
#define __S101 PAGE_READONLY_EXEC
|
||||
#define __S110 PAGE_SHARED_EXEC
|
||||
#define __S111 PAGE_SHARED_EXEC
|
||||
|
||||
@@ -83,12 +83,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
|
||||
#define pte_dirty(pte) (pte_sw_dirty(pte) || pte_hw_dirty(pte))
|
||||
|
||||
#define pte_valid(pte) (!!(pte_val(pte) & PTE_VALID))
|
||||
/*
|
||||
* Execute-only user mappings do not have the PTE_USER bit set. All valid
|
||||
* kernel mappings have the PTE_UXN bit set.
|
||||
*/
|
||||
#define pte_valid_not_user(pte) \
|
||||
((pte_val(pte) & (PTE_VALID | PTE_USER | PTE_UXN)) == (PTE_VALID | PTE_UXN))
|
||||
((pte_val(pte) & (PTE_VALID | PTE_USER)) == PTE_VALID)
|
||||
#define pte_valid_young(pte) \
|
||||
((pte_val(pte) & (PTE_VALID | PTE_AF)) == (PTE_VALID | PTE_AF))
|
||||
#define pte_valid_user(pte) \
|
||||
@@ -104,8 +100,8 @@ extern unsigned long empty_zero_page[PAGE_SIZE / sizeof(unsigned long)];
|
||||
|
||||
/*
|
||||
* p??_access_permitted() is true for valid user mappings (subject to the
|
||||
* write permission check) other than user execute-only which do not have the
|
||||
* PTE_USER bit set. PROT_NONE mappings do not have the PTE_VALID bit set.
|
||||
* write permission check). PROT_NONE mappings do not have the PTE_VALID bit
|
||||
* set.
|
||||
*/
|
||||
#define pte_access_permitted(pte, write) \
|
||||
(pte_valid_user(pte) && (!(write) || pte_write(pte)))
|
||||
|
||||
@@ -325,7 +325,7 @@ static int __kprobes do_page_fault(unsigned long addr, unsigned int esr,
|
||||
struct task_struct *tsk;
|
||||
struct mm_struct *mm;
|
||||
int fault, sig, code;
|
||||
unsigned long vm_flags = VM_READ | VM_WRITE;
|
||||
unsigned long vm_flags = VM_READ | VM_WRITE | VM_EXEC;
|
||||
unsigned int mm_flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE;
|
||||
|
||||
if (notify_page_fault(regs, esr))
|
||||
|
||||
@@ -52,8 +52,26 @@ struct thread_info {
|
||||
#define init_thread_info (init_thread_union.thread_info)
|
||||
#define init_stack (init_thread_union.stack)
|
||||
|
||||
/* How to get the thread information struct from C. */
|
||||
/*
|
||||
* A pointer to the struct thread_info for the currently executing thread is
|
||||
* held in register $28/$gp.
|
||||
*
|
||||
* We declare __current_thread_info as a global register variable rather than a
|
||||
* local register variable within current_thread_info() because clang doesn't
|
||||
* support explicit local register variables.
|
||||
*
|
||||
* When building the VDSO we take care not to declare the global register
|
||||
* variable because this causes GCC to not preserve the value of $28/$gp in
|
||||
* functions that change its value (which is common in the PIC VDSO when
|
||||
* accessing the GOT). Since the VDSO shouldn't be accessing
|
||||
* __current_thread_info anyway we declare it extern in order to cause a link
|
||||
* failure if it's referenced.
|
||||
*/
|
||||
#ifdef __VDSO__
|
||||
extern struct thread_info *__current_thread_info;
|
||||
#else
|
||||
register struct thread_info *__current_thread_info __asm__("$28");
|
||||
#endif
|
||||
|
||||
static inline struct thread_info *current_thread_info(void)
|
||||
{
|
||||
|
||||
@@ -43,8 +43,14 @@ __xchg(unsigned long x, __volatile__ void *ptr, int size)
|
||||
** if (((unsigned long)p & 0xf) == 0)
|
||||
** return __ldcw(p);
|
||||
*/
|
||||
#define xchg(ptr, x) \
|
||||
((__typeof__(*(ptr)))__xchg((unsigned long)(x), (ptr), sizeof(*(ptr))))
|
||||
#define xchg(ptr, x) \
|
||||
({ \
|
||||
__typeof__(*(ptr)) __ret; \
|
||||
__typeof__(*(ptr)) _x_ = (x); \
|
||||
__ret = (__typeof__(*(ptr))) \
|
||||
__xchg((unsigned long)_x_, (ptr), sizeof(*(ptr))); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
/* bug catcher for when unsupported size is used - won't link */
|
||||
extern void __cmpxchg_called_with_bad_pointer(void);
|
||||
|
||||
@@ -345,6 +345,14 @@ void __init mem_init(void)
|
||||
BUILD_BUG_ON(MMU_PAGE_COUNT > 16);
|
||||
|
||||
#ifdef CONFIG_SWIOTLB
|
||||
/*
|
||||
* Some platforms (e.g. 85xx) limit DMA-able memory way below
|
||||
* 4G. We force memblock to bottom-up mode to ensure that the
|
||||
* memory allocated in swiotlb_init() is DMA-able.
|
||||
* As it's the last memblock allocation, no need to reset it
|
||||
* back to to-down.
|
||||
*/
|
||||
memblock_set_bottom_up(true);
|
||||
swiotlb_init(0);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -62,7 +62,7 @@ EXPORT_SYMBOL(hvc_get_chars);
|
||||
* @vtermno: The vtermno or unit_address of the adapter from which the data
|
||||
* originated.
|
||||
* @buf: The character buffer that contains the character data to send to
|
||||
* firmware.
|
||||
* firmware. Must be at least 16 bytes, even if count is less than 16.
|
||||
* @count: Send this number of characters.
|
||||
*/
|
||||
int hvc_put_chars(uint32_t vtermno, const char *buf, int count)
|
||||
|
||||
@@ -1295,18 +1295,28 @@ static void hw_perf_event_update(struct perf_event *event, int flush_all)
|
||||
*/
|
||||
if (flush_all && done)
|
||||
break;
|
||||
|
||||
/* If an event overflow happened, discard samples by
|
||||
* processing any remaining sample-data-blocks.
|
||||
*/
|
||||
if (event_overflow)
|
||||
flush_all = 1;
|
||||
}
|
||||
|
||||
/* Account sample overflows in the event hardware structure */
|
||||
if (sampl_overflow)
|
||||
OVERFLOW_REG(hwc) = DIV_ROUND_UP(OVERFLOW_REG(hwc) +
|
||||
sampl_overflow, 1 + num_sdb);
|
||||
|
||||
/* Perf_event_overflow() and perf_event_account_interrupt() limit
|
||||
* the interrupt rate to an upper limit. Roughly 1000 samples per
|
||||
* task tick.
|
||||
* Hitting this limit results in a large number
|
||||
* of throttled REF_REPORT_THROTTLE entries and the samples
|
||||
* are dropped.
|
||||
* Slightly increase the interval to avoid hitting this limit.
|
||||
*/
|
||||
if (event_overflow) {
|
||||
SAMPL_RATE(hwc) += DIV_ROUND_UP(SAMPL_RATE(hwc), 10);
|
||||
debug_sprintf_event(sfdbg, 1, "%s: rate adjustment %ld\n",
|
||||
__func__,
|
||||
DIV_ROUND_UP(SAMPL_RATE(hwc), 10));
|
||||
}
|
||||
|
||||
if (sampl_overflow || event_overflow)
|
||||
debug_sprintf_event(sfdbg, 4, "hw_perf_event_update: "
|
||||
"overflow stats: sample=%llu event=%llu\n",
|
||||
|
||||
@@ -691,39 +691,67 @@ static struct sclp_core_info *smp_get_core_info(void)
|
||||
|
||||
static int smp_add_present_cpu(int cpu);
|
||||
|
||||
static int __smp_rescan_cpus(struct sclp_core_info *info, int sysfs_add)
|
||||
static int smp_add_core(struct sclp_core_entry *core, cpumask_t *avail,
|
||||
bool configured, bool early)
|
||||
{
|
||||
struct pcpu *pcpu;
|
||||
cpumask_t avail;
|
||||
int cpu, nr, i, j;
|
||||
int cpu, nr, i;
|
||||
u16 address;
|
||||
|
||||
nr = 0;
|
||||
cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
|
||||
cpu = cpumask_first(&avail);
|
||||
for (i = 0; (i < info->combined) && (cpu < nr_cpu_ids); i++) {
|
||||
if (sclp.has_core_type && info->core[i].type != boot_core_type)
|
||||
if (sclp.has_core_type && core->type != boot_core_type)
|
||||
return nr;
|
||||
cpu = cpumask_first(avail);
|
||||
address = core->core_id << smp_cpu_mt_shift;
|
||||
for (i = 0; (i <= smp_cpu_mtid) && (cpu < nr_cpu_ids); i++) {
|
||||
if (pcpu_find_address(cpu_present_mask, address + i))
|
||||
continue;
|
||||
address = info->core[i].core_id << smp_cpu_mt_shift;
|
||||
for (j = 0; j <= smp_cpu_mtid; j++) {
|
||||
if (pcpu_find_address(cpu_present_mask, address + j))
|
||||
continue;
|
||||
pcpu = pcpu_devices + cpu;
|
||||
pcpu->address = address + j;
|
||||
pcpu->state =
|
||||
(cpu >= info->configured*(smp_cpu_mtid + 1)) ?
|
||||
CPU_STATE_STANDBY : CPU_STATE_CONFIGURED;
|
||||
smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
|
||||
set_cpu_present(cpu, true);
|
||||
if (sysfs_add && smp_add_present_cpu(cpu) != 0)
|
||||
set_cpu_present(cpu, false);
|
||||
else
|
||||
nr++;
|
||||
cpu = cpumask_next(cpu, &avail);
|
||||
if (cpu >= nr_cpu_ids)
|
||||
pcpu = pcpu_devices + cpu;
|
||||
pcpu->address = address + i;
|
||||
if (configured)
|
||||
pcpu->state = CPU_STATE_CONFIGURED;
|
||||
else
|
||||
pcpu->state = CPU_STATE_STANDBY;
|
||||
smp_cpu_set_polarization(cpu, POLARIZATION_UNKNOWN);
|
||||
set_cpu_present(cpu, true);
|
||||
if (!early && smp_add_present_cpu(cpu) != 0)
|
||||
set_cpu_present(cpu, false);
|
||||
else
|
||||
nr++;
|
||||
cpumask_clear_cpu(cpu, avail);
|
||||
cpu = cpumask_next(cpu, avail);
|
||||
}
|
||||
return nr;
|
||||
}
|
||||
|
||||
static int __smp_rescan_cpus(struct sclp_core_info *info, bool early)
|
||||
{
|
||||
struct sclp_core_entry *core;
|
||||
cpumask_t avail;
|
||||
bool configured;
|
||||
u16 core_id;
|
||||
int nr, i;
|
||||
|
||||
nr = 0;
|
||||
cpumask_xor(&avail, cpu_possible_mask, cpu_present_mask);
|
||||
/*
|
||||
* Add IPL core first (which got logical CPU number 0) to make sure
|
||||
* that all SMT threads get subsequent logical CPU numbers.
|
||||
*/
|
||||
if (early) {
|
||||
core_id = pcpu_devices[0].address >> smp_cpu_mt_shift;
|
||||
for (i = 0; i < info->configured; i++) {
|
||||
core = &info->core[i];
|
||||
if (core->core_id == core_id) {
|
||||
nr += smp_add_core(core, &avail, true, early);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (i = 0; i < info->combined; i++) {
|
||||
configured = i < info->configured;
|
||||
nr += smp_add_core(&info->core[i], &avail, configured, early);
|
||||
}
|
||||
return nr;
|
||||
}
|
||||
|
||||
@@ -771,7 +799,7 @@ static void __init smp_detect_cpus(void)
|
||||
|
||||
/* Add CPUs present at boot */
|
||||
get_online_cpus();
|
||||
__smp_rescan_cpus(info, 0);
|
||||
__smp_rescan_cpus(info, true);
|
||||
put_online_cpus();
|
||||
kfree(info);
|
||||
}
|
||||
@@ -1127,7 +1155,7 @@ int __ref smp_rescan_cpus(void)
|
||||
return -ENOMEM;
|
||||
get_online_cpus();
|
||||
mutex_lock(&smp_cpu_state_mutex);
|
||||
nr = __smp_rescan_cpus(info, 1);
|
||||
nr = __smp_rescan_cpus(info, false);
|
||||
mutex_unlock(&smp_cpu_state_mutex);
|
||||
put_online_cpus();
|
||||
kfree(info);
|
||||
|
||||
@@ -24,8 +24,7 @@
|
||||
* has an opportunity to return -EFAULT to the user if needed.
|
||||
* The 64-bit routines just return a "long long" with the value,
|
||||
* since they are only used from kernel space and don't expect to fault.
|
||||
* Support for 16-bit ops is included in the framework but we don't provide
|
||||
* any (x86_64 has an atomic_inc_short(), so we might want to some day).
|
||||
* Support for 16-bit ops is included in the framework but we don't provide any.
|
||||
*
|
||||
* Note that the caller is advised to issue a suitable L1 or L2
|
||||
* prefetch on the address being manipulated to avoid extra stalls.
|
||||
|
||||
@@ -374,7 +374,7 @@ int x86_add_exclusive(unsigned int what)
|
||||
* LBR and BTS are still mutually exclusive.
|
||||
*/
|
||||
if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
if (!atomic_inc_not_zero(&x86_pmu.lbr_exclusive[what])) {
|
||||
mutex_lock(&pmc_reserve_mutex);
|
||||
@@ -386,6 +386,7 @@ int x86_add_exclusive(unsigned int what)
|
||||
mutex_unlock(&pmc_reserve_mutex);
|
||||
}
|
||||
|
||||
out:
|
||||
atomic_inc(&active_events);
|
||||
return 0;
|
||||
|
||||
@@ -396,11 +397,15 @@ fail_unlock:
|
||||
|
||||
void x86_del_exclusive(unsigned int what)
|
||||
{
|
||||
atomic_dec(&active_events);
|
||||
|
||||
/*
|
||||
* See the comment in x86_add_exclusive().
|
||||
*/
|
||||
if (x86_pmu.lbr_pt_coexist && what == x86_lbr_exclusive_pt)
|
||||
return;
|
||||
|
||||
atomic_dec(&x86_pmu.lbr_exclusive[what]);
|
||||
atomic_dec(&active_events);
|
||||
}
|
||||
|
||||
int x86_setup_perfctr(struct perf_event *event)
|
||||
|
||||
@@ -249,19 +249,6 @@ static __always_inline int __atomic_add_unless(atomic_t *v, int a, int u)
|
||||
return c;
|
||||
}
|
||||
|
||||
/**
|
||||
* atomic_inc_short - increment of a short integer
|
||||
* @v: pointer to type int
|
||||
*
|
||||
* Atomically adds 1 to @v
|
||||
* Returns the new value of @u
|
||||
*/
|
||||
static __always_inline short int atomic_inc_short(short int *v)
|
||||
{
|
||||
asm(LOCK_PREFIX "addw $1, %0" : "+m" (*v));
|
||||
return *v;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
# include <asm/atomic64_32.h>
|
||||
#else
|
||||
|
||||
@@ -142,7 +142,7 @@ int blk_rq_map_user_iov(struct request_queue *q, struct request *rq,
|
||||
return 0;
|
||||
|
||||
unmap_rq:
|
||||
__blk_rq_unmap_user(bio);
|
||||
blk_rq_unmap_user(bio);
|
||||
fail:
|
||||
rq->bio = NULL;
|
||||
return ret;
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <linux/compat.h>
|
||||
#include <linux/elevator.h>
|
||||
#include <linux/hdreg.h>
|
||||
#include <linux/pr.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/syscalls.h>
|
||||
#include <linux/types.h>
|
||||
@@ -406,6 +407,14 @@ long compat_blkdev_ioctl(struct file *file, unsigned cmd, unsigned long arg)
|
||||
case BLKTRACETEARDOWN: /* compatible */
|
||||
ret = blk_trace_ioctl(bdev, cmd, compat_ptr(arg));
|
||||
return ret;
|
||||
case IOC_PR_REGISTER:
|
||||
case IOC_PR_RESERVE:
|
||||
case IOC_PR_RELEASE:
|
||||
case IOC_PR_PREEMPT:
|
||||
case IOC_PR_PREEMPT_ABORT:
|
||||
case IOC_PR_CLEAR:
|
||||
return blkdev_ioctl(bdev, mode, cmd,
|
||||
(unsigned long)compat_ptr(arg));
|
||||
default:
|
||||
if (disk->fops->compat_ioctl)
|
||||
ret = disk->fops->compat_ioctl(bdev, mode, cmd, arg);
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/of.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/reset.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "ahci.h"
|
||||
@@ -88,6 +89,7 @@ struct brcm_ahci_priv {
|
||||
u32 port_mask;
|
||||
u32 quirks;
|
||||
enum brcm_ahci_version version;
|
||||
struct reset_control *rcdev;
|
||||
};
|
||||
|
||||
static const struct ata_port_info ahci_brcm_port_info = {
|
||||
@@ -226,19 +228,12 @@ static void brcm_sata_phys_disable(struct brcm_ahci_priv *priv)
|
||||
brcm_sata_phy_disable(priv, i);
|
||||
}
|
||||
|
||||
static u32 brcm_ahci_get_portmask(struct platform_device *pdev,
|
||||
static u32 brcm_ahci_get_portmask(struct ahci_host_priv *hpriv,
|
||||
struct brcm_ahci_priv *priv)
|
||||
{
|
||||
void __iomem *ahci;
|
||||
struct resource *res;
|
||||
u32 impl;
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "ahci");
|
||||
ahci = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(ahci))
|
||||
return 0;
|
||||
|
||||
impl = readl(ahci + HOST_PORTS_IMPL);
|
||||
impl = readl(hpriv->mmio + HOST_PORTS_IMPL);
|
||||
|
||||
if (fls(impl) > SATA_TOP_MAX_PHYS)
|
||||
dev_warn(priv->dev, "warning: more ports than PHYs (%#x)\n",
|
||||
@@ -246,9 +241,6 @@ static u32 brcm_ahci_get_portmask(struct platform_device *pdev,
|
||||
else if (!impl)
|
||||
dev_info(priv->dev, "no ports found\n");
|
||||
|
||||
devm_iounmap(&pdev->dev, ahci);
|
||||
devm_release_mem_region(&pdev->dev, res->start, resource_size(res));
|
||||
|
||||
return impl;
|
||||
}
|
||||
|
||||
@@ -275,11 +267,10 @@ static int brcm_ahci_suspend(struct device *dev)
|
||||
struct ata_host *host = dev_get_drvdata(dev);
|
||||
struct ahci_host_priv *hpriv = host->private_data;
|
||||
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
||||
int ret;
|
||||
|
||||
ret = ahci_platform_suspend(dev);
|
||||
brcm_sata_phys_disable(priv);
|
||||
return ret;
|
||||
|
||||
return ahci_platform_suspend(dev);
|
||||
}
|
||||
|
||||
static int brcm_ahci_resume(struct device *dev)
|
||||
@@ -287,11 +278,44 @@ static int brcm_ahci_resume(struct device *dev)
|
||||
struct ata_host *host = dev_get_drvdata(dev);
|
||||
struct ahci_host_priv *hpriv = host->private_data;
|
||||
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
||||
int ret;
|
||||
|
||||
/* Make sure clocks are turned on before re-configuration */
|
||||
ret = ahci_platform_enable_clks(hpriv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
brcm_sata_init(priv);
|
||||
brcm_sata_phys_enable(priv);
|
||||
brcm_sata_alpm_init(hpriv);
|
||||
return ahci_platform_resume(dev);
|
||||
|
||||
/* Since we had to enable clocks earlier on, we cannot use
|
||||
* ahci_platform_resume() as-is since a second call to
|
||||
* ahci_platform_enable_resources() would bump up the resources
|
||||
* (regulators, clocks, PHYs) count artificially so we copy the part
|
||||
* after ahci_platform_enable_resources().
|
||||
*/
|
||||
ret = ahci_platform_enable_phys(hpriv);
|
||||
if (ret)
|
||||
goto out_disable_phys;
|
||||
|
||||
ret = ahci_platform_resume_host(dev);
|
||||
if (ret)
|
||||
goto out_disable_platform_phys;
|
||||
|
||||
/* We resumed so update PM runtime state */
|
||||
pm_runtime_disable(dev);
|
||||
pm_runtime_set_active(dev);
|
||||
pm_runtime_enable(dev);
|
||||
|
||||
return 0;
|
||||
|
||||
out_disable_platform_phys:
|
||||
ahci_platform_disable_phys(hpriv);
|
||||
out_disable_phys:
|
||||
brcm_sata_phys_disable(priv);
|
||||
ahci_platform_disable_clks(hpriv);
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -332,43 +356,73 @@ static int brcm_ahci_probe(struct platform_device *pdev)
|
||||
if (IS_ERR(priv->top_ctrl))
|
||||
return PTR_ERR(priv->top_ctrl);
|
||||
|
||||
/* Reset is optional depending on platform */
|
||||
priv->rcdev = devm_reset_control_get(&pdev->dev, "ahci");
|
||||
if (!IS_ERR_OR_NULL(priv->rcdev))
|
||||
reset_control_deassert(priv->rcdev);
|
||||
|
||||
if ((priv->version == BRCM_SATA_BCM7425) ||
|
||||
(priv->version == BRCM_SATA_NSP)) {
|
||||
priv->quirks |= BRCM_AHCI_QUIRK_NO_NCQ;
|
||||
priv->quirks |= BRCM_AHCI_QUIRK_SKIP_PHY_ENABLE;
|
||||
}
|
||||
|
||||
hpriv = ahci_platform_get_resources(pdev);
|
||||
if (IS_ERR(hpriv)) {
|
||||
ret = PTR_ERR(hpriv);
|
||||
goto out_reset;
|
||||
}
|
||||
|
||||
ret = ahci_platform_enable_clks(hpriv);
|
||||
if (ret)
|
||||
goto out_reset;
|
||||
|
||||
/* Must be first so as to configure endianness including that
|
||||
* of the standard AHCI register space.
|
||||
*/
|
||||
brcm_sata_init(priv);
|
||||
|
||||
priv->port_mask = brcm_ahci_get_portmask(pdev, priv);
|
||||
if (!priv->port_mask)
|
||||
return -ENODEV;
|
||||
/* Initializes priv->port_mask which is used below */
|
||||
priv->port_mask = brcm_ahci_get_portmask(hpriv, priv);
|
||||
if (!priv->port_mask) {
|
||||
ret = -ENODEV;
|
||||
goto out_disable_clks;
|
||||
}
|
||||
|
||||
/* Must be done before ahci_platform_enable_phys() */
|
||||
brcm_sata_phys_enable(priv);
|
||||
|
||||
hpriv = ahci_platform_get_resources(pdev);
|
||||
if (IS_ERR(hpriv))
|
||||
return PTR_ERR(hpriv);
|
||||
hpriv->plat_data = priv;
|
||||
hpriv->flags = AHCI_HFLAG_WAKE_BEFORE_STOP;
|
||||
|
||||
brcm_sata_alpm_init(hpriv);
|
||||
|
||||
ret = ahci_platform_enable_resources(hpriv);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (priv->quirks & BRCM_AHCI_QUIRK_NO_NCQ)
|
||||
hpriv->flags |= AHCI_HFLAG_NO_NCQ;
|
||||
|
||||
ret = ahci_platform_enable_phys(hpriv);
|
||||
if (ret)
|
||||
goto out_disable_phys;
|
||||
|
||||
ret = ahci_platform_init_host(pdev, hpriv, &ahci_brcm_port_info,
|
||||
&ahci_platform_sht);
|
||||
if (ret)
|
||||
return ret;
|
||||
goto out_disable_platform_phys;
|
||||
|
||||
dev_info(dev, "Broadcom AHCI SATA3 registered\n");
|
||||
|
||||
return 0;
|
||||
|
||||
out_disable_platform_phys:
|
||||
ahci_platform_disable_phys(hpriv);
|
||||
out_disable_phys:
|
||||
brcm_sata_phys_disable(priv);
|
||||
out_disable_clks:
|
||||
ahci_platform_disable_clks(hpriv);
|
||||
out_reset:
|
||||
if (!IS_ERR_OR_NULL(priv->rcdev))
|
||||
reset_control_assert(priv->rcdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int brcm_ahci_remove(struct platform_device *pdev)
|
||||
@@ -378,12 +432,12 @@ static int brcm_ahci_remove(struct platform_device *pdev)
|
||||
struct brcm_ahci_priv *priv = hpriv->plat_data;
|
||||
int ret;
|
||||
|
||||
brcm_sata_phys_disable(priv);
|
||||
|
||||
ret = ata_platform_remove_one(pdev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
brcm_sata_phys_disable(priv);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -46,7 +46,7 @@ EXPORT_SYMBOL_GPL(ahci_platform_ops);
|
||||
* RETURNS:
|
||||
* 0 on success otherwise a negative error code
|
||||
*/
|
||||
static int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
|
||||
int ahci_platform_enable_phys(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
int rc, i;
|
||||
|
||||
@@ -71,6 +71,7 @@ disable_phys:
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_enable_phys);
|
||||
|
||||
/**
|
||||
* ahci_platform_disable_phys - Disable PHYs
|
||||
@@ -78,7 +79,7 @@ disable_phys:
|
||||
*
|
||||
* This function disables all PHYs found in hpriv->phys.
|
||||
*/
|
||||
static void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
|
||||
void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
|
||||
{
|
||||
int i;
|
||||
|
||||
@@ -87,6 +88,7 @@ static void ahci_platform_disable_phys(struct ahci_host_priv *hpriv)
|
||||
phy_exit(hpriv->phys[i]);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ahci_platform_disable_phys);
|
||||
|
||||
/**
|
||||
* ahci_platform_enable_clks - Enable platform clocks
|
||||
|
||||
@@ -929,6 +929,8 @@ next:
|
||||
out_of_memory:
|
||||
pr_alert("%s: out of memory\n", __func__);
|
||||
put_free_pages(ring, pages_to_gnt, segs_to_map);
|
||||
for (i = last_map; i < num; i++)
|
||||
pages[i]->handle = BLKBACK_INVALID_HANDLE;
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
||||
@@ -178,6 +178,15 @@ static struct xen_blkif *xen_blkif_alloc(domid_t domid)
|
||||
blkif->domid = domid;
|
||||
atomic_set(&blkif->refcnt, 1);
|
||||
init_completion(&blkif->drain_complete);
|
||||
|
||||
/*
|
||||
* Because freeing back to the cache may be deferred, it is not
|
||||
* safe to unload the module (and hence destroy the cache) until
|
||||
* this has completed. To prevent premature unloading, take an
|
||||
* extra module reference here and release only when the object
|
||||
* has been freed back to the cache.
|
||||
*/
|
||||
__module_get(THIS_MODULE);
|
||||
INIT_WORK(&blkif->free_work, xen_blkif_deferred_free);
|
||||
|
||||
return blkif;
|
||||
@@ -322,6 +331,7 @@ static void xen_blkif_free(struct xen_blkif *blkif)
|
||||
|
||||
/* Make sure everything is drained before shutting down */
|
||||
kmem_cache_free(xen_blkif_cachep, blkif);
|
||||
module_put(THIS_MODULE);
|
||||
}
|
||||
|
||||
int __init xen_blkif_interface_init(void)
|
||||
|
||||
@@ -1069,7 +1069,7 @@ static int btusb_open(struct hci_dev *hdev)
|
||||
if (data->setup_on_usb) {
|
||||
err = data->setup_on_usb(hdev);
|
||||
if (err < 0)
|
||||
return err;
|
||||
goto setup_fail;
|
||||
}
|
||||
|
||||
data->intf->needs_remote_wakeup = 1;
|
||||
@@ -1101,6 +1101,7 @@ done:
|
||||
|
||||
failed:
|
||||
clear_bit(BTUSB_INTR_RUNNING, &data->flags);
|
||||
setup_fail:
|
||||
usb_autopm_put_interface(data->intf);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -482,11 +482,6 @@ static int devfreq_notifier_call(struct notifier_block *nb, unsigned long type,
|
||||
static void _remove_devfreq(struct devfreq *devfreq)
|
||||
{
|
||||
mutex_lock(&devfreq_list_lock);
|
||||
if (IS_ERR(find_device_devfreq(devfreq->dev.parent))) {
|
||||
mutex_unlock(&devfreq_list_lock);
|
||||
dev_warn(&devfreq->dev, "releasing devfreq which doesn't exist\n");
|
||||
return;
|
||||
}
|
||||
list_del(&devfreq->node);
|
||||
mutex_unlock(&devfreq_list_lock);
|
||||
|
||||
@@ -558,6 +553,7 @@ struct devfreq *devfreq_add_device(struct device *dev,
|
||||
devfreq->dev.parent = dev;
|
||||
devfreq->dev.class = devfreq_class;
|
||||
devfreq->dev.release = devfreq_dev_release;
|
||||
INIT_LIST_HEAD(&devfreq->node);
|
||||
devfreq->profile = profile;
|
||||
strncpy(devfreq->governor_name, governor_name, DEVFREQ_NAME_LEN);
|
||||
devfreq->previous_freq = profile->initial_freq;
|
||||
@@ -986,7 +982,7 @@ static ssize_t available_governors_show(struct device *d,
|
||||
* The devfreq with immutable governor (e.g., passive) shows
|
||||
* only own governor.
|
||||
*/
|
||||
if (df->governor->immutable) {
|
||||
if (df->governor && df->governor->immutable) {
|
||||
count = scnprintf(&buf[count], DEVFREQ_NAME_LEN,
|
||||
"%s ", df->governor_name);
|
||||
/*
|
||||
|
||||
@@ -249,7 +249,11 @@ static int fwnet_header_cache(const struct neighbour *neigh,
|
||||
h = (struct fwnet_header *)((u8 *)hh->hh_data + HH_DATA_OFF(sizeof(*h)));
|
||||
h->h_proto = type;
|
||||
memcpy(h->h_dest, neigh->ha, net->addr_len);
|
||||
hh->hh_len = FWNET_HLEN;
|
||||
|
||||
/* Pairs with the READ_ONCE() in neigh_resolve_output(),
|
||||
* neigh_hh_output() and neigh_update_hhs().
|
||||
*/
|
||||
smp_store_release(&hh->hh_len, FWNET_HLEN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -85,30 +85,6 @@ setup_pixel_info(struct screen_info *si, u32 pixels_per_scan_line,
|
||||
}
|
||||
}
|
||||
|
||||
static efi_status_t
|
||||
__gop_query32(efi_system_table_t *sys_table_arg,
|
||||
struct efi_graphics_output_protocol_32 *gop32,
|
||||
struct efi_graphics_output_mode_info **info,
|
||||
unsigned long *size, u64 *fb_base)
|
||||
{
|
||||
struct efi_graphics_output_protocol_mode_32 *mode;
|
||||
efi_graphics_output_protocol_query_mode query_mode;
|
||||
efi_status_t status;
|
||||
unsigned long m;
|
||||
|
||||
m = gop32->mode;
|
||||
mode = (struct efi_graphics_output_protocol_mode_32 *)m;
|
||||
query_mode = (void *)(unsigned long)gop32->query_mode;
|
||||
|
||||
status = __efi_call_early(query_mode, (void *)gop32, mode->mode, size,
|
||||
info);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
*fb_base = mode->frame_buffer_base;
|
||||
return status;
|
||||
}
|
||||
|
||||
static efi_status_t
|
||||
setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
efi_guid_t *proto, unsigned long size, void **gop_handle)
|
||||
@@ -121,7 +97,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
u64 fb_base;
|
||||
struct efi_pixel_bitmask pixel_info;
|
||||
int pixel_format;
|
||||
efi_status_t status = EFI_NOT_FOUND;
|
||||
efi_status_t status;
|
||||
u32 *handles = (u32 *)(unsigned long)gop_handle;
|
||||
int i;
|
||||
|
||||
@@ -130,6 +106,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
|
||||
nr_gops = size / sizeof(u32);
|
||||
for (i = 0; i < nr_gops; i++) {
|
||||
struct efi_graphics_output_protocol_mode_32 *mode;
|
||||
struct efi_graphics_output_mode_info *info = NULL;
|
||||
efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID;
|
||||
bool conout_found = false;
|
||||
@@ -147,9 +124,11 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
if (status == EFI_SUCCESS)
|
||||
conout_found = true;
|
||||
|
||||
status = __gop_query32(sys_table_arg, gop32, &info, &size,
|
||||
¤t_fb_base);
|
||||
if (status == EFI_SUCCESS && (!first_gop || conout_found) &&
|
||||
mode = (void *)(unsigned long)gop32->mode;
|
||||
info = (void *)(unsigned long)mode->info;
|
||||
current_fb_base = mode->frame_buffer_base;
|
||||
|
||||
if ((!first_gop || conout_found) &&
|
||||
info->pixel_format != PIXEL_BLT_ONLY) {
|
||||
/*
|
||||
* Systems that use the UEFI Console Splitter may
|
||||
@@ -177,7 +156,7 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
|
||||
/* Did we find any GOPs? */
|
||||
if (!first_gop)
|
||||
goto out;
|
||||
return EFI_NOT_FOUND;
|
||||
|
||||
/* EFI framebuffer */
|
||||
si->orig_video_isVGA = VIDEO_TYPE_EFI;
|
||||
@@ -199,32 +178,8 @@ setup_gop32(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
si->lfb_size = si->lfb_linelength * si->lfb_height;
|
||||
|
||||
si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS;
|
||||
out:
|
||||
return status;
|
||||
}
|
||||
|
||||
static efi_status_t
|
||||
__gop_query64(efi_system_table_t *sys_table_arg,
|
||||
struct efi_graphics_output_protocol_64 *gop64,
|
||||
struct efi_graphics_output_mode_info **info,
|
||||
unsigned long *size, u64 *fb_base)
|
||||
{
|
||||
struct efi_graphics_output_protocol_mode_64 *mode;
|
||||
efi_graphics_output_protocol_query_mode query_mode;
|
||||
efi_status_t status;
|
||||
unsigned long m;
|
||||
|
||||
m = gop64->mode;
|
||||
mode = (struct efi_graphics_output_protocol_mode_64 *)m;
|
||||
query_mode = (void *)(unsigned long)gop64->query_mode;
|
||||
|
||||
status = __efi_call_early(query_mode, (void *)gop64, mode->mode, size,
|
||||
info);
|
||||
if (status != EFI_SUCCESS)
|
||||
return status;
|
||||
|
||||
*fb_base = mode->frame_buffer_base;
|
||||
return status;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
static efi_status_t
|
||||
@@ -239,7 +194,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
u64 fb_base;
|
||||
struct efi_pixel_bitmask pixel_info;
|
||||
int pixel_format;
|
||||
efi_status_t status = EFI_NOT_FOUND;
|
||||
efi_status_t status;
|
||||
u64 *handles = (u64 *)(unsigned long)gop_handle;
|
||||
int i;
|
||||
|
||||
@@ -248,6 +203,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
|
||||
nr_gops = size / sizeof(u64);
|
||||
for (i = 0; i < nr_gops; i++) {
|
||||
struct efi_graphics_output_protocol_mode_64 *mode;
|
||||
struct efi_graphics_output_mode_info *info = NULL;
|
||||
efi_guid_t conout_proto = EFI_CONSOLE_OUT_DEVICE_GUID;
|
||||
bool conout_found = false;
|
||||
@@ -265,9 +221,11 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
if (status == EFI_SUCCESS)
|
||||
conout_found = true;
|
||||
|
||||
status = __gop_query64(sys_table_arg, gop64, &info, &size,
|
||||
¤t_fb_base);
|
||||
if (status == EFI_SUCCESS && (!first_gop || conout_found) &&
|
||||
mode = (void *)(unsigned long)gop64->mode;
|
||||
info = (void *)(unsigned long)mode->info;
|
||||
current_fb_base = mode->frame_buffer_base;
|
||||
|
||||
if ((!first_gop || conout_found) &&
|
||||
info->pixel_format != PIXEL_BLT_ONLY) {
|
||||
/*
|
||||
* Systems that use the UEFI Console Splitter may
|
||||
@@ -295,7 +253,7 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
|
||||
/* Did we find any GOPs? */
|
||||
if (!first_gop)
|
||||
goto out;
|
||||
return EFI_NOT_FOUND;
|
||||
|
||||
/* EFI framebuffer */
|
||||
si->orig_video_isVGA = VIDEO_TYPE_EFI;
|
||||
@@ -317,8 +275,8 @@ setup_gop64(efi_system_table_t *sys_table_arg, struct screen_info *si,
|
||||
si->lfb_size = si->lfb_linelength * si->lfb_height;
|
||||
|
||||
si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS;
|
||||
out:
|
||||
return status;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -188,6 +188,14 @@ int gpiod_get_direction(struct gpio_desc *desc)
|
||||
chip = gpiod_to_chip(desc);
|
||||
offset = gpio_chip_hwgpio(desc);
|
||||
|
||||
/*
|
||||
* Open drain emulation using input mode may incorrectly report
|
||||
* input here, fix that up.
|
||||
*/
|
||||
if (test_bit(FLAG_OPEN_DRAIN, &desc->flags) &&
|
||||
test_bit(FLAG_IS_OUT, &desc->flags))
|
||||
return 0;
|
||||
|
||||
if (!chip->get_direction)
|
||||
return status;
|
||||
|
||||
|
||||
@@ -1536,7 +1536,11 @@ static void process_single_up_tx_qlock(struct drm_dp_mst_topology_mgr *mgr,
|
||||
if (ret != 1)
|
||||
DRM_DEBUG_KMS("failed to send msg in q %d\n", ret);
|
||||
|
||||
txmsg->dst->tx_slots[txmsg->seqno] = NULL;
|
||||
if (txmsg->seqno != -1) {
|
||||
WARN_ON((unsigned int)txmsg->seqno >
|
||||
ARRAY_SIZE(txmsg->dst->tx_slots));
|
||||
txmsg->dst->tx_slots[txmsg->seqno] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
|
||||
|
||||
@@ -554,7 +554,7 @@ drm_property_create_blob(struct drm_device *dev, size_t length,
|
||||
struct drm_property_blob *blob;
|
||||
int ret;
|
||||
|
||||
if (!length || length > ULONG_MAX - sizeof(struct drm_property_blob))
|
||||
if (!length || length > INT_MAX - sizeof(struct drm_property_blob))
|
||||
return ERR_PTR(-EINVAL);
|
||||
|
||||
blob = kzalloc(sizeof(struct drm_property_blob)+length, GFP_KERNEL);
|
||||
|
||||
@@ -4440,6 +4440,7 @@ err:
|
||||
unregister_netdevice_notifier(&cma_nb);
|
||||
rdma_addr_unregister_client(&addr_client);
|
||||
ib_sa_unregister_client(&sa_client);
|
||||
unregister_pernet_subsys(&cma_pernet_operations);
|
||||
err_wq:
|
||||
destroy_workqueue(cma_wq);
|
||||
return ret;
|
||||
|
||||
@@ -3031,16 +3031,17 @@ static void mlx4_ib_remove(struct mlx4_dev *dev, void *ibdev_ptr)
|
||||
ibdev->ib_active = false;
|
||||
flush_workqueue(wq);
|
||||
|
||||
mlx4_ib_close_sriov(ibdev);
|
||||
mlx4_ib_mad_cleanup(ibdev);
|
||||
ib_unregister_device(&ibdev->ib_dev);
|
||||
mlx4_ib_diag_cleanup(ibdev);
|
||||
if (ibdev->iboe.nb.notifier_call) {
|
||||
if (unregister_netdevice_notifier(&ibdev->iboe.nb))
|
||||
pr_warn("failure unregistering notifier\n");
|
||||
ibdev->iboe.nb.notifier_call = NULL;
|
||||
}
|
||||
|
||||
mlx4_ib_close_sriov(ibdev);
|
||||
mlx4_ib_mad_cleanup(ibdev);
|
||||
ib_unregister_device(&ibdev->ib_dev);
|
||||
mlx4_ib_diag_cleanup(ibdev);
|
||||
|
||||
mlx4_qp_release_range(dev, ibdev->steer_qpn_base,
|
||||
ibdev->steer_qpn_count);
|
||||
kfree(ibdev->ib_uc_qpns_bitmap);
|
||||
|
||||
@@ -2633,7 +2633,7 @@ static sector_t raid1_sync_request(struct mddev *mddev, sector_t sector_nr,
|
||||
write_targets++;
|
||||
}
|
||||
}
|
||||
if (bio->bi_end_io) {
|
||||
if (rdev && bio->bi_end_io) {
|
||||
atomic_inc(&rdev->nr_pending);
|
||||
bio->bi_iter.bi_sector = sector_nr + rdev->data_offset;
|
||||
bio->bi_bdev = rdev->bdev;
|
||||
|
||||
@@ -295,7 +295,7 @@ static int flexcop_usb_i2c_req(struct flexcop_i2c_adapter *i2c,
|
||||
|
||||
mutex_unlock(&fc_usb->data_mutex);
|
||||
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* actual bus specific access functions,
|
||||
|
||||
@@ -990,8 +990,9 @@ static int af9005_identify_state(struct usb_device *udev,
|
||||
else if (reply == 0x02)
|
||||
*cold = 0;
|
||||
else
|
||||
return -EIO;
|
||||
deb_info("Identify state cold = %d\n", *cold);
|
||||
ret = -EIO;
|
||||
if (!ret)
|
||||
deb_info("Identify state cold = %d\n", *cold);
|
||||
|
||||
err:
|
||||
kfree(buf);
|
||||
|
||||
@@ -1112,7 +1112,7 @@ static inline u8 bnx2x_get_path_func_num(struct bnx2x *bp)
|
||||
for (i = 0; i < E1H_FUNC_MAX / 2; i++) {
|
||||
u32 func_config =
|
||||
MF_CFG_RD(bp,
|
||||
func_mf_config[BP_PORT(bp) + 2 * i].
|
||||
func_mf_config[BP_PATH(bp) + 2 * i].
|
||||
config);
|
||||
func_num +=
|
||||
((func_config & FUNC_MF_CFG_FUNC_HIDE) ? 0 : 1);
|
||||
|
||||
@@ -9995,10 +9995,18 @@ static void bnx2x_recovery_failed(struct bnx2x *bp)
|
||||
*/
|
||||
static void bnx2x_parity_recover(struct bnx2x *bp)
|
||||
{
|
||||
bool global = false;
|
||||
u32 error_recovered, error_unrecovered;
|
||||
bool is_parity;
|
||||
bool is_parity, global = false;
|
||||
#ifdef CONFIG_BNX2X_SRIOV
|
||||
int vf_idx;
|
||||
|
||||
for (vf_idx = 0; vf_idx < bp->requested_nr_virtfn; vf_idx++) {
|
||||
struct bnx2x_virtf *vf = BP_VF(bp, vf_idx);
|
||||
|
||||
if (vf)
|
||||
vf->state = VF_LOST;
|
||||
}
|
||||
#endif
|
||||
DP(NETIF_MSG_HW, "Handling parity\n");
|
||||
while (1) {
|
||||
switch (bp->recovery_state) {
|
||||
|
||||
@@ -139,6 +139,7 @@ struct bnx2x_virtf {
|
||||
#define VF_ACQUIRED 1 /* VF acquired, but not initialized */
|
||||
#define VF_ENABLED 2 /* VF Enabled */
|
||||
#define VF_RESET 3 /* VF FLR'd, pending cleanup */
|
||||
#define VF_LOST 4 /* Recovery while VFs are loaded */
|
||||
|
||||
bool flr_clnup_stage; /* true during flr cleanup */
|
||||
|
||||
|
||||
@@ -2095,6 +2095,18 @@ static void bnx2x_vf_mbx_request(struct bnx2x *bp, struct bnx2x_virtf *vf,
|
||||
{
|
||||
int i;
|
||||
|
||||
if (vf->state == VF_LOST) {
|
||||
/* Just ack the FW and return if VFs are lost
|
||||
* in case of parity error. VFs are supposed to be timedout
|
||||
* on waiting for PF response.
|
||||
*/
|
||||
DP(BNX2X_MSG_IOV,
|
||||
"VF 0x%x lost, not handling the request\n", vf->abs_vfid);
|
||||
|
||||
storm_memset_vf_mbx_ack(bp, vf->abs_vfid);
|
||||
return;
|
||||
}
|
||||
|
||||
/* check if tlv type is known */
|
||||
if (bnx2x_tlv_supported(mbx->first_tlv.tl.type)) {
|
||||
/* Lock the per vf op mutex and note the locker's identity.
|
||||
|
||||
@@ -53,7 +53,7 @@ static int sun7i_gmac_init(struct platform_device *pdev, void *priv)
|
||||
* rate, which then uses the auto-reparenting feature of the
|
||||
* clock driver, and enabling/disabling the clock.
|
||||
*/
|
||||
if (gmac->interface == PHY_INTERFACE_MODE_RGMII) {
|
||||
if (phy_interface_mode_is_rgmii(gmac->interface)) {
|
||||
clk_set_rate(gmac->tx_clk, SUN7I_GMAC_GMII_RGMII_RATE);
|
||||
clk_prepare_enable(gmac->tx_clk);
|
||||
gmac->clk_enabled = 1;
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
#include <linux/of_mdio.h>
|
||||
#include "dwmac1000.h"
|
||||
|
||||
#define STMMAC_ALIGN(x) __ALIGN_KERNEL(x, SMP_CACHE_BYTES)
|
||||
#define STMMAC_ALIGN(x) ALIGN(ALIGN(x, SMP_CACHE_BYTES), 16)
|
||||
#define TSO_MAX_BUFF_SIZE (SZ_16K - 1)
|
||||
|
||||
/* Module parameters */
|
||||
|
||||
@@ -234,7 +234,7 @@ static void macvlan_broadcast(struct sk_buff *skb,
|
||||
struct net_device *src,
|
||||
enum macvlan_mode mode)
|
||||
{
|
||||
const struct ethhdr *eth = eth_hdr(skb);
|
||||
const struct ethhdr *eth = skb_eth_hdr(skb);
|
||||
const struct macvlan_dev *vlan;
|
||||
struct sk_buff *nskb;
|
||||
unsigned int i;
|
||||
|
||||
@@ -442,7 +442,7 @@ static int lan78xx_read_stats(struct lan78xx_net *dev,
|
||||
}
|
||||
} else {
|
||||
netdev_warn(dev->net,
|
||||
"Failed to read stat ret = 0x%x", ret);
|
||||
"Failed to read stat ret = %d", ret);
|
||||
}
|
||||
|
||||
kfree(stats);
|
||||
@@ -2407,11 +2407,6 @@ static int lan78xx_stop(struct net_device *net)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int lan78xx_linearize(struct sk_buff *skb)
|
||||
{
|
||||
return skb_linearize(skb);
|
||||
}
|
||||
|
||||
static struct sk_buff *lan78xx_tx_prep(struct lan78xx_net *dev,
|
||||
struct sk_buff *skb, gfp_t flags)
|
||||
{
|
||||
@@ -2422,8 +2417,10 @@ static struct sk_buff *lan78xx_tx_prep(struct lan78xx_net *dev,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (lan78xx_linearize(skb) < 0)
|
||||
if (skb_linearize(skb)) {
|
||||
dev_kfree_skb_any(skb);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
tx_cmd_a = (u32)(skb->len & TX_CMD_A_LEN_MASK_) | TX_CMD_A_FCS_;
|
||||
|
||||
|
||||
@@ -2104,7 +2104,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
||||
else if (info->key.tun_flags & TUNNEL_DONT_FRAGMENT)
|
||||
df = htons(IP_DF);
|
||||
|
||||
tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
|
||||
tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb);
|
||||
ttl = ttl ? : ip4_dst_hoplimit(&rt->dst);
|
||||
err = vxlan_build_skb(skb, &rt->dst, sizeof(struct iphdr),
|
||||
vni, md, flags, udp_sum);
|
||||
@@ -2163,7 +2163,7 @@ static void vxlan_xmit_one(struct sk_buff *skb, struct net_device *dev,
|
||||
if (!info)
|
||||
udp_sum = !(flags & VXLAN_F_UDP_ZERO_CSUM6_TX);
|
||||
|
||||
tos = ip_tunnel_ecn_encap(tos, old_iph, skb);
|
||||
tos = ip_tunnel_ecn_encap(RT_TOS(tos), old_iph, skb);
|
||||
ttl = ttl ? : ip6_dst_hoplimit(ndst);
|
||||
skb_scrub_packet(skb, xnet);
|
||||
err = vxlan_build_skb(skb, ndst, sizeof(struct ipv6hdr),
|
||||
|
||||
@@ -972,6 +972,8 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
||||
struct ath_htc_rx_status *rxstatus;
|
||||
struct ath_rx_status rx_stats;
|
||||
bool decrypt_error = false;
|
||||
__be16 rs_datalen;
|
||||
bool is_phyerr;
|
||||
|
||||
if (skb->len < HTC_RX_FRAME_HEADER_SIZE) {
|
||||
ath_err(common, "Corrupted RX frame, dropping (len: %d)\n",
|
||||
@@ -981,11 +983,24 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
||||
|
||||
rxstatus = (struct ath_htc_rx_status *)skb->data;
|
||||
|
||||
if (be16_to_cpu(rxstatus->rs_datalen) -
|
||||
(skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0) {
|
||||
rs_datalen = be16_to_cpu(rxstatus->rs_datalen);
|
||||
if (unlikely(rs_datalen -
|
||||
(skb->len - HTC_RX_FRAME_HEADER_SIZE) != 0)) {
|
||||
ath_err(common,
|
||||
"Corrupted RX data len, dropping (dlen: %d, skblen: %d)\n",
|
||||
rxstatus->rs_datalen, skb->len);
|
||||
rs_datalen, skb->len);
|
||||
goto rx_next;
|
||||
}
|
||||
|
||||
is_phyerr = rxstatus->rs_status & ATH9K_RXERR_PHY;
|
||||
/*
|
||||
* Discard zero-length packets and packets smaller than an ACK
|
||||
* which are not PHY_ERROR (short radar pulses have a length of 3)
|
||||
*/
|
||||
if (unlikely(!rs_datalen || (rs_datalen < 10 && !is_phyerr))) {
|
||||
ath_warn(common,
|
||||
"Short RX data len, dropping (dlen: %d)\n",
|
||||
rs_datalen);
|
||||
goto rx_next;
|
||||
}
|
||||
|
||||
@@ -1010,7 +1025,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv,
|
||||
* Process PHY errors and return so that the packet
|
||||
* can be dropped.
|
||||
*/
|
||||
if (rx_stats.rs_status & ATH9K_RXERR_PHY) {
|
||||
if (unlikely(is_phyerr)) {
|
||||
/* TODO: Not using DFS processing now. */
|
||||
if (ath_cmn_process_fft(&priv->spec_priv, hdr,
|
||||
&rx_stats, rx_status->mactime)) {
|
||||
|
||||
@@ -1099,23 +1099,6 @@ static struct ab8500_regulator_info
|
||||
.update_val_idle = 0x82,
|
||||
.update_val_normal = 0x02,
|
||||
},
|
||||
[AB8505_LDO_USB] = {
|
||||
.desc = {
|
||||
.name = "LDO-USB",
|
||||
.ops = &ab8500_regulator_mode_ops,
|
||||
.type = REGULATOR_VOLTAGE,
|
||||
.id = AB8505_LDO_USB,
|
||||
.owner = THIS_MODULE,
|
||||
.n_voltages = 1,
|
||||
.volt_table = fixed_3300000_voltage,
|
||||
},
|
||||
.update_bank = 0x03,
|
||||
.update_reg = 0x82,
|
||||
.update_mask = 0x03,
|
||||
.update_val = 0x01,
|
||||
.update_val_idle = 0x03,
|
||||
.update_val_normal = 0x01,
|
||||
},
|
||||
[AB8505_LDO_AUDIO] = {
|
||||
.desc = {
|
||||
.name = "LDO-AUDIO",
|
||||
|
||||
@@ -127,6 +127,7 @@ static struct platform_driver rn5t618_regulator_driver = {
|
||||
|
||||
module_platform_driver(rn5t618_regulator_driver);
|
||||
|
||||
MODULE_ALIAS("platform:rn5t618-regulator");
|
||||
MODULE_AUTHOR("Beniamino Galvani <b.galvani@gmail.com>");
|
||||
MODULE_DESCRIPTION("RN5T618 regulator driver");
|
||||
MODULE_LICENSE("GPL v2");
|
||||
|
||||
@@ -97,12 +97,21 @@ static int sas_get_port_device(struct asd_sas_port *port)
|
||||
else
|
||||
dev->dev_type = SAS_SATA_DEV;
|
||||
dev->tproto = SAS_PROTOCOL_SATA;
|
||||
} else {
|
||||
} else if (port->oob_mode == SAS_OOB_MODE) {
|
||||
struct sas_identify_frame *id =
|
||||
(struct sas_identify_frame *) dev->frame_rcvd;
|
||||
dev->dev_type = id->dev_type;
|
||||
dev->iproto = id->initiator_bits;
|
||||
dev->tproto = id->target_bits;
|
||||
} else {
|
||||
/* If the oob mode is OOB_NOT_CONNECTED, the port is
|
||||
* disconnected due to race with PHY down. We cannot
|
||||
* continue to discover this port
|
||||
*/
|
||||
sas_put_device(dev);
|
||||
pr_warn("Port %016llx is disconnected when discovering\n",
|
||||
SAS_ADDR(port->attached_sas_addr));
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
sas_init_dev(dev);
|
||||
|
||||
@@ -4352,12 +4352,6 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct fc_bsg_job *job,
|
||||
phba->mbox_ext_buf_ctx.seqNum++;
|
||||
nemb_tp = phba->mbox_ext_buf_ctx.nembType;
|
||||
|
||||
dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
|
||||
if (!dd_data) {
|
||||
rc = -ENOMEM;
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
pbuf = (uint8_t *)dmabuf->virt;
|
||||
size = job->request_payload.payload_len;
|
||||
sg_copy_to_buffer(job->request_payload.sg_list,
|
||||
@@ -4394,6 +4388,13 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct fc_bsg_job *job,
|
||||
"2968 SLI_CONFIG ext-buffer wr all %d "
|
||||
"ebuffers received\n",
|
||||
phba->mbox_ext_buf_ctx.numBuf);
|
||||
|
||||
dd_data = kmalloc(sizeof(struct bsg_job_data), GFP_KERNEL);
|
||||
if (!dd_data) {
|
||||
rc = -ENOMEM;
|
||||
goto job_error;
|
||||
}
|
||||
|
||||
/* mailbox command structure for base driver */
|
||||
pmboxq = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
|
||||
if (!pmboxq) {
|
||||
@@ -4441,6 +4442,8 @@ lpfc_bsg_write_ebuf_set(struct lpfc_hba *phba, struct fc_bsg_job *job,
|
||||
return SLI_CONFIG_HANDLED;
|
||||
|
||||
job_error:
|
||||
if (pmboxq)
|
||||
mempool_free(pmboxq, phba->mbox_mem_pool);
|
||||
lpfc_bsg_dma_page_free(phba, dmabuf);
|
||||
kfree(dd_data);
|
||||
|
||||
|
||||
@@ -973,8 +973,6 @@ global_port_update:
|
||||
ql_dbg(ql_dbg_async, vha, 0x5011,
|
||||
"Asynchronous PORT UPDATE ignored %04x/%04x/%04x.\n",
|
||||
mb[1], mb[2], mb[3]);
|
||||
|
||||
qlt_async_event(mb[0], vha, mb);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -995,8 +993,6 @@ global_port_update:
|
||||
set_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags);
|
||||
set_bit(LOCAL_LOOP_UPDATE, &vha->dpc_flags);
|
||||
set_bit(VP_CONFIG_OK, &vha->vp_flags);
|
||||
|
||||
qlt_async_event(mb[0], vha, mb);
|
||||
break;
|
||||
|
||||
case MBA_RSCN_UPDATE: /* State Change Registration */
|
||||
|
||||
@@ -4285,7 +4285,6 @@ static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
|
||||
return QLA_SUCCESS;
|
||||
|
||||
mem_alloc_error_exit:
|
||||
qla4xxx_mem_free(ha);
|
||||
return QLA_ERROR;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,6 +81,7 @@ static int thunderx_spi_probe(struct pci_dev *pdev,
|
||||
|
||||
error:
|
||||
clk_disable_unprepare(p->clk);
|
||||
pci_release_regions(pdev);
|
||||
spi_master_put(master);
|
||||
return ret;
|
||||
}
|
||||
@@ -95,6 +96,7 @@ static void thunderx_spi_remove(struct pci_dev *pdev)
|
||||
return;
|
||||
|
||||
clk_disable_unprepare(p->clk);
|
||||
pci_release_regions(pdev);
|
||||
/* Put everything in a known state. */
|
||||
writeq(0, p->register_base + OCTEON_SPI_CFG(p));
|
||||
}
|
||||
|
||||
@@ -120,6 +120,14 @@ static int hvterm_raw_get_chars(uint32_t vtermno, char *buf, int count)
|
||||
return got;
|
||||
}
|
||||
|
||||
/**
|
||||
* hvterm_raw_put_chars: send characters to firmware for given vterm adapter
|
||||
* @vtermno: The virtual terminal number.
|
||||
* @buf: The characters to send. Because of the underlying hypercall in
|
||||
* hvc_put_chars(), this buffer must be at least 16 bytes long, even if
|
||||
* you are sending fewer chars.
|
||||
* @count: number of chars to send.
|
||||
*/
|
||||
static int hvterm_raw_put_chars(uint32_t vtermno, const char *buf, int count)
|
||||
{
|
||||
struct hvterm_priv *pv = hvterm_privs[vtermno];
|
||||
@@ -232,6 +240,7 @@ static const struct hv_ops hvterm_hvsi_ops = {
|
||||
static void udbg_hvc_putc(char c)
|
||||
{
|
||||
int count = -1;
|
||||
unsigned char bounce_buffer[16];
|
||||
|
||||
if (!hvterm_privs[0])
|
||||
return;
|
||||
@@ -242,7 +251,12 @@ static void udbg_hvc_putc(char c)
|
||||
do {
|
||||
switch(hvterm_privs[0]->proto) {
|
||||
case HV_PROTOCOL_RAW:
|
||||
count = hvterm_raw_put_chars(0, &c, 1);
|
||||
/*
|
||||
* hvterm_raw_put_chars requires at least a 16-byte
|
||||
* buffer, so go via the bounce buffer
|
||||
*/
|
||||
bounce_buffer[0] = c;
|
||||
count = hvterm_raw_put_chars(0, bounce_buffer, 1);
|
||||
break;
|
||||
case HV_PROTOCOL_HVSI:
|
||||
count = hvterm_hvsi_put_chars(0, &c, 1);
|
||||
|
||||
@@ -1579,6 +1579,7 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
int num_newlines = 0;
|
||||
bool replaced = false;
|
||||
void __iomem *tf;
|
||||
int locked = 1;
|
||||
|
||||
if (is_uartdm)
|
||||
tf = port->membase + UARTDM_TF;
|
||||
@@ -1591,7 +1592,13 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
num_newlines++;
|
||||
count += num_newlines;
|
||||
|
||||
spin_lock(&port->lock);
|
||||
if (port->sysrq)
|
||||
locked = 0;
|
||||
else if (oops_in_progress)
|
||||
locked = spin_trylock(&port->lock);
|
||||
else
|
||||
spin_lock(&port->lock);
|
||||
|
||||
if (is_uartdm)
|
||||
msm_reset_dm_count(port, count);
|
||||
|
||||
@@ -1627,7 +1634,9 @@ static void __msm_console_write(struct uart_port *port, const char *s,
|
||||
iowrite32_rep(tf, buf, 1);
|
||||
i += num_chars;
|
||||
}
|
||||
spin_unlock(&port->lock);
|
||||
|
||||
if (locked)
|
||||
spin_unlock(&port->lock);
|
||||
}
|
||||
|
||||
static void msm_console_write(struct console *co, const char *s,
|
||||
|
||||
@@ -198,9 +198,58 @@ static const unsigned short super_speed_maxpacket_maxes[4] = {
|
||||
[USB_ENDPOINT_XFER_INT] = 1024,
|
||||
};
|
||||
|
||||
static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
|
||||
int asnum, struct usb_host_interface *ifp, int num_ep,
|
||||
unsigned char *buffer, int size)
|
||||
static bool endpoint_is_duplicate(struct usb_endpoint_descriptor *e1,
|
||||
struct usb_endpoint_descriptor *e2)
|
||||
{
|
||||
if (e1->bEndpointAddress == e2->bEndpointAddress)
|
||||
return true;
|
||||
|
||||
if (usb_endpoint_xfer_control(e1) || usb_endpoint_xfer_control(e2)) {
|
||||
if (usb_endpoint_num(e1) == usb_endpoint_num(e2))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Check for duplicate endpoint addresses in other interfaces and in the
|
||||
* altsetting currently being parsed.
|
||||
*/
|
||||
static bool config_endpoint_is_duplicate(struct usb_host_config *config,
|
||||
int inum, int asnum, struct usb_endpoint_descriptor *d)
|
||||
{
|
||||
struct usb_endpoint_descriptor *epd;
|
||||
struct usb_interface_cache *intfc;
|
||||
struct usb_host_interface *alt;
|
||||
int i, j, k;
|
||||
|
||||
for (i = 0; i < config->desc.bNumInterfaces; ++i) {
|
||||
intfc = config->intf_cache[i];
|
||||
|
||||
for (j = 0; j < intfc->num_altsetting; ++j) {
|
||||
alt = &intfc->altsetting[j];
|
||||
|
||||
if (alt->desc.bInterfaceNumber == inum &&
|
||||
alt->desc.bAlternateSetting != asnum)
|
||||
continue;
|
||||
|
||||
for (k = 0; k < alt->desc.bNumEndpoints; ++k) {
|
||||
epd = &alt->endpoint[k].desc;
|
||||
|
||||
if (endpoint_is_duplicate(epd, d))
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static int usb_parse_endpoint(struct device *ddev, int cfgno,
|
||||
struct usb_host_config *config, int inum, int asnum,
|
||||
struct usb_host_interface *ifp, int num_ep,
|
||||
unsigned char *buffer, int size)
|
||||
{
|
||||
unsigned char *buffer0 = buffer;
|
||||
struct usb_endpoint_descriptor *d;
|
||||
@@ -237,13 +286,10 @@ static int usb_parse_endpoint(struct device *ddev, int cfgno, int inum,
|
||||
goto skip_to_next_endpoint_or_interface_descriptor;
|
||||
|
||||
/* Check for duplicate endpoint addresses */
|
||||
for (i = 0; i < ifp->desc.bNumEndpoints; ++i) {
|
||||
if (ifp->endpoint[i].desc.bEndpointAddress ==
|
||||
d->bEndpointAddress) {
|
||||
dev_warn(ddev, "config %d interface %d altsetting %d has a duplicate endpoint with address 0x%X, skipping\n",
|
||||
cfgno, inum, asnum, d->bEndpointAddress);
|
||||
goto skip_to_next_endpoint_or_interface_descriptor;
|
||||
}
|
||||
if (config_endpoint_is_duplicate(config, inum, asnum, d)) {
|
||||
dev_warn(ddev, "config %d interface %d altsetting %d has a duplicate endpoint with address 0x%X, skipping\n",
|
||||
cfgno, inum, asnum, d->bEndpointAddress);
|
||||
goto skip_to_next_endpoint_or_interface_descriptor;
|
||||
}
|
||||
|
||||
endpoint = &ifp->endpoint[ifp->desc.bNumEndpoints];
|
||||
@@ -517,8 +563,8 @@ static int usb_parse_interface(struct device *ddev, int cfgno,
|
||||
if (((struct usb_descriptor_header *) buffer)->bDescriptorType
|
||||
== USB_DT_INTERFACE)
|
||||
break;
|
||||
retval = usb_parse_endpoint(ddev, cfgno, inum, asnum, alt,
|
||||
num_ep, buffer, size);
|
||||
retval = usb_parse_endpoint(ddev, cfgno, config, inum, asnum,
|
||||
alt, num_ep, buffer, size);
|
||||
if (retval < 0)
|
||||
return retval;
|
||||
++n;
|
||||
|
||||
@@ -625,8 +625,12 @@ static void ecm_disable(struct usb_function *f)
|
||||
|
||||
DBG(cdev, "ecm deactivated\n");
|
||||
|
||||
if (ecm->port.in_ep->enabled)
|
||||
if (ecm->port.in_ep->enabled) {
|
||||
gether_disconnect(&ecm->port);
|
||||
} else {
|
||||
ecm->port.in_ep->desc = NULL;
|
||||
ecm->port.out_ep->desc = NULL;
|
||||
}
|
||||
|
||||
usb_ep_disable(ecm->notify);
|
||||
ecm->notify->desc = NULL;
|
||||
|
||||
@@ -622,6 +622,7 @@ static void rndis_disable(struct usb_function *f)
|
||||
gether_disconnect(&rndis->port);
|
||||
|
||||
usb_ep_disable(rndis->notify);
|
||||
rndis->notify->desc = NULL;
|
||||
}
|
||||
|
||||
/*-------------------------------------------------------------------------*/
|
||||
|
||||
@@ -1167,6 +1167,8 @@ static const struct usb_device_id option_ids[] = {
|
||||
.driver_info = NCTRL(0) | RSVD(3) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x1102, 0xff), /* Telit ME910 (ECM) */
|
||||
.driver_info = NCTRL(0) },
|
||||
{ USB_DEVICE_INTERFACE_CLASS(TELIT_VENDOR_ID, 0x110a, 0xff), /* Telit ME910G1 */
|
||||
.driver_info = NCTRL(0) | RSVD(3) },
|
||||
{ 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),
|
||||
|
||||
@@ -403,7 +403,8 @@ static struct notifier_block xen_memory_nb = {
|
||||
#else
|
||||
static enum bp_state reserve_additional_memory(void)
|
||||
{
|
||||
balloon_stats.target_pages = balloon_stats.current_pages;
|
||||
balloon_stats.target_pages = balloon_stats.current_pages +
|
||||
balloon_stats.target_unpopulated;
|
||||
return BP_ECANCELED;
|
||||
}
|
||||
#endif /* CONFIG_XEN_BALLOON_MEMORY_HOTPLUG */
|
||||
|
||||
@@ -1585,9 +1585,10 @@ COMPAT_SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd,
|
||||
#endif
|
||||
|
||||
case FICLONE:
|
||||
goto do_ioctl;
|
||||
case FICLONERANGE:
|
||||
case FIDEDUPERANGE:
|
||||
goto do_ioctl;
|
||||
goto found_handler;
|
||||
|
||||
case FIBMAP:
|
||||
case FIGETBSZ:
|
||||
|
||||
@@ -2681,7 +2681,7 @@ static void lock_get_status(struct seq_file *f, struct file_lock *fl,
|
||||
}
|
||||
if (inode) {
|
||||
/* userspace relies on this representation of dev_t */
|
||||
seq_printf(f, "%d %02x:%02x:%ld ", fl_pid,
|
||||
seq_printf(f, "%d %02x:%02x:%lu ", fl_pid,
|
||||
MAJOR(inode->i_sb->s_dev),
|
||||
MINOR(inode->i_sb->s_dev), inode->i_ino);
|
||||
} else {
|
||||
|
||||
@@ -3067,12 +3067,17 @@ static bool replay_matches_cache(struct svc_rqst *rqstp,
|
||||
(bool)seq->cachethis)
|
||||
return false;
|
||||
/*
|
||||
* If there's an error than the reply can have fewer ops than
|
||||
* the call. But if we cached a reply with *more* ops than the
|
||||
* call you're sending us now, then this new call is clearly not
|
||||
* really a replay of the old one:
|
||||
* If there's an error then the reply can have fewer ops than
|
||||
* the call.
|
||||
*/
|
||||
if (slot->sl_opcnt < argp->opcnt)
|
||||
if (slot->sl_opcnt < argp->opcnt && !slot->sl_status)
|
||||
return false;
|
||||
/*
|
||||
* But if we cached a reply with *more* ops than the call you're
|
||||
* sending us now, then this new call is clearly not really a
|
||||
* replay of the old one:
|
||||
*/
|
||||
if (slot->sl_opcnt > argp->opcnt)
|
||||
return false;
|
||||
/* This is the only check explicitly called by spec: */
|
||||
if (!same_creds(&rqstp->rq_cred, &slot->sl_cred))
|
||||
|
||||
@@ -321,6 +321,17 @@ static int notrace ramoops_pstore_write_buf(enum pstore_type_id type,
|
||||
|
||||
prz = cxt->przs[cxt->dump_write_cnt];
|
||||
|
||||
/*
|
||||
* Since this is a new crash dump, we need to reset the buffer in
|
||||
* case it still has an old dump present. Without this, the new dump
|
||||
* will get appended, which would seriously confuse anything trying
|
||||
* to check dump file contents. Specifically, ramoops_read_kmsg_hdr()
|
||||
* expects to find a dump header in the beginning of buffer data, so
|
||||
* we must to reset the buffer values, in order to ensure that the
|
||||
* header will be written to the beginning of the buffer.
|
||||
*/
|
||||
persistent_ram_zap(prz);
|
||||
|
||||
hlen = ramoops_write_kmsg_hdr(prz, compressed);
|
||||
if (size + hlen > prz->buffer_size)
|
||||
size = prz->buffer_size - hlen;
|
||||
|
||||
@@ -5688,7 +5688,7 @@ __xfs_bunmapi(
|
||||
* Make sure we don't touch multiple AGF headers out of order
|
||||
* in a single transaction, as that could cause AB-BA deadlocks.
|
||||
*/
|
||||
if (!wasdel) {
|
||||
if (!wasdel && !isrt) {
|
||||
agno = XFS_FSB_TO_AGNO(mp, del.br_startblock);
|
||||
if (prev_agno != NULLAGNUMBER && prev_agno > agno)
|
||||
break;
|
||||
|
||||
@@ -1540,6 +1540,8 @@ out_free_iclog:
|
||||
if (iclog->ic_bp)
|
||||
xfs_buf_free(iclog->ic_bp);
|
||||
kmem_free(iclog);
|
||||
if (prev_iclog == log->l_iclog)
|
||||
break;
|
||||
}
|
||||
spinlock_destroy(&log->l_icloglock);
|
||||
xfs_buf_free(log->l_xbuf);
|
||||
|
||||
@@ -23,6 +23,8 @@ struct ahci_host_priv;
|
||||
struct platform_device;
|
||||
struct scsi_host_template;
|
||||
|
||||
int ahci_platform_enable_phys(struct ahci_host_priv *hpriv);
|
||||
void ahci_platform_disable_phys(struct ahci_host_priv *hpriv);
|
||||
int ahci_platform_enable_clks(struct ahci_host_priv *hpriv);
|
||||
void ahci_platform_disable_clks(struct ahci_host_priv *hpriv);
|
||||
int ahci_platform_enable_regulators(struct ahci_host_priv *hpriv);
|
||||
|
||||
@@ -1358,8 +1358,11 @@ static inline int dma_get_slave_caps(struct dma_chan *chan,
|
||||
static inline int dmaengine_desc_set_reuse(struct dma_async_tx_descriptor *tx)
|
||||
{
|
||||
struct dma_slave_caps caps;
|
||||
int ret;
|
||||
|
||||
dma_get_slave_caps(tx->chan, &caps);
|
||||
ret = dma_get_slave_caps(tx->chan, &caps);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (caps.descriptor_reuse) {
|
||||
tx->flags |= DMA_CTRL_REUSE;
|
||||
|
||||
@@ -28,6 +28,14 @@ static inline struct ethhdr *eth_hdr(const struct sk_buff *skb)
|
||||
return (struct ethhdr *)skb_mac_header(skb);
|
||||
}
|
||||
|
||||
/* Prefer this version in TX path, instead of
|
||||
* skb_reset_mac_header() + eth_hdr()
|
||||
*/
|
||||
static inline struct ethhdr *skb_eth_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct ethhdr *)skb->data;
|
||||
}
|
||||
|
||||
static inline struct ethhdr *inner_eth_hdr(const struct sk_buff *skb)
|
||||
{
|
||||
return (struct ethhdr *)skb_inner_mac_header(skb);
|
||||
|
||||
@@ -38,7 +38,6 @@ enum ab8505_regulator_id {
|
||||
AB8505_LDO_AUX6,
|
||||
AB8505_LDO_INTCORE,
|
||||
AB8505_LDO_ADC,
|
||||
AB8505_LDO_USB,
|
||||
AB8505_LDO_AUDIO,
|
||||
AB8505_LDO_ANAMIC1,
|
||||
AB8505_LDO_ANAMIC2,
|
||||
|
||||
@@ -454,7 +454,7 @@ static inline int neigh_hh_output(const struct hh_cache *hh, struct sk_buff *skb
|
||||
|
||||
do {
|
||||
seq = read_seqbegin(&hh->hh_lock);
|
||||
hh_len = hh->hh_len;
|
||||
hh_len = READ_ONCE(hh->hh_len);
|
||||
if (likely(hh_len <= HH_DATA_MOD)) {
|
||||
hh_alen = HH_DATA_MOD;
|
||||
|
||||
|
||||
@@ -40,19 +40,19 @@ struct xt_sctp_info {
|
||||
#define SCTP_CHUNKMAP_SET(chunkmap, type) \
|
||||
do { \
|
||||
(chunkmap)[type / bytes(__u32)] |= \
|
||||
1 << (type % bytes(__u32)); \
|
||||
1u << (type % bytes(__u32)); \
|
||||
} while (0)
|
||||
|
||||
#define SCTP_CHUNKMAP_CLEAR(chunkmap, type) \
|
||||
do { \
|
||||
(chunkmap)[type / bytes(__u32)] &= \
|
||||
~(1 << (type % bytes(__u32))); \
|
||||
~(1u << (type % bytes(__u32))); \
|
||||
} while (0)
|
||||
|
||||
#define SCTP_CHUNKMAP_IS_SET(chunkmap, type) \
|
||||
({ \
|
||||
((chunkmap)[type / bytes (__u32)] & \
|
||||
(1 << (type % bytes (__u32)))) ? 1: 0; \
|
||||
(1u << (type % bytes (__u32)))) ? 1: 0; \
|
||||
})
|
||||
|
||||
#define SCTP_CHUNKMAP_RESET(chunkmap) \
|
||||
|
||||
@@ -219,7 +219,7 @@ struct cred *cred_alloc_blank(void)
|
||||
new->magic = CRED_MAGIC;
|
||||
#endif
|
||||
|
||||
if (security_cred_alloc_blank(new, GFP_KERNEL) < 0)
|
||||
if (security_cred_alloc_blank(new, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
|
||||
return new;
|
||||
@@ -278,7 +278,7 @@ struct cred *prepare_creds(void)
|
||||
new->security = NULL;
|
||||
#endif
|
||||
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL) < 0)
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
validate_creds(new);
|
||||
return new;
|
||||
@@ -653,7 +653,7 @@ struct cred *prepare_kernel_cred(struct task_struct *daemon)
|
||||
#ifdef CONFIG_SECURITY
|
||||
new->security = NULL;
|
||||
#endif
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL) < 0)
|
||||
if (security_prepare_creds(new, old, GFP_KERNEL_ACCOUNT) < 0)
|
||||
goto error;
|
||||
|
||||
put_cred(old);
|
||||
|
||||
@@ -51,19 +51,19 @@ EXPORT_SYMBOL(__rwlock_init);
|
||||
|
||||
static void spin_dump(raw_spinlock_t *lock, const char *msg)
|
||||
{
|
||||
struct task_struct *owner = NULL;
|
||||
struct task_struct *owner = READ_ONCE(lock->owner);
|
||||
|
||||
if (lock->owner && lock->owner != SPINLOCK_OWNER_INIT)
|
||||
owner = lock->owner;
|
||||
if (owner == SPINLOCK_OWNER_INIT)
|
||||
owner = NULL;
|
||||
printk(KERN_EMERG "BUG: spinlock %s on CPU#%d, %s/%d\n",
|
||||
msg, raw_smp_processor_id(),
|
||||
current->comm, task_pid_nr(current));
|
||||
printk(KERN_EMERG " lock: %pS, .magic: %08x, .owner: %s/%d, "
|
||||
".owner_cpu: %d\n",
|
||||
lock, lock->magic,
|
||||
lock, READ_ONCE(lock->magic),
|
||||
owner ? owner->comm : "<none>",
|
||||
owner ? task_pid_nr(owner) : -1,
|
||||
lock->owner_cpu);
|
||||
READ_ONCE(lock->owner_cpu));
|
||||
dump_stack();
|
||||
}
|
||||
|
||||
@@ -80,16 +80,16 @@ static void spin_bug(raw_spinlock_t *lock, const char *msg)
|
||||
static inline void
|
||||
debug_spin_lock_before(raw_spinlock_t *lock)
|
||||
{
|
||||
SPIN_BUG_ON(lock->magic != SPINLOCK_MAGIC, lock, "bad magic");
|
||||
SPIN_BUG_ON(lock->owner == current, lock, "recursion");
|
||||
SPIN_BUG_ON(lock->owner_cpu == raw_smp_processor_id(),
|
||||
SPIN_BUG_ON(READ_ONCE(lock->magic) != SPINLOCK_MAGIC, lock, "bad magic");
|
||||
SPIN_BUG_ON(READ_ONCE(lock->owner) == current, lock, "recursion");
|
||||
SPIN_BUG_ON(READ_ONCE(lock->owner_cpu) == raw_smp_processor_id(),
|
||||
lock, "cpu recursion");
|
||||
}
|
||||
|
||||
static inline void debug_spin_lock_after(raw_spinlock_t *lock)
|
||||
{
|
||||
lock->owner_cpu = raw_smp_processor_id();
|
||||
lock->owner = current;
|
||||
WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id());
|
||||
WRITE_ONCE(lock->owner, current);
|
||||
}
|
||||
|
||||
static inline void debug_spin_unlock(raw_spinlock_t *lock)
|
||||
@@ -99,8 +99,8 @@ static inline void debug_spin_unlock(raw_spinlock_t *lock)
|
||||
SPIN_BUG_ON(lock->owner != current, lock, "wrong owner");
|
||||
SPIN_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),
|
||||
lock, "wrong CPU");
|
||||
lock->owner = SPINLOCK_OWNER_INIT;
|
||||
lock->owner_cpu = -1;
|
||||
WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT);
|
||||
WRITE_ONCE(lock->owner_cpu, -1);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -183,8 +183,8 @@ static inline void debug_write_lock_before(rwlock_t *lock)
|
||||
|
||||
static inline void debug_write_lock_after(rwlock_t *lock)
|
||||
{
|
||||
lock->owner_cpu = raw_smp_processor_id();
|
||||
lock->owner = current;
|
||||
WRITE_ONCE(lock->owner_cpu, raw_smp_processor_id());
|
||||
WRITE_ONCE(lock->owner, current);
|
||||
}
|
||||
|
||||
static inline void debug_write_unlock(rwlock_t *lock)
|
||||
@@ -193,8 +193,8 @@ static inline void debug_write_unlock(rwlock_t *lock)
|
||||
RWLOCK_BUG_ON(lock->owner != current, lock, "wrong owner");
|
||||
RWLOCK_BUG_ON(lock->owner_cpu != raw_smp_processor_id(),
|
||||
lock, "wrong CPU");
|
||||
lock->owner = SPINLOCK_OWNER_INIT;
|
||||
lock->owner_cpu = -1;
|
||||
WRITE_ONCE(lock->owner, SPINLOCK_OWNER_INIT);
|
||||
WRITE_ONCE(lock->owner_cpu, -1);
|
||||
}
|
||||
|
||||
void do_raw_write_lock(rwlock_t *lock)
|
||||
|
||||
@@ -732,8 +732,15 @@ zone_found:
|
||||
* We have found the zone. Now walk the radix tree to find the leaf node
|
||||
* for our PFN.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If the zone we wish to scan is the the current zone and the
|
||||
* pfn falls into the current node then we do not need to walk
|
||||
* the tree.
|
||||
*/
|
||||
node = bm->cur.node;
|
||||
if (((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn)
|
||||
if (zone == bm->cur.zone &&
|
||||
((pfn - zone->start_pfn) & ~BM_BLOCK_MASK) == bm->cur.node_pfn)
|
||||
goto node_found;
|
||||
|
||||
node = zone->rtree;
|
||||
|
||||
@@ -559,25 +559,33 @@ static int taskstats_user_cmd(struct sk_buff *skb, struct genl_info *info)
|
||||
static struct taskstats *taskstats_tgid_alloc(struct task_struct *tsk)
|
||||
{
|
||||
struct signal_struct *sig = tsk->signal;
|
||||
struct taskstats *stats;
|
||||
struct taskstats *stats_new, *stats;
|
||||
|
||||
if (sig->stats || thread_group_empty(tsk))
|
||||
goto ret;
|
||||
/* Pairs with smp_store_release() below. */
|
||||
stats = smp_load_acquire(&sig->stats);
|
||||
if (stats || thread_group_empty(tsk))
|
||||
return stats;
|
||||
|
||||
/* No problem if kmem_cache_zalloc() fails */
|
||||
stats = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
|
||||
stats_new = kmem_cache_zalloc(taskstats_cache, GFP_KERNEL);
|
||||
|
||||
spin_lock_irq(&tsk->sighand->siglock);
|
||||
if (!sig->stats) {
|
||||
sig->stats = stats;
|
||||
stats = NULL;
|
||||
stats = sig->stats;
|
||||
if (!stats) {
|
||||
/*
|
||||
* Pairs with smp_store_release() above and order the
|
||||
* kmem_cache_zalloc().
|
||||
*/
|
||||
smp_store_release(&sig->stats, stats_new);
|
||||
stats = stats_new;
|
||||
stats_new = NULL;
|
||||
}
|
||||
spin_unlock_irq(&tsk->sighand->siglock);
|
||||
|
||||
if (stats)
|
||||
kmem_cache_free(taskstats_cache, stats);
|
||||
ret:
|
||||
return sig->stats;
|
||||
if (stats_new)
|
||||
kmem_cache_free(taskstats_cache, stats_new);
|
||||
|
||||
return stats;
|
||||
}
|
||||
|
||||
/* Send pid data out on exit */
|
||||
|
||||
@@ -610,8 +610,7 @@ static int function_stat_show(struct seq_file *m, void *v)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_FUNCTION_GRAPH_TRACER
|
||||
avg = rec->time;
|
||||
do_div(avg, rec->counter);
|
||||
avg = div64_ul(rec->time, rec->counter);
|
||||
if (tracing_thresh && (avg < tracing_thresh))
|
||||
goto out;
|
||||
#endif
|
||||
@@ -637,7 +636,8 @@ static int function_stat_show(struct seq_file *m, void *v)
|
||||
* Divide only 1000 for ns^2 -> us^2 conversion.
|
||||
* trace_print_graph_duration will divide 1000 again.
|
||||
*/
|
||||
do_div(stddev, rec->counter * (rec->counter - 1) * 1000);
|
||||
stddev = div64_ul(stddev,
|
||||
rec->counter * (rec->counter - 1) * 1000);
|
||||
}
|
||||
|
||||
trace_seq_init(&s);
|
||||
|
||||
@@ -90,8 +90,8 @@ static int tracing_map_cmp_atomic64(void *val_a, void *val_b)
|
||||
#define DEFINE_TRACING_MAP_CMP_FN(type) \
|
||||
static int tracing_map_cmp_##type(void *val_a, void *val_b) \
|
||||
{ \
|
||||
type a = *(type *)val_a; \
|
||||
type b = *(type *)val_b; \
|
||||
type a = (type)(*(u64 *)val_a); \
|
||||
type b = (type)(*(u64 *)val_b); \
|
||||
\
|
||||
return (a > b) ? 1 : ((a < b) ? -1 : 0); \
|
||||
}
|
||||
|
||||
@@ -87,12 +87,6 @@ static void unmap_region(struct mm_struct *mm,
|
||||
* MAP_PRIVATE r: (no) no r: (yes) yes r: (no) yes r: (no) yes
|
||||
* w: (no) no w: (no) no w: (copy) copy w: (no) no
|
||||
* x: (no) no x: (no) yes x: (no) yes x: (yes) yes
|
||||
*
|
||||
* On arm64, PROT_EXEC has the following behaviour for both MAP_SHARED and
|
||||
* MAP_PRIVATE:
|
||||
* r: (no) no
|
||||
* w: (no) no
|
||||
* x: (yes) yes
|
||||
*/
|
||||
pgprot_t protection_map[16] = {
|
||||
__P000, __P001, __P010, __P011, __P100, __P101, __P110, __P111,
|
||||
|
||||
@@ -2158,6 +2158,11 @@ int zs_page_migrate(struct address_space *mapping, struct page *newpage,
|
||||
zs_pool_dec_isolated(pool);
|
||||
}
|
||||
|
||||
if (page_zone(newpage) != page_zone(page)) {
|
||||
dec_zone_page_state(page, NR_ZSPAGES);
|
||||
inc_zone_page_state(newpage, NR_ZSPAGES);
|
||||
}
|
||||
|
||||
reset_page(page);
|
||||
put_page(page);
|
||||
page = newpage;
|
||||
|
||||
@@ -109,6 +109,7 @@ int vlan_check_real_dev(struct net_device *real_dev,
|
||||
void vlan_setup(struct net_device *dev);
|
||||
int register_vlan_dev(struct net_device *dev);
|
||||
void unregister_vlan_dev(struct net_device *dev, struct list_head *head);
|
||||
void vlan_dev_uninit(struct net_device *dev);
|
||||
bool vlan_dev_inherit_address(struct net_device *dev,
|
||||
struct net_device *real_dev);
|
||||
|
||||
|
||||
@@ -610,7 +610,8 @@ static int vlan_dev_init(struct net_device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void vlan_dev_uninit(struct net_device *dev)
|
||||
/* Note: this function might be called multiple times for the same device. */
|
||||
void vlan_dev_uninit(struct net_device *dev)
|
||||
{
|
||||
struct vlan_priority_tci_mapping *pm;
|
||||
struct vlan_dev_priv *vlan = vlan_dev_priv(dev);
|
||||
|
||||
@@ -92,11 +92,13 @@ static int vlan_changelink(struct net_device *dev,
|
||||
struct ifla_vlan_flags *flags;
|
||||
struct ifla_vlan_qos_mapping *m;
|
||||
struct nlattr *attr;
|
||||
int rem;
|
||||
int rem, err;
|
||||
|
||||
if (data[IFLA_VLAN_FLAGS]) {
|
||||
flags = nla_data(data[IFLA_VLAN_FLAGS]);
|
||||
vlan_dev_change_flags(dev, flags->flags, flags->mask);
|
||||
err = vlan_dev_change_flags(dev, flags->flags, flags->mask);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
if (data[IFLA_VLAN_INGRESS_QOS]) {
|
||||
nla_for_each_nested(attr, data[IFLA_VLAN_INGRESS_QOS], rem) {
|
||||
@@ -107,7 +109,9 @@ static int vlan_changelink(struct net_device *dev,
|
||||
if (data[IFLA_VLAN_EGRESS_QOS]) {
|
||||
nla_for_each_nested(attr, data[IFLA_VLAN_EGRESS_QOS], rem) {
|
||||
m = nla_data(attr);
|
||||
vlan_dev_set_egress_priority(dev, m->from, m->to);
|
||||
err = vlan_dev_set_egress_priority(dev, m->from, m->to);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -153,10 +157,11 @@ static int vlan_newlink(struct net *src_net, struct net_device *dev,
|
||||
return -EINVAL;
|
||||
|
||||
err = vlan_changelink(dev, tb, data);
|
||||
if (err < 0)
|
||||
return err;
|
||||
|
||||
return register_vlan_dev(dev);
|
||||
if (!err)
|
||||
err = register_vlan_dev(dev);
|
||||
if (err)
|
||||
vlan_dev_uninit(dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static inline size_t vlan_qos_map_size(unsigned int n)
|
||||
|
||||
@@ -1054,8 +1054,10 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
|
||||
if (!conn)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0)
|
||||
if (hci_explicit_conn_params_set(hdev, dst, dst_type) < 0) {
|
||||
hci_conn_del(conn);
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
|
||||
conn->state = BT_CONNECT;
|
||||
set_bit(HCI_CONN_SCANNING, &conn->flags);
|
||||
|
||||
@@ -4908,10 +4908,8 @@ void __l2cap_physical_cfm(struct l2cap_chan *chan, int result)
|
||||
BT_DBG("chan %p, result %d, local_amp_id %d, remote_amp_id %d",
|
||||
chan, result, local_amp_id, remote_amp_id);
|
||||
|
||||
if (chan->state == BT_DISCONN || chan->state == BT_CLOSED) {
|
||||
l2cap_chan_unlock(chan);
|
||||
if (chan->state == BT_DISCONN || chan->state == BT_CLOSED)
|
||||
return;
|
||||
}
|
||||
|
||||
if (chan->state != BT_CONNECTED) {
|
||||
l2cap_do_create(chan, result, local_amp_id, remote_amp_id);
|
||||
|
||||
@@ -1058,7 +1058,7 @@ static void neigh_update_hhs(struct neighbour *neigh)
|
||||
|
||||
if (update) {
|
||||
hh = &neigh->hh;
|
||||
if (hh->hh_len) {
|
||||
if (READ_ONCE(hh->hh_len)) {
|
||||
write_seqlock_bh(&hh->hh_lock);
|
||||
update(hh, neigh->dev, neigh->ha);
|
||||
write_sequnlock_bh(&hh->hh_lock);
|
||||
@@ -1319,7 +1319,7 @@ int neigh_resolve_output(struct neighbour *neigh, struct sk_buff *skb)
|
||||
struct net_device *dev = neigh->dev;
|
||||
unsigned int seq;
|
||||
|
||||
if (dev->header_ops->cache && !neigh->hh.hh_len)
|
||||
if (dev->header_ops->cache && !READ_ONCE(neigh->hh.hh_len))
|
||||
neigh_hh_init(neigh);
|
||||
|
||||
do {
|
||||
|
||||
@@ -238,7 +238,12 @@ int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh, __be16
|
||||
eth->h_proto = type;
|
||||
memcpy(eth->h_source, dev->dev_addr, ETH_ALEN);
|
||||
memcpy(eth->h_dest, neigh->ha, ETH_ALEN);
|
||||
hh->hh_len = ETH_HLEN;
|
||||
|
||||
/* Pairs with READ_ONCE() in neigh_resolve_output(),
|
||||
* neigh_hh_output() and neigh_update_hhs().
|
||||
*/
|
||||
smp_store_release(&hh->hh_len, ETH_HLEN);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(eth_header_cache);
|
||||
|
||||
@@ -1742,8 +1742,11 @@ tcp_sacktag_write_queue(struct sock *sk, const struct sk_buff *ack_skb,
|
||||
}
|
||||
|
||||
/* Ignore very old stuff early */
|
||||
if (!after(sp[used_sacks].end_seq, prior_snd_una))
|
||||
if (!after(sp[used_sacks].end_seq, prior_snd_una)) {
|
||||
if (i == 0)
|
||||
first_sack_index = -1;
|
||||
continue;
|
||||
}
|
||||
|
||||
used_sacks++;
|
||||
}
|
||||
|
||||
@@ -32,7 +32,7 @@ static int llc_stat_ev_rx_null_dsap_xid_c(struct sk_buff *skb)
|
||||
return LLC_PDU_IS_CMD(pdu) && /* command PDU */
|
||||
LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */
|
||||
LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_XID &&
|
||||
!pdu->dsap ? 0 : 1; /* NULL DSAP value */
|
||||
!pdu->dsap; /* NULL DSAP value */
|
||||
}
|
||||
|
||||
static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff *skb)
|
||||
@@ -42,7 +42,7 @@ static int llc_stat_ev_rx_null_dsap_test_c(struct sk_buff *skb)
|
||||
return LLC_PDU_IS_CMD(pdu) && /* command PDU */
|
||||
LLC_PDU_TYPE_IS_U(pdu) && /* U type PDU */
|
||||
LLC_U_PDU_CMD(pdu) == LLC_1_PDU_CMD_TEST &&
|
||||
!pdu->dsap ? 0 : 1; /* NULL DSAP */
|
||||
!pdu->dsap; /* NULL DSAP */
|
||||
}
|
||||
|
||||
static int llc_station_ac_send_xid_r(struct sk_buff *skb)
|
||||
|
||||
@@ -3388,6 +3388,9 @@ static void __net_exit ctnetlink_net_exit_batch(struct list_head *net_exit_list)
|
||||
|
||||
list_for_each_entry(net, net_exit_list, exit_list)
|
||||
ctnetlink_net_exit(net);
|
||||
|
||||
/* wait for other cpus until they are done with ctnl_notifiers */
|
||||
synchronize_rcu();
|
||||
}
|
||||
|
||||
static struct pernet_operations ctnetlink_net_ops = {
|
||||
|
||||
@@ -935,10 +935,13 @@ static void rfkill_sync_work(struct work_struct *work)
|
||||
int __must_check rfkill_register(struct rfkill *rfkill)
|
||||
{
|
||||
static unsigned long rfkill_no;
|
||||
struct device *dev = &rfkill->dev;
|
||||
struct device *dev;
|
||||
int error;
|
||||
|
||||
BUG_ON(!rfkill);
|
||||
if (!rfkill)
|
||||
return -EINVAL;
|
||||
|
||||
dev = &rfkill->dev;
|
||||
|
||||
mutex_lock(&rfkill_global_mutex);
|
||||
|
||||
|
||||
@@ -148,6 +148,9 @@ void rxrpc_error_report(struct sock *sk)
|
||||
struct rxrpc_peer *peer;
|
||||
struct sk_buff *skb;
|
||||
|
||||
if (unlikely(!local))
|
||||
return;
|
||||
|
||||
_enter("%p{%d}", sk, local->debug_id);
|
||||
|
||||
skb = sock_dequeue_err_skb(sk);
|
||||
|
||||
@@ -736,7 +736,7 @@ static int fq_change(struct Qdisc *sch, struct nlattr *opt)
|
||||
if (tb[TCA_FQ_QUANTUM]) {
|
||||
u32 quantum = nla_get_u32(tb[TCA_FQ_QUANTUM]);
|
||||
|
||||
if (quantum > 0)
|
||||
if (quantum > 0 && quantum <= (1 << 20))
|
||||
q->quantum = quantum;
|
||||
else
|
||||
err = -EINVAL;
|
||||
|
||||
@@ -232,8 +232,14 @@ static int prio_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
|
||||
struct prio_sched_data *q = qdisc_priv(sch);
|
||||
unsigned long band = arg - 1;
|
||||
|
||||
if (new == NULL)
|
||||
new = &noop_qdisc;
|
||||
if (!new) {
|
||||
new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
|
||||
TC_H_MAKE(sch->handle, arg));
|
||||
if (!new)
|
||||
new = &noop_qdisc;
|
||||
else
|
||||
qdisc_hash_add(new);
|
||||
}
|
||||
|
||||
*old = qdisc_replace(sch, new, &q->queues[band]);
|
||||
return 0;
|
||||
|
||||
@@ -1321,8 +1321,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
||||
/* Generate an INIT ACK chunk. */
|
||||
new_obj = sctp_make_init_ack(asoc, chunk, GFP_ATOMIC,
|
||||
0);
|
||||
if (!new_obj)
|
||||
goto nomem;
|
||||
if (!new_obj) {
|
||||
error = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,
|
||||
SCTP_CHUNK(new_obj));
|
||||
@@ -1344,7 +1346,8 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
||||
if (!new_obj) {
|
||||
if (cmd->obj.chunk)
|
||||
sctp_chunk_free(cmd->obj.chunk);
|
||||
goto nomem;
|
||||
error = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,
|
||||
SCTP_CHUNK(new_obj));
|
||||
@@ -1391,8 +1394,10 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
||||
|
||||
/* Generate a SHUTDOWN chunk. */
|
||||
new_obj = sctp_make_shutdown(asoc, chunk);
|
||||
if (!new_obj)
|
||||
goto nomem;
|
||||
if (!new_obj) {
|
||||
error = -ENOMEM;
|
||||
break;
|
||||
}
|
||||
sctp_add_cmd_sf(commands, SCTP_CMD_REPLY,
|
||||
SCTP_CHUNK(new_obj));
|
||||
break;
|
||||
@@ -1721,11 +1726,17 @@ static int sctp_cmd_interpreter(sctp_event_t event_type,
|
||||
break;
|
||||
}
|
||||
|
||||
if (error)
|
||||
if (error) {
|
||||
cmd = sctp_next_cmd(commands);
|
||||
while (cmd) {
|
||||
if (cmd->verb == SCTP_CMD_REPLY)
|
||||
sctp_chunk_free(cmd->obj.chunk);
|
||||
cmd = sctp_next_cmd(commands);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
out:
|
||||
/* If this is in response to a received chunk, wait until
|
||||
* we are done with the packet to open the queue so that we don't
|
||||
* send multiple packets in response to a single request.
|
||||
@@ -1740,8 +1751,5 @@ out:
|
||||
sp->data_ready_signalled = 0;
|
||||
|
||||
return error;
|
||||
nomem:
|
||||
error = -ENOMEM;
|
||||
goto out;
|
||||
}
|
||||
|
||||
|
||||
@@ -33,9 +33,9 @@ static void print_ksym(__u64 addr)
|
||||
return;
|
||||
sym = ksym_search(addr);
|
||||
printf("%s;", sym->name);
|
||||
if (!strcmp(sym->name, "sys_read"))
|
||||
if (!strstr(sym->name, "sys_read"))
|
||||
sys_read_seen = true;
|
||||
else if (!strcmp(sym->name, "sys_write"))
|
||||
else if (!strstr(sym->name, "sys_write"))
|
||||
sys_write_seen = true;
|
||||
}
|
||||
|
||||
|
||||
@@ -201,6 +201,13 @@ static int expr_eq(struct expr *e1, struct expr *e2)
|
||||
{
|
||||
int res, old_count;
|
||||
|
||||
/*
|
||||
* A NULL expr is taken to be yes, but there's also a different way to
|
||||
* represent yes. expr_is_yes() checks for either representation.
|
||||
*/
|
||||
if (!e1 || !e2)
|
||||
return expr_is_yes(e1) && expr_is_yes(e2);
|
||||
|
||||
if (e1->type != e2->type)
|
||||
return 0;
|
||||
switch (e1->type) {
|
||||
|
||||
@@ -293,7 +293,8 @@ static int snd_cs423x_pnp_init_mpu(int dev, struct pnp_dev *pdev)
|
||||
} else {
|
||||
mpu_port[dev] = pnp_port_start(pdev, 0);
|
||||
if (mpu_irq[dev] >= 0 &&
|
||||
pnp_irq_valid(pdev, 0) && pnp_irq(pdev, 0) >= 0) {
|
||||
pnp_irq_valid(pdev, 0) &&
|
||||
pnp_irq(pdev, 0) != (resource_size_t)-1) {
|
||||
mpu_irq[dev] = pnp_irq(pdev, 0);
|
||||
} else {
|
||||
mpu_irq[dev] = -1; /* disable interrupt */
|
||||
|
||||
@@ -661,6 +661,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
||||
unsigned long flags;
|
||||
unsigned char mclk_change;
|
||||
unsigned int i, old_rate;
|
||||
bool call_set_rate = false;
|
||||
|
||||
if (rate > ice->hw_rates->list[ice->hw_rates->count - 1])
|
||||
return -EINVAL;
|
||||
@@ -684,7 +685,7 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
||||
* setting clock rate for internal clock mode */
|
||||
old_rate = ice->get_rate(ice);
|
||||
if (force || (old_rate != rate))
|
||||
ice->set_rate(ice, rate);
|
||||
call_set_rate = true;
|
||||
else if (rate == ice->cur_rate) {
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
return 0;
|
||||
@@ -692,12 +693,14 @@ static int snd_vt1724_set_pro_rate(struct snd_ice1712 *ice, unsigned int rate,
|
||||
}
|
||||
|
||||
ice->cur_rate = rate;
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
|
||||
if (call_set_rate)
|
||||
ice->set_rate(ice, rate);
|
||||
|
||||
/* setting master clock */
|
||||
mclk_change = ice->set_mclk(ice, rate);
|
||||
|
||||
spin_unlock_irqrestore(&ice->reg_lock, flags);
|
||||
|
||||
if (mclk_change && ice->gpio.i2s_mclk_changed)
|
||||
ice->gpio.i2s_mclk_changed(ice);
|
||||
if (ice->gpio.set_pro_rate)
|
||||
|
||||
@@ -2791,7 +2791,7 @@ static int fll_factors(struct _fll_div *fll_div, unsigned int Fref,
|
||||
|
||||
if (target % Fref == 0) {
|
||||
fll_div->theta = 0;
|
||||
fll_div->lambda = 0;
|
||||
fll_div->lambda = 1;
|
||||
} else {
|
||||
gcd_fll = gcd(target, fratio * Fref);
|
||||
|
||||
@@ -2861,7 +2861,7 @@ static int wm8962_set_fll(struct snd_soc_codec *codec, int fll_id, int source,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (fll_div.theta || fll_div.lambda)
|
||||
if (fll_div.theta)
|
||||
fll1 |= WM8962_FLL_FRAC;
|
||||
|
||||
/* Stop the FLL while we reconfigure */
|
||||
|
||||
@@ -292,13 +292,6 @@ static int report__setup_sample_type(struct report *rep)
|
||||
PERF_SAMPLE_BRANCH_ANY))
|
||||
rep->nonany_branch_mode = true;
|
||||
|
||||
#ifndef HAVE_LIBUNWIND_SUPPORT
|
||||
if (dwarf_callchain_users) {
|
||||
ui__warning("Please install libunwind development packages "
|
||||
"during the perf build.\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user