mirror of
https://github.com/torvalds/linux.git
synced 2026-07-31 11:37:06 +02:00
Linux 6.0
-----BEGIN PGP SIGNATURE----- iQFSBAABCAA8FiEEq68RxlopcLEwq+PEeb4+QwBBGIYFAmM5/fMeHHRvcnZhbGRz QGxpbnV4LWZvdW5kYXRpb24ub3JnAAoJEHm+PkMAQRiG+Y0H/jG0HQjUHfIOGjPQ T33eaF5POoZKzZmsTNITbtya7B3/OTZZRGdSq9B8t5tElyPnZrdIfaXds17mCI8y 5DJUEQGdv6fqRttYLGKf6rk1kzABhhaTS8n9BgDFEsmvdqwG4AV6dLQr3HL09gTV Lu+Is86RPwmpgH0Z9u7DyFCF8yLjefyu0vl6eFm/SXjCE8gQM/LZQSi9mv5/YDxa MVKlsZKIkQm6P8a6r8wbGedKYBped4+4gYedsf/IcS0lvKdLIs/P7YgR5wKklSbM tqECvBOmKq1Fwj/oxH+fx0KLX/ZD1xxQwoQd+a9DOSo+BuPBt6KGojYT9gQRyFJp R7gyUCo= =2UOD -----END PGP SIGNATURE----- Merge tag 'v6.0' into android-mainline Linux 6.0 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: I60e3a100cae145cc4d788c45a536d391ba331831
This commit is contained in:
commit
c2c77ac403
|
|
@ -57,6 +57,11 @@ properties:
|
|||
- description: interrupt ID for I2C event
|
||||
- description: interrupt ID for I2C error
|
||||
|
||||
interrupt-names:
|
||||
items:
|
||||
- const: event
|
||||
- const: error
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
|
|
@ -92,6 +97,8 @@ properties:
|
|||
- description: register offset within syscfg
|
||||
- description: register bitmask for FMP bit
|
||||
|
||||
wakeup-source: true
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
|
|
|
|||
2
Makefile
2
Makefile
|
|
@ -2,7 +2,7 @@
|
|||
VERSION = 6
|
||||
PATCHLEVEL = 0
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc7
|
||||
EXTRAVERSION =
|
||||
NAME = Hurr durr I'ma ninja sloth
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
|
|
|||
|
|
@ -2102,6 +2102,15 @@ static struct extra_reg intel_tnt_extra_regs[] __read_mostly = {
|
|||
EVENT_EXTRA_END
|
||||
};
|
||||
|
||||
EVENT_ATTR_STR(mem-loads, mem_ld_grt, "event=0xd0,umask=0x5,ldlat=3");
|
||||
EVENT_ATTR_STR(mem-stores, mem_st_grt, "event=0xd0,umask=0x6");
|
||||
|
||||
static struct attribute *grt_mem_attrs[] = {
|
||||
EVENT_PTR(mem_ld_grt),
|
||||
EVENT_PTR(mem_st_grt),
|
||||
NULL
|
||||
};
|
||||
|
||||
static struct extra_reg intel_grt_extra_regs[] __read_mostly = {
|
||||
/* must define OFFCORE_RSP_X first, see intel_fixup_er() */
|
||||
INTEL_UEVENT_EXTRA_REG(0x01b7, MSR_OFFCORE_RSP_0, 0x3fffffffffull, RSP_0),
|
||||
|
|
@ -5975,6 +5984,36 @@ __init int intel_pmu_init(void)
|
|||
name = "Tremont";
|
||||
break;
|
||||
|
||||
case INTEL_FAM6_ALDERLAKE_N:
|
||||
x86_pmu.mid_ack = true;
|
||||
memcpy(hw_cache_event_ids, glp_hw_cache_event_ids,
|
||||
sizeof(hw_cache_event_ids));
|
||||
memcpy(hw_cache_extra_regs, tnt_hw_cache_extra_regs,
|
||||
sizeof(hw_cache_extra_regs));
|
||||
hw_cache_event_ids[C(ITLB)][C(OP_READ)][C(RESULT_ACCESS)] = -1;
|
||||
|
||||
x86_pmu.event_constraints = intel_slm_event_constraints;
|
||||
x86_pmu.pebs_constraints = intel_grt_pebs_event_constraints;
|
||||
x86_pmu.extra_regs = intel_grt_extra_regs;
|
||||
|
||||
x86_pmu.pebs_aliases = NULL;
|
||||
x86_pmu.pebs_prec_dist = true;
|
||||
x86_pmu.pebs_block = true;
|
||||
x86_pmu.lbr_pt_coexist = true;
|
||||
x86_pmu.flags |= PMU_FL_HAS_RSP_1;
|
||||
x86_pmu.flags |= PMU_FL_INSTR_LATENCY;
|
||||
|
||||
intel_pmu_pebs_data_source_grt();
|
||||
x86_pmu.pebs_latency_data = adl_latency_data_small;
|
||||
x86_pmu.get_event_constraints = tnt_get_event_constraints;
|
||||
x86_pmu.limit_period = spr_limit_period;
|
||||
td_attr = tnt_events_attrs;
|
||||
mem_attr = grt_mem_attrs;
|
||||
extra_attr = nhm_format_attr;
|
||||
pr_cont("Gracemont events, ");
|
||||
name = "gracemont";
|
||||
break;
|
||||
|
||||
case INTEL_FAM6_WESTMERE:
|
||||
case INTEL_FAM6_WESTMERE_EP:
|
||||
case INTEL_FAM6_WESTMERE_EX:
|
||||
|
|
@ -6317,7 +6356,6 @@ __init int intel_pmu_init(void)
|
|||
|
||||
case INTEL_FAM6_ALDERLAKE:
|
||||
case INTEL_FAM6_ALDERLAKE_L:
|
||||
case INTEL_FAM6_ALDERLAKE_N:
|
||||
case INTEL_FAM6_RAPTORLAKE:
|
||||
case INTEL_FAM6_RAPTORLAKE_P:
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -110,13 +110,18 @@ void __init intel_pmu_pebs_data_source_skl(bool pmem)
|
|||
__intel_pmu_pebs_data_source_skl(pmem, pebs_data_source);
|
||||
}
|
||||
|
||||
static void __init intel_pmu_pebs_data_source_grt(u64 *data_source)
|
||||
static void __init __intel_pmu_pebs_data_source_grt(u64 *data_source)
|
||||
{
|
||||
data_source[0x05] = OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HIT);
|
||||
data_source[0x06] = OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOP, HITM);
|
||||
data_source[0x08] = OP_LH | P(LVL, L3) | LEVEL(L3) | P(SNOOPX, FWD);
|
||||
}
|
||||
|
||||
void __init intel_pmu_pebs_data_source_grt(void)
|
||||
{
|
||||
__intel_pmu_pebs_data_source_grt(pebs_data_source);
|
||||
}
|
||||
|
||||
void __init intel_pmu_pebs_data_source_adl(void)
|
||||
{
|
||||
u64 *data_source;
|
||||
|
|
@ -127,7 +132,7 @@ void __init intel_pmu_pebs_data_source_adl(void)
|
|||
|
||||
data_source = x86_pmu.hybrid_pmu[X86_HYBRID_PMU_ATOM_IDX].pebs_data_source;
|
||||
memcpy(data_source, pebs_data_source, sizeof(pebs_data_source));
|
||||
intel_pmu_pebs_data_source_grt(data_source);
|
||||
__intel_pmu_pebs_data_source_grt(data_source);
|
||||
}
|
||||
|
||||
static u64 precise_store_data(u64 status)
|
||||
|
|
|
|||
|
|
@ -1516,6 +1516,8 @@ void intel_pmu_pebs_data_source_skl(bool pmem);
|
|||
|
||||
void intel_pmu_pebs_data_source_adl(void);
|
||||
|
||||
void intel_pmu_pebs_data_source_grt(void);
|
||||
|
||||
int intel_pmu_setup_lbr_filter(struct perf_event *event);
|
||||
|
||||
void intel_pt_interrupt(void);
|
||||
|
|
|
|||
|
|
@ -21,16 +21,6 @@ DECLARE_PER_CPU_READ_MOSTLY(u16, cpu_llc_id);
|
|||
DECLARE_PER_CPU_READ_MOSTLY(u16, cpu_l2c_id);
|
||||
DECLARE_PER_CPU_READ_MOSTLY(int, cpu_number);
|
||||
|
||||
static inline struct cpumask *cpu_llc_shared_mask(int cpu)
|
||||
{
|
||||
return per_cpu(cpu_llc_shared_map, cpu);
|
||||
}
|
||||
|
||||
static inline struct cpumask *cpu_l2c_shared_mask(int cpu)
|
||||
{
|
||||
return per_cpu(cpu_l2c_shared_map, cpu);
|
||||
}
|
||||
|
||||
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_cpu_to_apicid);
|
||||
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u32, x86_cpu_to_acpiid);
|
||||
DECLARE_EARLY_PER_CPU_READ_MOSTLY(u16, x86_bios_cpu_apicid);
|
||||
|
|
@ -172,6 +162,16 @@ extern int safe_smp_processor_id(void);
|
|||
# define safe_smp_processor_id() smp_processor_id()
|
||||
#endif
|
||||
|
||||
static inline struct cpumask *cpu_llc_shared_mask(int cpu)
|
||||
{
|
||||
return per_cpu(cpu_llc_shared_map, cpu);
|
||||
}
|
||||
|
||||
static inline struct cpumask *cpu_l2c_shared_mask(int cpu)
|
||||
{
|
||||
return per_cpu(cpu_l2c_shared_map, cpu);
|
||||
}
|
||||
|
||||
#else /* !CONFIG_SMP */
|
||||
#define wbinvd_on_cpu(cpu) wbinvd()
|
||||
static inline int wbinvd_on_all_cpus(void)
|
||||
|
|
@ -179,6 +179,11 @@ static inline int wbinvd_on_all_cpus(void)
|
|||
wbinvd();
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline struct cpumask *cpu_llc_shared_mask(int cpu)
|
||||
{
|
||||
return (struct cpumask *)cpumask_of(0);
|
||||
}
|
||||
#endif /* CONFIG_SMP */
|
||||
|
||||
extern unsigned disabled_cpus;
|
||||
|
|
|
|||
|
|
@ -1319,22 +1319,23 @@ struct bp_patching_desc {
|
|||
atomic_t refs;
|
||||
};
|
||||
|
||||
static struct bp_patching_desc *bp_desc;
|
||||
static struct bp_patching_desc bp_desc;
|
||||
|
||||
static __always_inline
|
||||
struct bp_patching_desc *try_get_desc(struct bp_patching_desc **descp)
|
||||
struct bp_patching_desc *try_get_desc(void)
|
||||
{
|
||||
/* rcu_dereference */
|
||||
struct bp_patching_desc *desc = __READ_ONCE(*descp);
|
||||
struct bp_patching_desc *desc = &bp_desc;
|
||||
|
||||
if (!desc || !arch_atomic_inc_not_zero(&desc->refs))
|
||||
if (!arch_atomic_inc_not_zero(&desc->refs))
|
||||
return NULL;
|
||||
|
||||
return desc;
|
||||
}
|
||||
|
||||
static __always_inline void put_desc(struct bp_patching_desc *desc)
|
||||
static __always_inline void put_desc(void)
|
||||
{
|
||||
struct bp_patching_desc *desc = &bp_desc;
|
||||
|
||||
smp_mb__before_atomic();
|
||||
arch_atomic_dec(&desc->refs);
|
||||
}
|
||||
|
|
@ -1367,15 +1368,15 @@ noinstr int poke_int3_handler(struct pt_regs *regs)
|
|||
|
||||
/*
|
||||
* Having observed our INT3 instruction, we now must observe
|
||||
* bp_desc:
|
||||
* bp_desc with non-zero refcount:
|
||||
*
|
||||
* bp_desc = desc INT3
|
||||
* bp_desc.refs = 1 INT3
|
||||
* WMB RMB
|
||||
* write INT3 if (desc)
|
||||
* write INT3 if (bp_desc.refs != 0)
|
||||
*/
|
||||
smp_rmb();
|
||||
|
||||
desc = try_get_desc(&bp_desc);
|
||||
desc = try_get_desc();
|
||||
if (!desc)
|
||||
return 0;
|
||||
|
||||
|
|
@ -1429,7 +1430,7 @@ noinstr int poke_int3_handler(struct pt_regs *regs)
|
|||
ret = 1;
|
||||
|
||||
out_put:
|
||||
put_desc(desc);
|
||||
put_desc();
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
|
@ -1460,18 +1461,20 @@ static int tp_vec_nr;
|
|||
*/
|
||||
static void text_poke_bp_batch(struct text_poke_loc *tp, unsigned int nr_entries)
|
||||
{
|
||||
struct bp_patching_desc desc = {
|
||||
.vec = tp,
|
||||
.nr_entries = nr_entries,
|
||||
.refs = ATOMIC_INIT(1),
|
||||
};
|
||||
unsigned char int3 = INT3_INSN_OPCODE;
|
||||
unsigned int i;
|
||||
int do_sync;
|
||||
|
||||
lockdep_assert_held(&text_mutex);
|
||||
|
||||
smp_store_release(&bp_desc, &desc); /* rcu_assign_pointer */
|
||||
bp_desc.vec = tp;
|
||||
bp_desc.nr_entries = nr_entries;
|
||||
|
||||
/*
|
||||
* Corresponds to the implicit memory barrier in try_get_desc() to
|
||||
* ensure reading a non-zero refcount provides up to date bp_desc data.
|
||||
*/
|
||||
atomic_set_release(&bp_desc.refs, 1);
|
||||
|
||||
/*
|
||||
* Corresponding read barrier in int3 notifier for making sure the
|
||||
|
|
@ -1559,12 +1562,10 @@ static void text_poke_bp_batch(struct text_poke_loc *tp, unsigned int nr_entries
|
|||
text_poke_sync();
|
||||
|
||||
/*
|
||||
* Remove and synchronize_rcu(), except we have a very primitive
|
||||
* refcount based completion.
|
||||
* Remove and wait for refs to be zero.
|
||||
*/
|
||||
WRITE_ONCE(bp_desc, NULL); /* RCU_INIT_POINTER */
|
||||
if (!atomic_dec_and_test(&desc.refs))
|
||||
atomic_cond_read_acquire(&desc.refs, !VAL);
|
||||
if (!atomic_dec_and_test(&bp_desc.refs))
|
||||
atomic_cond_read_acquire(&bp_desc.refs, !VAL);
|
||||
}
|
||||
|
||||
static void text_poke_loc_init(struct text_poke_loc *tp, void *addr,
|
||||
|
|
|
|||
|
|
@ -823,7 +823,7 @@ static int davinci_i2c_probe(struct platform_device *pdev)
|
|||
r = pm_runtime_resume_and_get(dev->dev);
|
||||
if (r < 0) {
|
||||
dev_err(dev->dev, "failed to runtime_get device: %d\n", r);
|
||||
return r;
|
||||
goto err_pm;
|
||||
}
|
||||
|
||||
i2c_davinci_init(dev);
|
||||
|
|
@ -882,6 +882,7 @@ static int davinci_i2c_probe(struct platform_device *pdev)
|
|||
err_unuse_clocks:
|
||||
pm_runtime_dont_use_autosuspend(dev->dev);
|
||||
pm_runtime_put_sync(dev->dev);
|
||||
err_pm:
|
||||
pm_runtime_disable(dev->dev);
|
||||
|
||||
return r;
|
||||
|
|
|
|||
|
|
@ -6879,9 +6879,16 @@ static void perf_output_read_group(struct perf_output_handle *handle,
|
|||
{
|
||||
struct perf_event *leader = event->group_leader, *sub;
|
||||
u64 read_format = event->attr.read_format;
|
||||
unsigned long flags;
|
||||
u64 values[6];
|
||||
int n = 0;
|
||||
|
||||
/*
|
||||
* Disabling interrupts avoids all counter scheduling
|
||||
* (context switches, timer based rotation and IPIs).
|
||||
*/
|
||||
local_irq_save(flags);
|
||||
|
||||
values[n++] = 1 + leader->nr_siblings;
|
||||
|
||||
if (read_format & PERF_FORMAT_TOTAL_TIME_ENABLED)
|
||||
|
|
@ -6917,6 +6924,8 @@ static void perf_output_read_group(struct perf_output_handle *handle,
|
|||
|
||||
__output_copy(handle, values, n * sizeof(u64));
|
||||
}
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
#define PERF_FORMAT_TOTAL_TIMES (PERF_FORMAT_TOTAL_TIME_ENABLED|\
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user