Merge ffd9fb546d ("Merge tag 'sound-5.12-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound") into android-mainline
Steps on the way to 5.11-rc6 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ia02e1f420f6ca2eb61cf4bbaff9afc645bf6f992
This commit is contained in:
@@ -15640,8 +15640,8 @@ F: Documentation/s390/pci.rst
|
||||
|
||||
S390 VFIO AP DRIVER
|
||||
M: Tony Krowiak <akrowiak@linux.ibm.com>
|
||||
M: Pierre Morel <pmorel@linux.ibm.com>
|
||||
M: Halil Pasic <pasic@linux.ibm.com>
|
||||
M: Jason Herne <jjherne@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
S: Supported
|
||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||
@@ -15653,6 +15653,7 @@ F: drivers/s390/crypto/vfio_ap_private.h
|
||||
S390 VFIO-CCW DRIVER
|
||||
M: Cornelia Huck <cohuck@redhat.com>
|
||||
M: Eric Farman <farman@linux.ibm.com>
|
||||
M: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||
R: Halil Pasic <pasic@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
L: kvm@vger.kernel.org
|
||||
@@ -15663,6 +15664,7 @@ F: include/uapi/linux/vfio_ccw.h
|
||||
|
||||
S390 VFIO-PCI DRIVER
|
||||
M: Matthew Rosato <mjrosato@linux.ibm.com>
|
||||
M: Eric Farman <farman@linux.ibm.com>
|
||||
L: linux-s390@vger.kernel.org
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
#include <asm/prom.h>
|
||||
|
||||
#ifdef CONFIG_MIPS_ELF_APPENDED_DTB
|
||||
const char __section(".appended_dtb") __appended_dtb[0x100000];
|
||||
char __section(".appended_dtb") __appended_dtb[0x100000];
|
||||
#endif /* CONFIG_MIPS_ELF_APPENDED_DTB */
|
||||
|
||||
struct cpuinfo_mips cpu_data[NR_CPUS] __read_mostly;
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
#include <vdso/datapage.h>
|
||||
|
||||
struct arch_vdso_data {
|
||||
__u64 tod_steering_delta;
|
||||
__s64 tod_steering_delta;
|
||||
__u64 tod_steering_end;
|
||||
};
|
||||
|
||||
|
||||
@@ -80,10 +80,12 @@ void __init time_early_init(void)
|
||||
{
|
||||
struct ptff_qto qto;
|
||||
struct ptff_qui qui;
|
||||
int cs;
|
||||
|
||||
/* Initialize TOD steering parameters */
|
||||
tod_steering_end = tod_clock_base.tod;
|
||||
vdso_data->arch_data.tod_steering_end = tod_steering_end;
|
||||
for (cs = 0; cs < CS_BASES; cs++)
|
||||
vdso_data[cs].arch_data.tod_steering_end = tod_steering_end;
|
||||
|
||||
if (!test_facility(28))
|
||||
return;
|
||||
@@ -366,6 +368,7 @@ static void clock_sync_global(unsigned long delta)
|
||||
{
|
||||
unsigned long now, adj;
|
||||
struct ptff_qto qto;
|
||||
int cs;
|
||||
|
||||
/* Fixup the monotonic sched clock. */
|
||||
tod_clock_base.eitod += delta;
|
||||
@@ -381,7 +384,10 @@ static void clock_sync_global(unsigned long delta)
|
||||
panic("TOD clock sync offset %li is too large to drift\n",
|
||||
tod_steering_delta);
|
||||
tod_steering_end = now + (abs(tod_steering_delta) << 15);
|
||||
vdso_data->arch_data.tod_steering_end = tod_steering_end;
|
||||
for (cs = 0; cs < CS_BASES; cs++) {
|
||||
vdso_data[cs].arch_data.tod_steering_end = tod_steering_end;
|
||||
vdso_data[cs].arch_data.tod_steering_delta = tod_steering_delta;
|
||||
}
|
||||
|
||||
/* Update LPAR offset. */
|
||||
if (ptff_query(PTFF_QTO) && ptff(&qto, sizeof(qto), PTFF_QTO) == 0)
|
||||
|
||||
@@ -99,37 +99,6 @@
|
||||
LOAD_CP_REGS_TAB(6)
|
||||
LOAD_CP_REGS_TAB(7)
|
||||
|
||||
/*
|
||||
* coprocessor_flush(struct thread_info*, index)
|
||||
* a2 a3
|
||||
*
|
||||
* Save coprocessor registers for coprocessor 'index'.
|
||||
* The register values are saved to or loaded from the coprocessor area
|
||||
* inside the task_info structure.
|
||||
*
|
||||
* Note that this function doesn't update the coprocessor_owner information!
|
||||
*
|
||||
*/
|
||||
|
||||
ENTRY(coprocessor_flush)
|
||||
|
||||
/* reserve 4 bytes on stack to save a0 */
|
||||
abi_entry(4)
|
||||
|
||||
s32i a0, a1, 0
|
||||
movi a0, .Lsave_cp_regs_jump_table
|
||||
addx8 a3, a3, a0
|
||||
l32i a4, a3, 4
|
||||
l32i a3, a3, 0
|
||||
add a2, a2, a4
|
||||
beqz a3, 1f
|
||||
callx0 a3
|
||||
1: l32i a0, a1, 0
|
||||
|
||||
abi_ret(4)
|
||||
|
||||
ENDPROC(coprocessor_flush)
|
||||
|
||||
/*
|
||||
* Entry condition:
|
||||
*
|
||||
@@ -245,6 +214,39 @@ ENTRY(fast_coprocessor)
|
||||
|
||||
ENDPROC(fast_coprocessor)
|
||||
|
||||
.text
|
||||
|
||||
/*
|
||||
* coprocessor_flush(struct thread_info*, index)
|
||||
* a2 a3
|
||||
*
|
||||
* Save coprocessor registers for coprocessor 'index'.
|
||||
* The register values are saved to or loaded from the coprocessor area
|
||||
* inside the task_info structure.
|
||||
*
|
||||
* Note that this function doesn't update the coprocessor_owner information!
|
||||
*
|
||||
*/
|
||||
|
||||
ENTRY(coprocessor_flush)
|
||||
|
||||
/* reserve 4 bytes on stack to save a0 */
|
||||
abi_entry(4)
|
||||
|
||||
s32i a0, a1, 0
|
||||
movi a0, .Lsave_cp_regs_jump_table
|
||||
addx8 a3, a3, a0
|
||||
l32i a4, a3, 4
|
||||
l32i a3, a3, 0
|
||||
add a2, a2, a4
|
||||
beqz a3, 1f
|
||||
callx0 a3
|
||||
1: l32i a0, a1, 0
|
||||
|
||||
abi_ret(4)
|
||||
|
||||
ENDPROC(coprocessor_flush)
|
||||
|
||||
.data
|
||||
|
||||
ENTRY(coprocessor_owner)
|
||||
|
||||
@@ -112,8 +112,11 @@ good_area:
|
||||
*/
|
||||
fault = handle_mm_fault(vma, address, flags, regs);
|
||||
|
||||
if (fault_signal_pending(fault, regs))
|
||||
if (fault_signal_pending(fault, regs)) {
|
||||
if (!user_mode(regs))
|
||||
goto bad_page_fault;
|
||||
return;
|
||||
}
|
||||
|
||||
if (unlikely(fault & VM_FAULT_ERROR)) {
|
||||
if (fault & VM_FAULT_OOM)
|
||||
|
||||
@@ -891,7 +891,7 @@ next:
|
||||
out:
|
||||
for (i = last_map; i < num; i++) {
|
||||
/* Don't zap current batch's valid persistent grants. */
|
||||
if(i >= last_map + segs_to_map)
|
||||
if(i >= map_until)
|
||||
pages[i]->persistent_gnt = NULL;
|
||||
pages[i]->handle = BLKBACK_INVALID_HANDLE;
|
||||
}
|
||||
|
||||
@@ -1357,6 +1357,7 @@ static int intel_pinctrl_add_padgroups_by_gpps(struct intel_pinctrl *pctrl,
|
||||
gpps[i].gpio_base = 0;
|
||||
break;
|
||||
case INTEL_GPIO_BASE_NOMAP:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
@@ -1393,6 +1394,7 @@ static int intel_pinctrl_add_padgroups_by_size(struct intel_pinctrl *pctrl,
|
||||
gpps[i].size = min(gpp_size, npins);
|
||||
npins -= gpps[i].size;
|
||||
|
||||
gpps[i].gpio_base = gpps[i].base;
|
||||
gpps[i].padown_num = padown_num;
|
||||
|
||||
/*
|
||||
@@ -1491,8 +1493,13 @@ static int intel_pinctrl_probe(struct platform_device *pdev,
|
||||
if (IS_ERR(regs))
|
||||
return PTR_ERR(regs);
|
||||
|
||||
/* Determine community features based on the revision */
|
||||
/*
|
||||
* Determine community features based on the revision.
|
||||
* A value of all ones means the device is not present.
|
||||
*/
|
||||
value = readl(regs + REVID);
|
||||
if (value == ~0u)
|
||||
return -ENODEV;
|
||||
if (((value & REVID_MASK) >> REVID_SHIFT) >= 0x94) {
|
||||
community->features |= PINCTRL_FEATURE_DEBOUNCE;
|
||||
community->features |= PINCTRL_FEATURE_1K_PD;
|
||||
|
||||
@@ -572,7 +572,7 @@ static void microchip_sgpio_irq_settype(struct irq_data *data,
|
||||
/* Type value spread over 2 registers sets: low, high bit */
|
||||
sgpio_clrsetbits(bank->priv, REG_INT_TRIGGER, addr.bit,
|
||||
BIT(addr.port), (!!(type & 0x1)) << addr.port);
|
||||
sgpio_clrsetbits(bank->priv, REG_INT_TRIGGER + SGPIO_MAX_BITS, addr.bit,
|
||||
sgpio_clrsetbits(bank->priv, REG_INT_TRIGGER, SGPIO_MAX_BITS + addr.bit,
|
||||
BIT(addr.port), (!!(type & 0x2)) << addr.port);
|
||||
|
||||
if (type == SGPIO_INT_TRG_LEVEL)
|
||||
|
||||
@@ -3727,12 +3727,15 @@ static int __maybe_unused rockchip_pinctrl_suspend(struct device *dev)
|
||||
static int __maybe_unused rockchip_pinctrl_resume(struct device *dev)
|
||||
{
|
||||
struct rockchip_pinctrl *info = dev_get_drvdata(dev);
|
||||
int ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX,
|
||||
rk3288_grf_gpio6c_iomux |
|
||||
GPIO6C6_SEL_WRITE_ENABLE);
|
||||
int ret;
|
||||
|
||||
if (ret)
|
||||
return ret;
|
||||
if (info->ctrl->type == RK3288) {
|
||||
ret = regmap_write(info->regmap_base, RK3288_GRF_GPIO6C_IOMUX,
|
||||
rk3288_grf_gpio6c_iomux |
|
||||
GPIO6C6_SEL_WRITE_ENABLE);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
|
||||
return pinctrl_force_default(info->pctl_dev);
|
||||
}
|
||||
|
||||
@@ -392,7 +392,7 @@ static int lpi_config_set(struct pinctrl_dev *pctldev, unsigned int group,
|
||||
unsigned long *configs, unsigned int nconfs)
|
||||
{
|
||||
struct lpi_pinctrl *pctrl = dev_get_drvdata(pctldev->dev);
|
||||
unsigned int param, arg, pullup, strength;
|
||||
unsigned int param, arg, pullup = LPI_GPIO_BIAS_DISABLE, strength = 2;
|
||||
bool value, output_enabled = false;
|
||||
const struct lpi_pingroup *g;
|
||||
unsigned long sval;
|
||||
|
||||
@@ -1439,14 +1439,14 @@ static const struct msm_pingroup sc7280_groups[] = {
|
||||
[172] = PINGROUP(172, qdss, _, _, _, _, _, _, _, _),
|
||||
[173] = PINGROUP(173, qdss, _, _, _, _, _, _, _, _),
|
||||
[174] = PINGROUP(174, qdss, _, _, _, _, _, _, _, _),
|
||||
[175] = UFS_RESET(ufs_reset, 0x1be000),
|
||||
[176] = SDC_QDSD_PINGROUP(sdc1_rclk, 0x1b3000, 15, 0),
|
||||
[177] = SDC_QDSD_PINGROUP(sdc1_clk, 0x1b3000, 13, 6),
|
||||
[178] = SDC_QDSD_PINGROUP(sdc1_cmd, 0x1b3000, 11, 3),
|
||||
[179] = SDC_QDSD_PINGROUP(sdc1_data, 0x1b3000, 9, 0),
|
||||
[180] = SDC_QDSD_PINGROUP(sdc2_clk, 0x1b4000, 14, 6),
|
||||
[181] = SDC_QDSD_PINGROUP(sdc2_cmd, 0x1b4000, 11, 3),
|
||||
[182] = SDC_QDSD_PINGROUP(sdc2_data, 0x1b4000, 9, 0),
|
||||
[175] = UFS_RESET(ufs_reset, 0xbe000),
|
||||
[176] = SDC_QDSD_PINGROUP(sdc1_rclk, 0xb3004, 0, 6),
|
||||
[177] = SDC_QDSD_PINGROUP(sdc1_clk, 0xb3000, 13, 6),
|
||||
[178] = SDC_QDSD_PINGROUP(sdc1_cmd, 0xb3000, 11, 3),
|
||||
[179] = SDC_QDSD_PINGROUP(sdc1_data, 0xb3000, 9, 0),
|
||||
[180] = SDC_QDSD_PINGROUP(sdc2_clk, 0xb4000, 14, 6),
|
||||
[181] = SDC_QDSD_PINGROUP(sdc2_cmd, 0xb4000, 11, 3),
|
||||
[182] = SDC_QDSD_PINGROUP(sdc2_data, 0xb4000, 9, 0),
|
||||
};
|
||||
|
||||
static const struct msm_pinctrl_soc_data sc7280_pinctrl = {
|
||||
|
||||
@@ -423,7 +423,7 @@ static const char * const gpio_groups[] = {
|
||||
|
||||
static const char * const qdss_stm_groups[] = {
|
||||
"gpio0", "gpio1", "gpio2", "gpio3", "gpio4", "gpio5", "gpio6", "gpio7", "gpio12", "gpio13",
|
||||
"gpio14", "gpio15", "gpio16", "gpio17", "gpio18", "gpio19" "gpio20", "gpio21", "gpio22",
|
||||
"gpio14", "gpio15", "gpio16", "gpio17", "gpio18", "gpio19", "gpio20", "gpio21", "gpio22",
|
||||
"gpio23", "gpio44", "gpio45", "gpio52", "gpio53", "gpio56", "gpio57", "gpio61", "gpio62",
|
||||
"gpio63", "gpio64", "gpio65", "gpio66",
|
||||
};
|
||||
|
||||
@@ -42,6 +42,6 @@ config VFIO_PCI_IGD
|
||||
|
||||
config VFIO_PCI_NVLINK2
|
||||
def_bool y
|
||||
depends on VFIO_PCI && PPC_POWERNV
|
||||
depends on VFIO_PCI && PPC_POWERNV && SPAPR_TCE_IOMMU
|
||||
help
|
||||
VFIO PCI support for P9 Witherspoon machine with NVIDIA V100 GPUs
|
||||
|
||||
@@ -739,6 +739,12 @@ out:
|
||||
ret = vfio_lock_acct(dma, lock_acct, false);
|
||||
|
||||
unpin_out:
|
||||
if (batch->size == 1 && !batch->offset) {
|
||||
/* May be a VM_PFNMAP pfn, which the batch can't remember. */
|
||||
put_pfn(pfn, dma->prot);
|
||||
batch->size = 0;
|
||||
}
|
||||
|
||||
if (ret < 0) {
|
||||
if (pinned && !rsvd) {
|
||||
for (pfn = *pfn_base ; pinned ; pfn++, pinned--)
|
||||
|
||||
@@ -44,7 +44,7 @@ void reiserfs_security_free(struct reiserfs_security_handle *sec);
|
||||
|
||||
static inline int reiserfs_xattrs_initialized(struct super_block *sb)
|
||||
{
|
||||
return REISERFS_SB(sb)->priv_root != NULL;
|
||||
return REISERFS_SB(sb)->priv_root && REISERFS_SB(sb)->xattr_root;
|
||||
}
|
||||
|
||||
#define xattr_size(size) ((size) + sizeof(struct reiserfs_xattr_header))
|
||||
|
||||
@@ -229,9 +229,10 @@ static inline int xa_err(void *entry)
|
||||
*
|
||||
* This structure is used either directly or via the XA_LIMIT() macro
|
||||
* to communicate the range of IDs that are valid for allocation.
|
||||
* Two common ranges are predefined for you:
|
||||
* Three common ranges are predefined for you:
|
||||
* * xa_limit_32b - [0 - UINT_MAX]
|
||||
* * xa_limit_31b - [0 - INT_MAX]
|
||||
* * xa_limit_16b - [0 - USHRT_MAX]
|
||||
*/
|
||||
struct xa_limit {
|
||||
u32 max;
|
||||
@@ -242,6 +243,7 @@ struct xa_limit {
|
||||
|
||||
#define xa_limit_32b XA_LIMIT(0, UINT_MAX)
|
||||
#define xa_limit_31b XA_LIMIT(0, INT_MAX)
|
||||
#define xa_limit_16b XA_LIMIT(0, USHRT_MAX)
|
||||
|
||||
typedef unsigned __bitwise xa_mark_t;
|
||||
#define XA_MARK_0 ((__force xa_mark_t)0U)
|
||||
|
||||
@@ -3231,7 +3231,8 @@ ftrace_allocate_pages(unsigned long num_to_init)
|
||||
pg = start_pg;
|
||||
while (pg) {
|
||||
order = get_count_order(pg->size / ENTRIES_PER_PAGE);
|
||||
free_pages((unsigned long)pg->records, order);
|
||||
if (order >= 0)
|
||||
free_pages((unsigned long)pg->records, order);
|
||||
start_pg = pg->next;
|
||||
kfree(pg);
|
||||
pg = start_pg;
|
||||
@@ -6451,7 +6452,8 @@ void ftrace_release_mod(struct module *mod)
|
||||
clear_mod_from_hashes(pg);
|
||||
|
||||
order = get_count_order(pg->size / ENTRIES_PER_PAGE);
|
||||
free_pages((unsigned long)pg->records, order);
|
||||
if (order >= 0)
|
||||
free_pages((unsigned long)pg->records, order);
|
||||
tmp_page = pg->next;
|
||||
kfree(pg);
|
||||
ftrace_number_of_pages -= 1 << order;
|
||||
@@ -6811,7 +6813,8 @@ void ftrace_free_mem(struct module *mod, void *start_ptr, void *end_ptr)
|
||||
if (!pg->index) {
|
||||
*last_pg = pg->next;
|
||||
order = get_count_order(pg->size / ENTRIES_PER_PAGE);
|
||||
free_pages((unsigned long)pg->records, order);
|
||||
if (order >= 0)
|
||||
free_pages((unsigned long)pg->records, order);
|
||||
ftrace_number_of_pages -= 1 << order;
|
||||
ftrace_number_of_groups--;
|
||||
kfree(pg);
|
||||
|
||||
@@ -1530,24 +1530,24 @@ static noinline void check_store_range(struct xarray *xa)
|
||||
|
||||
#ifdef CONFIG_XARRAY_MULTI
|
||||
static void check_split_1(struct xarray *xa, unsigned long index,
|
||||
unsigned int order)
|
||||
unsigned int order, unsigned int new_order)
|
||||
{
|
||||
XA_STATE(xas, xa, index);
|
||||
void *entry;
|
||||
unsigned int i = 0;
|
||||
XA_STATE_ORDER(xas, xa, index, new_order);
|
||||
unsigned int i;
|
||||
|
||||
xa_store_order(xa, index, order, xa, GFP_KERNEL);
|
||||
|
||||
xas_split_alloc(&xas, xa, order, GFP_KERNEL);
|
||||
xas_lock(&xas);
|
||||
xas_split(&xas, xa, order);
|
||||
for (i = 0; i < (1 << order); i += (1 << new_order))
|
||||
__xa_store(xa, index + i, xa_mk_index(index + i), 0);
|
||||
xas_unlock(&xas);
|
||||
|
||||
xa_for_each(xa, index, entry) {
|
||||
XA_BUG_ON(xa, entry != xa);
|
||||
i++;
|
||||
for (i = 0; i < (1 << order); i++) {
|
||||
unsigned int val = index + (i & ~((1 << new_order) - 1));
|
||||
XA_BUG_ON(xa, xa_load(xa, index + i) != xa_mk_index(val));
|
||||
}
|
||||
XA_BUG_ON(xa, i != 1 << order);
|
||||
|
||||
xa_set_mark(xa, index, XA_MARK_0);
|
||||
XA_BUG_ON(xa, !xa_get_mark(xa, index, XA_MARK_0));
|
||||
@@ -1557,14 +1557,16 @@ static void check_split_1(struct xarray *xa, unsigned long index,
|
||||
|
||||
static noinline void check_split(struct xarray *xa)
|
||||
{
|
||||
unsigned int order;
|
||||
unsigned int order, new_order;
|
||||
|
||||
XA_BUG_ON(xa, !xa_empty(xa));
|
||||
|
||||
for (order = 1; order < 2 * XA_CHUNK_SHIFT; order++) {
|
||||
check_split_1(xa, 0, order);
|
||||
check_split_1(xa, 1UL << order, order);
|
||||
check_split_1(xa, 3UL << order, order);
|
||||
for (new_order = 0; new_order < order; new_order++) {
|
||||
check_split_1(xa, 0, order, new_order);
|
||||
check_split_1(xa, 1UL << order, order, new_order);
|
||||
check_split_1(xa, 3UL << order, order, new_order);
|
||||
}
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
11
lib/xarray.c
11
lib/xarray.c
@@ -987,7 +987,7 @@ static void node_set_marks(struct xa_node *node, unsigned int offset,
|
||||
* xas_split_alloc() - Allocate memory for splitting an entry.
|
||||
* @xas: XArray operation state.
|
||||
* @entry: New entry which will be stored in the array.
|
||||
* @order: New entry order.
|
||||
* @order: Current entry order.
|
||||
* @gfp: Memory allocation flags.
|
||||
*
|
||||
* This function should be called before calling xas_split().
|
||||
@@ -1011,7 +1011,7 @@ void xas_split_alloc(struct xa_state *xas, void *entry, unsigned int order,
|
||||
|
||||
do {
|
||||
unsigned int i;
|
||||
void *sibling;
|
||||
void *sibling = NULL;
|
||||
struct xa_node *node;
|
||||
|
||||
node = kmem_cache_alloc(radix_tree_node_cachep, gfp);
|
||||
@@ -1021,7 +1021,7 @@ void xas_split_alloc(struct xa_state *xas, void *entry, unsigned int order,
|
||||
for (i = 0; i < XA_CHUNK_SIZE; i++) {
|
||||
if ((i & mask) == 0) {
|
||||
RCU_INIT_POINTER(node->slots[i], entry);
|
||||
sibling = xa_mk_sibling(0);
|
||||
sibling = xa_mk_sibling(i);
|
||||
} else {
|
||||
RCU_INIT_POINTER(node->slots[i], sibling);
|
||||
}
|
||||
@@ -1041,9 +1041,10 @@ EXPORT_SYMBOL_GPL(xas_split_alloc);
|
||||
* xas_split() - Split a multi-index entry into smaller entries.
|
||||
* @xas: XArray operation state.
|
||||
* @entry: New entry to store in the array.
|
||||
* @order: New entry order.
|
||||
* @order: Current entry order.
|
||||
*
|
||||
* The value in the entry is copied to all the replacement entries.
|
||||
* The size of the new entries is set in @xas. The value in @entry is
|
||||
* copied to all the replacement entries.
|
||||
*
|
||||
* Context: Any context. The caller should hold the xa_lock.
|
||||
*/
|
||||
|
||||
@@ -167,7 +167,7 @@ static int __init init_zero_pfn(void)
|
||||
zero_pfn = page_to_pfn(ZERO_PAGE(0));
|
||||
return 0;
|
||||
}
|
||||
core_initcall(init_zero_pfn);
|
||||
early_initcall(init_zero_pfn);
|
||||
|
||||
/*
|
||||
* Only trace rss_stat when there is a 512kb cross over.
|
||||
|
||||
@@ -613,7 +613,7 @@ static int tomoyo_check_unix_address(struct sockaddr *addr,
|
||||
static bool tomoyo_kernel_service(void)
|
||||
{
|
||||
/* Nothing to do if I am a kernel service. */
|
||||
return (current->flags & (PF_KTHREAD | PF_IO_WORKER)) == PF_KTHREAD;
|
||||
return current->flags & PF_KTHREAD;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -989,8 +989,12 @@ static int azx_prepare(struct device *dev)
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip;
|
||||
|
||||
if (!azx_is_pm_ready(card))
|
||||
return 0;
|
||||
|
||||
chip = card->private_data;
|
||||
chip->pm_prepared = 1;
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D3hot);
|
||||
|
||||
flush_work(&azx_bus(chip)->unsol_work);
|
||||
|
||||
@@ -1005,7 +1009,11 @@ static void azx_complete(struct device *dev)
|
||||
struct snd_card *card = dev_get_drvdata(dev);
|
||||
struct azx *chip;
|
||||
|
||||
if (!azx_is_pm_ready(card))
|
||||
return;
|
||||
|
||||
chip = card->private_data;
|
||||
snd_power_change_state(card, SNDRV_CTL_POWER_D0);
|
||||
chip->pm_prepared = 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -5256,7 +5256,7 @@ static void alc_determine_headset_type(struct hda_codec *codec)
|
||||
case 0x10ec0274:
|
||||
case 0x10ec0294:
|
||||
alc_process_coef_fw(codec, coef0274);
|
||||
msleep(80);
|
||||
msleep(850);
|
||||
val = alc_read_coef_idx(codec, 0x46);
|
||||
is_ctia = (val & 0x00f0) == 0x00f0;
|
||||
break;
|
||||
@@ -5440,6 +5440,7 @@ static void alc_update_headset_jack_cb(struct hda_codec *codec,
|
||||
struct hda_jack_callback *jack)
|
||||
{
|
||||
snd_hda_gen_hp_automute(codec, jack);
|
||||
alc_update_headset_mode(codec);
|
||||
}
|
||||
|
||||
static void alc_probe_headset_mode(struct hda_codec *codec)
|
||||
@@ -8057,6 +8058,7 @@ static const struct snd_pci_quirk alc269_fixup_tbl[] = {
|
||||
ALC285_FIXUP_HP_GPIO_AMP_INIT),
|
||||
SND_PCI_QUIRK(0x103c, 0x87c8, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87e5, "HP ProBook 440 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f2, "HP ProBook 640 G8 Notebook PC", ALC236_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f4, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f5, "HP", ALC287_FIXUP_HP_GPIO_LED),
|
||||
SND_PCI_QUIRK(0x103c, 0x87f7, "HP Spectre x360 14", ALC245_FIXUP_HP_X360_AMP),
|
||||
|
||||
@@ -1521,6 +1521,7 @@ bool snd_usb_get_sample_rate_quirk(struct snd_usb_audio *chip)
|
||||
case USB_ID(0x21b4, 0x0081): /* AudioQuest DragonFly */
|
||||
case USB_ID(0x2912, 0x30c8): /* Audioengine D1 */
|
||||
case USB_ID(0x413c, 0xa506): /* Dell AE515 sound bar */
|
||||
case USB_ID(0x046d, 0x084c): /* Logitech ConferenceCam Connect */
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -296,21 +296,34 @@ static void *idr_throbber(void *arg)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* There are always either 1 or 2 objects in the IDR. If we find nothing,
|
||||
* or we find something at an ID we didn't expect, that's a bug.
|
||||
*/
|
||||
void idr_find_test_1(int anchor_id, int throbber_id)
|
||||
{
|
||||
pthread_t throbber;
|
||||
time_t start = time(NULL);
|
||||
|
||||
pthread_create(&throbber, NULL, idr_throbber, &throbber_id);
|
||||
|
||||
BUG_ON(idr_alloc(&find_idr, xa_mk_value(anchor_id), anchor_id,
|
||||
anchor_id + 1, GFP_KERNEL) != anchor_id);
|
||||
|
||||
pthread_create(&throbber, NULL, idr_throbber, &throbber_id);
|
||||
|
||||
rcu_read_lock();
|
||||
do {
|
||||
int id = 0;
|
||||
void *entry = idr_get_next(&find_idr, &id);
|
||||
BUG_ON(entry != xa_mk_value(id));
|
||||
rcu_read_unlock();
|
||||
if ((id != anchor_id && id != throbber_id) ||
|
||||
entry != xa_mk_value(id)) {
|
||||
printf("%s(%d, %d): %p at %d\n", __func__, anchor_id,
|
||||
throbber_id, entry, id);
|
||||
abort();
|
||||
}
|
||||
rcu_read_lock();
|
||||
} while (time(NULL) < start + 11);
|
||||
rcu_read_unlock();
|
||||
|
||||
pthread_join(throbber, NULL);
|
||||
|
||||
@@ -577,6 +590,7 @@ void ida_tests(void)
|
||||
|
||||
int __weak main(void)
|
||||
{
|
||||
rcu_register_thread();
|
||||
radix_tree_init();
|
||||
idr_checks();
|
||||
ida_tests();
|
||||
@@ -584,5 +598,6 @@ int __weak main(void)
|
||||
rcu_barrier();
|
||||
if (nr_allocated)
|
||||
printf("nr_allocated = %d\n", nr_allocated);
|
||||
rcu_unregister_thread();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -224,7 +224,9 @@ void multiorder_checks(void)
|
||||
|
||||
int __weak main(void)
|
||||
{
|
||||
rcu_register_thread();
|
||||
radix_tree_init();
|
||||
multiorder_checks();
|
||||
rcu_unregister_thread();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -25,11 +25,13 @@ void xarray_tests(void)
|
||||
|
||||
int __weak main(void)
|
||||
{
|
||||
rcu_register_thread();
|
||||
radix_tree_init();
|
||||
xarray_tests();
|
||||
radix_tree_cpu_dead(1);
|
||||
rcu_barrier();
|
||||
if (nr_allocated)
|
||||
printf("nr_allocated = %d\n", nr_allocated);
|
||||
rcu_unregister_thread();
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user