Merge branch 'android12-5.10' into android12-5.10-lts

Sync up with android12-5.10 for the following commits:

b781144f8a ANDROID: GKI: update xiaomi symbol list
7ed18b3da9 ANDROID: GKI: Update symbols to symbol list
70fb50176e UPSTREAM: kasan, slub: reset tag when printing address
bd5c75ce7b UPSTREAM: kasan, kmemleak: reset tags when scanning block
b683931b2a ANDROID: gki_defconfig: set DEFAULT_MMAP_MIN_ADDR=32768
c0cce1da8b UPSTREAM: kasan, slub: reset tag when printing address
3b6f980a85 UPSTREAM: KVM: arm64: Fix off-by-one in range_is_memory
3649d38887 UPSTREAM: mm: fix the deadlock in finish_fault()
09ec66de84 UPSTREAM: arm64: mte: fix restoration of GCR_EL1 from suspend
1e8a0d84dc UPSTREAM: firmware: arm_scmi: Avoid padding in sensor message structure
ea6f697c3d UPSTREAM: media: s5p-mfc: Fix display delay control creation
2f13bd8f39 UPSTREAM: software node: Handle software node injection to an existing device properly
2f34733fae UPSTREAM: usb: dwc3: Fix debugfs creation flow
d42ca898a6 UPSTREAM: usb: dwc3: core: fix kernel panic when do reboot
71710d40d9 UPSTREAM: kfence: use TASK_IDLE when awaiting allocation
1ea718cd9e UPSTREAM: regulator: scmi: Fix off-by-one for linear regulators .n_voltages setting
be7c2833df UPSTREAM: clk: Skip clk provider registration when np is NULL
f20cbf56db FROMGIT: usb: typec: tcpm: Raise vdm_sm_running flag only when VDM SM is running
b58b8007b1 FROMGIT: usb: typec: tcpm: Fix VDMs sometimes not being forwarded to alt-mode drivers

Note, takes the .xml file from the `android12-5.10` branch, will need to
be updated again in a follow-on commit to pick up the missing symbol.

Change-Id: Ic579951cb27d50feb2987cc91a3f58170562eed1
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Greg Kroah-Hartman
2021-09-02 09:01:29 +02:00
17 changed files with 8346 additions and 7958 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -26,6 +26,7 @@
__arch_copy_from_user __arch_copy_from_user
__arch_copy_in_user __arch_copy_in_user
__arch_copy_to_user __arch_copy_to_user
arch_mmap_rnd
arch_timer_read_counter arch_timer_read_counter
argv_free argv_free
argv_split argv_split
@@ -70,9 +71,9 @@
blocking_notifier_call_chain blocking_notifier_call_chain
blocking_notifier_chain_register blocking_notifier_chain_register
blocking_notifier_chain_unregister blocking_notifier_chain_unregister
bpf_trace_run1
bpf_trace_run10 bpf_trace_run10
bpf_trace_run12 bpf_trace_run12
bpf_trace_run1
bpf_trace_run2 bpf_trace_run2
bpf_trace_run3 bpf_trace_run3
bpf_trace_run4 bpf_trace_run4
@@ -595,6 +596,7 @@
get_pid_task get_pid_task
get_random_bytes get_random_bytes
get_random_u32 get_random_u32
get_random_u64
get_sg_io_hdr get_sg_io_hdr
get_slabinfo get_slabinfo
__get_task_comm __get_task_comm
@@ -603,6 +605,7 @@
get_unmapped_area get_unmapped_area
get_unused_fd_flags get_unused_fd_flags
get_user_pages get_user_pages
get_user_pages_remote
gic_nonsecure_priorities gic_nonsecure_priorities
gov_attr_set_init gov_attr_set_init
gov_attr_set_put gov_attr_set_put
@@ -771,6 +774,7 @@
iounmap iounmap
__iowrite32_copy __iowrite32_copy
ipi_desc_get ipi_desc_get
ip_route_me_harder
iput iput
ipv6_find_hdr ipv6_find_hdr
irq_chip_ack_parent irq_chip_ack_parent
@@ -911,6 +915,7 @@
ktime_get_mono_fast_ns ktime_get_mono_fast_ns
ktime_get_real_seconds ktime_get_real_seconds
ktime_get_real_ts64 ktime_get_real_ts64
ktime_get_with_offset
kvfree kvfree
kvmalloc_node kvmalloc_node
led_classdev_flash_register_ext led_classdev_flash_register_ext
@@ -959,8 +964,8 @@
mempool_free mempool_free
mempool_free_slab mempool_free_slab
memremap memremap
memset64
memset memset
memset64
__memset_io __memset_io
memstart_addr memstart_addr
memunmap memunmap
@@ -995,12 +1000,13 @@
netlink_kernel_release netlink_kernel_release
netlink_unicast netlink_unicast
net_namespace_list net_namespace_list
nf_ct_delete
nf_register_net_hooks nf_register_net_hooks
nf_unregister_net_hooks nf_unregister_net_hooks
nla_find nla_find
nla_put nla_put
nla_reserve_64bit
nla_reserve nla_reserve
nla_reserve_64bit
__nla_validate __nla_validate
__nlmsg_put __nlmsg_put
no_llseek no_llseek
@@ -1343,6 +1349,7 @@
register_kretprobe register_kretprobe
register_memory_notifier register_memory_notifier
register_module_notifier register_module_notifier
register_net_sysctl
register_pm_notifier register_pm_notifier
register_reboot_notifier register_reboot_notifier
register_restart_handler register_restart_handler
@@ -1690,6 +1697,7 @@
__task_pid_nr_ns __task_pid_nr_ns
__task_rq_lock __task_rq_lock
task_rq_lock task_rq_lock
tcp_parse_options
thermal_cooling_device_register thermal_cooling_device_register
thermal_cooling_device_unregister thermal_cooling_device_unregister
thermal_of_cooling_device_register thermal_of_cooling_device_register
@@ -1781,12 +1789,16 @@
__traceiter_android_vh_cpu_idle_enter __traceiter_android_vh_cpu_idle_enter
__traceiter_android_vh_cpu_idle_exit __traceiter_android_vh_cpu_idle_exit
__traceiter_android_vh_do_send_sig_info __traceiter_android_vh_do_send_sig_info
__traceiter_android_vh_exclude_reserved_zone
__traceiter_android_vh_exit_mm
__traceiter_android_vh_ftrace_dump_buffer __traceiter_android_vh_ftrace_dump_buffer
__traceiter_android_vh_ftrace_format_check __traceiter_android_vh_ftrace_format_check
__traceiter_android_vh_ftrace_oops_enter __traceiter_android_vh_ftrace_oops_enter
__traceiter_android_vh_ftrace_oops_exit __traceiter_android_vh_ftrace_oops_exit
__traceiter_android_vh_ftrace_size_check __traceiter_android_vh_ftrace_size_check
__traceiter_android_vh_get_from_fragment_pool
__traceiter_android_vh_gpio_block_read __traceiter_android_vh_gpio_block_read
__traceiter_android_vh_include_reserved_zone
__traceiter_android_vh_iommu_setup_dma_ops __traceiter_android_vh_iommu_setup_dma_ops
__traceiter_android_vh_ipi_stop __traceiter_android_vh_ipi_stop
__traceiter_android_vh_jiffies_update __traceiter_android_vh_jiffies_update
@@ -1799,12 +1811,15 @@
__traceiter_android_vh_rwsem_wake __traceiter_android_vh_rwsem_wake
__traceiter_android_vh_rwsem_wake_finish __traceiter_android_vh_rwsem_wake_finish
__traceiter_android_vh_scheduler_tick __traceiter_android_vh_scheduler_tick
__traceiter_android_vh_show_max_freq
__traceiter_android_vh_show_resume_epoch_val __traceiter_android_vh_show_resume_epoch_val
__traceiter_android_vh_show_suspend_epoch_val __traceiter_android_vh_show_suspend_epoch_val
__traceiter_android_vh_sync_txn_recvd __traceiter_android_vh_sync_txn_recvd
__traceiter_android_vh_timer_calc_index __traceiter_android_vh_timer_calc_index
__traceiter_android_vh_tune_inactive_ratio __traceiter_android_vh_tune_inactive_ratio
__traceiter_android_vh_tune_swappiness __traceiter_android_vh_tune_swappiness
__traceiter_android_vh_ufs_compl_command
__traceiter_android_vh_ufs_send_command
__traceiter_android_vh_update_topology_flags_workfn __traceiter_android_vh_update_topology_flags_workfn
__traceiter_binder_transaction_received __traceiter_binder_transaction_received
__traceiter_cpu_frequency_limits __traceiter_cpu_frequency_limits
@@ -1886,12 +1901,16 @@
__tracepoint_android_vh_cpu_idle_enter __tracepoint_android_vh_cpu_idle_enter
__tracepoint_android_vh_cpu_idle_exit __tracepoint_android_vh_cpu_idle_exit
__tracepoint_android_vh_do_send_sig_info __tracepoint_android_vh_do_send_sig_info
__tracepoint_android_vh_exclude_reserved_zone
__tracepoint_android_vh_exit_mm
__tracepoint_android_vh_ftrace_dump_buffer __tracepoint_android_vh_ftrace_dump_buffer
__tracepoint_android_vh_ftrace_format_check __tracepoint_android_vh_ftrace_format_check
__tracepoint_android_vh_ftrace_oops_enter __tracepoint_android_vh_ftrace_oops_enter
__tracepoint_android_vh_ftrace_oops_exit __tracepoint_android_vh_ftrace_oops_exit
__tracepoint_android_vh_ftrace_size_check __tracepoint_android_vh_ftrace_size_check
__tracepoint_android_vh_get_from_fragment_pool
__tracepoint_android_vh_gpio_block_read __tracepoint_android_vh_gpio_block_read
__tracepoint_android_vh_include_reserved_zone
__tracepoint_android_vh_iommu_setup_dma_ops __tracepoint_android_vh_iommu_setup_dma_ops
__tracepoint_android_vh_ipi_stop __tracepoint_android_vh_ipi_stop
__tracepoint_android_vh_jiffies_update __tracepoint_android_vh_jiffies_update
@@ -1904,12 +1923,15 @@
__tracepoint_android_vh_rwsem_wake __tracepoint_android_vh_rwsem_wake
__tracepoint_android_vh_rwsem_wake_finish __tracepoint_android_vh_rwsem_wake_finish
__tracepoint_android_vh_scheduler_tick __tracepoint_android_vh_scheduler_tick
__tracepoint_android_vh_show_max_freq
__tracepoint_android_vh_show_resume_epoch_val __tracepoint_android_vh_show_resume_epoch_val
__tracepoint_android_vh_show_suspend_epoch_val __tracepoint_android_vh_show_suspend_epoch_val
__tracepoint_android_vh_sync_txn_recvd __tracepoint_android_vh_sync_txn_recvd
__tracepoint_android_vh_timer_calc_index __tracepoint_android_vh_timer_calc_index
__tracepoint_android_vh_tune_inactive_ratio __tracepoint_android_vh_tune_inactive_ratio
__tracepoint_android_vh_tune_swappiness __tracepoint_android_vh_tune_swappiness
__tracepoint_android_vh_ufs_compl_command
__tracepoint_android_vh_ufs_send_command
__tracepoint_android_vh_update_topology_flags_workfn __tracepoint_android_vh_update_topology_flags_workfn
__tracepoint_binder_transaction_received __tracepoint_binder_transaction_received
__tracepoint_cpu_frequency_limits __tracepoint_cpu_frequency_limits
@@ -1998,6 +2020,7 @@
unregister_ftrace_export unregister_ftrace_export
unregister_kretprobe unregister_kretprobe
unregister_module_notifier unregister_module_notifier
unregister_net_sysctl_table
unregister_pm_notifier unregister_pm_notifier
unregister_reboot_notifier unregister_reboot_notifier
unregister_restart_handler unregister_restart_handler
@@ -2080,6 +2103,7 @@
vm_iomap_memory vm_iomap_memory
vm_map_pages vm_map_pages
vm_node_stat vm_node_stat
vm_unmapped_area
vm_zone_stat vm_zone_stat
vscnprintf vscnprintf
vsnprintf vsnprintf

View File

@@ -139,6 +139,8 @@
__traceiter_android_vh_free_task __traceiter_android_vh_free_task
__tracepoint_android_vh_free_task __tracepoint_android_vh_free_task
jiffies_64 jiffies_64
free_uid
find_user
#required by pm8941-pwrkey.ko module #required by pm8941-pwrkey.ko module
console_printk console_printk

View File

@@ -108,6 +108,7 @@ CONFIG_GKI_HACKS_TO_FIX=y
CONFIG_BINFMT_MISC=y CONFIG_BINFMT_MISC=y
CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTREMOVE=y CONFIG_MEMORY_HOTREMOVE=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
CONFIG_CLEANCACHE=y CONFIG_CLEANCACHE=y

View File

@@ -188,18 +188,6 @@ void mte_check_tfsr_el1(void)
} }
#endif #endif
static void update_gcr_el1_excl(u64 excl)
{
/*
* Note that the mask controlled by the user via prctl() is an
* include while GCR_EL1 accepts an exclude mask.
* No need for ISB since this only affects EL0 currently, implicit
* with ERET.
*/
sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, excl);
}
static void mte_update_sctlr_user(struct task_struct *task) static void mte_update_sctlr_user(struct task_struct *task)
{ {
/* /*
@@ -271,7 +259,8 @@ void mte_suspend_exit(void)
if (!system_supports_mte()) if (!system_supports_mte())
return; return;
update_gcr_el1_excl(gcr_kernel_excl); sysreg_clear_set_s(SYS_GCR_EL1, SYS_GCR_EL1_EXCL_MASK, gcr_kernel_excl);
isb();
} }
long set_mte_ctrl(struct task_struct *task, unsigned long arg) long set_mte_ctrl(struct task_struct *task, unsigned long arg)

View File

@@ -190,7 +190,7 @@ static bool range_is_memory(u64 start, u64 end)
{ {
struct kvm_mem_range r1, r2; struct kvm_mem_range r1, r2;
if (!find_mem_range(start, &r1) || !find_mem_range(end, &r2)) if (!find_mem_range(start, &r1) || !find_mem_range(end - 1, &r2))
return false; return false;
if (r1.start != r2.start) if (r1.start != r2.start)
return false; return false;

View File

@@ -85,6 +85,7 @@ CONFIG_GKI_HACKS_TO_FIX=y
CONFIG_BINFMT_MISC=y CONFIG_BINFMT_MISC=y
CONFIG_MEMORY_HOTPLUG=y CONFIG_MEMORY_HOTPLUG=y
CONFIG_MEMORY_HOTREMOVE=y CONFIG_MEMORY_HOTREMOVE=y
CONFIG_DEFAULT_MMAP_MIN_ADDR=32768
CONFIG_TRANSPARENT_HUGEPAGE=y CONFIG_TRANSPARENT_HUGEPAGE=y
CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
CONFIG_CLEANCACHE=y CONFIG_CLEANCACHE=y

View File

@@ -893,6 +893,14 @@ int device_add_software_node(struct device *dev, const struct software_node *nod
} }
set_secondary_fwnode(dev, &swnode->fwnode); set_secondary_fwnode(dev, &swnode->fwnode);
/*
* If the device has been fully registered by the time this function is
* called, software_node_notify() must be called separately so that the
* symlinks get created and the reference count of the node is kept in
* balance.
*/
if (device_is_registered(dev))
software_node_notify(dev, KOBJ_ADD); software_node_notify(dev, KOBJ_ADD);
return 0; return 0;
@@ -913,6 +921,7 @@ void device_remove_software_node(struct device *dev)
if (!swnode) if (!swnode)
return; return;
if (device_is_registered(dev))
software_node_notify(dev, KOBJ_REMOVE); software_node_notify(dev, KOBJ_REMOVE);
set_secondary_fwnode(dev, NULL); set_secondary_fwnode(dev, NULL);
kobject_put(&swnode->kobj); kobject_put(&swnode->kobj);
@@ -930,8 +939,7 @@ int software_node_notify(struct device *dev, unsigned long action)
switch (action) { switch (action) {
case KOBJ_ADD: case KOBJ_ADD:
ret = sysfs_create_link_nowarn(&dev->kobj, &swnode->kobj, ret = sysfs_create_link(&dev->kobj, &swnode->kobj, "software_node");
"software_node");
if (ret) if (ret)
break; break;

View File

@@ -4601,6 +4601,9 @@ int of_clk_add_provider(struct device_node *np,
struct of_clk_provider *cp; struct of_clk_provider *cp;
int ret; int ret;
if (!np)
return 0;
cp = kzalloc(sizeof(*cp), GFP_KERNEL); cp = kzalloc(sizeof(*cp), GFP_KERNEL);
if (!cp) if (!cp)
return -ENOMEM; return -ENOMEM;
@@ -4640,6 +4643,9 @@ int of_clk_add_hw_provider(struct device_node *np,
struct of_clk_provider *cp; struct of_clk_provider *cp;
int ret; int ret;
if (!np)
return 0;
cp = kzalloc(sizeof(*cp), GFP_KERNEL); cp = kzalloc(sizeof(*cp), GFP_KERNEL);
if (!cp) if (!cp)
return -ENOMEM; return -ENOMEM;
@@ -4735,6 +4741,9 @@ void of_clk_del_provider(struct device_node *np)
{ {
struct of_clk_provider *cp; struct of_clk_provider *cp;
if (!np)
return;
mutex_lock(&of_clk_mutex); mutex_lock(&of_clk_mutex);
list_for_each_entry(cp, &of_clk_providers, link) { list_for_each_entry(cp, &of_clk_providers, link) {
if (cp->node == np) { if (cp->node == np) {

View File

@@ -166,7 +166,8 @@ struct scmi_msg_sensor_reading_get {
struct scmi_resp_sensor_reading_complete { struct scmi_resp_sensor_reading_complete {
__le32 id; __le32 id;
__le64 readings; __le32 readings_low;
__le32 readings_high;
}; };
struct scmi_sensor_reading_resp { struct scmi_sensor_reading_resp {
@@ -717,7 +718,8 @@ static int scmi_sensor_reading_get(const struct scmi_protocol_handle *ph,
resp = t->rx.buf; resp = t->rx.buf;
if (le32_to_cpu(resp->id) == sensor_id) if (le32_to_cpu(resp->id) == sensor_id)
*value = get_unaligned_le64(&resp->readings); *value =
get_unaligned_le64(&resp->readings_low);
else else
ret = -EPROTO; ret = -EPROTO;
} }

View File

@@ -172,6 +172,7 @@ static struct mfc_control controls[] = {
.type = V4L2_CTRL_TYPE_INTEGER, .type = V4L2_CTRL_TYPE_INTEGER,
.minimum = 0, .minimum = 0,
.maximum = 16383, .maximum = 16383,
.step = 1,
.default_value = 0, .default_value = 0,
}, },
{ {

View File

@@ -173,7 +173,7 @@ scmi_config_linear_regulator_mappings(struct scmi_regulator *sreg,
sreg->desc.uV_step = sreg->desc.uV_step =
vinfo->levels_uv[SCMI_VOLTAGE_SEGMENT_STEP]; vinfo->levels_uv[SCMI_VOLTAGE_SEGMENT_STEP];
sreg->desc.linear_min_sel = 0; sreg->desc.linear_min_sel = 0;
sreg->desc.n_voltages = delta_uV / sreg->desc.uV_step; sreg->desc.n_voltages = (delta_uV / sreg->desc.uV_step) + 1;
sreg->desc.ops = &scmi_reg_linear_ops; sreg->desc.ops = &scmi_reg_linear_ops;
} }

View File

@@ -342,6 +342,7 @@ struct tcpm_port {
bool vbus_source; bool vbus_source;
bool vbus_charge; bool vbus_charge;
/* Set to true when Discover_Identity Command is expected to be sent in Ready states. */
bool send_discover; bool send_discover;
bool op_vsafe5v; bool op_vsafe5v;
@@ -371,6 +372,7 @@ struct tcpm_port {
struct hrtimer send_discover_timer; struct hrtimer send_discover_timer;
struct kthread_work send_discover_work; struct kthread_work send_discover_work;
bool state_machine_running; bool state_machine_running;
/* Set to true when VDM State Machine has following actions. */
bool vdm_sm_running; bool vdm_sm_running;
struct completion tx_complete; struct completion tx_complete;
@@ -1453,6 +1455,7 @@ static void tcpm_queue_vdm(struct tcpm_port *port, const u32 header,
/* Set ready, vdm state machine will actually send */ /* Set ready, vdm state machine will actually send */
port->vdm_retries = 0; port->vdm_retries = 0;
port->vdm_state = VDM_STATE_READY; port->vdm_state = VDM_STATE_READY;
port->vdm_sm_running = true;
mod_vdm_delayed_work(port, 0); mod_vdm_delayed_work(port, 0);
} }
@@ -1695,7 +1698,6 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
rlen = 1; rlen = 1;
} else { } else {
tcpm_register_partner_altmodes(port); tcpm_register_partner_altmodes(port);
port->vdm_sm_running = false;
} }
break; break;
case CMD_ENTER_MODE: case CMD_ENTER_MODE:
@@ -1743,14 +1745,12 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
(VDO_SVDM_VERS(svdm_version)); (VDO_SVDM_VERS(svdm_version));
break; break;
} }
port->vdm_sm_running = false;
break; break;
default: default:
response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK); response[0] = p[0] | VDO_CMDT(CMDT_RSP_NAK);
rlen = 1; rlen = 1;
response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) | response[0] = (response[0] & ~VDO_SVDM_VERS_MASK) |
(VDO_SVDM_VERS(svdm_version)); (VDO_SVDM_VERS(svdm_version));
port->vdm_sm_running = false;
break; break;
} }
@@ -1759,6 +1759,10 @@ static int tcpm_pd_svdm(struct tcpm_port *port, struct typec_altmode *adev,
return rlen; return rlen;
} }
static void tcpm_pd_handle_msg(struct tcpm_port *port,
enum pd_msg_request message,
enum tcpm_ams ams);
static void tcpm_handle_vdm_request(struct tcpm_port *port, static void tcpm_handle_vdm_request(struct tcpm_port *port,
const __le32 *payload, int cnt) const __le32 *payload, int cnt)
{ {
@@ -1786,11 +1790,25 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
port->vdm_state = VDM_STATE_DONE; port->vdm_state = VDM_STATE_DONE;
} }
if (PD_VDO_SVDM(p[0])) { if (PD_VDO_SVDM(p[0]) && (adev || tcpm_vdm_ams(port) || port->nr_snk_vdo)) {
/*
* Here a SVDM is received (INIT or RSP or unknown). Set the vdm_sm_running in
* advance because we are dropping the lock but may send VDMs soon.
* For the cases of INIT received:
* - If no response to send, it will be cleared later in this function.
* - If there are responses to send, it will be cleared in the state machine.
* For the cases of RSP received:
* - If no further INIT to send, it will be cleared later in this function.
* - Otherwise, it will be cleared in the state machine if timeout or it will go
* back here until no further INIT to send.
* For the cases of unknown type received:
* - We will send NAK and the flag will be cleared in the state machine.
*/
port->vdm_sm_running = true;
rlen = tcpm_pd_svdm(port, adev, p, cnt, response, &adev_action); rlen = tcpm_pd_svdm(port, adev, p, cnt, response, &adev_action);
} else { } else {
if (port->negotiated_rev >= PD_REV30) if (port->negotiated_rev >= PD_REV30)
tcpm_queue_message(port, PD_MSG_CTRL_NOT_SUPP); tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
} }
/* /*
@@ -1855,6 +1873,8 @@ static void tcpm_handle_vdm_request(struct tcpm_port *port,
if (rlen > 0) if (rlen > 0)
tcpm_queue_vdm(port, response[0], &response[1], rlen - 1); tcpm_queue_vdm(port, response[0], &response[1], rlen - 1);
else
port->vdm_sm_running = false;
} }
static void tcpm_send_vdm(struct tcpm_port *port, u32 vid, int cmd, static void tcpm_send_vdm(struct tcpm_port *port, u32 vid, int cmd,
@@ -1920,8 +1940,10 @@ static void vdm_run_state_machine(struct tcpm_port *port)
* if there's traffic or we're not in PDO ready state don't send * if there's traffic or we're not in PDO ready state don't send
* a VDM. * a VDM.
*/ */
if (port->state != SRC_READY && port->state != SNK_READY) if (port->state != SRC_READY && port->state != SNK_READY) {
port->vdm_sm_running = false;
break; break;
}
/* TODO: AMS operation for Unstructured VDM */ /* TODO: AMS operation for Unstructured VDM */
if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) { if (PD_VDO_SVDM(vdo_hdr) && PD_VDO_CMDT(vdo_hdr) == CMDT_INIT) {
@@ -2496,10 +2518,7 @@ static void tcpm_pd_data_request(struct tcpm_port *port,
NONE_AMS); NONE_AMS);
break; break;
case PD_DATA_VENDOR_DEF: case PD_DATA_VENDOR_DEF:
if (tcpm_vdm_ams(port) || port->nr_snk_vdo)
tcpm_handle_vdm_request(port, msg->payload, cnt); tcpm_handle_vdm_request(port, msg->payload, cnt);
else if (port->negotiated_rev > PD_REV20)
tcpm_pd_handle_msg(port, PD_MSG_CTRL_NOT_SUPP, NONE_AMS);
break; break;
case PD_DATA_BIST: case PD_DATA_BIST:
port->bist_request = le32_to_cpu(msg->payload[0]); port->bist_request = le32_to_cpu(msg->payload[0]);
@@ -2580,10 +2599,6 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
TYPEC_PWR_MODE_PD, TYPEC_PWR_MODE_PD,
port->pps_data.active, port->pps_data.active,
port->supply_voltage); port->supply_voltage);
/* Set VDM running flag ASAP */
if (port->data_role == TYPEC_HOST &&
port->send_discover)
port->vdm_sm_running = true;
tcpm_set_state(port, SNK_READY, 0); tcpm_set_state(port, SNK_READY, 0);
} else { } else {
/* /*
@@ -2621,14 +2636,10 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
switch (port->state) { switch (port->state) {
case SNK_NEGOTIATE_CAPABILITIES: case SNK_NEGOTIATE_CAPABILITIES:
/* USB PD specification, Figure 8-43 */ /* USB PD specification, Figure 8-43 */
if (port->explicit_contract) { if (port->explicit_contract)
next_state = SNK_READY; next_state = SNK_READY;
if (port->data_role == TYPEC_HOST && else
port->send_discover)
port->vdm_sm_running = true;
} else {
next_state = SNK_WAIT_CAPABILITIES; next_state = SNK_WAIT_CAPABILITIES;
}
/* Threshold was relaxed before sending Request. Restore it back. */ /* Threshold was relaxed before sending Request. Restore it back. */
tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD, tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
@@ -2643,10 +2654,6 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
port->pps_status = (type == PD_CTRL_WAIT ? port->pps_status = (type == PD_CTRL_WAIT ?
-EAGAIN : -EOPNOTSUPP); -EAGAIN : -EOPNOTSUPP);
if (port->data_role == TYPEC_HOST &&
port->send_discover)
port->vdm_sm_running = true;
/* Threshold was relaxed before sending Request. Restore it back. */ /* Threshold was relaxed before sending Request. Restore it back. */
tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD, tcpm_set_auto_vbus_discharge_threshold(port, TYPEC_PWR_MODE_PD,
port->pps_data.active, port->pps_data.active,
@@ -2722,10 +2729,6 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
} }
break; break;
case DR_SWAP_SEND: case DR_SWAP_SEND:
if (port->data_role == TYPEC_DEVICE &&
port->send_discover)
port->vdm_sm_running = true;
tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0); tcpm_set_state(port, DR_SWAP_CHANGE_DR, 0);
break; break;
case PR_SWAP_SEND: case PR_SWAP_SEND:
@@ -2763,7 +2766,7 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
PD_MSG_CTRL_NOT_SUPP, PD_MSG_CTRL_NOT_SUPP,
NONE_AMS); NONE_AMS);
} else { } else {
if (port->vdm_sm_running) { if (port->send_discover) {
tcpm_queue_message(port, PD_MSG_CTRL_WAIT); tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
break; break;
} }
@@ -2779,7 +2782,7 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
PD_MSG_CTRL_NOT_SUPP, PD_MSG_CTRL_NOT_SUPP,
NONE_AMS); NONE_AMS);
} else { } else {
if (port->vdm_sm_running) { if (port->send_discover) {
tcpm_queue_message(port, PD_MSG_CTRL_WAIT); tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
break; break;
} }
@@ -2788,7 +2791,7 @@ static void tcpm_pd_ctrl_request(struct tcpm_port *port,
} }
break; break;
case PD_CTRL_VCONN_SWAP: case PD_CTRL_VCONN_SWAP:
if (port->vdm_sm_running) { if (port->send_discover) {
tcpm_queue_message(port, PD_MSG_CTRL_WAIT); tcpm_queue_message(port, PD_MSG_CTRL_WAIT);
break; break;
} }
@@ -4582,18 +4585,20 @@ static void run_state_machine(struct tcpm_port *port)
/* DR_Swap states */ /* DR_Swap states */
case DR_SWAP_SEND: case DR_SWAP_SEND:
tcpm_pd_send_control(port, PD_CTRL_DR_SWAP); tcpm_pd_send_control(port, PD_CTRL_DR_SWAP);
if (port->data_role == TYPEC_DEVICE || port->negotiated_rev > PD_REV20)
port->send_discover = true;
tcpm_set_state_cond(port, DR_SWAP_SEND_TIMEOUT, tcpm_set_state_cond(port, DR_SWAP_SEND_TIMEOUT,
PD_T_SENDER_RESPONSE); PD_T_SENDER_RESPONSE);
break; break;
case DR_SWAP_ACCEPT: case DR_SWAP_ACCEPT:
tcpm_pd_send_control(port, PD_CTRL_ACCEPT); tcpm_pd_send_control(port, PD_CTRL_ACCEPT);
/* Set VDM state machine running flag ASAP */ if (port->data_role == TYPEC_DEVICE || port->negotiated_rev > PD_REV20)
if (port->data_role == TYPEC_DEVICE && port->send_discover) port->send_discover = true;
port->vdm_sm_running = true;
tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0); tcpm_set_state_cond(port, DR_SWAP_CHANGE_DR, 0);
break; break;
case DR_SWAP_SEND_TIMEOUT: case DR_SWAP_SEND_TIMEOUT:
tcpm_swap_complete(port, -ETIMEDOUT); tcpm_swap_complete(port, -ETIMEDOUT);
port->send_discover = false;
tcpm_ams_finish(port); tcpm_ams_finish(port);
tcpm_set_state(port, ready_state(port), 0); tcpm_set_state(port, ready_state(port), 0);
break; break;
@@ -4605,7 +4610,6 @@ static void run_state_machine(struct tcpm_port *port)
} else { } else {
tcpm_set_roles(port, true, port->pwr_role, tcpm_set_roles(port, true, port->pwr_role,
TYPEC_HOST); TYPEC_HOST);
port->send_discover = true;
} }
tcpm_ams_finish(port); tcpm_ams_finish(port);
tcpm_set_state(port, ready_state(port), 0); tcpm_set_state(port, ready_state(port), 0);
@@ -4756,8 +4760,6 @@ static void run_state_machine(struct tcpm_port *port)
break; break;
case VCONN_SWAP_SEND_TIMEOUT: case VCONN_SWAP_SEND_TIMEOUT:
tcpm_swap_complete(port, -ETIMEDOUT); tcpm_swap_complete(port, -ETIMEDOUT);
if (port->data_role == TYPEC_HOST && port->send_discover)
port->vdm_sm_running = true;
tcpm_set_state(port, ready_state(port), 0); tcpm_set_state(port, ready_state(port), 0);
break; break;
case VCONN_SWAP_START: case VCONN_SWAP_START:
@@ -4773,14 +4775,10 @@ static void run_state_machine(struct tcpm_port *port)
case VCONN_SWAP_TURN_ON_VCONN: case VCONN_SWAP_TURN_ON_VCONN:
tcpm_set_vconn(port, true); tcpm_set_vconn(port, true);
tcpm_pd_send_control(port, PD_CTRL_PS_RDY); tcpm_pd_send_control(port, PD_CTRL_PS_RDY);
if (port->data_role == TYPEC_HOST && port->send_discover)
port->vdm_sm_running = true;
tcpm_set_state(port, ready_state(port), 0); tcpm_set_state(port, ready_state(port), 0);
break; break;
case VCONN_SWAP_TURN_OFF_VCONN: case VCONN_SWAP_TURN_OFF_VCONN:
tcpm_set_vconn(port, false); tcpm_set_vconn(port, false);
if (port->data_role == TYPEC_HOST && port->send_discover)
port->vdm_sm_running = true;
tcpm_set_state(port, ready_state(port), 0); tcpm_set_state(port, ready_state(port), 0);
break; break;
@@ -4788,8 +4786,6 @@ static void run_state_machine(struct tcpm_port *port)
case PR_SWAP_CANCEL: case PR_SWAP_CANCEL:
case VCONN_SWAP_CANCEL: case VCONN_SWAP_CANCEL:
tcpm_swap_complete(port, port->swap_status); tcpm_swap_complete(port, port->swap_status);
if (port->data_role == TYPEC_HOST && port->send_discover)
port->vdm_sm_running = true;
if (port->pwr_role == TYPEC_SOURCE) if (port->pwr_role == TYPEC_SOURCE)
tcpm_set_state(port, SRC_READY, 0); tcpm_set_state(port, SRC_READY, 0);
else else
@@ -5142,9 +5138,6 @@ static void _tcpm_pd_vbus_on(struct tcpm_port *port)
switch (port->state) { switch (port->state) {
case SNK_TRANSITION_SINK_VBUS: case SNK_TRANSITION_SINK_VBUS:
port->explicit_contract = true; port->explicit_contract = true;
/* Set the VDM flag ASAP */
if (port->data_role == TYPEC_HOST && port->send_discover)
port->vdm_sm_running = true;
tcpm_set_state(port, SNK_READY, 0); tcpm_set_state(port, SNK_READY, 0);
break; break;
case SNK_DISCOVERY: case SNK_DISCOVERY:
@@ -5545,14 +5538,17 @@ static void tcpm_send_discover_work(struct kthread_work *work)
if (!port->send_discover) if (!port->send_discover)
goto unlock; goto unlock;
if (port->data_role == TYPEC_DEVICE && port->negotiated_rev < PD_REV30) {
port->send_discover = false;
goto unlock;
}
/* Retry if the port is not idle */ /* Retry if the port is not idle */
if ((port->state != SRC_READY && port->state != SNK_READY) || port->vdm_sm_running) { if ((port->state != SRC_READY && port->state != SNK_READY) || port->vdm_sm_running) {
mod_send_discover_delayed_work(port, SEND_DISCOVER_RETRY_MS); mod_send_discover_delayed_work(port, SEND_DISCOVER_RETRY_MS);
goto unlock; goto unlock;
} }
/* Only send the Message if the port is host for PD rev2.0 */
if (port->data_role == TYPEC_HOST || port->negotiated_rev > PD_REV20)
tcpm_send_vdm(port, USB_SID_PD, CMD_DISCOVER_IDENT, NULL, 0); tcpm_send_vdm(port, USB_SID_PD, CMD_DISCOVER_IDENT, NULL, 0);
unlock: unlock:

View File

@@ -627,10 +627,10 @@ static void toggle_allocation_gate(struct work_struct *work)
* During low activity with no allocations we might wait a * During low activity with no allocations we might wait a
* while; let's avoid the hung task warning. * while; let's avoid the hung task warning.
*/ */
wait_event_timeout(allocation_wait, atomic_read(&kfence_allocation_gate), wait_event_idle_timeout(allocation_wait, atomic_read(&kfence_allocation_gate),
sysctl_hung_task_timeout_secs * HZ / 2); sysctl_hung_task_timeout_secs * HZ / 2);
} else { } else {
wait_event(allocation_wait, atomic_read(&kfence_allocation_gate)); wait_event_idle(allocation_wait, atomic_read(&kfence_allocation_gate));
} }
/* Disable static key and reset timer. */ /* Disable static key and reset timer. */

View File

@@ -290,7 +290,7 @@ static void hex_dump_object(struct seq_file *seq,
warn_or_seq_printf(seq, " hex dump (first %zu bytes):\n", len); warn_or_seq_printf(seq, " hex dump (first %zu bytes):\n", len);
kasan_disable_current(); kasan_disable_current();
warn_or_seq_hex_dump(seq, DUMP_PREFIX_NONE, HEX_ROW_SIZE, warn_or_seq_hex_dump(seq, DUMP_PREFIX_NONE, HEX_ROW_SIZE,
HEX_GROUP_SIZE, ptr, len, HEX_ASCII); HEX_GROUP_SIZE, kasan_reset_tag((void *)ptr), len, HEX_ASCII);
kasan_enable_current(); kasan_enable_current();
} }
@@ -1171,7 +1171,7 @@ static bool update_checksum(struct kmemleak_object *object)
kasan_disable_current(); kasan_disable_current();
kcsan_disable_current(); kcsan_disable_current();
object->checksum = crc32(0, (void *)object->pointer, object->size); object->checksum = crc32(0, kasan_reset_tag((void *)object->pointer), object->size);
kasan_enable_current(); kasan_enable_current();
kcsan_enable_current(); kcsan_enable_current();
@@ -1246,7 +1246,7 @@ static void scan_block(void *_start, void *_end,
break; break;
kasan_disable_current(); kasan_disable_current();
pointer = *ptr; pointer = *(unsigned long *)kasan_reset_tag((void *)ptr);
kasan_enable_current(); kasan_enable_current();
untagged_ptr = (unsigned long)kasan_reset_tag((void *)pointer); untagged_ptr = (unsigned long)kasan_reset_tag((void *)pointer);

View File

@@ -4159,9 +4159,18 @@ vm_fault_t finish_fault(struct vm_fault *vmf)
return ret; return ret;
} }
if (unlikely(pte_alloc(vma->vm_mm, vmf->pmd))) if (vmf->prealloc_pte) {
vmf->ptl = pmd_lock(vma->vm_mm, vmf->pmd);
if (likely(pmd_none(*vmf->pmd))) {
mm_inc_nr_ptes(vma->vm_mm);
pmd_populate(vma->vm_mm, vmf->pmd, vmf->prealloc_pte);
vmf->prealloc_pte = NULL;
}
spin_unlock(vmf->ptl);
} else if (unlikely(pte_alloc(vma->vm_mm, vmf->pmd))) {
return VM_FAULT_OOM; return VM_FAULT_OOM;
} }
}
/* See comment in handle_pte_fault() */ /* See comment in handle_pte_fault() */
if (pmd_devmap_trans_unstable(vmf->pmd)) if (pmd_devmap_trans_unstable(vmf->pmd))

View File

@@ -535,8 +535,8 @@ static void print_section(char *level, char *text, u8 *addr,
unsigned int length) unsigned int length)
{ {
metadata_access_enable(); metadata_access_enable();
print_hex_dump(level, kasan_reset_tag(text), DUMP_PREFIX_ADDRESS, print_hex_dump(level, text, DUMP_PREFIX_ADDRESS,
16, 1, addr, length, 1); 16, 1, kasan_reset_tag((void *)addr), length, 1);
metadata_access_disable(); metadata_access_disable();
} }