mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 02:21:52 +09:00
Merge 0764df6b80 ("drm/rockchip: vop2: Check linear format for Cluster windows on rk3566/8") into android14-6.1-lts
Steps on the way to 6.1.129 Resolves merge conflicts in: kernel/sched/fair.c Change-Id: I875e1c0846dd439a019d0d5b81f09cdac4a5c74e Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -15,6 +15,15 @@
|
||||
|
||||
extern bool hugetlb_disabled;
|
||||
|
||||
static inline bool hugepages_supported(void)
|
||||
{
|
||||
if (hugetlb_disabled)
|
||||
return false;
|
||||
|
||||
return HPAGE_SHIFT != 0;
|
||||
}
|
||||
#define hugepages_supported hugepages_supported
|
||||
|
||||
void __init hugetlbpage_init_defaultsize(void);
|
||||
|
||||
int slice_is_hugepage_only_range(struct mm_struct *mm, unsigned long addr,
|
||||
|
||||
@@ -740,7 +740,7 @@ static ssize_t disk_badblocks_store(struct device *dev,
|
||||
}
|
||||
|
||||
#ifdef CONFIG_BLOCK_LEGACY_AUTOLOAD
|
||||
void blk_request_module(dev_t devt)
|
||||
static bool blk_probe_dev(dev_t devt)
|
||||
{
|
||||
unsigned int major = MAJOR(devt);
|
||||
struct blk_major_name **n;
|
||||
@@ -750,14 +750,26 @@ void blk_request_module(dev_t devt)
|
||||
if ((*n)->major == major && (*n)->probe) {
|
||||
(*n)->probe(devt);
|
||||
mutex_unlock(&major_names_lock);
|
||||
return;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&major_names_lock);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt)) > 0)
|
||||
/* Make old-style 2.4 aliases work */
|
||||
request_module("block-major-%d", MAJOR(devt));
|
||||
void blk_request_module(dev_t devt)
|
||||
{
|
||||
int error;
|
||||
|
||||
if (blk_probe_dev(devt))
|
||||
return;
|
||||
|
||||
error = request_module("block-major-%d-%d", MAJOR(devt), MINOR(devt));
|
||||
/* Make old-style 2.4 aliases work */
|
||||
if (error > 0)
|
||||
error = request_module("block-major-%d", MAJOR(devt));
|
||||
if (!error)
|
||||
blk_probe_dev(devt);
|
||||
}
|
||||
#endif /* CONFIG_BLOCK_LEGACY_AUTOLOAD */
|
||||
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||
/**
|
||||
/*
|
||||
* ldm - Part of the Linux-NTFS project.
|
||||
*
|
||||
* Copyright (C) 2001,2002 Richard Russon <ldm@flatcap.org>
|
||||
|
||||
@@ -2133,6 +2133,7 @@ static void nbd_disconnect_and_put(struct nbd_device *nbd)
|
||||
flush_workqueue(nbd->recv_workq);
|
||||
nbd_clear_que(nbd);
|
||||
nbd->task_setup = NULL;
|
||||
clear_bit(NBD_RT_BOUND, &nbd->config->runtime_flags);
|
||||
mutex_unlock(&nbd->config_lock);
|
||||
|
||||
if (test_and_clear_bit(NBD_RT_HAS_CONFIG_REF,
|
||||
|
||||
@@ -1420,6 +1420,8 @@ int atomctrl_get_smc_sclk_range_table(struct pp_hwmgr *hwmgr, struct pp_atom_ctr
|
||||
GetIndexIntoMasterTable(DATA, SMU_Info),
|
||||
&size, &frev, &crev);
|
||||
|
||||
if (!psmu_info)
|
||||
return -EINVAL;
|
||||
|
||||
for (i = 0; i < psmu_info->ucSclkEntryNum; i++) {
|
||||
table->entry[i].ucVco_setting = psmu_info->asSclkFcwRangeEntry[i].ucVco_setting;
|
||||
|
||||
@@ -342,6 +342,7 @@ void *etnaviv_gem_vmap(struct drm_gem_object *obj)
|
||||
static void *etnaviv_gem_vmap_impl(struct etnaviv_gem_object *obj)
|
||||
{
|
||||
struct page **pages;
|
||||
pgprot_t prot;
|
||||
|
||||
lockdep_assert_held(&obj->lock);
|
||||
|
||||
@@ -349,8 +350,19 @@ static void *etnaviv_gem_vmap_impl(struct etnaviv_gem_object *obj)
|
||||
if (IS_ERR(pages))
|
||||
return NULL;
|
||||
|
||||
return vmap(pages, obj->base.size >> PAGE_SHIFT,
|
||||
VM_MAP, pgprot_writecombine(PAGE_KERNEL));
|
||||
switch (obj->flags & ETNA_BO_CACHE_MASK) {
|
||||
case ETNA_BO_CACHED:
|
||||
prot = PAGE_KERNEL;
|
||||
break;
|
||||
case ETNA_BO_UNCACHED:
|
||||
prot = pgprot_noncached(PAGE_KERNEL);
|
||||
break;
|
||||
case ETNA_BO_WC:
|
||||
default:
|
||||
prot = pgprot_writecombine(PAGE_KERNEL);
|
||||
}
|
||||
|
||||
return vmap(pages, obj->base.size >> PAGE_SHIFT, VM_MAP, prot);
|
||||
}
|
||||
|
||||
static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op)
|
||||
|
||||
@@ -410,10 +410,10 @@ static void dp_audio_safe_to_exit_level(struct dp_audio_private *audio)
|
||||
safe_to_exit_level = 5;
|
||||
break;
|
||||
default:
|
||||
safe_to_exit_level = 14;
|
||||
drm_dbg_dp(audio->drm_dev,
|
||||
"setting the default safe_to_exit_level = %u\n",
|
||||
safe_to_exit_level);
|
||||
safe_to_exit_level = 14;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ struct rockchip_crtc_state {
|
||||
int output_bpc;
|
||||
int output_flags;
|
||||
bool enable_afbc;
|
||||
bool yuv_overlay;
|
||||
u32 bus_format;
|
||||
u32 bus_flags;
|
||||
int color_space;
|
||||
|
||||
@@ -463,6 +463,16 @@ static bool rockchip_vop2_mod_supported(struct drm_plane *plane, u32 format,
|
||||
if (modifier == DRM_FORMAT_MOD_INVALID)
|
||||
return false;
|
||||
|
||||
if (vop2->data->soc_id == 3568 || vop2->data->soc_id == 3566) {
|
||||
if (vop2_cluster_window(win)) {
|
||||
if (modifier == DRM_FORMAT_MOD_LINEAR) {
|
||||
drm_dbg_kms(vop2->drm,
|
||||
"Cluster window only supports format with afbc\n");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (modifier == DRM_FORMAT_MOD_LINEAR)
|
||||
return true;
|
||||
|
||||
@@ -1395,8 +1405,18 @@ static void vop2_post_config(struct drm_crtc *crtc)
|
||||
u32 top_margin = 100, bottom_margin = 100;
|
||||
u16 hsize = hdisplay * (left_margin + right_margin) / 200;
|
||||
u16 vsize = vdisplay * (top_margin + bottom_margin) / 200;
|
||||
u16 hsync_len = mode->crtc_hsync_end - mode->crtc_hsync_start;
|
||||
u16 hact_end, vact_end;
|
||||
u32 val;
|
||||
u32 bg_dly;
|
||||
u32 pre_scan_dly;
|
||||
|
||||
bg_dly = vp->data->pre_scan_max_dly[3];
|
||||
vop2_writel(vp->vop2, RK3568_VP_BG_MIX_CTRL(vp->id),
|
||||
FIELD_PREP(RK3568_VP_BG_MIX_CTRL__BG_DLY, bg_dly));
|
||||
|
||||
pre_scan_dly = ((bg_dly + (hdisplay >> 1) - 1) << 16) | hsync_len;
|
||||
vop2_vp_write(vp, RK3568_VP_PRE_SCAN_HTIMING, pre_scan_dly);
|
||||
|
||||
vsize = rounddown(vsize, 2);
|
||||
hsize = rounddown(hsize, 2);
|
||||
@@ -1556,6 +1576,8 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
|
||||
vop2->enable_count++;
|
||||
|
||||
vcstate->yuv_overlay = is_yuv_output(vcstate->bus_format);
|
||||
|
||||
vop2_crtc_enable_irq(vp, VP_INT_POST_BUF_EMPTY);
|
||||
|
||||
polflags = 0;
|
||||
@@ -1583,7 +1605,7 @@ static void vop2_crtc_atomic_enable(struct drm_crtc *crtc,
|
||||
if (vop2_output_uv_swap(vcstate->bus_format, vcstate->output_mode))
|
||||
dsp_ctrl |= RK3568_VP_DSP_CTRL__DSP_RB_SWAP;
|
||||
|
||||
if (is_yuv_output(vcstate->bus_format))
|
||||
if (vcstate->yuv_overlay)
|
||||
dsp_ctrl |= RK3568_VP_DSP_CTRL__POST_DSP_OUT_R2Y;
|
||||
|
||||
vop2_dither_setup(crtc, &dsp_ctrl);
|
||||
@@ -1737,7 +1759,6 @@ static int vop2_find_start_mixer_id_for_vp(struct vop2 *vop2, u8 port_id)
|
||||
|
||||
static void vop2_setup_cluster_alpha(struct vop2 *vop2, struct vop2_win *main_win)
|
||||
{
|
||||
u32 offset = (main_win->data->phys_id * 0x10);
|
||||
struct vop2_alpha_config alpha_config;
|
||||
struct vop2_alpha alpha;
|
||||
struct drm_plane_state *bottom_win_pstate;
|
||||
@@ -1745,6 +1766,7 @@ static void vop2_setup_cluster_alpha(struct vop2 *vop2, struct vop2_win *main_wi
|
||||
u16 src_glb_alpha_val, dst_glb_alpha_val;
|
||||
bool premulti_en = false;
|
||||
bool swap = false;
|
||||
u32 offset = 0;
|
||||
|
||||
/* At one win mode, win0 is dst/bottom win, and win1 is a all zero src/top win */
|
||||
bottom_win_pstate = main_win->base.state;
|
||||
@@ -1763,6 +1785,22 @@ static void vop2_setup_cluster_alpha(struct vop2 *vop2, struct vop2_win *main_wi
|
||||
vop2_parse_alpha(&alpha_config, &alpha);
|
||||
|
||||
alpha.src_color_ctrl.bits.src_dst_swap = swap;
|
||||
|
||||
switch (main_win->data->phys_id) {
|
||||
case ROCKCHIP_VOP2_CLUSTER0:
|
||||
offset = 0x0;
|
||||
break;
|
||||
case ROCKCHIP_VOP2_CLUSTER1:
|
||||
offset = 0x10;
|
||||
break;
|
||||
case ROCKCHIP_VOP2_CLUSTER2:
|
||||
offset = 0x20;
|
||||
break;
|
||||
case ROCKCHIP_VOP2_CLUSTER3:
|
||||
offset = 0x30;
|
||||
break;
|
||||
}
|
||||
|
||||
vop2_writel(vop2, RK3568_CLUSTER0_MIX_SRC_COLOR_CTRL + offset,
|
||||
alpha.src_color_ctrl.val);
|
||||
vop2_writel(vop2, RK3568_CLUSTER0_MIX_DST_COLOR_CTRL + offset,
|
||||
@@ -1810,6 +1848,12 @@ static void vop2_setup_alpha(struct vop2_video_port *vp)
|
||||
struct vop2_win *win = to_vop2_win(plane);
|
||||
int zpos = plane->state->normalized_zpos;
|
||||
|
||||
/*
|
||||
* Need to configure alpha from second layer.
|
||||
*/
|
||||
if (zpos == 0)
|
||||
continue;
|
||||
|
||||
if (plane->state->pixel_blend_mode == DRM_MODE_BLEND_PREMULTI)
|
||||
premulti_en = 1;
|
||||
else
|
||||
@@ -1886,29 +1930,26 @@ static void vop2_setup_layer_mixer(struct vop2_video_port *vp)
|
||||
struct drm_plane *plane;
|
||||
u32 layer_sel = 0;
|
||||
u32 port_sel;
|
||||
unsigned int nlayer, ofs;
|
||||
struct drm_display_mode *adjusted_mode;
|
||||
u16 hsync_len;
|
||||
u16 hdisplay;
|
||||
u32 bg_dly;
|
||||
u32 pre_scan_dly;
|
||||
u8 layer_id;
|
||||
u8 old_layer_id;
|
||||
u8 layer_sel_id;
|
||||
unsigned int ofs;
|
||||
u32 ovl_ctrl;
|
||||
int i;
|
||||
struct vop2_video_port *vp0 = &vop2->vps[0];
|
||||
struct vop2_video_port *vp1 = &vop2->vps[1];
|
||||
struct vop2_video_port *vp2 = &vop2->vps[2];
|
||||
struct rockchip_crtc_state *vcstate = to_rockchip_crtc_state(vp->crtc.state);
|
||||
|
||||
adjusted_mode = &vp->crtc.state->adjusted_mode;
|
||||
hsync_len = adjusted_mode->crtc_hsync_end - adjusted_mode->crtc_hsync_start;
|
||||
hdisplay = adjusted_mode->crtc_hdisplay;
|
||||
ovl_ctrl = vop2_readl(vop2, RK3568_OVL_CTRL);
|
||||
ovl_ctrl |= RK3568_OVL_CTRL__LAYERSEL_REGDONE_IMD;
|
||||
if (vcstate->yuv_overlay)
|
||||
ovl_ctrl |= RK3568_OVL_CTRL__YUV_MODE(vp->id);
|
||||
else
|
||||
ovl_ctrl &= ~RK3568_OVL_CTRL__YUV_MODE(vp->id);
|
||||
|
||||
bg_dly = vp->data->pre_scan_max_dly[3];
|
||||
vop2_writel(vop2, RK3568_VP_BG_MIX_CTRL(vp->id),
|
||||
FIELD_PREP(RK3568_VP_BG_MIX_CTRL__BG_DLY, bg_dly));
|
||||
vop2_writel(vop2, RK3568_OVL_CTRL, ovl_ctrl);
|
||||
|
||||
pre_scan_dly = ((bg_dly + (hdisplay >> 1) - 1) << 16) | hsync_len;
|
||||
vop2_vp_write(vp, RK3568_VP_PRE_SCAN_HTIMING, pre_scan_dly);
|
||||
|
||||
vop2_writel(vop2, RK3568_OVL_CTRL, 0);
|
||||
port_sel = vop2_readl(vop2, RK3568_OVL_PORT_SEL);
|
||||
port_sel &= RK3568_OVL_PORT_SEL__SEL_PORT;
|
||||
|
||||
@@ -1936,9 +1977,30 @@ static void vop2_setup_layer_mixer(struct vop2_video_port *vp)
|
||||
for (i = 0; i < vp->id; i++)
|
||||
ofs += vop2->vps[i].nlayers;
|
||||
|
||||
nlayer = 0;
|
||||
drm_atomic_crtc_for_each_plane(plane, &vp->crtc) {
|
||||
struct vop2_win *win = to_vop2_win(plane);
|
||||
struct vop2_win *old_win;
|
||||
|
||||
layer_id = (u8)(plane->state->normalized_zpos + ofs);
|
||||
|
||||
/*
|
||||
* Find the layer this win bind in old state.
|
||||
*/
|
||||
for (old_layer_id = 0; old_layer_id < vop2->data->win_size; old_layer_id++) {
|
||||
layer_sel_id = (layer_sel >> (4 * old_layer_id)) & 0xf;
|
||||
if (layer_sel_id == win->data->layer_sel_id)
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Find the win bind to this layer in old state
|
||||
*/
|
||||
for (i = 0; i < vop2->data->win_size; i++) {
|
||||
old_win = &vop2->win[i];
|
||||
layer_sel_id = (layer_sel >> (4 * layer_id)) & 0xf;
|
||||
if (layer_sel_id == old_win->data->layer_sel_id)
|
||||
break;
|
||||
}
|
||||
|
||||
switch (win->data->phys_id) {
|
||||
case ROCKCHIP_VOP2_CLUSTER0:
|
||||
@@ -1967,22 +2029,18 @@ static void vop2_setup_layer_mixer(struct vop2_video_port *vp)
|
||||
break;
|
||||
}
|
||||
|
||||
layer_sel &= ~RK3568_OVL_LAYER_SEL__LAYER(plane->state->normalized_zpos + ofs,
|
||||
0x7);
|
||||
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(plane->state->normalized_zpos + ofs,
|
||||
win->data->layer_sel_id);
|
||||
nlayer++;
|
||||
}
|
||||
|
||||
/* configure unused layers to 0x5 (reserved) */
|
||||
for (; nlayer < vp->nlayers; nlayer++) {
|
||||
layer_sel &= ~RK3568_OVL_LAYER_SEL__LAYER(nlayer + ofs, 0x7);
|
||||
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(nlayer + ofs, 5);
|
||||
layer_sel &= ~RK3568_OVL_LAYER_SEL__LAYER(layer_id, 0x7);
|
||||
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(layer_id, win->data->layer_sel_id);
|
||||
/*
|
||||
* When we bind a window from layerM to layerN, we also need to move the old
|
||||
* window on layerN to layerM to avoid one window selected by two or more layers.
|
||||
*/
|
||||
layer_sel &= ~RK3568_OVL_LAYER_SEL__LAYER(old_layer_id, 0x7);
|
||||
layer_sel |= RK3568_OVL_LAYER_SEL__LAYER(old_layer_id, old_win->data->layer_sel_id);
|
||||
}
|
||||
|
||||
vop2_writel(vop2, RK3568_OVL_LAYER_SEL, layer_sel);
|
||||
vop2_writel(vop2, RK3568_OVL_PORT_SEL, port_sel);
|
||||
vop2_writel(vop2, RK3568_OVL_CTRL, RK3568_OVL_CTRL__LAYERSEL_REGDONE_IMD);
|
||||
}
|
||||
|
||||
static void vop2_setup_dly_for_windows(struct vop2 *vop2)
|
||||
|
||||
@@ -418,6 +418,7 @@ enum dst_factor_mode {
|
||||
#define VOP2_COLOR_KEY_MASK BIT(31)
|
||||
|
||||
#define RK3568_OVL_CTRL__LAYERSEL_REGDONE_IMD BIT(28)
|
||||
#define RK3568_OVL_CTRL__YUV_MODE(vp) BIT(vp)
|
||||
|
||||
#define RK3568_VP_BG_MIX_CTRL__BG_DLY GENMASK(31, 24)
|
||||
|
||||
|
||||
@@ -1123,6 +1123,8 @@ static void hid_apply_multiplier(struct hid_device *hid,
|
||||
while (multiplier_collection->parent_idx != -1 &&
|
||||
multiplier_collection->type != HID_COLLECTION_LOGICAL)
|
||||
multiplier_collection = &hid->collection[multiplier_collection->parent_idx];
|
||||
if (multiplier_collection->type != HID_COLLECTION_LOGICAL)
|
||||
multiplier_collection = NULL;
|
||||
|
||||
effective_multiplier = hid_calculate_multiplier(hid, multiplier);
|
||||
|
||||
|
||||
@@ -3099,7 +3099,7 @@ int nvme_get_log(struct nvme_ctrl *ctrl, u32 nsid, u8 log_page, u8 lsp, u8 csi,
|
||||
static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
|
||||
struct nvme_effects_log **log)
|
||||
{
|
||||
struct nvme_effects_log *cel = xa_load(&ctrl->cels, csi);
|
||||
struct nvme_effects_log *old, *cel = xa_load(&ctrl->cels, csi);
|
||||
int ret;
|
||||
|
||||
if (cel)
|
||||
@@ -3116,7 +3116,11 @@ static int nvme_get_effects_log(struct nvme_ctrl *ctrl, u8 csi,
|
||||
return ret;
|
||||
}
|
||||
|
||||
xa_store(&ctrl->cels, csi, cel, GFP_KERNEL);
|
||||
old = xa_store(&ctrl->cels, csi, cel, GFP_KERNEL);
|
||||
if (xa_is_err(old)) {
|
||||
kfree(cel);
|
||||
return xa_err(old);
|
||||
}
|
||||
out:
|
||||
*log = cel;
|
||||
return 0;
|
||||
|
||||
@@ -1457,7 +1457,12 @@ static int afs_rmdir(struct inode *dir, struct dentry *dentry)
|
||||
op->file[1].vnode = vnode;
|
||||
}
|
||||
|
||||
return afs_do_sync_operation(op);
|
||||
ret = afs_do_sync_operation(op);
|
||||
|
||||
/* Not all systems that can host afs servers have ENOTEMPTY. */
|
||||
if (ret == -EEXIST)
|
||||
ret = -ENOTEMPTY;
|
||||
return ret;
|
||||
|
||||
error:
|
||||
return afs_put_operation(op);
|
||||
|
||||
@@ -88,7 +88,7 @@ union afs_xdr_dir_block {
|
||||
|
||||
struct {
|
||||
struct afs_xdr_dir_hdr hdr;
|
||||
u8 alloc_ctrs[AFS_DIR_MAX_BLOCKS];
|
||||
u8 alloc_ctrs[AFS_DIR_BLOCKS_WITH_CTR];
|
||||
__be16 hashtable[AFS_DIR_HASHTBL_SIZE];
|
||||
} meta;
|
||||
|
||||
|
||||
@@ -655,8 +655,9 @@ static int yfs_deliver_fs_remove_file2(struct afs_call *call)
|
||||
static void yfs_done_fs_remove_file2(struct afs_call *call)
|
||||
{
|
||||
if (call->error == -ECONNABORTED &&
|
||||
call->abort_code == RX_INVALID_OPERATION) {
|
||||
set_bit(AFS_SERVER_FL_NO_RM2, &call->server->flags);
|
||||
(call->abort_code == RX_INVALID_OPERATION ||
|
||||
call->abort_code == RXGEN_OPCODE)) {
|
||||
set_bit(AFS_SERVER_FL_NO_RM2, &call->op->server->flags);
|
||||
call->op->flags |= AFS_OPERATION_DOWNGRADE;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -110,7 +110,7 @@ static struct ctl_table fs_stat_sysctls[] = {
|
||||
.data = &sysctl_nr_open,
|
||||
.maxlen = sizeof(unsigned int),
|
||||
.mode = 0644,
|
||||
.proc_handler = proc_dointvec_minmax,
|
||||
.proc_handler = proc_douintvec_minmax,
|
||||
.extra1 = &sysctl_nr_open_min,
|
||||
.extra2 = &sysctl_nr_open_max,
|
||||
},
|
||||
|
||||
@@ -89,7 +89,7 @@ static struct pstore_device_info *pstore_device_info;
|
||||
_##name_ = check_size(name, alignsize); \
|
||||
else \
|
||||
_##name_ = 0; \
|
||||
/* Synchronize module parameters with resuls. */ \
|
||||
/* Synchronize module parameters with results. */ \
|
||||
name = _##name_ / 1024; \
|
||||
dev->zone.name = _##name_; \
|
||||
}
|
||||
@@ -121,7 +121,7 @@ static int __register_pstore_device(struct pstore_device_info *dev)
|
||||
if (pstore_device_info)
|
||||
return -EBUSY;
|
||||
|
||||
/* zero means not limit on which backends to attempt to store. */
|
||||
/* zero means no limit on which backends attempt to store. */
|
||||
if (!dev->flags)
|
||||
dev->flags = UINT_MAX;
|
||||
|
||||
|
||||
@@ -788,7 +788,7 @@ static inline int get_sigset_argpack(struct sigset_argpack *to,
|
||||
}
|
||||
return 0;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
@@ -1361,7 +1361,7 @@ static inline int get_compat_sigset_argpack(struct compat_sigset_argpack *to,
|
||||
}
|
||||
return 0;
|
||||
Efault:
|
||||
user_access_end();
|
||||
user_read_access_end();
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
|
||||
@@ -900,9 +900,7 @@ struct task_struct {
|
||||
unsigned sched_reset_on_fork:1;
|
||||
unsigned sched_contributes_to_load:1;
|
||||
unsigned sched_migrated:1;
|
||||
#ifdef CONFIG_PSI
|
||||
unsigned sched_psi_wake_requeue:1;
|
||||
#endif
|
||||
unsigned sched_task_hot:1;
|
||||
|
||||
/* Force alignment to the next boundary: */
|
||||
unsigned :0;
|
||||
|
||||
@@ -2110,7 +2110,7 @@ static inline void enqueue_task(struct rq *rq, struct task_struct *p, int flags)
|
||||
|
||||
if (!(flags & ENQUEUE_RESTORE)) {
|
||||
sched_info_enqueue(rq, p);
|
||||
psi_enqueue(p, flags & ENQUEUE_WAKEUP);
|
||||
psi_enqueue(p, (flags & ENQUEUE_WAKEUP) && !(flags & ENQUEUE_MIGRATED));
|
||||
}
|
||||
|
||||
uclamp_rq_inc(rq, p);
|
||||
|
||||
@@ -8425,6 +8425,8 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env)
|
||||
int can_migrate = 1;
|
||||
|
||||
lockdep_assert_rq_held(env->src_rq);
|
||||
if (p->sched_task_hot)
|
||||
p->sched_task_hot = 0;
|
||||
|
||||
trace_android_rvh_can_migrate_task(p, env->dst_cpu, &can_migrate);
|
||||
if (!can_migrate)
|
||||
@@ -8501,10 +8503,8 @@ int can_migrate_task(struct task_struct *p, struct lb_env *env)
|
||||
|
||||
if (tsk_cache_hot <= 0 ||
|
||||
env->sd->nr_balance_failed > env->sd->cache_nice_tries) {
|
||||
if (tsk_cache_hot == 1) {
|
||||
schedstat_inc(env->sd->lb_hot_gained[env->idle]);
|
||||
schedstat_inc(p->stats.nr_forced_migrations);
|
||||
}
|
||||
if (tsk_cache_hot == 1)
|
||||
p->sched_task_hot = 1;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -8531,6 +8531,12 @@ static void detach_task(struct task_struct *p, struct lb_env *env)
|
||||
if (detached)
|
||||
return;
|
||||
|
||||
if (p->sched_task_hot) {
|
||||
p->sched_task_hot = 0;
|
||||
schedstat_inc(env->sd->lb_hot_gained[env->idle]);
|
||||
schedstat_inc(p->stats.nr_forced_migrations);
|
||||
}
|
||||
|
||||
deactivate_task(env->src_rq, p, DEQUEUE_NOCLOCK);
|
||||
set_task_cpu(p, env->dst_cpu);
|
||||
}
|
||||
@@ -8691,6 +8697,9 @@ static int detach_tasks(struct lb_env *env)
|
||||
|
||||
continue;
|
||||
next:
|
||||
if (p->sched_task_hot)
|
||||
schedstat_inc(p->stats.nr_failed_migrations_hot);
|
||||
|
||||
list_move(&p->se.group_node, tasks);
|
||||
}
|
||||
|
||||
|
||||
@@ -132,11 +132,9 @@ static inline void psi_enqueue(struct task_struct *p, bool wakeup)
|
||||
if (p->in_memstall)
|
||||
set |= TSK_MEMSTALL_RUNNING;
|
||||
|
||||
if (!wakeup || p->sched_psi_wake_requeue) {
|
||||
if (!wakeup) {
|
||||
if (p->in_memstall)
|
||||
set |= TSK_MEMSTALL;
|
||||
if (p->sched_psi_wake_requeue)
|
||||
p->sched_psi_wake_requeue = 0;
|
||||
} else {
|
||||
if (p->in_iowait)
|
||||
clear |= TSK_IOWAIT;
|
||||
@@ -147,8 +145,6 @@ static inline void psi_enqueue(struct task_struct *p, bool wakeup)
|
||||
|
||||
static inline void psi_dequeue(struct task_struct *p, bool sleep)
|
||||
{
|
||||
int clear = TSK_RUNNING;
|
||||
|
||||
if (static_branch_likely(&psi_disabled))
|
||||
return;
|
||||
|
||||
@@ -161,10 +157,7 @@ static inline void psi_dequeue(struct task_struct *p, bool sleep)
|
||||
if (sleep)
|
||||
return;
|
||||
|
||||
if (p->in_memstall)
|
||||
clear |= (TSK_MEMSTALL | TSK_MEMSTALL_RUNNING);
|
||||
|
||||
psi_task_change(p, clear, 0);
|
||||
psi_task_change(p, p->psi_flags, 0);
|
||||
}
|
||||
|
||||
static inline void psi_ttwu_dequeue(struct task_struct *p)
|
||||
@@ -176,19 +169,12 @@ static inline void psi_ttwu_dequeue(struct task_struct *p)
|
||||
* deregister its sleep-persistent psi states from the old
|
||||
* queue, and let psi_enqueue() know it has to requeue.
|
||||
*/
|
||||
if (unlikely(p->in_iowait || p->in_memstall)) {
|
||||
if (unlikely(p->psi_flags)) {
|
||||
struct rq_flags rf;
|
||||
struct rq *rq;
|
||||
int clear = 0;
|
||||
|
||||
if (p->in_iowait)
|
||||
clear |= TSK_IOWAIT;
|
||||
if (p->in_memstall)
|
||||
clear |= TSK_MEMSTALL;
|
||||
|
||||
rq = __task_rq_lock(p, &rf);
|
||||
psi_task_change(p, clear, 0);
|
||||
p->sched_psi_wake_requeue = 1;
|
||||
psi_task_change(p, p->psi_flags, 0);
|
||||
__task_rq_unlock(rq, &rf);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -20,7 +20,7 @@ static int test_gettimeofday(void)
|
||||
gettimeofday(&tv_end, NULL);
|
||||
}
|
||||
|
||||
timersub(&tv_start, &tv_end, &tv_diff);
|
||||
timersub(&tv_end, &tv_start, &tv_diff);
|
||||
|
||||
printf("time = %.6f\n", tv_diff.tv_sec + (tv_diff.tv_usec) * 1e-6);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user