Files
kernel_arpi/kernel/sched/pelt.h
Greg Kroah-Hartman 8222792e8e Merge 5.15.19 into android13-5.15
Changes in 5.15.19
	can: m_can: m_can_fifo_{read,write}: don't read or write from/to FIFO if length is 0
	net: sfp: ignore disabled SFP node
	net: stmmac: configure PTP clock source prior to PTP initialization
	net: stmmac: skip only stmmac_ptp_register when resume from suspend
	ARM: 9179/1: uaccess: avoid alignment faults in copy_[from|to]_kernel_nofault
	ARM: 9180/1: Thumb2: align ALT_UP() sections in modules sufficiently
	KVM: arm64: Use shadow SPSR_EL1 when injecting exceptions on !VHE
	s390/module: fix loading modules with a lot of relocations
	s390/hypfs: include z/VM guests with access control group set
	s390/nmi: handle guarded storage validity failures for KVM guests
	s390/nmi: handle vector validity failures for KVM guests
	bpf: Guard against accessing NULL pt_regs in bpf_get_task_stack()
	powerpc32/bpf: Fix codegen for bpf-to-bpf calls
	powerpc/bpf: Update ldimm64 instructions during extra pass
	ucount: Make get_ucount a safe get_user replacement
	scsi: zfcp: Fix failed recovery on gone remote port with non-NPIV FCP devices
	udf: Restore i_lenAlloc when inode expansion fails
	udf: Fix NULL ptr deref when converting from inline format
	efi: runtime: avoid EFIv2 runtime services on Apple x86 machines
	PM: wakeup: simplify the output logic of pm_show_wakelocks()
	tracing/histogram: Fix a potential memory leak for kstrdup()
	tracing: Don't inc err_log entry count if entry allocation fails
	ceph: properly put ceph_string reference after async create attempt
	ceph: set pool_ns in new inode layout for async creates
	fsnotify: fix fsnotify hooks in pseudo filesystems
	Revert "KVM: SVM: avoid infinite loop on NPF from bad address"
	psi: Fix uaf issue when psi trigger is destroyed while being polled
	powerpc/audit: Fix syscall_get_arch()
	perf/x86/intel/uncore: Fix CAS_COUNT_WRITE issue for ICX
	perf/x86/intel: Add a quirk for the calculation of the number of counters on Alder Lake
	drm/etnaviv: relax submit size limits
	drm/atomic: Add the crtc to affected crtc only if uapi.enable = true
	drm/amd/display: Fix FP start/end for dcn30_internal_validate_bw.
	KVM: LAPIC: Also cancel preemption timer during SET_LAPIC
	KVM: SVM: Never reject emulation due to SMAP errata for !SEV guests
	KVM: SVM: Don't intercept #GP for SEV guests
	KVM: x86: nSVM: skip eax alignment check for non-SVM instructions
	KVM: x86: Forcibly leave nested virt when SMM state is toggled
	KVM: x86: Keep MSR_IA32_XSS unchanged for INIT
	KVM: x86: Update vCPU's runtime CPUID on write to MSR_IA32_XSS
	KVM: x86: Sync the states size with the XCR0/IA32_XSS at, any time
	KVM: PPC: Book3S HV Nested: Fix nested HFSCR being clobbered with multiple vCPUs
	dm: revert partial fix for redundant bio-based IO accounting
	block: add bio_start_io_acct_time() to control start_time
	dm: properly fix redundant bio-based IO accounting
	serial: pl011: Fix incorrect rs485 RTS polarity on set_mctrl
	serial: 8250: of: Fix mapped region size when using reg-offset property
	serial: stm32: fix software flow control transfer
	tty: n_gsm: fix SW flow control encoding/handling
	tty: Partially revert the removal of the Cyclades public API
	tty: Add support for Brainboxes UC cards.
	kbuild: remove include/linux/cyclades.h from header file check
	usb-storage: Add unusual-devs entry for VL817 USB-SATA bridge
	usb: xhci-plat: fix crash when suspend if remote wake enable
	usb: common: ulpi: Fix crash in ulpi_match()
	usb: gadget: f_sourcesink: Fix isoc transfer for USB_SPEED_SUPER_PLUS
	usb: cdnsp: Fix segmentation fault in cdns_lost_power function
	usb: dwc3: xilinx: Skip resets and USB3 register settings for USB2.0 mode
	usb: dwc3: xilinx: Fix error handling when getting USB3 PHY
	USB: core: Fix hang in usb_kill_urb by adding memory barriers
	usb: typec: tcpci: don't touch CC line if it's Vconn source
	usb: typec: tcpm: Do not disconnect while receiving VBUS off
	usb: typec: tcpm: Do not disconnect when receiving VSAFE0V
	ucsi_ccg: Check DEV_INT bit only when starting CCG4
	mm, kasan: use compare-exchange operation to set KASAN page tag
	jbd2: export jbd2_journal_[grab|put]_journal_head
	ocfs2: fix a deadlock when commit trans
	sched/membarrier: Fix membarrier-rseq fence command missing from query bitmask
	PCI/sysfs: Find shadow ROM before static attribute initialization
	x86/MCE/AMD: Allow thresholding interface updates after init
	x86/cpu: Add Xeon Icelake-D to list of CPUs that support PPIN
	powerpc/32s: Allocate one 256k IBAT instead of two consecutives 128k IBATs
	powerpc/32s: Fix kasan_init_region() for KASAN
	powerpc/32: Fix boot failure with GCC latent entropy plugin
	i40e: Increase delay to 1 s after global EMP reset
	i40e: Fix issue when maximum queues is exceeded
	i40e: Fix queues reservation for XDP
	i40e: Fix for failed to init adminq while VF reset
	i40e: fix unsigned stat widths
	usb: roles: fix include/linux/usb/role.h compile issue
	rpmsg: char: Fix race between the release of rpmsg_ctrldev and cdev
	rpmsg: char: Fix race between the release of rpmsg_eptdev and cdev
	scsi: elx: efct: Don't use GFP_KERNEL under spin lock
	scsi: bnx2fc: Flush destroy_work queue before calling bnx2fc_interface_put()
	ipv6_tunnel: Rate limit warning messages
	ARM: 9170/1: fix panic when kasan and kprobe are enabled
	net: fix information leakage in /proc/net/ptype
	hwmon: (lm90) Mark alert as broken for MAX6646/6647/6649
	hwmon: (lm90) Mark alert as broken for MAX6680
	ping: fix the sk_bound_dev_if match in ping_lookup
	ipv4: avoid using shared IP generator for connected sockets
	hwmon: (lm90) Reduce maximum conversion rate for G781
	NFSv4: Handle case where the lookup of a directory fails
	NFSv4: nfs_atomic_open() can race when looking up a non-regular file
	net-procfs: show net devices bound packet types
	drm/msm: Fix wrong size calculation
	drm/msm/dsi: Fix missing put_device() call in dsi_get_phy
	drm/msm/dsi: invalid parameter check in msm_dsi_phy_enable
	ipv6: annotate accesses to fn->fn_sernum
	NFS: Ensure the server has an up to date ctime before hardlinking
	NFS: Ensure the server has an up to date ctime before renaming
	KVM: arm64: pkvm: Use the mm_ops indirection for cache maintenance
	SUNRPC: Use BIT() macro in rpc_show_xprt_state()
	SUNRPC: Don't dereference xprt->snd_task if it's a cookie
	powerpc64/bpf: Limit 'ldbrx' to processors compliant with ISA v2.06
	netfilter: conntrack: don't increment invalid counter on NF_REPEAT
	powerpc/64s: Mask SRR0 before checking against the masked NIP
	perf: Fix perf_event_read_local() time
	sched/pelt: Relax the sync of util_sum with util_avg
	net: phy: broadcom: hook up soft_reset for BCM54616S
	net: stmmac: dwmac-visconti: Fix bit definitions for ETHER_CLK_SEL
	net: stmmac: dwmac-visconti: Fix clock configuration for RMII mode
	phylib: fix potential use-after-free
	octeontx2-af: Do not fixup all VF action entries
	octeontx2-af: Fix LBK backpressure id count
	octeontx2-af: Retry until RVU block reset complete
	octeontx2-pf: cn10k: Ensure valid pointers are freed to aura
	octeontx2-af: verify CQ context updates
	octeontx2-af: Increase link credit restore polling timeout
	octeontx2-af: cn10k: Do not enable RPM loopback for LPC interfaces
	octeontx2-pf: Forward error codes to VF
	rxrpc: Adjust retransmission backoff
	efi/libstub: arm64: Fix image check alignment at entry
	io_uring: fix bug in slow unregistering of nodes
	Drivers: hv: balloon: account for vmbus packet header in max_pkt_size
	hwmon: (lm90) Re-enable interrupts after alert clears
	hwmon: (lm90) Mark alert as broken for MAX6654
	hwmon: (lm90) Fix sysfs and udev notifications
	hwmon: (adt7470) Prevent divide by zero in adt7470_fan_write()
	powerpc/perf: Fix power_pmu_disable to call clear_pmi_irq_pending only if PMI is pending
	ipv4: fix ip option filtering for locally generated fragments
	ibmvnic: Allow extra failures before disabling
	ibmvnic: init ->running_cap_crqs early
	ibmvnic: don't spin in tasklet
	net/smc: Transitional solution for clcsock race issue
	video: hyperv_fb: Fix validation of screen resolution
	can: tcan4x5x: regmap: fix max register value
	drm/msm/hdmi: Fix missing put_device() call in msm_hdmi_get_phy
	drm/msm/dpu: invalid parameter check in dpu_setup_dspp_pcc
	drm/msm/a6xx: Add missing suspend_count increment
	yam: fix a memory leak in yam_siocdevprivate()
	net: cpsw: Properly initialise struct page_pool_params
	net: hns3: handle empty unknown interrupt for VF
	sch_htb: Fail on unsupported parameters when offload is requested
	Revert "drm/ast: Support 1600x900 with 108MHz PCLK"
	KVM: selftests: Don't skip L2's VMCALL in SMM test for SVM guest
	ceph: put the requests/sessions when it fails to alloc memory
	gve: Fix GFP flags when allocing pages
	Revert "ipv6: Honor all IPv6 PIO Valid Lifetime values"
	net: bridge: vlan: fix single net device option dumping
	ipv4: raw: lock the socket in raw_bind()
	ipv4: tcp: send zero IPID in SYNACK messages
	ipv4: remove sparse error in ip_neigh_gw4()
	net: bridge: vlan: fix memory leak in __allowed_ingress
	Bluetooth: refactor malicious adv data check
	irqchip/realtek-rtl: Map control data to virq
	irqchip/realtek-rtl: Fix off-by-one in routing
	dt-bindings: can: tcan4x5x: fix mram-cfg RX FIFO config
	perf/core: Fix cgroup event list management
	psi: fix "no previous prototype" warnings when CONFIG_CGROUPS=n
	psi: fix "defined but not used" warnings when CONFIG_PROC_FS=n
	usb: dwc3: xilinx: fix uninitialized return value
	usr/include/Makefile: add linux/nfc.h to the compile-test coverage
	fsnotify: invalidate dcache before IN_DELETE event
	block: Fix wrong offset in bio_truncate()
	mtd: rawnand: mpc5121: Remove unused variable in ads5121_select_chip()
	Linux 5.15.19

Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: I66399d45af362fa8e1672ba38c0d672e21afc716
2022-02-02 09:32:24 +01:00

217 lines
5.5 KiB
C

#ifdef CONFIG_SMP
#include "sched-pelt.h"
int __update_load_avg_blocked_se(u64 now, struct sched_entity *se);
int __update_load_avg_se(u64 now, struct cfs_rq *cfs_rq, struct sched_entity *se);
int __update_load_avg_cfs_rq(u64 now, struct cfs_rq *cfs_rq);
int update_rt_rq_load_avg(u64 now, struct rq *rq, int running);
int update_dl_rq_load_avg(u64 now, struct rq *rq, int running);
#ifdef CONFIG_SCHED_THERMAL_PRESSURE
int update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity);
static inline u64 thermal_load_avg(struct rq *rq)
{
return READ_ONCE(rq->avg_thermal.load_avg);
}
#else
static inline int
update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity)
{
return 0;
}
static inline u64 thermal_load_avg(struct rq *rq)
{
return 0;
}
#endif
#ifdef CONFIG_HAVE_SCHED_AVG_IRQ
int update_irq_load_avg(struct rq *rq, u64 running);
#else
static inline int
update_irq_load_avg(struct rq *rq, u64 running)
{
return 0;
}
#endif
#define PELT_MIN_DIVIDER (LOAD_AVG_MAX - 1024)
static inline u32 get_pelt_divider(struct sched_avg *avg)
{
return PELT_MIN_DIVIDER + avg->period_contrib;
}
static inline void cfs_se_util_change(struct sched_avg *avg)
{
unsigned int enqueued;
if (!sched_feat(UTIL_EST))
return;
/* Avoid store if the flag has been already reset */
enqueued = avg->util_est.enqueued;
if (!(enqueued & UTIL_AVG_UNCHANGED))
return;
/* Reset flag to report util_avg has been updated */
enqueued &= ~UTIL_AVG_UNCHANGED;
WRITE_ONCE(avg->util_est.enqueued, enqueued);
}
extern unsigned int sched_pelt_lshift;
/*
* The clock_pelt scales the time to reflect the effective amount of
* computation done during the running delta time but then sync back to
* clock_task when rq is idle.
*
*
* absolute time | 1| 2| 3| 4| 5| 6| 7| 8| 9|10|11|12|13|14|15|16
* @ max capacity ------******---------------******---------------
* @ half capacity ------************---------************---------
* clock pelt | 1| 2| 3| 4| 7| 8| 9| 10| 11|14|15|16
*
*/
static inline void update_rq_clock_pelt(struct rq *rq, s64 delta)
{
delta <<= READ_ONCE(sched_pelt_lshift);
rq->clock_task_mult += delta;
if (unlikely(is_idle_task(rq->curr))) {
/* The rq is idle, we can sync to clock_task */
rq->clock_pelt = rq_clock_task_mult(rq);
return;
}
/*
* When a rq runs at a lower compute capacity, it will need
* more time to do the same amount of work than at max
* capacity. In order to be invariant, we scale the delta to
* reflect how much work has been really done.
* Running longer results in stealing idle time that will
* disturb the load signal compared to max capacity. This
* stolen idle time will be automatically reflected when the
* rq will be idle and the clock will be synced with
* rq_clock_task.
*/
/*
* Scale the elapsed time to reflect the real amount of
* computation
*/
delta = cap_scale(delta, arch_scale_cpu_capacity(cpu_of(rq)));
delta = cap_scale(delta, arch_scale_freq_capacity(cpu_of(rq)));
rq->clock_pelt += delta;
}
/*
* When rq becomes idle, we have to check if it has lost idle time
* because it was fully busy. A rq is fully used when the /Sum util_sum
* is greater or equal to:
* (LOAD_AVG_MAX - 1024 + rq->cfs.avg.period_contrib) << SCHED_CAPACITY_SHIFT;
* For optimization and computing rounding purpose, we don't take into account
* the position in the current window (period_contrib) and we use the higher
* bound of util_sum to decide.
*/
static inline void update_idle_rq_clock_pelt(struct rq *rq)
{
u32 divider = ((LOAD_AVG_MAX - 1024) << SCHED_CAPACITY_SHIFT) - LOAD_AVG_MAX;
u32 util_sum = rq->cfs.avg.util_sum;
util_sum += rq->avg_rt.util_sum;
util_sum += rq->avg_dl.util_sum;
/*
* Reflecting stolen time makes sense only if the idle
* phase would be present at max capacity. As soon as the
* utilization of a rq has reached the maximum value, it is
* considered as an always running rq without idle time to
* steal. This potential idle time is considered as lost in
* this case. We keep track of this lost idle time compare to
* rq's clock_task.
*/
if (util_sum >= divider)
rq->lost_idle_time += rq_clock_task_mult(rq) -
rq->clock_pelt;
}
static inline u64 rq_clock_pelt(struct rq *rq)
{
lockdep_assert_rq_held(rq);
assert_clock_updated(rq);
return rq->clock_pelt - rq->lost_idle_time;
}
#ifdef CONFIG_CFS_BANDWIDTH
/* rq->task_clock normalized against any time this cfs_rq has spent throttled */
static inline u64 cfs_rq_clock_pelt(struct cfs_rq *cfs_rq)
{
if (unlikely(cfs_rq->throttle_count))
return cfs_rq->throttled_clock_task - cfs_rq->throttled_clock_task_time;
return rq_clock_pelt(rq_of(cfs_rq)) - cfs_rq->throttled_clock_task_time;
}
#else
static inline u64 cfs_rq_clock_pelt(struct cfs_rq *cfs_rq)
{
return rq_clock_pelt(rq_of(cfs_rq));
}
#endif
#else
static inline int
update_cfs_rq_load_avg(u64 now, struct cfs_rq *cfs_rq)
{
return 0;
}
static inline int
update_rt_rq_load_avg(u64 now, struct rq *rq, int running)
{
return 0;
}
static inline int
update_dl_rq_load_avg(u64 now, struct rq *rq, int running)
{
return 0;
}
static inline int
update_thermal_load_avg(u64 now, struct rq *rq, u64 capacity)
{
return 0;
}
static inline u64 thermal_load_avg(struct rq *rq)
{
return 0;
}
static inline int
update_irq_load_avg(struct rq *rq, u64 running)
{
return 0;
}
static inline u64 rq_clock_pelt(struct rq *rq)
{
return rq_clock_task(rq);
}
static inline void
update_rq_clock_pelt(struct rq *rq, s64 delta) { }
static inline void
update_idle_rq_clock_pelt(struct rq *rq) { }
#endif