Merge tag 'v6.3-rc1' into android-mainline
Linux 6.3-rc1 Change-Id: Idf6d4687283e8f7c40d0d3bd094525882dd22a67 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -226,7 +226,6 @@ ForEachMacros:
|
||||
- 'for_each_console_srcu'
|
||||
- 'for_each_cpu'
|
||||
- 'for_each_cpu_and'
|
||||
- 'for_each_cpu_not'
|
||||
- 'for_each_cpu_wrap'
|
||||
- 'for_each_dapm_widgets'
|
||||
- 'for_each_dedup_cand'
|
||||
|
||||
@@ -479,8 +479,16 @@ Spectre variant 2
|
||||
On Intel Skylake-era systems the mitigation covers most, but not all,
|
||||
cases. See :ref:`[3] <spec_ref3>` for more details.
|
||||
|
||||
On CPUs with hardware mitigation for Spectre variant 2 (e.g. Enhanced
|
||||
IBRS on x86), retpoline is automatically disabled at run time.
|
||||
On CPUs with hardware mitigation for Spectre variant 2 (e.g. IBRS
|
||||
or enhanced IBRS on x86), retpoline is automatically disabled at run time.
|
||||
|
||||
Systems which support enhanced IBRS (eIBRS) enable IBRS protection once at
|
||||
boot, by setting the IBRS bit, and they're automatically protected against
|
||||
Spectre v2 variant attacks, including cross-thread branch target injections
|
||||
on SMT systems (STIBP). In other words, eIBRS enables STIBP too.
|
||||
|
||||
Legacy IBRS systems clear the IBRS bit on exit to userspace and
|
||||
therefore explicitly enable STIBP for that
|
||||
|
||||
The retpoline mitigation is turned on by default on vulnerable
|
||||
CPUs. It can be forced on or off by the administrator
|
||||
@@ -504,9 +512,12 @@ Spectre variant 2
|
||||
For Spectre variant 2 mitigation, individual user programs
|
||||
can be compiled with return trampolines for indirect branches.
|
||||
This protects them from consuming poisoned entries in the branch
|
||||
target buffer left by malicious software. Alternatively, the
|
||||
programs can disable their indirect branch speculation via prctl()
|
||||
(See :ref:`Documentation/userspace-api/spec_ctrl.rst <set_spec_ctrl>`).
|
||||
target buffer left by malicious software.
|
||||
|
||||
On legacy IBRS systems, at return to userspace, implicit STIBP is disabled
|
||||
because the kernel clears the IBRS bit. In this case, the userspace programs
|
||||
can disable indirect branch speculation via prctl() (See
|
||||
:ref:`Documentation/userspace-api/spec_ctrl.rst <set_spec_ctrl>`).
|
||||
On x86, this will turn on STIBP to guard against attacks from the
|
||||
sibling thread when the user program is running, and use IBPB to
|
||||
flush the branch target buffer when switching to/from the program.
|
||||
|
||||
@@ -7911,6 +7911,7 @@ F: include/trace/events/fs_dax.h
|
||||
|
||||
FILESYSTEMS (VFS and infrastructure)
|
||||
M: Alexander Viro <viro@zeniv.linux.org.uk>
|
||||
M: Christian Brauner <brauner@kernel.org>
|
||||
L: linux-fsdevel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: fs/*
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 6
|
||||
PATCHLEVEL = 2
|
||||
PATCHLEVEL = 3
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION =
|
||||
EXTRAVERSION = -rc1
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
||||
@@ -152,8 +152,11 @@ retry:
|
||||
the fault. */
|
||||
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 no_context;
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -93,8 +93,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 no_context;
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -15,11 +15,7 @@
|
||||
#include <linux/types.h>
|
||||
/* include compiler specific intrinsics */
|
||||
#include <asm/ia64regs.h>
|
||||
#ifdef __INTEL_COMPILER
|
||||
# include <asm/intel_intrin.h>
|
||||
#else
|
||||
# include <asm/gcc_intrin.h>
|
||||
#endif
|
||||
#include <asm/gcc_intrin.h>
|
||||
|
||||
/*
|
||||
* This function doesn't exist, so you'll get a linker error if
|
||||
|
||||
@@ -1,162 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
|
||||
#ifndef _ASM_IA64_INTEL_INTRIN_H
|
||||
#define _ASM_IA64_INTEL_INTRIN_H
|
||||
/*
|
||||
* Intel Compiler Intrinsics
|
||||
*
|
||||
* Copyright (C) 2002,2003 Jun Nakajima <jun.nakajima@intel.com>
|
||||
* Copyright (C) 2002,2003 Suresh Siddha <suresh.b.siddha@intel.com>
|
||||
* Copyright (C) 2005,2006 Hongjiu Lu <hongjiu.lu@intel.com>
|
||||
*
|
||||
*/
|
||||
#include <ia64intrin.h>
|
||||
|
||||
#define ia64_barrier() __memory_barrier()
|
||||
|
||||
#define ia64_stop() /* Nothing: As of now stop bit is generated for each
|
||||
* intrinsic
|
||||
*/
|
||||
|
||||
#define ia64_getreg __getReg
|
||||
#define ia64_setreg __setReg
|
||||
|
||||
#define ia64_hint __hint
|
||||
#define ia64_hint_pause __hint_pause
|
||||
|
||||
#define ia64_mux1_brcst _m64_mux1_brcst
|
||||
#define ia64_mux1_mix _m64_mux1_mix
|
||||
#define ia64_mux1_shuf _m64_mux1_shuf
|
||||
#define ia64_mux1_alt _m64_mux1_alt
|
||||
#define ia64_mux1_rev _m64_mux1_rev
|
||||
|
||||
#define ia64_mux1(x,v) _m_to_int64(_m64_mux1(_m_from_int64(x), (v)))
|
||||
#define ia64_popcnt _m64_popcnt
|
||||
#define ia64_getf_exp __getf_exp
|
||||
#define ia64_shrp _m64_shrp
|
||||
|
||||
#define ia64_tpa __tpa
|
||||
#define ia64_invala __invala
|
||||
#define ia64_invala_gr __invala_gr
|
||||
#define ia64_invala_fr __invala_fr
|
||||
#define ia64_nop __nop
|
||||
#define ia64_sum __sum
|
||||
#define ia64_ssm __ssm
|
||||
#define ia64_rum __rum
|
||||
#define ia64_rsm __rsm
|
||||
#define ia64_fc __fc
|
||||
|
||||
#define ia64_ldfs __ldfs
|
||||
#define ia64_ldfd __ldfd
|
||||
#define ia64_ldfe __ldfe
|
||||
#define ia64_ldf8 __ldf8
|
||||
#define ia64_ldf_fill __ldf_fill
|
||||
|
||||
#define ia64_stfs __stfs
|
||||
#define ia64_stfd __stfd
|
||||
#define ia64_stfe __stfe
|
||||
#define ia64_stf8 __stf8
|
||||
#define ia64_stf_spill __stf_spill
|
||||
|
||||
#define ia64_mf __mf
|
||||
#define ia64_mfa __mfa
|
||||
|
||||
#define ia64_fetchadd4_acq __fetchadd4_acq
|
||||
#define ia64_fetchadd4_rel __fetchadd4_rel
|
||||
#define ia64_fetchadd8_acq __fetchadd8_acq
|
||||
#define ia64_fetchadd8_rel __fetchadd8_rel
|
||||
|
||||
#define ia64_xchg1 _InterlockedExchange8
|
||||
#define ia64_xchg2 _InterlockedExchange16
|
||||
#define ia64_xchg4 _InterlockedExchange
|
||||
#define ia64_xchg8 _InterlockedExchange64
|
||||
|
||||
#define ia64_cmpxchg1_rel _InterlockedCompareExchange8_rel
|
||||
#define ia64_cmpxchg1_acq _InterlockedCompareExchange8_acq
|
||||
#define ia64_cmpxchg2_rel _InterlockedCompareExchange16_rel
|
||||
#define ia64_cmpxchg2_acq _InterlockedCompareExchange16_acq
|
||||
#define ia64_cmpxchg4_rel _InterlockedCompareExchange_rel
|
||||
#define ia64_cmpxchg4_acq _InterlockedCompareExchange_acq
|
||||
#define ia64_cmpxchg8_rel _InterlockedCompareExchange64_rel
|
||||
#define ia64_cmpxchg8_acq _InterlockedCompareExchange64_acq
|
||||
|
||||
#define __ia64_set_dbr(index, val) \
|
||||
__setIndReg(_IA64_REG_INDR_DBR, index, val)
|
||||
#define ia64_set_ibr(index, val) \
|
||||
__setIndReg(_IA64_REG_INDR_IBR, index, val)
|
||||
#define ia64_set_pkr(index, val) \
|
||||
__setIndReg(_IA64_REG_INDR_PKR, index, val)
|
||||
#define ia64_set_pmc(index, val) \
|
||||
__setIndReg(_IA64_REG_INDR_PMC, index, val)
|
||||
#define ia64_set_pmd(index, val) \
|
||||
__setIndReg(_IA64_REG_INDR_PMD, index, val)
|
||||
#define ia64_set_rr(index, val) \
|
||||
__setIndReg(_IA64_REG_INDR_RR, index, val)
|
||||
|
||||
#define ia64_get_cpuid(index) \
|
||||
__getIndReg(_IA64_REG_INDR_CPUID, index)
|
||||
#define __ia64_get_dbr(index) __getIndReg(_IA64_REG_INDR_DBR, index)
|
||||
#define ia64_get_ibr(index) __getIndReg(_IA64_REG_INDR_IBR, index)
|
||||
#define ia64_get_pkr(index) __getIndReg(_IA64_REG_INDR_PKR, index)
|
||||
#define ia64_get_pmc(index) __getIndReg(_IA64_REG_INDR_PMC, index)
|
||||
#define ia64_get_pmd(index) __getIndReg(_IA64_REG_INDR_PMD, index)
|
||||
#define ia64_get_rr(index) __getIndReg(_IA64_REG_INDR_RR, index)
|
||||
|
||||
#define ia64_srlz_d __dsrlz
|
||||
#define ia64_srlz_i __isrlz
|
||||
|
||||
#define ia64_dv_serialize_data()
|
||||
#define ia64_dv_serialize_instruction()
|
||||
|
||||
#define ia64_st1_rel __st1_rel
|
||||
#define ia64_st2_rel __st2_rel
|
||||
#define ia64_st4_rel __st4_rel
|
||||
#define ia64_st8_rel __st8_rel
|
||||
|
||||
/* FIXME: need st4.rel.nta intrinsic */
|
||||
#define ia64_st4_rel_nta __st4_rel
|
||||
|
||||
#define ia64_ld1_acq __ld1_acq
|
||||
#define ia64_ld2_acq __ld2_acq
|
||||
#define ia64_ld4_acq __ld4_acq
|
||||
#define ia64_ld8_acq __ld8_acq
|
||||
|
||||
#define ia64_sync_i __synci
|
||||
#define ia64_thash __thash
|
||||
#define ia64_ttag __ttag
|
||||
#define ia64_itcd __itcd
|
||||
#define ia64_itci __itci
|
||||
#define ia64_itrd __itrd
|
||||
#define ia64_itri __itri
|
||||
#define ia64_ptce __ptce
|
||||
#define ia64_ptcl __ptcl
|
||||
#define ia64_ptcg __ptcg
|
||||
#define ia64_ptcga __ptcga
|
||||
#define ia64_ptri __ptri
|
||||
#define ia64_ptrd __ptrd
|
||||
#define ia64_dep_mi _m64_dep_mi
|
||||
|
||||
/* Values for lfhint in __lfetch and __lfetch_fault */
|
||||
|
||||
#define ia64_lfhint_none __lfhint_none
|
||||
#define ia64_lfhint_nt1 __lfhint_nt1
|
||||
#define ia64_lfhint_nt2 __lfhint_nt2
|
||||
#define ia64_lfhint_nta __lfhint_nta
|
||||
|
||||
#define ia64_lfetch __lfetch
|
||||
#define ia64_lfetch_excl __lfetch_excl
|
||||
#define ia64_lfetch_fault __lfetch_fault
|
||||
#define ia64_lfetch_fault_excl __lfetch_fault_excl
|
||||
|
||||
#define ia64_intrin_local_irq_restore(x) \
|
||||
do { \
|
||||
if ((x) != 0) { \
|
||||
ia64_ssm(IA64_PSR_I); \
|
||||
ia64_srlz_d(); \
|
||||
} else { \
|
||||
ia64_rsm(IA64_PSR_I); \
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
#define __builtin_trap() __break(0);
|
||||
|
||||
#endif /* _ASM_IA64_INTEL_INTRIN_H */
|
||||
@@ -14,11 +14,7 @@
|
||||
#include <linux/types.h>
|
||||
/* include compiler specific intrinsics */
|
||||
#include <asm/ia64regs.h>
|
||||
#ifdef __INTEL_COMPILER
|
||||
# include <asm/intel_intrin.h>
|
||||
#else
|
||||
# include <asm/gcc_intrin.h>
|
||||
#endif
|
||||
#include <asm/gcc_intrin.h>
|
||||
#include <asm/cmpxchg.h>
|
||||
|
||||
#define ia64_set_rr0_to_rr4(val0, val1, val2, val3, val4) \
|
||||
|
||||
@@ -783,11 +783,9 @@ __init void prefill_possible_map(void)
|
||||
|
||||
static int _acpi_map_lsapic(acpi_handle handle, int physid, int *pcpu)
|
||||
{
|
||||
cpumask_t tmp_map;
|
||||
int cpu;
|
||||
|
||||
cpumask_complement(&tmp_map, cpu_present_mask);
|
||||
cpu = cpumask_first(&tmp_map);
|
||||
cpu = cpumask_first_zero(cpu_present_mask);
|
||||
if (cpu >= nr_cpu_ids)
|
||||
return -EINVAL;
|
||||
|
||||
|
||||
@@ -136,8 +136,11 @@ retry:
|
||||
*/
|
||||
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 no_context;
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -138,8 +138,11 @@ good_area:
|
||||
fault = handle_mm_fault(vma, address, flags, regs);
|
||||
pr_debug("handle_mm_fault returns %x\n", fault);
|
||||
|
||||
if (fault_signal_pending(fault, regs))
|
||||
if (fault_signal_pending(fault, regs)) {
|
||||
if (!user_mode(regs))
|
||||
goto no_context;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -219,8 +219,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))
|
||||
bad_page_fault(regs, address, SIGBUS);
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -136,8 +136,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 no_context;
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -162,8 +162,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 no_context;
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -308,8 +308,13 @@ 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)) {
|
||||
msg = "Page fault: fault signal on kernel memory";
|
||||
goto no_context;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -326,8 +326,11 @@ good_area:
|
||||
* signal first. We do not need to release the mmap_lock because it
|
||||
* would already be released in __lock_page_or_retry in mm/filemap.c.
|
||||
*/
|
||||
if (fault_signal_pending(fault, regs))
|
||||
if (fault_signal_pending(fault, regs)) {
|
||||
if (!user_mode(regs))
|
||||
no_context(regs, addr);
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -187,8 +187,11 @@ good_area:
|
||||
*/
|
||||
fault = handle_mm_fault(vma, address, flags, regs);
|
||||
|
||||
if (fault_signal_pending(fault, regs))
|
||||
if (fault_signal_pending(fault, regs)) {
|
||||
if (!from_user)
|
||||
goto no_context;
|
||||
return;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -424,8 +424,13 @@ good_area:
|
||||
|
||||
fault = handle_mm_fault(vma, address, flags, regs);
|
||||
|
||||
if (fault_signal_pending(fault, regs))
|
||||
if (fault_signal_pending(fault, regs)) {
|
||||
if (regs->tstate & TSTATE_PRIV) {
|
||||
insn = get_fault_insn(regs, insn);
|
||||
goto handle_kernel_fault;
|
||||
}
|
||||
goto exit_exception;
|
||||
}
|
||||
|
||||
/* The fault is fully completed (including releasing mmap lock) */
|
||||
if (fault & VM_FAULT_COMPLETED)
|
||||
|
||||
@@ -1133,14 +1133,18 @@ spectre_v2_parse_user_cmdline(void)
|
||||
return SPECTRE_V2_USER_CMD_AUTO;
|
||||
}
|
||||
|
||||
static inline bool spectre_v2_in_ibrs_mode(enum spectre_v2_mitigation mode)
|
||||
static inline bool spectre_v2_in_eibrs_mode(enum spectre_v2_mitigation mode)
|
||||
{
|
||||
return mode == SPECTRE_V2_IBRS ||
|
||||
mode == SPECTRE_V2_EIBRS ||
|
||||
return mode == SPECTRE_V2_EIBRS ||
|
||||
mode == SPECTRE_V2_EIBRS_RETPOLINE ||
|
||||
mode == SPECTRE_V2_EIBRS_LFENCE;
|
||||
}
|
||||
|
||||
static inline bool spectre_v2_in_ibrs_mode(enum spectre_v2_mitigation mode)
|
||||
{
|
||||
return spectre_v2_in_eibrs_mode(mode) || mode == SPECTRE_V2_IBRS;
|
||||
}
|
||||
|
||||
static void __init
|
||||
spectre_v2_user_select_mitigation(void)
|
||||
{
|
||||
@@ -1203,12 +1207,19 @@ spectre_v2_user_select_mitigation(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* If no STIBP, IBRS or enhanced IBRS is enabled, or SMT impossible,
|
||||
* STIBP is not required.
|
||||
* If no STIBP, enhanced IBRS is enabled, or SMT impossible, STIBP
|
||||
* is not required.
|
||||
*
|
||||
* Enhanced IBRS also protects against cross-thread branch target
|
||||
* injection in user-mode as the IBRS bit remains always set which
|
||||
* implicitly enables cross-thread protections. However, in legacy IBRS
|
||||
* mode, the IBRS bit is set only on kernel entry and cleared on return
|
||||
* to userspace. This disables the implicit cross-thread protection,
|
||||
* so allow for STIBP to be selected in that case.
|
||||
*/
|
||||
if (!boot_cpu_has(X86_FEATURE_STIBP) ||
|
||||
!smt_possible ||
|
||||
spectre_v2_in_ibrs_mode(spectre_v2_enabled))
|
||||
spectre_v2_in_eibrs_mode(spectre_v2_enabled))
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -2340,7 +2351,7 @@ static ssize_t mmio_stale_data_show_state(char *buf)
|
||||
|
||||
static char *stibp_state(void)
|
||||
{
|
||||
if (spectre_v2_in_ibrs_mode(spectre_v2_enabled))
|
||||
if (spectre_v2_in_eibrs_mode(spectre_v2_enabled))
|
||||
return "";
|
||||
|
||||
switch (spectre_v2_user_stibp) {
|
||||
|
||||
@@ -324,6 +324,7 @@ void platform_msi_device_domain_free(struct irq_domain *domain, unsigned int vir
|
||||
struct platform_msi_priv_data *data = domain->host_data;
|
||||
|
||||
msi_lock_descs(data->dev);
|
||||
msi_domain_depopulate_descs(data->dev, virq, nr_irqs);
|
||||
irq_domain_free_irqs_common(domain, virq, nr_irqs);
|
||||
msi_free_msi_descs_range(data->dev, virq, virq + nr_irqs - 1);
|
||||
msi_unlock_descs(data->dev);
|
||||
|
||||
@@ -60,7 +60,11 @@
|
||||
#include <crypto/xts.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
/*
|
||||
* crypto alg
|
||||
@@ -1000,6 +1004,13 @@ static void aead_crypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
crypto_finalize_aead_request(jrp->engine, req, ecode);
|
||||
}
|
||||
|
||||
static inline u8 *skcipher_edesc_iv(struct skcipher_edesc *edesc)
|
||||
{
|
||||
|
||||
return PTR_ALIGN((u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes,
|
||||
dma_get_cache_alignment());
|
||||
}
|
||||
|
||||
static void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
void *context)
|
||||
{
|
||||
@@ -1027,8 +1038,7 @@ static void skcipher_crypt_done(struct device *jrdev, u32 *desc, u32 err,
|
||||
* This is used e.g. by the CTS mode.
|
||||
*/
|
||||
if (ivsize && !ecode) {
|
||||
memcpy(req->iv, (u8 *)edesc->sec4_sg + edesc->sec4_sg_bytes,
|
||||
ivsize);
|
||||
memcpy(req->iv, skcipher_edesc_iv(edesc), ivsize);
|
||||
|
||||
print_hex_dump_debug("dstiv @" __stringify(__LINE__)": ",
|
||||
DUMP_PREFIX_ADDRESS, 16, 4, req->iv,
|
||||
@@ -1683,18 +1693,19 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
|
||||
/*
|
||||
* allocate space for base edesc and hw desc commands, link tables, IV
|
||||
*/
|
||||
aligned_size = ALIGN(ivsize, __alignof__(*edesc));
|
||||
aligned_size += sizeof(*edesc) + desc_bytes + sec4_sg_bytes;
|
||||
aligned_size = sizeof(*edesc) + desc_bytes + sec4_sg_bytes;
|
||||
aligned_size = ALIGN(aligned_size, dma_get_cache_alignment());
|
||||
iv = kzalloc(aligned_size, flags);
|
||||
if (!iv) {
|
||||
aligned_size += ~(ARCH_KMALLOC_MINALIGN - 1) &
|
||||
(dma_get_cache_alignment() - 1);
|
||||
aligned_size += ALIGN(ivsize, dma_get_cache_alignment());
|
||||
edesc = kzalloc(aligned_size, flags);
|
||||
if (!edesc) {
|
||||
dev_err(jrdev, "could not allocate extended descriptor\n");
|
||||
caam_unmap(jrdev, req->src, req->dst, src_nents, dst_nents, 0,
|
||||
0, 0, 0);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
edesc = (void *)(iv + ALIGN(ivsize, __alignof__(*edesc)));
|
||||
edesc->src_nents = src_nents;
|
||||
edesc->dst_nents = dst_nents;
|
||||
edesc->mapped_src_nents = mapped_src_nents;
|
||||
@@ -1706,6 +1717,7 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
|
||||
|
||||
/* Make sure IV is located in a DMAable area */
|
||||
if (ivsize) {
|
||||
iv = skcipher_edesc_iv(edesc);
|
||||
memcpy(iv, req->iv, ivsize);
|
||||
|
||||
iv_dma = dma_map_single(jrdev, iv, ivsize, DMA_BIDIRECTIONAL);
|
||||
|
||||
@@ -20,8 +20,11 @@
|
||||
#include "caamalg_desc.h"
|
||||
#include <crypto/xts.h>
|
||||
#include <asm/unaligned.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
/*
|
||||
* crypto alg
|
||||
@@ -1204,6 +1207,12 @@ static int ipsec_gcm_decrypt(struct aead_request *req)
|
||||
false);
|
||||
}
|
||||
|
||||
static inline u8 *skcipher_edesc_iv(struct skcipher_edesc *edesc)
|
||||
{
|
||||
return PTR_ALIGN((u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,
|
||||
dma_get_cache_alignment());
|
||||
}
|
||||
|
||||
static void skcipher_done(struct caam_drv_req *drv_req, u32 status)
|
||||
{
|
||||
struct skcipher_edesc *edesc;
|
||||
@@ -1236,8 +1245,7 @@ static void skcipher_done(struct caam_drv_req *drv_req, u32 status)
|
||||
* This is used e.g. by the CTS mode.
|
||||
*/
|
||||
if (!ecode)
|
||||
memcpy(req->iv, (u8 *)&edesc->sgt[0] + edesc->qm_sg_bytes,
|
||||
ivsize);
|
||||
memcpy(req->iv, skcipher_edesc_iv(edesc), ivsize);
|
||||
|
||||
qi_cache_free(edesc);
|
||||
skcipher_request_complete(req, ecode);
|
||||
@@ -1259,6 +1267,7 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
|
||||
int dst_sg_idx, qm_sg_ents, qm_sg_bytes;
|
||||
struct qm_sg_entry *sg_table, *fd_sgt;
|
||||
struct caam_drv_ctx *drv_ctx;
|
||||
unsigned int len;
|
||||
|
||||
drv_ctx = get_drv_ctx(ctx, encrypt ? ENCRYPT : DECRYPT);
|
||||
if (IS_ERR(drv_ctx))
|
||||
@@ -1319,9 +1328,12 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
|
||||
qm_sg_ents = 1 + pad_sg_nents(qm_sg_ents);
|
||||
|
||||
qm_sg_bytes = qm_sg_ents * sizeof(struct qm_sg_entry);
|
||||
if (unlikely(ALIGN(ivsize, __alignof__(*edesc)) +
|
||||
offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes >
|
||||
CAAM_QI_MEMCACHE_SIZE)) {
|
||||
|
||||
len = offsetof(struct skcipher_edesc, sgt) + qm_sg_bytes;
|
||||
len = ALIGN(len, dma_get_cache_alignment());
|
||||
len += ivsize;
|
||||
|
||||
if (unlikely(len > CAAM_QI_MEMCACHE_SIZE)) {
|
||||
dev_err(qidev, "No space for %d S/G entries and/or %dB IV\n",
|
||||
qm_sg_ents, ivsize);
|
||||
caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0,
|
||||
@@ -1330,18 +1342,24 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
|
||||
}
|
||||
|
||||
/* allocate space for base edesc, link tables and IV */
|
||||
iv = qi_cache_alloc(flags);
|
||||
if (unlikely(!iv)) {
|
||||
edesc = qi_cache_alloc(flags);
|
||||
if (unlikely(!edesc)) {
|
||||
dev_err(qidev, "could not allocate extended descriptor\n");
|
||||
caam_unmap(qidev, req->src, req->dst, src_nents, dst_nents, 0,
|
||||
0, DMA_NONE, 0, 0);
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
edesc = (void *)(iv + ALIGN(ivsize, __alignof__(*edesc)));
|
||||
edesc->src_nents = src_nents;
|
||||
edesc->dst_nents = dst_nents;
|
||||
edesc->qm_sg_bytes = qm_sg_bytes;
|
||||
edesc->drv_req.app_ctx = req;
|
||||
edesc->drv_req.cbk = skcipher_done;
|
||||
edesc->drv_req.drv_ctx = drv_ctx;
|
||||
|
||||
/* Make sure IV is located in a DMAable area */
|
||||
sg_table = &edesc->sgt[0];
|
||||
iv = skcipher_edesc_iv(edesc);
|
||||
memcpy(iv, req->iv, ivsize);
|
||||
|
||||
iv_dma = dma_map_single(qidev, iv, ivsize, DMA_BIDIRECTIONAL);
|
||||
@@ -1353,13 +1371,7 @@ static struct skcipher_edesc *skcipher_edesc_alloc(struct skcipher_request *req,
|
||||
return ERR_PTR(-ENOMEM);
|
||||
}
|
||||
|
||||
edesc->src_nents = src_nents;
|
||||
edesc->dst_nents = dst_nents;
|
||||
edesc->iv_dma = iv_dma;
|
||||
edesc->qm_sg_bytes = qm_sg_bytes;
|
||||
edesc->drv_req.app_ctx = req;
|
||||
edesc->drv_req.cbk = skcipher_done;
|
||||
edesc->drv_req.drv_ctx = drv_ctx;
|
||||
|
||||
dma_to_qm_sg_one(sg_table, iv_dma, ivsize, 0);
|
||||
sg_to_qm_sg(req->src, req->cryptlen, sg_table + 1, 0);
|
||||
|
||||
@@ -8,7 +8,13 @@
|
||||
*/
|
||||
|
||||
#include <linux/cpumask.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/kthread.h>
|
||||
#include <linux/netdevice.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <soc/fsl/qman.h>
|
||||
|
||||
#include "debugfs.h"
|
||||
@@ -755,8 +761,8 @@ int caam_qi_init(struct platform_device *caam_pdev)
|
||||
napi_enable(irqtask);
|
||||
}
|
||||
|
||||
qi_cache = kmem_cache_create("caamqicache", CAAM_QI_MEMCACHE_SIZE, 0,
|
||||
0, NULL);
|
||||
qi_cache = kmem_cache_create("caamqicache", CAAM_QI_MEMCACHE_SIZE,
|
||||
dma_get_cache_alignment(), 0, NULL);
|
||||
if (!qi_cache) {
|
||||
dev_err(qidev, "Can't allocate CAAM cache\n");
|
||||
free_rsp_fqs();
|
||||
|
||||
@@ -914,6 +914,7 @@ config I2C_PASEMI
|
||||
|
||||
config I2C_APPLE
|
||||
tristate "Apple SMBus platform driver"
|
||||
depends on !I2C_PASEMI
|
||||
depends on ARCH_APPLE || COMPILE_TEST
|
||||
default ARCH_APPLE
|
||||
help
|
||||
|
||||
@@ -126,22 +126,13 @@ static int gxp_i2c_master_xfer(struct i2c_adapter *adapter,
|
||||
time_left = wait_for_completion_timeout(&drvdata->completion,
|
||||
adapter->timeout);
|
||||
ret = num - drvdata->msgs_remaining;
|
||||
if (time_left == 0) {
|
||||
switch (drvdata->state) {
|
||||
case GXP_I2C_WDATA_PHASE:
|
||||
break;
|
||||
case GXP_I2C_RDATA_PHASE:
|
||||
break;
|
||||
case GXP_I2C_ADDR_PHASE:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
if (time_left == 0)
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
if (drvdata->state == GXP_I2C_ADDR_NACK ||
|
||||
drvdata->state == GXP_I2C_DATA_NACK)
|
||||
if (drvdata->state == GXP_I2C_ADDR_NACK)
|
||||
return -ENXIO;
|
||||
|
||||
if (drvdata->state == GXP_I2C_DATA_NACK)
|
||||
return -EIO;
|
||||
|
||||
return ret;
|
||||
@@ -525,7 +516,7 @@ static int gxp_i2c_probe(struct platform_device *pdev)
|
||||
i2cg_map = syscon_regmap_lookup_by_phandle(pdev->dev.of_node,
|
||||
"hpe,sysreg");
|
||||
if (IS_ERR(i2cg_map)) {
|
||||
return dev_err_probe(&pdev->dev, IS_ERR(i2cg_map),
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(i2cg_map),
|
||||
"failed to map i2cg_handle\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -163,11 +163,11 @@ EXPORT_SYMBOL_GPL(pci_msix_alloc_irq_at);
|
||||
|
||||
/**
|
||||
* pci_msix_free_irq - Free an interrupt on a PCI/MSIX interrupt domain
|
||||
* which was allocated via pci_msix_alloc_irq_at()
|
||||
*
|
||||
* @dev: The PCI device to operate on
|
||||
* @map: A struct msi_map describing the interrupt to free
|
||||
* as returned from the allocation function.
|
||||
*
|
||||
* Undo an interrupt vector allocation. Does not disable MSI-X.
|
||||
*/
|
||||
void pci_msix_free_irq(struct pci_dev *dev, struct msi_map map)
|
||||
{
|
||||
|
||||
@@ -377,9 +377,26 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in
|
||||
snp_dev->input.data_npages = certs_npages;
|
||||
}
|
||||
|
||||
/*
|
||||
* Increment the message sequence number. There is no harm in doing
|
||||
* this now because decryption uses the value stored in the response
|
||||
* structure and any failure will wipe the VMPCK, preventing further
|
||||
* use anyway.
|
||||
*/
|
||||
snp_inc_msg_seqno(snp_dev);
|
||||
|
||||
if (fw_err)
|
||||
*fw_err = err;
|
||||
|
||||
/*
|
||||
* If an extended guest request was issued and the supplied certificate
|
||||
* buffer was not large enough, a standard guest request was issued to
|
||||
* prevent IV reuse. If the standard request was successful, return -EIO
|
||||
* back to the caller as would have originally been returned.
|
||||
*/
|
||||
if (!rc && err == SNP_GUEST_REQ_INVALID_LEN)
|
||||
return -EIO;
|
||||
|
||||
if (rc) {
|
||||
dev_alert(snp_dev->dev,
|
||||
"Detected error from ASP request. rc: %d, fw_err: %llu\n",
|
||||
@@ -395,9 +412,6 @@ static int handle_guest_request(struct snp_guest_dev *snp_dev, u64 exit_code, in
|
||||
goto disable_vmpck;
|
||||
}
|
||||
|
||||
/* Increment to new message sequence after payload decryption was successful. */
|
||||
snp_inc_msg_seqno(snp_dev);
|
||||
|
||||
return 0;
|
||||
|
||||
disable_vmpck:
|
||||
|
||||
@@ -148,15 +148,12 @@
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
||||
#if defined(__GNUC__)
|
||||
#include <acpi/platform/acgcc.h>
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
#include "acmsvc.h"
|
||||
|
||||
#elif defined(__INTEL_COMPILER)
|
||||
#include <acpi/platform/acintel.h>
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(_LINUX) || defined(__linux__)
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
|
||||
#endif
|
||||
|
||||
#if defined(__GNUC__) && !defined(__INTEL_COMPILER)
|
||||
#if defined(__GNUC__)
|
||||
#include "acgccex.h"
|
||||
|
||||
#elif defined(_MSC_VER)
|
||||
|
||||
@@ -1,55 +0,0 @@
|
||||
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 */
|
||||
/******************************************************************************
|
||||
*
|
||||
* Name: acintel.h - VC specific defines, etc.
|
||||
*
|
||||
* Copyright (C) 2000 - 2022, Intel Corp.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
#ifndef __ACINTEL_H__
|
||||
#define __ACINTEL_H__
|
||||
|
||||
/*
|
||||
* Use compiler specific <stdarg.h> is a good practice for even when
|
||||
* -nostdinc is specified (i.e., ACPI_USE_STANDARD_HEADERS undefined.
|
||||
*/
|
||||
#ifndef va_arg
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
/* Configuration specific to Intel 64-bit C compiler */
|
||||
|
||||
#define COMPILER_DEPENDENT_INT64 __int64
|
||||
#define COMPILER_DEPENDENT_UINT64 unsigned __int64
|
||||
#define ACPI_INLINE __inline
|
||||
|
||||
/*
|
||||
* Calling conventions:
|
||||
*
|
||||
* ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads)
|
||||
* ACPI_EXTERNAL_XFACE - External ACPI interfaces
|
||||
* ACPI_INTERNAL_XFACE - Internal ACPI interfaces
|
||||
* ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces
|
||||
*/
|
||||
#define ACPI_SYSTEM_XFACE
|
||||
#define ACPI_EXTERNAL_XFACE
|
||||
#define ACPI_INTERNAL_XFACE
|
||||
#define ACPI_INTERNAL_VAR_XFACE
|
||||
|
||||
/* remark 981 - operands evaluated in no particular order */
|
||||
#pragma warning(disable:981)
|
||||
|
||||
/* warn C4100: unreferenced formal parameter */
|
||||
#pragma warning(disable:4100)
|
||||
|
||||
/* warn C4127: conditional expression is constant */
|
||||
#pragma warning(disable:4127)
|
||||
|
||||
/* warn C4706: assignment within conditional expression */
|
||||
#pragma warning(disable:4706)
|
||||
|
||||
/* warn C4214: bit field types other than int */
|
||||
#pragma warning(disable:4214)
|
||||
|
||||
#endif /* __ACINTEL_H__ */
|
||||
@@ -1,34 +0,0 @@
|
||||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
#ifndef __LINUX_COMPILER_TYPES_H
|
||||
#error "Please don't include <linux/compiler-intel.h> directly, include <linux/compiler.h> instead."
|
||||
#endif
|
||||
|
||||
#ifdef __ECC
|
||||
|
||||
/* Compiler specific definitions for Intel ECC compiler */
|
||||
|
||||
#include <asm/intrinsics.h>
|
||||
|
||||
/* Intel ECC compiler doesn't support gcc specific asm stmts.
|
||||
* It uses intrinsics to do the equivalent things.
|
||||
*/
|
||||
|
||||
#define barrier() __memory_barrier()
|
||||
#define barrier_data(ptr) barrier()
|
||||
|
||||
#define RELOC_HIDE(ptr, off) \
|
||||
({ unsigned long __ptr; \
|
||||
__ptr = (unsigned long) (ptr); \
|
||||
(typeof(ptr)) (__ptr + (off)); })
|
||||
|
||||
/* This should act as an optimization barrier on var.
|
||||
* Given that this compiler does not have inline assembly, a compiler barrier
|
||||
* is the best we can do.
|
||||
*/
|
||||
#define OPTIMIZER_HIDE_VAR(var) barrier()
|
||||
|
||||
#endif
|
||||
|
||||
/* icc has this, but it's called _bswap16 */
|
||||
#define __HAVE_BUILTIN_BSWAP16__
|
||||
#define __builtin_bswap16 _bswap16
|
||||
@@ -64,16 +64,10 @@
|
||||
* compiler should see some alignment anyway, when the return value is
|
||||
* massaged by 'flags = ptr & 3; ptr &= ~3;').
|
||||
*
|
||||
* Optional: not supported by icc
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-assume_005faligned-function-attribute
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#assume-aligned
|
||||
*/
|
||||
#if __has_attribute(__assume_aligned__)
|
||||
# define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||
#else
|
||||
# define __assume_aligned(a, ...)
|
||||
#endif
|
||||
#define __assume_aligned(a, ...) __attribute__((__assume_aligned__(a, ## __VA_ARGS__)))
|
||||
|
||||
/*
|
||||
* Note the long name.
|
||||
@@ -85,7 +79,6 @@
|
||||
/*
|
||||
* Optional: only supported since gcc >= 9
|
||||
* Optional: not supported by clang
|
||||
* Optional: not supported by icc
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#index-copy-function-attribute
|
||||
*/
|
||||
@@ -98,7 +91,6 @@
|
||||
/*
|
||||
* Optional: not supported by gcc
|
||||
* Optional: only supported since clang >= 14.0
|
||||
* Optional: not supported by icc
|
||||
*
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#diagnose_as_builtin
|
||||
*/
|
||||
@@ -122,7 +114,6 @@
|
||||
|
||||
/*
|
||||
* Optional: not supported by clang
|
||||
* Optional: not supported by icc
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#index-designated_005finit-type-attribute
|
||||
*/
|
||||
@@ -236,7 +227,6 @@
|
||||
/*
|
||||
* Optional: only supported since gcc >= 8
|
||||
* Optional: not supported by clang
|
||||
* Optional: not supported by icc
|
||||
*
|
||||
* gcc: https://gcc.gnu.org/onlinedocs/gcc/Common-Variable-Attributes.html#index-nonstring-variable-attribute
|
||||
*/
|
||||
@@ -267,7 +257,6 @@
|
||||
|
||||
/*
|
||||
* Optional: not supported by gcc.
|
||||
* Optional: not supported by icc.
|
||||
*
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#overloadable
|
||||
*/
|
||||
@@ -287,7 +276,6 @@
|
||||
* Note: the "type" argument should match any __builtin_object_size(p, type) usage.
|
||||
*
|
||||
* Optional: not supported by gcc.
|
||||
* Optional: not supported by icc.
|
||||
*
|
||||
* clang: https://clang.llvm.org/docs/AttributeReference.html#pass-object-size-pass-dynamic-object-size
|
||||
*/
|
||||
|
||||
@@ -120,8 +120,6 @@ static inline void __chk_io_ptr(const volatile void __iomem *ptr) { }
|
||||
/* Compiler specific macros. */
|
||||
#ifdef __clang__
|
||||
#include <linux/compiler-clang.h>
|
||||
#elif defined(__INTEL_COMPILER)
|
||||
#include <linux/compiler-intel.h>
|
||||
#elif defined(__GNUC__)
|
||||
/* The above compilers also define __GNUC__, so order is important here. */
|
||||
#include <linux/compiler-gcc.h>
|
||||
|
||||
+70
-55
@@ -50,8 +50,41 @@ static inline void set_nr_cpu_ids(unsigned int nr)
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Deprecated. Always use nr_cpu_ids. */
|
||||
#define nr_cpumask_bits nr_cpu_ids
|
||||
/*
|
||||
* We have several different "preferred sizes" for the cpumask
|
||||
* operations, depending on operation.
|
||||
*
|
||||
* For example, the bitmap scanning and operating operations have
|
||||
* optimized routines that work for the single-word case, but only when
|
||||
* the size is constant. So if NR_CPUS fits in one single word, we are
|
||||
* better off using that small constant, in order to trigger the
|
||||
* optimized bit finding. That is 'small_cpumask_size'.
|
||||
*
|
||||
* The clearing and copying operations will similarly perform better
|
||||
* with a constant size, but we limit that size arbitrarily to four
|
||||
* words. We call this 'large_cpumask_size'.
|
||||
*
|
||||
* Finally, some operations just want the exact limit, either because
|
||||
* they set bits or just don't have any faster fixed-sized versions. We
|
||||
* call this just 'nr_cpumask_size'.
|
||||
*
|
||||
* Note that these optional constants are always guaranteed to be at
|
||||
* least as big as 'nr_cpu_ids' itself is, and all our cpumask
|
||||
* allocations are at least that size (see cpumask_size()). The
|
||||
* optimization comes from being able to potentially use a compile-time
|
||||
* constant instead of a run-time generated exact number of CPUs.
|
||||
*/
|
||||
#if NR_CPUS <= BITS_PER_LONG
|
||||
#define small_cpumask_bits ((unsigned int)NR_CPUS)
|
||||
#define large_cpumask_bits ((unsigned int)NR_CPUS)
|
||||
#elif NR_CPUS <= 4*BITS_PER_LONG
|
||||
#define small_cpumask_bits nr_cpu_ids
|
||||
#define large_cpumask_bits ((unsigned int)NR_CPUS)
|
||||
#else
|
||||
#define small_cpumask_bits nr_cpu_ids
|
||||
#define large_cpumask_bits nr_cpu_ids
|
||||
#endif
|
||||
#define nr_cpumask_bits nr_cpu_ids
|
||||
|
||||
/*
|
||||
* The following particular system cpumasks and operations manage
|
||||
@@ -126,7 +159,7 @@ static __always_inline unsigned int cpumask_check(unsigned int cpu)
|
||||
*/
|
||||
static inline unsigned int cpumask_first(const struct cpumask *srcp)
|
||||
{
|
||||
return find_first_bit(cpumask_bits(srcp), nr_cpumask_bits);
|
||||
return find_first_bit(cpumask_bits(srcp), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -137,7 +170,7 @@ static inline unsigned int cpumask_first(const struct cpumask *srcp)
|
||||
*/
|
||||
static inline unsigned int cpumask_first_zero(const struct cpumask *srcp)
|
||||
{
|
||||
return find_first_zero_bit(cpumask_bits(srcp), nr_cpumask_bits);
|
||||
return find_first_zero_bit(cpumask_bits(srcp), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -150,7 +183,7 @@ static inline unsigned int cpumask_first_zero(const struct cpumask *srcp)
|
||||
static inline
|
||||
unsigned int cpumask_first_and(const struct cpumask *srcp1, const struct cpumask *srcp2)
|
||||
{
|
||||
return find_first_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits);
|
||||
return find_first_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -161,7 +194,7 @@ unsigned int cpumask_first_and(const struct cpumask *srcp1, const struct cpumask
|
||||
*/
|
||||
static inline unsigned int cpumask_last(const struct cpumask *srcp)
|
||||
{
|
||||
return find_last_bit(cpumask_bits(srcp), nr_cpumask_bits);
|
||||
return find_last_bit(cpumask_bits(srcp), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -177,7 +210,7 @@ unsigned int cpumask_next(int n, const struct cpumask *srcp)
|
||||
/* -1 is a legal arg here. */
|
||||
if (n != -1)
|
||||
cpumask_check(n);
|
||||
return find_next_bit(cpumask_bits(srcp), nr_cpumask_bits, n + 1);
|
||||
return find_next_bit(cpumask_bits(srcp), small_cpumask_bits, n + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -192,7 +225,7 @@ static inline unsigned int cpumask_next_zero(int n, const struct cpumask *srcp)
|
||||
/* -1 is a legal arg here. */
|
||||
if (n != -1)
|
||||
cpumask_check(n);
|
||||
return find_next_zero_bit(cpumask_bits(srcp), nr_cpumask_bits, n+1);
|
||||
return find_next_zero_bit(cpumask_bits(srcp), small_cpumask_bits, n+1);
|
||||
}
|
||||
|
||||
#if NR_CPUS == 1
|
||||
@@ -235,7 +268,7 @@ unsigned int cpumask_next_and(int n, const struct cpumask *src1p,
|
||||
if (n != -1)
|
||||
cpumask_check(n);
|
||||
return find_next_and_bit(cpumask_bits(src1p), cpumask_bits(src2p),
|
||||
nr_cpumask_bits, n + 1);
|
||||
small_cpumask_bits, n + 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -246,17 +279,7 @@ unsigned int cpumask_next_and(int n, const struct cpumask *src1p,
|
||||
* After the loop, cpu is >= nr_cpu_ids.
|
||||
*/
|
||||
#define for_each_cpu(cpu, mask) \
|
||||
for_each_set_bit(cpu, cpumask_bits(mask), nr_cpumask_bits)
|
||||
|
||||
/**
|
||||
* for_each_cpu_not - iterate over every cpu in a complemented mask
|
||||
* @cpu: the (optionally unsigned) integer iterator
|
||||
* @mask: the cpumask pointer
|
||||
*
|
||||
* After the loop, cpu is >= nr_cpu_ids.
|
||||
*/
|
||||
#define for_each_cpu_not(cpu, mask) \
|
||||
for_each_clear_bit(cpu, cpumask_bits(mask), nr_cpumask_bits)
|
||||
for_each_set_bit(cpu, cpumask_bits(mask), small_cpumask_bits)
|
||||
|
||||
#if NR_CPUS == 1
|
||||
static inline
|
||||
@@ -290,7 +313,7 @@ unsigned int __pure cpumask_next_wrap(int n, const struct cpumask *mask, int sta
|
||||
* After the loop, cpu is >= nr_cpu_ids.
|
||||
*/
|
||||
#define for_each_cpu_wrap(cpu, mask, start) \
|
||||
for_each_set_bit_wrap(cpu, cpumask_bits(mask), nr_cpumask_bits, start)
|
||||
for_each_set_bit_wrap(cpu, cpumask_bits(mask), small_cpumask_bits, start)
|
||||
|
||||
/**
|
||||
* for_each_cpu_and - iterate over every cpu in both masks
|
||||
@@ -307,7 +330,7 @@ unsigned int __pure cpumask_next_wrap(int n, const struct cpumask *mask, int sta
|
||||
* After the loop, cpu is >= nr_cpu_ids.
|
||||
*/
|
||||
#define for_each_cpu_and(cpu, mask1, mask2) \
|
||||
for_each_and_bit(cpu, cpumask_bits(mask1), cpumask_bits(mask2), nr_cpumask_bits)
|
||||
for_each_and_bit(cpu, cpumask_bits(mask1), cpumask_bits(mask2), small_cpumask_bits)
|
||||
|
||||
/**
|
||||
* for_each_cpu_andnot - iterate over every cpu present in one mask, excluding
|
||||
@@ -325,7 +348,7 @@ unsigned int __pure cpumask_next_wrap(int n, const struct cpumask *mask, int sta
|
||||
* After the loop, cpu is >= nr_cpu_ids.
|
||||
*/
|
||||
#define for_each_cpu_andnot(cpu, mask1, mask2) \
|
||||
for_each_andnot_bit(cpu, cpumask_bits(mask1), cpumask_bits(mask2), nr_cpumask_bits)
|
||||
for_each_andnot_bit(cpu, cpumask_bits(mask1), cpumask_bits(mask2), small_cpumask_bits)
|
||||
|
||||
/**
|
||||
* cpumask_any_but - return a "random" in a cpumask, but not this one.
|
||||
@@ -356,7 +379,7 @@ unsigned int cpumask_any_but(const struct cpumask *mask, unsigned int cpu)
|
||||
*/
|
||||
static inline unsigned int cpumask_nth(unsigned int cpu, const struct cpumask *srcp)
|
||||
{
|
||||
return find_nth_bit(cpumask_bits(srcp), nr_cpumask_bits, cpumask_check(cpu));
|
||||
return find_nth_bit(cpumask_bits(srcp), small_cpumask_bits, cpumask_check(cpu));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -372,7 +395,7 @@ unsigned int cpumask_nth_and(unsigned int cpu, const struct cpumask *srcp1,
|
||||
const struct cpumask *srcp2)
|
||||
{
|
||||
return find_nth_and_bit(cpumask_bits(srcp1), cpumask_bits(srcp2),
|
||||
nr_cpumask_bits, cpumask_check(cpu));
|
||||
small_cpumask_bits, cpumask_check(cpu));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -388,7 +411,7 @@ unsigned int cpumask_nth_andnot(unsigned int cpu, const struct cpumask *srcp1,
|
||||
const struct cpumask *srcp2)
|
||||
{
|
||||
return find_nth_andnot_bit(cpumask_bits(srcp1), cpumask_bits(srcp2),
|
||||
nr_cpumask_bits, cpumask_check(cpu));
|
||||
small_cpumask_bits, cpumask_check(cpu));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -408,7 +431,7 @@ unsigned int cpumask_nth_and_andnot(unsigned int cpu, const struct cpumask *srcp
|
||||
return find_nth_and_andnot_bit(cpumask_bits(srcp1),
|
||||
cpumask_bits(srcp2),
|
||||
cpumask_bits(srcp3),
|
||||
nr_cpumask_bits, cpumask_check(cpu));
|
||||
small_cpumask_bits, cpumask_check(cpu));
|
||||
}
|
||||
|
||||
#define CPU_BITS_NONE \
|
||||
@@ -495,10 +518,14 @@ static __always_inline bool cpumask_test_and_clear_cpu(int cpu, struct cpumask *
|
||||
/**
|
||||
* cpumask_setall - set all cpus (< nr_cpu_ids) in a cpumask
|
||||
* @dstp: the cpumask pointer
|
||||
*
|
||||
* Note: since we set bits, we should use the tighter 'bitmap_set()' with
|
||||
* the eact number of bits, not 'bitmap_fill()' that will fill past the
|
||||
* end.
|
||||
*/
|
||||
static inline void cpumask_setall(struct cpumask *dstp)
|
||||
{
|
||||
bitmap_fill(cpumask_bits(dstp), nr_cpumask_bits);
|
||||
bitmap_set(cpumask_bits(dstp), 0, nr_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -507,7 +534,7 @@ static inline void cpumask_setall(struct cpumask *dstp)
|
||||
*/
|
||||
static inline void cpumask_clear(struct cpumask *dstp)
|
||||
{
|
||||
bitmap_zero(cpumask_bits(dstp), nr_cpumask_bits);
|
||||
bitmap_zero(cpumask_bits(dstp), large_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -523,7 +550,7 @@ static inline bool cpumask_and(struct cpumask *dstp,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
return bitmap_and(cpumask_bits(dstp), cpumask_bits(src1p),
|
||||
cpumask_bits(src2p), nr_cpumask_bits);
|
||||
cpumask_bits(src2p), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -536,7 +563,7 @@ static inline void cpumask_or(struct cpumask *dstp, const struct cpumask *src1p,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
bitmap_or(cpumask_bits(dstp), cpumask_bits(src1p),
|
||||
cpumask_bits(src2p), nr_cpumask_bits);
|
||||
cpumask_bits(src2p), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -550,7 +577,7 @@ static inline void cpumask_xor(struct cpumask *dstp,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
bitmap_xor(cpumask_bits(dstp), cpumask_bits(src1p),
|
||||
cpumask_bits(src2p), nr_cpumask_bits);
|
||||
cpumask_bits(src2p), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -566,19 +593,7 @@ static inline bool cpumask_andnot(struct cpumask *dstp,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
return bitmap_andnot(cpumask_bits(dstp), cpumask_bits(src1p),
|
||||
cpumask_bits(src2p), nr_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
* cpumask_complement - *dstp = ~*srcp
|
||||
* @dstp: the cpumask result
|
||||
* @srcp: the input to invert
|
||||
*/
|
||||
static inline void cpumask_complement(struct cpumask *dstp,
|
||||
const struct cpumask *srcp)
|
||||
{
|
||||
bitmap_complement(cpumask_bits(dstp), cpumask_bits(srcp),
|
||||
nr_cpumask_bits);
|
||||
cpumask_bits(src2p), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -590,7 +605,7 @@ static inline bool cpumask_equal(const struct cpumask *src1p,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
return bitmap_equal(cpumask_bits(src1p), cpumask_bits(src2p),
|
||||
nr_cpumask_bits);
|
||||
small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -604,7 +619,7 @@ static inline bool cpumask_or_equal(const struct cpumask *src1p,
|
||||
const struct cpumask *src3p)
|
||||
{
|
||||
return bitmap_or_equal(cpumask_bits(src1p), cpumask_bits(src2p),
|
||||
cpumask_bits(src3p), nr_cpumask_bits);
|
||||
cpumask_bits(src3p), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -616,7 +631,7 @@ static inline bool cpumask_intersects(const struct cpumask *src1p,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
return bitmap_intersects(cpumask_bits(src1p), cpumask_bits(src2p),
|
||||
nr_cpumask_bits);
|
||||
small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -630,7 +645,7 @@ static inline bool cpumask_subset(const struct cpumask *src1p,
|
||||
const struct cpumask *src2p)
|
||||
{
|
||||
return bitmap_subset(cpumask_bits(src1p), cpumask_bits(src2p),
|
||||
nr_cpumask_bits);
|
||||
small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -639,7 +654,7 @@ static inline bool cpumask_subset(const struct cpumask *src1p,
|
||||
*/
|
||||
static inline bool cpumask_empty(const struct cpumask *srcp)
|
||||
{
|
||||
return bitmap_empty(cpumask_bits(srcp), nr_cpumask_bits);
|
||||
return bitmap_empty(cpumask_bits(srcp), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -657,7 +672,7 @@ static inline bool cpumask_full(const struct cpumask *srcp)
|
||||
*/
|
||||
static inline unsigned int cpumask_weight(const struct cpumask *srcp)
|
||||
{
|
||||
return bitmap_weight(cpumask_bits(srcp), nr_cpumask_bits);
|
||||
return bitmap_weight(cpumask_bits(srcp), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -668,7 +683,7 @@ static inline unsigned int cpumask_weight(const struct cpumask *srcp)
|
||||
static inline unsigned int cpumask_weight_and(const struct cpumask *srcp1,
|
||||
const struct cpumask *srcp2)
|
||||
{
|
||||
return bitmap_weight_and(cpumask_bits(srcp1), cpumask_bits(srcp2), nr_cpumask_bits);
|
||||
return bitmap_weight_and(cpumask_bits(srcp1), cpumask_bits(srcp2), small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -681,7 +696,7 @@ static inline void cpumask_shift_right(struct cpumask *dstp,
|
||||
const struct cpumask *srcp, int n)
|
||||
{
|
||||
bitmap_shift_right(cpumask_bits(dstp), cpumask_bits(srcp), n,
|
||||
nr_cpumask_bits);
|
||||
small_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -705,7 +720,7 @@ static inline void cpumask_shift_left(struct cpumask *dstp,
|
||||
static inline void cpumask_copy(struct cpumask *dstp,
|
||||
const struct cpumask *srcp)
|
||||
{
|
||||
bitmap_copy(cpumask_bits(dstp), cpumask_bits(srcp), nr_cpumask_bits);
|
||||
bitmap_copy(cpumask_bits(dstp), cpumask_bits(srcp), large_cpumask_bits);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -789,7 +804,7 @@ static inline int cpulist_parse(const char *buf, struct cpumask *dstp)
|
||||
*/
|
||||
static inline unsigned int cpumask_size(void)
|
||||
{
|
||||
return BITS_TO_LONGS(nr_cpumask_bits) * sizeof(long);
|
||||
return BITS_TO_LONGS(large_cpumask_bits) * sizeof(long);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -635,6 +635,8 @@ int msi_domain_prepare_irqs(struct irq_domain *domain, struct device *dev,
|
||||
int nvec, msi_alloc_info_t *args);
|
||||
int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
|
||||
int virq, int nvec, msi_alloc_info_t *args);
|
||||
void msi_domain_depopulate_descs(struct device *dev, int virq, int nvec);
|
||||
|
||||
struct irq_domain *
|
||||
__platform_msi_create_device_domain(struct device *dev,
|
||||
unsigned int nvec,
|
||||
|
||||
+6
-2
@@ -188,9 +188,9 @@ EXPORT_SYMBOL_GPL(ipi_get_hwirq);
|
||||
static int ipi_send_verify(struct irq_chip *chip, struct irq_data *data,
|
||||
const struct cpumask *dest, unsigned int cpu)
|
||||
{
|
||||
const struct cpumask *ipimask = irq_data_get_affinity_mask(data);
|
||||
const struct cpumask *ipimask;
|
||||
|
||||
if (!chip || !ipimask)
|
||||
if (!chip || !data)
|
||||
return -EINVAL;
|
||||
|
||||
if (!chip->ipi_send_single && !chip->ipi_send_mask)
|
||||
@@ -199,6 +199,10 @@ static int ipi_send_verify(struct irq_chip *chip, struct irq_data *data,
|
||||
if (cpu >= nr_cpu_ids)
|
||||
return -EINVAL;
|
||||
|
||||
ipimask = irq_data_get_affinity_mask(data);
|
||||
if (!ipimask)
|
||||
return -EINVAL;
|
||||
|
||||
if (dest) {
|
||||
if (!cpumask_subset(dest, ipimask))
|
||||
return -EINVAL;
|
||||
|
||||
@@ -277,7 +277,7 @@ static struct attribute *irq_attrs[] = {
|
||||
};
|
||||
ATTRIBUTE_GROUPS(irq);
|
||||
|
||||
static struct kobj_type irq_kobj_type = {
|
||||
static const struct kobj_type irq_kobj_type = {
|
||||
.release = irq_kobj_release,
|
||||
.sysfs_ops = &kobj_sysfs_ops,
|
||||
.default_groups = irq_groups,
|
||||
@@ -335,7 +335,7 @@ postcore_initcall(irq_sysfs_init);
|
||||
|
||||
#else /* !CONFIG_SYSFS */
|
||||
|
||||
static struct kobj_type irq_kobj_type = {
|
||||
static const struct kobj_type irq_kobj_type = {
|
||||
.release = irq_kobj_release,
|
||||
};
|
||||
|
||||
|
||||
@@ -1147,7 +1147,8 @@ struct irq_domain *irq_domain_create_hierarchy(struct irq_domain *parent,
|
||||
domain = __irq_domain_create(fwnode, 0, ~0, 0, ops, host_data);
|
||||
|
||||
if (domain) {
|
||||
domain->root = parent->root;
|
||||
if (parent)
|
||||
domain->root = parent->root;
|
||||
domain->parent = parent;
|
||||
domain->flags |= flags;
|
||||
|
||||
|
||||
+29
-8
@@ -830,11 +830,8 @@ static struct irq_domain *__msi_create_irq_domain(struct fwnode_handle *fwnode,
|
||||
domain = irq_domain_create_hierarchy(parent, flags | IRQ_DOMAIN_FLAG_MSI, 0,
|
||||
fwnode, &msi_domain_ops, info);
|
||||
|
||||
if (domain) {
|
||||
if (!domain->name && info->chip)
|
||||
domain->name = info->chip->name;
|
||||
if (domain)
|
||||
irq_domain_update_bus_token(domain, info->bus_token);
|
||||
}
|
||||
|
||||
return domain;
|
||||
}
|
||||
@@ -1084,10 +1081,13 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
|
||||
struct xarray *xa;
|
||||
int ret, virq;
|
||||
|
||||
if (!msi_ctrl_valid(dev, &ctrl))
|
||||
return -EINVAL;
|
||||
|
||||
msi_lock_descs(dev);
|
||||
|
||||
if (!msi_ctrl_valid(dev, &ctrl)) {
|
||||
ret = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
ret = msi_domain_add_simple_msi_descs(dev, &ctrl);
|
||||
if (ret)
|
||||
goto unlock;
|
||||
@@ -1109,14 +1109,35 @@ int msi_domain_populate_irqs(struct irq_domain *domain, struct device *dev,
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
for (--virq; virq >= virq_base; virq--)
|
||||
for (--virq; virq >= virq_base; virq--) {
|
||||
msi_domain_depopulate_descs(dev, virq, 1);
|
||||
irq_domain_free_irqs_common(domain, virq, 1);
|
||||
}
|
||||
msi_domain_free_descs(dev, &ctrl);
|
||||
unlock:
|
||||
msi_unlock_descs(dev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void msi_domain_depopulate_descs(struct device *dev, int virq_base, int nvec)
|
||||
{
|
||||
struct msi_ctrl ctrl = {
|
||||
.domid = MSI_DEFAULT_DOMAIN,
|
||||
.first = virq_base,
|
||||
.last = virq_base + nvec - 1,
|
||||
};
|
||||
struct msi_desc *desc;
|
||||
struct xarray *xa;
|
||||
unsigned long idx;
|
||||
|
||||
if (!msi_ctrl_valid(dev, &ctrl))
|
||||
return;
|
||||
|
||||
xa = &dev->msi.data->__domains[ctrl.domid].store;
|
||||
xa_for_each_range(xa, idx, desc, ctrl.first, ctrl.last)
|
||||
desc->irq = 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Carefully check whether the device can use reservation mode. If
|
||||
* reservation mode is enabled then the early activation will assign a
|
||||
|
||||
+1
-13
@@ -23,16 +23,6 @@
|
||||
KUNIT_EXPECT_EQ_MSG((test), mask_weight, iter, MASK_MSG(mask)); \
|
||||
} while (0)
|
||||
|
||||
#define EXPECT_FOR_EACH_CPU_NOT_EQ(test, mask) \
|
||||
do { \
|
||||
const cpumask_t *m = (mask); \
|
||||
int mask_weight = cpumask_weight(m); \
|
||||
int cpu, iter = 0; \
|
||||
for_each_cpu_not(cpu, m) \
|
||||
iter++; \
|
||||
KUNIT_EXPECT_EQ_MSG((test), nr_cpu_ids - mask_weight, iter, MASK_MSG(mask)); \
|
||||
} while (0)
|
||||
|
||||
#define EXPECT_FOR_EACH_CPU_OP_EQ(test, op, mask1, mask2) \
|
||||
do { \
|
||||
const cpumask_t *m1 = (mask1); \
|
||||
@@ -77,7 +67,7 @@ static void test_cpumask_weight(struct kunit *test)
|
||||
KUNIT_EXPECT_EQ_MSG(test, 0, cpumask_weight(&mask_empty), MASK_MSG(&mask_empty));
|
||||
KUNIT_EXPECT_EQ_MSG(test, nr_cpu_ids, cpumask_weight(cpu_possible_mask),
|
||||
MASK_MSG(cpu_possible_mask));
|
||||
KUNIT_EXPECT_EQ_MSG(test, nr_cpumask_bits, cpumask_weight(&mask_all), MASK_MSG(&mask_all));
|
||||
KUNIT_EXPECT_EQ_MSG(test, nr_cpu_ids, cpumask_weight(&mask_all), MASK_MSG(&mask_all));
|
||||
}
|
||||
|
||||
static void test_cpumask_first(struct kunit *test)
|
||||
@@ -113,14 +103,12 @@ static void test_cpumask_next(struct kunit *test)
|
||||
static void test_cpumask_iterators(struct kunit *test)
|
||||
{
|
||||
EXPECT_FOR_EACH_CPU_EQ(test, &mask_empty);
|
||||
EXPECT_FOR_EACH_CPU_NOT_EQ(test, &mask_empty);
|
||||
EXPECT_FOR_EACH_CPU_WRAP_EQ(test, &mask_empty);
|
||||
EXPECT_FOR_EACH_CPU_OP_EQ(test, and, &mask_empty, &mask_empty);
|
||||
EXPECT_FOR_EACH_CPU_OP_EQ(test, and, cpu_possible_mask, &mask_empty);
|
||||
EXPECT_FOR_EACH_CPU_OP_EQ(test, andnot, &mask_empty, &mask_empty);
|
||||
|
||||
EXPECT_FOR_EACH_CPU_EQ(test, cpu_possible_mask);
|
||||
EXPECT_FOR_EACH_CPU_NOT_EQ(test, cpu_possible_mask);
|
||||
EXPECT_FOR_EACH_CPU_WRAP_EQ(test, cpu_possible_mask);
|
||||
EXPECT_FOR_EACH_CPU_OP_EQ(test, and, cpu_possible_mask, cpu_possible_mask);
|
||||
EXPECT_FOR_EACH_CPU_OP_EQ(test, andnot, cpu_possible_mask, &mask_empty);
|
||||
|
||||
+8
-2
@@ -1035,11 +1035,16 @@ out:
|
||||
* destination folio. This is safe because nobody is using them
|
||||
* except us.
|
||||
*/
|
||||
union migration_ptr {
|
||||
struct anon_vma *anon_vma;
|
||||
struct address_space *mapping;
|
||||
};
|
||||
static void __migrate_folio_record(struct folio *dst,
|
||||
unsigned long page_was_mapped,
|
||||
struct anon_vma *anon_vma)
|
||||
{
|
||||
dst->mapping = (void *)anon_vma;
|
||||
union migration_ptr ptr = { .anon_vma = anon_vma };
|
||||
dst->mapping = ptr.mapping;
|
||||
dst->private = (void *)page_was_mapped;
|
||||
}
|
||||
|
||||
@@ -1047,7 +1052,8 @@ static void __migrate_folio_extract(struct folio *dst,
|
||||
int *page_was_mappedp,
|
||||
struct anon_vma **anon_vmap)
|
||||
{
|
||||
*anon_vmap = (void *)dst->mapping;
|
||||
union migration_ptr ptr = { .mapping = dst->mapping };
|
||||
*anon_vmap = ptr.anon_vma;
|
||||
*page_was_mappedp = (unsigned long)dst->private;
|
||||
dst->mapping = NULL;
|
||||
dst->private = NULL;
|
||||
|
||||
@@ -12,8 +12,6 @@ get_c_compiler_info()
|
||||
cat <<- EOF | "$@" -E -P -x c - 2>/dev/null
|
||||
#if defined(__clang__)
|
||||
Clang __clang_major__ __clang_minor__ __clang_patchlevel__
|
||||
#elif defined(__INTEL_COMPILER)
|
||||
ICC __INTEL_COMPILER __INTEL_COMPILER_UPDATE
|
||||
#elif defined(__GNUC__)
|
||||
GCC __GNUC__ __GNUC_MINOR__ __GNUC_PATCHLEVEL__
|
||||
#else
|
||||
|
||||
@@ -19,10 +19,6 @@ binutils)
|
||||
gcc)
|
||||
echo 5.1.0
|
||||
;;
|
||||
icc)
|
||||
# temporary
|
||||
echo 16.0.3
|
||||
;;
|
||||
llvm)
|
||||
if [ "$SRCARCH" = s390 ]; then
|
||||
echo 15.0.0
|
||||
|
||||
Reference in New Issue
Block a user