From 4025820c61875cc785cb9eece324e9229990cdcd Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Fri, 15 Dec 2023 19:30:05 +0200 Subject: [PATCH 01/37] UPSTREAM: usb: typec: tcpm: Parse Accessory Mode information Some of the boards supported by the TCPM drivers can support USB-C Accessory Modes (Analog Audio, Debug). Parse information about supported modes from the device tree. Reviewed-by: Heikki Krogerus Signed-off-by: Dmitry Baryshkov Link: https://lore.kernel.org/r/20231215173005.313422-3-dmitry.baryshkov@linaro.org Signed-off-by: Greg Kroah-Hartman Bug: 206108037 (cherry picked from commit e9158c7e55339737847cebbfa397c668713f1a15) Signed-off-by: Kyle Tso (cherry picked from https://android-review.googlesource.com/q/commit:33854a1fee6cc57f82c14ea0d584d1f425a5d95e) Merged-In: Iece498046926d631d4a572152fbe41957b8354e4 Change-Id: Iece498046926d631d4a572152fbe41957b8354e4 --- drivers/usb/typec/tcpm/tcpm.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index e29c7a268c2c..da49e3b23793 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -6200,6 +6200,7 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, { const char *opmode_str; int ret; + int mode; u32 mw, frs_current; if (!fwnode) @@ -6218,6 +6219,14 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, if (ret < 0) return ret; + mode = 0; + + if (fwnode_property_read_bool(fwnode, "accessory-mode-audio")) + port->typec_caps.accessory[mode++] = TYPEC_ACCESSORY_AUDIO; + + if (fwnode_property_read_bool(fwnode, "accessory-mode-debug")) + port->typec_caps.accessory[mode++] = TYPEC_ACCESSORY_DEBUG; + port->port_type = port->typec_caps.type; port->pd_supported = !fwnode_property_read_bool(fwnode, "pd-disable"); From e08371bcf5ef2698235eacf93c010da0dd441304 Mon Sep 17 00:00:00 2001 From: Kyle Tso Date: Sat, 16 Dec 2023 18:46:30 +0800 Subject: [PATCH 02/37] UPSTREAM: usb: typec: tcpm: Support multiple capabilities Refactor tcpm_fw_get_caps to support the multiple pd capabilities got from fwnode. For backward compatibility, the original single capability is still applicable. The fetched data is stored in the newly defined structure "pd_data" and there is an array "pd_list" to store the pointers to them. A dedicated array "pds" is used to store the handles of the registered usb_power_delivery instances. Also implement the .pd_get and .pd_set ops which are introduced in commit a7cff92f0635 ("usb: typec: USB Power Delivery helpers for ports and partners"). Once the .pd_set is called, the current capability will be updated and state machine will re-negotiate the power contract if possible. Signed-off-by: Kyle Tso Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20231216104630.2720818-3-kyletso@google.com Signed-off-by: Greg Kroah-Hartman Bug: 206108037 (cherry picked from commit cd099cde4ed264403b434d8344994f97ac2a4349) Signed-off-by: Kyle Tso (cherry picked from https://android-review.googlesource.com/q/commit:eab651bc575f23415e8aa8cb39b45a92fcf8eeee) Merged-In: I58ee6e321f304b758507287ced314cc7a07466eb Change-Id: I58ee6e321f304b758507287ced314cc7a07466eb --- drivers/usb/typec/tcpm/tcpm.c | 385 ++++++++++++++++++++++++++-------- 1 file changed, 297 insertions(+), 88 deletions(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index da49e3b23793..09f2bacaee75 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -297,6 +297,15 @@ struct pd_pps_data { bool active; }; +struct pd_data { + struct usb_power_delivery *pd; + struct usb_power_delivery_capabilities *source_cap; + struct usb_power_delivery_capabilities_desc source_desc; + struct usb_power_delivery_capabilities *sink_cap; + struct usb_power_delivery_capabilities_desc sink_desc; + unsigned int operating_snk_mw; +}; + struct tcpm_port { struct device *dev; @@ -398,12 +407,14 @@ struct tcpm_port { unsigned int rx_msgid; /* USB PD objects */ - struct usb_power_delivery *pd; + struct usb_power_delivery **pds; + struct pd_data **pd_list; struct usb_power_delivery_capabilities *port_source_caps; struct usb_power_delivery_capabilities *port_sink_caps; struct usb_power_delivery *partner_pd; struct usb_power_delivery_capabilities *partner_source_caps; struct usb_power_delivery_capabilities *partner_sink_caps; + struct usb_power_delivery *selected_pd; /* Partner capabilities/requests */ u32 sink_request; @@ -413,6 +424,7 @@ struct tcpm_port { unsigned int nr_sink_caps; /* Local capabilities */ + unsigned int pd_count; u32 src_pdo[PDO_MAX_OBJECTS]; unsigned int nr_src_pdo; u32 snk_pdo[PDO_MAX_OBJECTS]; @@ -6116,12 +6128,114 @@ port_unlock: return 0; } +static struct pd_data *tcpm_find_pd_data(struct tcpm_port *port, struct usb_power_delivery *pd) +{ + int i; + + for (i = 0; port->pd_list[i]; i++) { + if (port->pd_list[i]->pd == pd) + return port->pd_list[i]; + } + + return ERR_PTR(-ENODATA); +} + +static struct usb_power_delivery **tcpm_pd_get(struct typec_port *p) +{ + struct tcpm_port *port = typec_get_drvdata(p); + + return port->pds; +} + +static int tcpm_pd_set(struct typec_port *p, struct usb_power_delivery *pd) +{ + struct tcpm_port *port = typec_get_drvdata(p); + struct pd_data *data; + int i, ret = 0; + + mutex_lock(&port->lock); + + if (port->selected_pd == pd) + goto unlock; + + data = tcpm_find_pd_data(port, pd); + if (IS_ERR(data)) { + ret = PTR_ERR(data); + goto unlock; + } + + if (data->sink_desc.pdo[0]) { + for (i = 0; i < PDO_MAX_OBJECTS && data->sink_desc.pdo[i]; i++) + port->snk_pdo[i] = data->sink_desc.pdo[i]; + port->nr_snk_pdo = i + 1; + port->operating_snk_mw = data->operating_snk_mw; + } + + if (data->source_desc.pdo[0]) { + for (i = 0; i < PDO_MAX_OBJECTS && data->source_desc.pdo[i]; i++) + port->snk_pdo[i] = data->source_desc.pdo[i]; + port->nr_src_pdo = i + 1; + } + + switch (port->state) { + case SRC_UNATTACHED: + case SRC_ATTACH_WAIT: + case SRC_TRYWAIT: + tcpm_set_cc(port, tcpm_rp_cc(port)); + break; + case SRC_SEND_CAPABILITIES: + case SRC_SEND_CAPABILITIES_TIMEOUT: + case SRC_NEGOTIATE_CAPABILITIES: + case SRC_READY: + case SRC_WAIT_NEW_CAPABILITIES: + port->caps_count = 0; + port->upcoming_state = SRC_SEND_CAPABILITIES; + ret = tcpm_ams_start(port, POWER_NEGOTIATION); + if (ret == -EAGAIN) { + port->upcoming_state = INVALID_STATE; + goto unlock; + } + break; + case SNK_NEGOTIATE_CAPABILITIES: + case SNK_NEGOTIATE_PPS_CAPABILITIES: + case SNK_READY: + case SNK_TRANSITION_SINK: + case SNK_TRANSITION_SINK_VBUS: + if (port->pps_data.active) + port->upcoming_state = SNK_NEGOTIATE_PPS_CAPABILITIES; + else if (port->pd_capable) + port->upcoming_state = SNK_NEGOTIATE_CAPABILITIES; + else + break; + + port->update_sink_caps = true; + + ret = tcpm_ams_start(port, POWER_NEGOTIATION); + if (ret == -EAGAIN) { + port->upcoming_state = INVALID_STATE; + goto unlock; + } + break; + default: + break; + } + + port->port_source_caps = data->source_cap; + port->port_sink_caps = data->sink_cap; + port->selected_pd = pd; +unlock: + mutex_unlock(&port->lock); + return ret; +} + static const struct typec_operations tcpm_ops = { .try_role = tcpm_try_role, .dr_set = tcpm_dr_set, .pr_set = tcpm_pr_set, .vconn_set = tcpm_vconn_set, - .port_type_set = tcpm_port_type_set + .port_type_set = tcpm_port_type_set, + .pd_get = tcpm_pd_get, + .pd_set = tcpm_pd_set }; void tcpm_tcpc_reset(struct tcpm_port *port) @@ -6135,58 +6249,63 @@ EXPORT_SYMBOL_GPL(tcpm_tcpc_reset); static void tcpm_port_unregister_pd(struct tcpm_port *port) { - usb_power_delivery_unregister_capabilities(port->port_sink_caps); + int i; + port->port_sink_caps = NULL; - usb_power_delivery_unregister_capabilities(port->port_source_caps); port->port_source_caps = NULL; - usb_power_delivery_unregister(port->pd); - port->pd = NULL; + for (i = 0; i < port->pd_count; i++) { + usb_power_delivery_unregister_capabilities(port->pd_list[i]->sink_cap); + kfree(port->pd_list[i]->sink_cap); + usb_power_delivery_unregister_capabilities(port->pd_list[i]->source_cap); + kfree(port->pd_list[i]->source_cap); + devm_kfree(port->dev, port->pd_list[i]); + port->pd_list[i] = NULL; + usb_power_delivery_unregister(port->pds[i]); + port->pds[i] = NULL; + } } static int tcpm_port_register_pd(struct tcpm_port *port) { struct usb_power_delivery_desc desc = { port->typec_caps.pd_revision }; - struct usb_power_delivery_capabilities_desc caps = { }; struct usb_power_delivery_capabilities *cap; - int ret; + int ret, i; if (!port->nr_src_pdo && !port->nr_snk_pdo) return 0; - port->pd = usb_power_delivery_register(port->dev, &desc); - if (IS_ERR(port->pd)) { - ret = PTR_ERR(port->pd); - goto err_unregister; - } - - if (port->nr_src_pdo) { - memcpy_and_pad(caps.pdo, sizeof(caps.pdo), port->src_pdo, - port->nr_src_pdo * sizeof(u32), 0); - caps.role = TYPEC_SOURCE; - - cap = usb_power_delivery_register_capabilities(port->pd, &caps); - if (IS_ERR(cap)) { - ret = PTR_ERR(cap); + for (i = 0; i < port->pd_count; i++) { + port->pds[i] = usb_power_delivery_register(port->dev, &desc); + if (IS_ERR(port->pds[i])) { + ret = PTR_ERR(port->pds[i]); goto err_unregister; } + port->pd_list[i]->pd = port->pds[i]; - port->port_source_caps = cap; - } - - if (port->nr_snk_pdo) { - memcpy_and_pad(caps.pdo, sizeof(caps.pdo), port->snk_pdo, - port->nr_snk_pdo * sizeof(u32), 0); - caps.role = TYPEC_SINK; - - cap = usb_power_delivery_register_capabilities(port->pd, &caps); - if (IS_ERR(cap)) { - ret = PTR_ERR(cap); - goto err_unregister; + if (port->pd_list[i]->source_desc.pdo[0]) { + cap = usb_power_delivery_register_capabilities(port->pds[i], + &port->pd_list[i]->source_desc); + if (IS_ERR(cap)) { + ret = PTR_ERR(cap); + goto err_unregister; + } + port->pd_list[i]->source_cap = cap; } - port->port_sink_caps = cap; + if (port->pd_list[i]->sink_desc.pdo[0]) { + cap = usb_power_delivery_register_capabilities(port->pds[i], + &port->pd_list[i]->sink_desc); + if (IS_ERR(cap)) { + ret = PTR_ERR(cap); + goto err_unregister; + } + port->pd_list[i]->sink_cap = cap; + } } + port->port_source_caps = port->pd_list[0]->source_cap; + port->port_sink_caps = port->pd_list[0]->sink_cap; + port->selected_pd = port->pds[0]; return 0; err_unregister: @@ -6195,13 +6314,15 @@ err_unregister: return ret; } -static int tcpm_fw_get_caps(struct tcpm_port *port, - struct fwnode_handle *fwnode) +static int tcpm_fw_get_caps(struct tcpm_port *port, struct fwnode_handle *fwnode) { + struct fwnode_handle *capabilities, *child, *caps = NULL; + unsigned int nr_src_pdo, nr_snk_pdo; const char *opmode_str; - int ret; + u32 *src_pdo, *snk_pdo; + u32 uw, frs_current; + int ret = 0, i; int mode; - u32 mw, frs_current; if (!fwnode) return -EINVAL; @@ -6229,28 +6350,10 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, port->port_type = port->typec_caps.type; port->pd_supported = !fwnode_property_read_bool(fwnode, "pd-disable"); - port->slow_charger_loop = fwnode_property_read_bool(fwnode, "slow-charger-loop"); - if (port->port_type == TYPEC_PORT_SNK) - goto sink; + port->self_powered = fwnode_property_read_bool(fwnode, "self-powered"); - /* Get Source PDOs for the PD port or Source Rp value for the non-PD port */ - if (port->pd_supported) { - ret = fwnode_property_count_u32(fwnode, "source-pdos"); - if (ret == 0) - return -EINVAL; - else if (ret < 0) - return ret; - - port->nr_src_pdo = min(ret, PDO_MAX_OBJECTS); - ret = fwnode_property_read_u32_array(fwnode, "source-pdos", - port->src_pdo, port->nr_src_pdo); - if (ret) - return ret; - ret = tcpm_validate_caps(port, port->src_pdo, port->nr_src_pdo); - if (ret) - return ret; - } else { + if (!port->pd_supported) { ret = fwnode_property_read_string(fwnode, "typec-power-opmode", &opmode_str); if (ret) return ret; @@ -6258,45 +6361,150 @@ static int tcpm_fw_get_caps(struct tcpm_port *port, if (ret < 0) return ret; port->src_rp = tcpm_pwr_opmode_to_rp(ret); + return 0; } - if (port->port_type == TYPEC_PORT_SRC) - return 0; - -sink: - port->self_powered = fwnode_property_read_bool(fwnode, "self-powered"); - - if (!port->pd_supported) - return 0; - - /* Get sink pdos */ - ret = fwnode_property_count_u32(fwnode, "sink-pdos"); - if (ret <= 0) - return -EINVAL; - - port->nr_snk_pdo = min(ret, PDO_MAX_OBJECTS); - ret = fwnode_property_read_u32_array(fwnode, "sink-pdos", - port->snk_pdo, port->nr_snk_pdo); - if ((ret < 0) || tcpm_validate_caps(port, port->snk_pdo, - port->nr_snk_pdo)) - return -EINVAL; - - if (fwnode_property_read_u32(fwnode, "op-sink-microwatt", &mw) < 0) - return -EINVAL; - port->operating_snk_mw = mw / 1000; + /* The following code are applicable to pd-capable ports, i.e. pd_supported is true. */ /* FRS can only be supported by DRP ports */ if (port->port_type == TYPEC_PORT_DRP) { ret = fwnode_property_read_u32(fwnode, "new-source-frs-typec-current", &frs_current); - if (ret >= 0 && frs_current <= FRS_5V_3A) + if (!ret && frs_current <= FRS_5V_3A) port->new_source_frs_current = frs_current; + + if (ret) + ret = 0; } + /* For the backward compatibility, "capabilities" node is optional. */ + capabilities = fwnode_get_named_child_node(fwnode, "capabilities"); + if (!capabilities) { + port->pd_count = 1; + } else { + fwnode_for_each_child_node(capabilities, child) + port->pd_count++; + + if (!port->pd_count) { + ret = -ENODATA; + goto put_capabilities; + } + } + + port->pds = devm_kcalloc(port->dev, port->pd_count, sizeof(struct usb_power_delivery *), + GFP_KERNEL); + if (!port->pds) { + ret = -ENOMEM; + goto put_capabilities; + } + + port->pd_list = devm_kcalloc(port->dev, port->pd_count, sizeof(struct pd_data *), + GFP_KERNEL); + if (!port->pd_list) { + ret = -ENOMEM; + goto put_capabilities; + } + + for (i = 0; i < port->pd_count; i++) { + port->pd_list[i] = devm_kzalloc(port->dev, sizeof(struct pd_data), GFP_KERNEL); + if (!port->pd_list[i]) { + ret = -ENOMEM; + goto put_capabilities; + } + + src_pdo = port->pd_list[i]->source_desc.pdo; + port->pd_list[i]->source_desc.role = TYPEC_SOURCE; + snk_pdo = port->pd_list[i]->sink_desc.pdo; + port->pd_list[i]->sink_desc.role = TYPEC_SINK; + + /* If "capabilities" is NULL, fall back to single pd cap population. */ + if (!capabilities) + caps = fwnode; + else + caps = fwnode_get_next_child_node(capabilities, caps); + + if (port->port_type != TYPEC_PORT_SNK) { + ret = fwnode_property_count_u32(caps, "source-pdos"); + if (ret == 0) { + ret = -EINVAL; + goto put_caps; + } + if (ret < 0) + goto put_caps; + + nr_src_pdo = min(ret, PDO_MAX_OBJECTS); + ret = fwnode_property_read_u32_array(caps, "source-pdos", src_pdo, + nr_src_pdo); + if (ret) + goto put_caps; + + ret = tcpm_validate_caps(port, src_pdo, nr_src_pdo); + if (ret) + goto put_caps; + + if (i == 0) { + port->nr_src_pdo = nr_src_pdo; + memcpy_and_pad(port->src_pdo, sizeof(u32) * PDO_MAX_OBJECTS, + port->pd_list[0]->source_desc.pdo, + sizeof(u32) * nr_src_pdo, + 0); + } + } + + if (port->port_type != TYPEC_PORT_SRC) { + ret = fwnode_property_count_u32(caps, "sink-pdos"); + if (ret == 0) { + ret = -EINVAL; + goto put_caps; + } + + if (ret < 0) + goto put_caps; + + nr_snk_pdo = min(ret, PDO_MAX_OBJECTS); + ret = fwnode_property_read_u32_array(caps, "sink-pdos", snk_pdo, + nr_snk_pdo); + if (ret) + goto put_caps; + + ret = tcpm_validate_caps(port, snk_pdo, nr_snk_pdo); + if (ret) + goto put_caps; + + if (fwnode_property_read_u32(caps, "op-sink-microwatt", &uw) < 0) { + ret = -EINVAL; + goto put_caps; + } + + port->pd_list[i]->operating_snk_mw = uw / 1000; + + if (i == 0) { + port->nr_snk_pdo = nr_snk_pdo; + memcpy_and_pad(port->snk_pdo, sizeof(u32) * PDO_MAX_OBJECTS, + port->pd_list[0]->sink_desc.pdo, + sizeof(u32) * nr_snk_pdo, + 0); + port->operating_snk_mw = port->pd_list[0]->operating_snk_mw; + } + } + } + +put_caps: + if (caps != fwnode) + fwnode_handle_put(caps); +put_capabilities: + fwnode_handle_put(capabilities); + return ret; +} + +static int tcpm_fw_get_snk_vdos(struct tcpm_port *port, struct fwnode_handle *fwnode) +{ + int ret; + /* sink-vdos is optional */ ret = fwnode_property_count_u32(fwnode, "sink-vdos"); if (ret < 0) - ret = 0; + return 0; port->nr_snk_vdo = min(ret, VDO_MAX_OBJECTS); if (port->nr_snk_vdo) { @@ -6638,12 +6846,14 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) tcpm_debugfs_init(port); err = tcpm_fw_get_caps(port, tcpc->fwnode); + if (err < 0) + goto out_destroy_wq; + err = tcpm_fw_get_snk_vdos(port, tcpc->fwnode); if (err < 0) goto out_destroy_wq; port->try_role = port->typec_caps.prefer_role; - port->typec_caps.fwnode = tcpc->fwnode; port->typec_caps.revision = 0x0120; /* Type-C spec release 1.2 */ port->typec_caps.pd_revision = 0x0300; /* USB-PD spec release 3.0 */ port->typec_caps.svdm_version = SVDM_VER_2_0; @@ -6652,7 +6862,6 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) port->typec_caps.orientation_aware = 1; port->partner_desc.identity = &port->partner_ident; - port->port_type = port->typec_caps.type; port->role_sw = usb_role_switch_get(port->dev); if (IS_ERR(port->role_sw)) { @@ -6669,7 +6878,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) if (err) goto out_role_sw_put; - port->typec_caps.pd = port->pd; + port->typec_caps.pd = port->pds[0]; port->typec_port = typec_register_port(port->dev, &port->typec_caps); if (IS_ERR(port->typec_port)) { From db94de2a170815960fddf3565b31462efa243d1b Mon Sep 17 00:00:00 2001 From: Kyle Tso Date: Thu, 1 Feb 2024 15:29:57 +0800 Subject: [PATCH 03/37] ANDROID: Update the ABI representation type 'struct tcpm_port' changed byte size changed from 12536 to 12552 member 'struct usb_power_delivery** pds' was added member 'struct pd_data** pd_list' was added member 'struct usb_power_delivery* pd' was removed 5 members ('struct usb_power_delivery_capabilities* port_source_caps' .. 'struct usb_power_delivery_capabilities* partner_sink_caps') changed offset changed by 64 member 'struct usb_power_delivery* selected_pd' was added 5 members ('u32 sink_request' .. 'unsigned int nr_sink_caps') changed offset changed by 128 member 'unsigned int pd_count' was added 14 members ('u32 src_pdo[7]' .. 'u32 supply_voltage') changed offset changed by 160 32 members ('struct power_supply* psy' .. 'u8* logbuffer[1024]') changed offset changed by 128 Bug: 206108037 Change-Id: I533d197558e12eefeb4984dbbd58c8f5b4d9e9ac Signed-off-by: Kyle Tso --- android/abi_gki_aarch64.stg | 457 ++++++++++++++++++++++-------------- 1 file changed, 279 insertions(+), 178 deletions(-) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 69c568233542..058157fa278e 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -793,6 +793,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0x213e28f7 } +pointer_reference { + id: 0x02e5776c + kind: POINTER + pointee_type_id: 0x21d53b2d +} pointer_reference { id: 0x02e98c8d kind: POINTER @@ -11743,6 +11748,11 @@ pointer_reference { kind: POINTER pointee_type_id: 0xad463304 } +pointer_reference { + id: 0x21d53b2d + kind: POINTER + pointee_type_id: 0xad140a28 +} pointer_reference { id: 0x21d7b2e4 kind: POINTER @@ -46115,10 +46125,10 @@ member { offset: 16 } member { - id: 0x27728fa6 + id: 0x27728925 name: "ams" type_id: 0x31aab745 - offset: 34112 + offset: 34240 } member { id: 0x31fec685 @@ -50944,10 +50954,10 @@ member { offset: 1344 } member { - id: 0x01610524 + id: 0x0161008f name: "auto_vbus_discharge_enabled" type_id: 0x6d7f5ff6 - offset: 34184 + offset: 34312 } member { id: 0xbdb80151 @@ -53841,10 +53851,10 @@ member { type_id: 0xb3e7bac9 } member { - id: 0xe59faff2 + id: 0xe59fa88d name: "bist_request" type_id: 0xc9082b19 - offset: 11040 + offset: 11168 } member { id: 0x1352cf9f @@ -69441,10 +69451,10 @@ member { offset: 320 } member { - id: 0xe5ef799d + id: 0xe5ef7ca5 name: "current_limit" type_id: 0xc9082b19 - offset: 10016 + offset: 10176 } member { id: 0xcfc20a47 @@ -73320,10 +73330,10 @@ member { offset: 768 } member { - id: 0xf3efe74d + id: 0xf3efe442 name: "dentry" type_id: 0x120540d1 - offset: 34240 + offset: 34368 } member { id: 0xf3efe84f @@ -105918,10 +105928,10 @@ member { offset: 256 } member { - id: 0xf609412d + id: 0xf60940d5 name: "in_ams" type_id: 0x6d7f5ff6 - offset: 34176 + offset: 34304 } member { id: 0x207c8b70 @@ -119360,28 +119370,28 @@ member { offset: 2648 } member { - id: 0xd27fca71 + id: 0xd27fcf67 name: "logbuffer" type_id: 0x3f6a85f3 - offset: 34752 + offset: 34880 } member { - id: 0x2a721390 + id: 0x2a721ab3 name: "logbuffer_head" type_id: 0x6720d32f - offset: 34688 + offset: 34816 } member { - id: 0x6339abb1 + id: 0x6339ac5e name: "logbuffer_lock" type_id: 0xa7c362b0 - offset: 34304 + offset: 34432 } member { - id: 0x90e05c99 + id: 0x90e05f4a name: "logbuffer_tail" type_id: 0x6720d32f - offset: 34720 + offset: 34848 } member { id: 0xb7357bee @@ -124425,10 +124435,10 @@ member { offset: 64 } member { - id: 0x52f29850 + id: 0x52f29c56 name: "max_wait" type_id: 0x33756485 - offset: 33920 + offset: 34048 } member { id: 0x3a232a1e @@ -128568,10 +128578,10 @@ member { offset: 3392 } member { - id: 0x9d25f138 + id: 0x9d25fedc name: "mode_data" type_id: 0x85164ba0 - offset: 12032 + offset: 12160 } member { id: 0x0014ce38 @@ -133316,10 +133326,10 @@ member { offset: 32 } member { - id: 0x4fa1c1e5 + id: 0x4fa1c8f8 name: "new_source_frs_current" type_id: 0x9f5bfa55 - offset: 34016 + offset: 34144 } member { id: 0xef42e2c8 @@ -133808,10 +133818,10 @@ member { offset: 128 } member { - id: 0x0e49b8e7 + id: 0x0e49bb46 name: "next_ams" type_id: 0x31aab745 - offset: 34144 + offset: 34272 } member { id: 0x43a6c314 @@ -136981,10 +136991,10 @@ member { offset: 1024 } member { - id: 0x033a9549 + id: 0x033a9662 name: "nr_sink_caps" type_id: 0x4585663f - offset: 8896 + offset: 9024 } member { id: 0x004eca1b @@ -136993,28 +137003,28 @@ member { offset: 256 } member { - id: 0xb41e9884 + id: 0xb41e9e01 name: "nr_snk_pdo" type_id: 0x4585663f - offset: 9408 + offset: 9568 } member { - id: 0xc545eb16 + id: 0xc545e694 name: "nr_snk_vdo" type_id: 0x4585663f - offset: 9856 + offset: 10016 } member { - id: 0x00b04f21 + id: 0x00b043a9 name: "nr_snk_vdo_v1" type_id: 0x4585663f - offset: 9632 + offset: 9792 } member { - id: 0xb0b60c88 + id: 0xb0b60502 name: "nr_source_caps" type_id: 0x4585663f - offset: 8640 + offset: 8768 } member { id: 0x47396359 @@ -137023,10 +137033,10 @@ member { offset: 768 } member { - id: 0x639c131a + id: 0x639c148e name: "nr_src_pdo" type_id: 0x4585663f - offset: 9152 + offset: 9312 } member { id: 0xd297eba7 @@ -141420,10 +141430,16 @@ member { offset: 192 } member { - id: 0x271e858e + id: 0x271e80d1 name: "operating_snk_mw" type_id: 0x4585663f - offset: 9888 + offset: 704 +} +member { + id: 0x271e85b7 + name: "operating_snk_mw" + type_id: 0x4585663f + offset: 10048 } member { id: 0xcd538228 @@ -145661,10 +145677,10 @@ member { offset: 1408 } member { - id: 0xeea87524 + id: 0xeea875b8 name: "partner_altmode" type_id: 0x23ac68c7 - offset: 21632 + offset: 21760 } member { id: 0xeebdf358 @@ -145685,22 +145701,22 @@ member { offset: 1536 } member { - id: 0xb74f4f82 + id: 0xb74f4815 name: "partner_pd" type_id: 0x3754d634 - offset: 8192 + offset: 8256 } member { - id: 0x15e6ae4f + id: 0x15e6a39e name: "partner_sink_caps" type_id: 0x3bdc1cb2 - offset: 8320 + offset: 8384 } member { - id: 0xdae5533d + id: 0xdae55413 name: "partner_source_caps" type_id: 0x3bdc1cb2 - offset: 8256 + offset: 8320 } member { id: 0x4592de1d @@ -146398,10 +146414,9 @@ member { offset: 7296 } member { - id: 0x6733a6b6 + id: 0x6733aa59 name: "pd" type_id: 0x3754d634 - offset: 8000 } member { id: 0x6733abb6 @@ -146439,6 +146454,12 @@ member { type_id: 0x6d7f5ff6 offset: 7904 } +member { + id: 0x765113fc + name: "pd_count" + type_id: 0x4585663f + offset: 9056 +} member { id: 0x24dcb717 name: "pd_d1d0_rec" @@ -146486,6 +146507,12 @@ member { type_id: 0x14ce1d40 offset: 512 } +member { + id: 0xb4445d1d + name: "pd_list" + type_id: 0x02e5776c + offset: 8064 +} member { id: 0x28d07b74 name: "pd_offline_fn" @@ -146647,6 +146674,17 @@ member { name: "pdev" type_id: 0x11e6864c } +member { + id: 0x7c7d84d2 + name: "pdo" + type_id: 0x5a8c92f7 +} +member { + id: 0x216f8116 + name: "pds" + type_id: 0x07450c2a + offset: 8000 +} member { id: 0xa2ef9390 name: "pdst" @@ -150812,10 +150850,10 @@ member { type_id: 0x00b7947f } member { - id: 0x7b09cd83 + id: 0x7b09ca7f name: "port_altmode" type_id: 0x23ac68c7 - offset: 27776 + offset: 27904 } member { id: 0x7b1c4643 @@ -151038,16 +151076,16 @@ member { offset: 2496 } member { - id: 0x7b044f0a + id: 0x7b04456d name: "port_sink_caps" type_id: 0x3bdc1cb2 - offset: 8128 + offset: 8192 } member { - id: 0x1bd4a20c + id: 0x1bd4a805 name: "port_source_caps" type_id: 0x3bdc1cb2 - offset: 8064 + offset: 8128 } member { id: 0xa22f8c42 @@ -151420,10 +151458,10 @@ member { offset: 896 } member { - id: 0x5016a0d8 + id: 0x5016a2b8 name: "potential_contaminant" type_id: 0x6d7f5ff6 - offset: 34200 + offset: 34328 } member { id: 0x002f56c1 @@ -151812,10 +151850,10 @@ member { offset: 48 } member { - id: 0x8d3c7b36 + id: 0x8d3c78bf name: "pps_complete" type_id: 0x3fcbf304 - offset: 11712 + offset: 11840 } member { id: 0x9c354b81 @@ -151824,10 +151862,10 @@ member { offset: 56 } member { - id: 0x3dd8249d + id: 0x3dd822a2 name: "pps_data" type_id: 0x593c0f6e - offset: 11424 + offset: 11552 } member { id: 0x8f5a97bc @@ -151884,10 +151922,10 @@ member { offset: 784 } member { - id: 0xb828e7c0 + id: 0xb828e700 name: "pps_pending" type_id: 0x6d7f5ff6 - offset: 11968 + offset: 12096 } member { id: 0x809edba2 @@ -151908,10 +151946,10 @@ member { offset: 9792 } member { - id: 0x7ec6d9ab + id: 0x7ec6d9f8 name: "pps_status" type_id: 0x6720d32f - offset: 12000 + offset: 12128 } member { id: 0x1c8b23f2 @@ -155840,10 +155878,10 @@ member { offset: 64 } member { - id: 0x85ba538c + id: 0x85ba5e0e name: "psy" type_id: 0x18150d9f - offset: 10112 + offset: 10240 } member { id: 0x85ba5e75 @@ -155851,18 +155889,18 @@ member { type_id: 0x18150d9f offset: 6144 } -member { - id: 0x84ab1052 - name: "psy_desc" - type_id: 0xa66e4d3d - offset: 10176 -} member { id: 0x84ab121a name: "psy_desc" type_id: 0xa66e4d3d offset: 6208 } +member { + id: 0x84ab1fd7 + name: "psy_desc" + type_id: 0xa66e4d3d + offset: 10304 +} member { id: 0x7b014ca9 name: "pt" @@ -163835,10 +163873,10 @@ member { offset: 448 } member { - id: 0xbb722e20 + id: 0xbb722ddd name: "req_current_limit" type_id: 0xc9082b19 - offset: 9952 + offset: 10112 } member { id: 0x667936b6 @@ -163982,10 +164020,10 @@ member { offset: 26816 } member { - id: 0x48ed2ec0 + id: 0x48ed266a name: "req_supply_voltage" type_id: 0xc9082b19 - offset: 9984 + offset: 10144 } member { id: 0x6b98bee2 @@ -167265,6 +167303,12 @@ member { type_id: 0x8167e73b offset: 7360 } +member { + id: 0xc069e642 + name: "role" + type_id: 0x8167e73b + offset: 224 +} member { id: 0xc0868466 name: "role" @@ -173277,6 +173321,12 @@ member { type_id: 0x2c40c92f offset: 640 } +member { + id: 0xa9ad9371 + name: "selected_pd" + type_id: 0x3754d634 + offset: 8448 +} member { id: 0x3a30a25b name: "selective_acks" @@ -173366,10 +173416,10 @@ member { offset: 1984 } member { - id: 0x259c81f5 + id: 0x259c8f08 name: "self_powered" type_id: 0x6d7f5ff6 - offset: 33984 + offset: 34112 } member { id: 0x7f269087 @@ -177800,16 +177850,28 @@ member { offset: 640 } member { - id: 0xfff33e76 - name: "sink_cap_done" - type_id: 0x6d7f5ff6 - offset: 34048 + id: 0x910f610e + name: "sink_cap" + type_id: 0x3bdc1cb2 + offset: 384 } member { - id: 0xe2d1147a + id: 0xfff33ad1 + name: "sink_cap_done" + type_id: 0x6d7f5ff6 + offset: 34176 +} +member { + id: 0xe2d11906 name: "sink_caps" type_id: 0x5a8c92f7 - offset: 8672 + offset: 8800 +} +member { + id: 0xbe26ad7c + name: "sink_desc" + type_id: 0x6fe411e0 + offset: 448 } member { id: 0x02ad13b2 @@ -177818,10 +177880,10 @@ member { offset: 1600 } member { - id: 0xf61f0ac5 + id: 0xf61f09b2 name: "sink_request" type_id: 0xc9082b19 - offset: 8384 + offset: 8512 } member { id: 0x0fe9219f @@ -179879,10 +179941,10 @@ member { offset: 32768 } member { - id: 0x3e932eb1 + id: 0x3e93273a name: "slow_charger_loop" type_id: 0x6d7f5ff6 - offset: 34192 + offset: 34320 } member { id: 0x208466ce @@ -180288,22 +180350,22 @@ member { offset: 7104 } member { - id: 0x8953a7d6 + id: 0x8953a68c name: "snk_pdo" type_id: 0x5a8c92f7 - offset: 9184 + offset: 9344 } member { - id: 0x85509fb3 + id: 0x85509ed6 name: "snk_vdo" type_id: 0x93e3596e - offset: 9664 + offset: 9824 } member { - id: 0xf23f9fe4 + id: 0xf23f9915 name: "snk_vdo_v1" type_id: 0x93e3596e - offset: 9440 + offset: 9600 } member { id: 0x89903be4 @@ -180648,10 +180710,22 @@ member { bitsize: 2 } member { - id: 0xab725605 + id: 0xb4cd4b26 + name: "source_cap" + type_id: 0x3bdc1cb2 + offset: 64 +} +member { + id: 0xab725054 name: "source_caps" type_id: 0x5a8c92f7 - offset: 8416 + offset: 8544 +} +member { + id: 0x808fbf02 + name: "source_desc" + type_id: 0x6fe411e0 + offset: 128 } member { id: 0x3c2dda48 @@ -181580,10 +181654,10 @@ member { offset: 256 } member { - id: 0x8b46a1dd + id: 0x8b46a74f name: "src_pdo" type_id: 0x5a8c92f7 - offset: 8928 + offset: 9088 } member { id: 0x6c861a98 @@ -185948,10 +186022,10 @@ member { type_id: 0x3e10b518 } member { - id: 0x92024d5f + id: 0x92024080 name: "supply_voltage" type_id: 0xc9082b19 - offset: 10048 + offset: 10208 } member { id: 0xa69acf8a @@ -199172,10 +199246,10 @@ member { offset: 1568 } member { - id: 0x1dc21b9c + id: 0x1dc21869 name: "upcoming_state" type_id: 0x63b95725 - offset: 34080 + offset: 34208 } member { id: 0xd6886f0b @@ -199355,10 +199429,10 @@ member { offset: 832 } member { - id: 0x51701f62 + id: 0x517019e2 name: "update_sink_caps" type_id: 0x6d7f5ff6 - offset: 9920 + offset: 10080 } member { id: 0x02e857e6 @@ -200043,10 +200117,10 @@ member { offset: 7360 } member { - id: 0x414594be + id: 0x41459e0e name: "usb_type" type_id: 0xed696ae5 - offset: 11008 + offset: 11136 } member { id: 0x73dbac61 @@ -202338,10 +202412,10 @@ member { offset: 192 } member { - id: 0x6011d4c2 + id: 0x6011dc13 name: "vdm_retries" type_id: 0xc9082b19 - offset: 11104 + offset: 11232 } member { id: 0xc4350055 @@ -202350,10 +202424,10 @@ member { offset: 6664 } member { - id: 0x46a0ec2d + id: 0x46a0e8ef name: "vdm_state" type_id: 0xd2f5a3bb - offset: 11072 + offset: 11200 } member { id: 0x06868f0a @@ -202386,22 +202460,22 @@ member { offset: 96 } member { - id: 0x2ad86005 + id: 0x2ad86d58 name: "vdo_count" type_id: 0x295c7202 - offset: 11360 + offset: 11488 } member { - id: 0x02b3bb9e + id: 0x02b3bdc3 name: "vdo_data" type_id: 0x5a8c92f7 - offset: 11136 + offset: 11264 } member { - id: 0x91c81583 + id: 0x91c81b88 name: "vdo_retry" type_id: 0xc9082b19 - offset: 11392 + offset: 11520 } member { id: 0xef4220d5 @@ -246522,6 +246596,20 @@ struct_union { member_id: 0xff5912bc } } +struct_union { + id: 0xad140a28 + kind: STRUCT + name: "pd_data" + definition { + bytesize: 96 + member_id: 0x6733aa59 + member_id: 0xb4cd4b26 + member_id: 0x808fbf02 + member_id: 0x910f610e + member_id: 0xbe26ad7c + member_id: 0x271e80d1 + } +} struct_union { id: 0xe5566452 kind: STRUCT @@ -259950,7 +260038,7 @@ struct_union { kind: STRUCT name: "tcpm_port" definition { - bytesize: 12536 + bytesize: 12552 member_id: 0xce3bbab3 member_id: 0x2d4b38e1 member_id: 0x22dd9cdb @@ -260019,63 +260107,66 @@ struct_union { member_id: 0x769578e9 member_id: 0x01992270 member_id: 0x2fffd25b - member_id: 0x6733a6b6 - member_id: 0x1bd4a20c - member_id: 0x7b044f0a - member_id: 0xb74f4f82 - member_id: 0xdae5533d - member_id: 0x15e6ae4f - member_id: 0xf61f0ac5 - member_id: 0xab725605 - member_id: 0xb0b60c88 - member_id: 0xe2d1147a - member_id: 0x033a9549 - member_id: 0x8b46a1dd - member_id: 0x639c131a - member_id: 0x8953a7d6 - member_id: 0xb41e9884 - member_id: 0xf23f9fe4 - member_id: 0x00b04f21 - member_id: 0x85509fb3 - member_id: 0xc545eb16 - member_id: 0x271e858e - member_id: 0x51701f62 - member_id: 0xbb722e20 - member_id: 0x48ed2ec0 - member_id: 0xe5ef799d - member_id: 0x92024d5f - member_id: 0x85ba538c - member_id: 0x84ab1052 - member_id: 0x414594be - member_id: 0xe59faff2 - member_id: 0x46a0ec2d - member_id: 0x6011d4c2 - member_id: 0x02b3bb9e - member_id: 0x2ad86005 - member_id: 0x91c81583 - member_id: 0x3dd8249d - member_id: 0x8d3c7b36 - member_id: 0xb828e7c0 - member_id: 0x7ec6d9ab - member_id: 0x9d25f138 - member_id: 0xeea87524 - member_id: 0x7b09cd83 - member_id: 0x52f29850 - member_id: 0x259c81f5 - member_id: 0x4fa1c1e5 - member_id: 0xfff33e76 - member_id: 0x1dc21b9c - member_id: 0x27728fa6 - member_id: 0x0e49b8e7 - member_id: 0xf609412d - member_id: 0x01610524 - member_id: 0x3e932eb1 - member_id: 0x5016a0d8 - member_id: 0xf3efe74d - member_id: 0x6339abb1 - member_id: 0x2a721390 - member_id: 0x90e05c99 - member_id: 0xd27fca71 + member_id: 0x216f8116 + member_id: 0xb4445d1d + member_id: 0x1bd4a805 + member_id: 0x7b04456d + member_id: 0xb74f4815 + member_id: 0xdae55413 + member_id: 0x15e6a39e + member_id: 0xa9ad9371 + member_id: 0xf61f09b2 + member_id: 0xab725054 + member_id: 0xb0b60502 + member_id: 0xe2d11906 + member_id: 0x033a9662 + member_id: 0x765113fc + member_id: 0x8b46a74f + member_id: 0x639c148e + member_id: 0x8953a68c + member_id: 0xb41e9e01 + member_id: 0xf23f9915 + member_id: 0x00b043a9 + member_id: 0x85509ed6 + member_id: 0xc545e694 + member_id: 0x271e85b7 + member_id: 0x517019e2 + member_id: 0xbb722ddd + member_id: 0x48ed266a + member_id: 0xe5ef7ca5 + member_id: 0x92024080 + member_id: 0x85ba5e0e + member_id: 0x84ab1fd7 + member_id: 0x41459e0e + member_id: 0xe59fa88d + member_id: 0x46a0e8ef + member_id: 0x6011dc13 + member_id: 0x02b3bdc3 + member_id: 0x2ad86d58 + member_id: 0x91c81b88 + member_id: 0x3dd822a2 + member_id: 0x8d3c78bf + member_id: 0xb828e700 + member_id: 0x7ec6d9f8 + member_id: 0x9d25fedc + member_id: 0xeea875b8 + member_id: 0x7b09ca7f + member_id: 0x52f29c56 + member_id: 0x259c8f08 + member_id: 0x4fa1c8f8 + member_id: 0xfff33ad1 + member_id: 0x1dc21869 + member_id: 0x27728925 + member_id: 0x0e49bb46 + member_id: 0xf60940d5 + member_id: 0x0161008f + member_id: 0x3e93273a + member_id: 0x5016a2b8 + member_id: 0xf3efe442 + member_id: 0x6339ac5e + member_id: 0x2a721ab3 + member_id: 0x90e05f4a + member_id: 0xd27fcf67 } } struct_union { @@ -264703,6 +264794,16 @@ struct_union { member_id: 0xc069e42e } } +struct_union { + id: 0x6fe411e0 + kind: STRUCT + name: "usb_power_delivery_capabilities_desc" + definition { + bytesize: 32 + member_id: 0x7c7d84d2 + member_id: 0xc069e642 + } +} struct_union { id: 0x6621953c kind: STRUCT From 7b6a6228df34c0b846d24e3b99926a3ef117d9f0 Mon Sep 17 00:00:00 2001 From: Rick Yiu Date: Thu, 1 Feb 2024 04:22:12 +0000 Subject: [PATCH 04/37] ANDROID: Update the ABI symbol list Adding the following symbols: - d_path - find_vpid - get_task_mm - mas_find - mmput - __traceiter_android_rvh_sched_setaffinity - __tracepoint_android_rvh_sched_setaffinity Bug: 297987838 Change-Id: Idac889c1b9f2c397036bd83bc1ac5cba19eeab6f Signed-off-by: Rick Yiu --- android/abi_gki_aarch64_pixel | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index 6542846a3ddb..e2940b3fcaf6 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -614,6 +614,7 @@ down_read_trylock down_trylock down_write + d_path dput drain_workqueue driver_register @@ -883,6 +884,7 @@ find_pid_ns find_task_by_vpid find_vma_intersection + find_vpid finish_wait firmware_request_nowarn flush_dcache_page @@ -972,6 +974,7 @@ get_sg_io_hdr __get_task_comm get_task_cred + get_task_mm get_thermal_instance get_unused_fd_flags get_user_pages @@ -1323,6 +1326,7 @@ loops_per_jiffy mac_pton mas_empty_area_rev + mas_find max_load_balance_interval mbox_chan_received_data mbox_controller_register @@ -1377,6 +1381,7 @@ __mmap_lock_do_trace_released __mmap_lock_do_trace_start_locking __mmdrop + mmput mod_delayed_work_on mod_node_page_state mod_timer @@ -2303,6 +2308,7 @@ __traceiter_android_rvh_remove_entity_load_avg __traceiter_android_rvh_rtmutex_prepare_setprio __traceiter_android_rvh_sched_newidle_balance + __traceiter_android_rvh_sched_setaffinity __traceiter_android_rvh_select_task_rq_fair __traceiter_android_rvh_select_task_rq_rt __traceiter_android_rvh_set_cpus_allowed_by_task @@ -2415,6 +2421,7 @@ __tracepoint_android_rvh_remove_entity_load_avg __tracepoint_android_rvh_rtmutex_prepare_setprio __tracepoint_android_rvh_sched_newidle_balance + __tracepoint_android_rvh_sched_setaffinity __tracepoint_android_rvh_select_task_rq_fair __tracepoint_android_rvh_select_task_rq_rt __tracepoint_android_rvh_set_cpus_allowed_by_task From 7ce117301e1bd43ff24e0f83d1bf27ec1b77f17e Mon Sep 17 00:00:00 2001 From: chenweitao Date: Wed, 31 Jan 2024 16:49:23 +0800 Subject: [PATCH 05/37] ANDROID: vendor_hooks: Add hook for binder_detect_low_async_space_locked Add hook for binder_detect_low_async_space_locked, which gives the vendor a choice whether or not this alloc new buf should go on or not Bug: 322915513 Change-Id: Ie7f1567dae6dee0fb22b014cd1eacc3308ccb205 Signed-off-by: chenweitao --- drivers/android/binder_alloc.c | 8 ++++++++ drivers/android/vendor_hooks.c | 1 + include/trace/hooks/binder.h | 4 ++++ 3 files changed, 13 insertions(+) diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index c649c00bcbfa..ac6b68aaea09 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c @@ -383,6 +383,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked( void __user *end_page_addr; size_t size, data_offsets_size; int ret; + bool should_fail = false; /* Check binder_alloc is fully initialized */ if (!binder_alloc_get_vma(alloc)) { @@ -409,6 +410,13 @@ static struct binder_buffer *binder_alloc_new_buf_locked( return ERR_PTR(-EINVAL); } trace_android_vh_binder_alloc_new_buf_locked(size, &alloc->free_async_space, is_async); + trace_android_vh_binder_detect_low_async_space_locked(is_async, &alloc->free_async_space, pid, &should_fail); + if (should_fail) { + binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, + "%d: binder_alloc_buf size %zd failed, not allowed to alloc more async space\n", + alloc->pid, size); + return ERR_PTR(-EPERM); + } if (is_async && alloc->free_async_space < size + sizeof(struct binder_buffer)) { binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 3b50cf94742b..98ef19a76bb9 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -375,3 +375,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_ioctl_end); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_looper_exited); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_spawn_new_thread); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_has_special_work_ilocked); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_binder_detect_low_async_space_locked); diff --git a/include/trace/hooks/binder.h b/include/trace/hooks/binder.h index 1a1d051fb079..b895f23f8cf7 100644 --- a/include/trace/hooks/binder.h +++ b/include/trace/hooks/binder.h @@ -82,6 +82,10 @@ DECLARE_HOOK(android_vh_binder_select_special_worklist, DECLARE_HOOK(android_vh_binder_alloc_new_buf_locked, TP_PROTO(size_t size, size_t *free_async_space, int is_async), TP_ARGS(size, free_async_space, is_async)); + +DECLARE_HOOK(android_vh_binder_detect_low_async_space_locked, + TP_PROTO(int is_async, size_t *free_async_space, int pid, bool *should_fail), + TP_ARGS(is_async, free_async_space, pid, should_fail)); struct binder_transaction_data; DECLARE_HOOK(android_vh_binder_reply, TP_PROTO(struct binder_proc *target_proc, struct binder_proc *proc, From 0123832f680274918c7db46eb479da4edf2883d4 Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Mon, 26 Jul 2021 09:27:15 -0700 Subject: [PATCH 06/37] ANDROID: scsi: ufs: add vendor hook to override key reprogramming Some hardware has a way to restore all keyslots at once that is significantly faster than restoring each keyslot individually, as is done by blk_ksm_reprogram_all_keys(). Add a hook "android_rvh_ufs_reprogram_all_keys" that allows overriding the restoration of all keyslots after UFS reset. This may sleep, so this must be a "restricted" Android vendor hook rather than a regular one. Note that currently this functionality can't be upstreamed, as support for the hardware that needs it would need to be upstreamed first. (cherry picked from commit e2e063f5074e2e14a96875e5e5670314a41e1c34) Bug: 162257402 Bug: 181905172 Bug: 241106918 Signed-off-by: Eric Biggers Signed-off-by: Kenny Root Change-Id: I0b25393a5131941f085892560e08a64e63cd1369 --- drivers/android/vendor_hooks.c | 1 + drivers/ufs/core/ufshcd-crypto.c | 11 ++++++++++- include/trace/hooks/ufshcd.h | 4 ++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 98ef19a76bb9..a3ee24e3ce6a 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -135,6 +135,7 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_size_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_format_check); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ftrace_dump_buffer); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_fill_prdt); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_ufs_reprogram_all_keys); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_prepare_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_update_sysfs); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_command); diff --git a/drivers/ufs/core/ufshcd-crypto.c b/drivers/ufs/core/ufshcd-crypto.c index c1a8354d4ef7..be25dbbba1ba 100644 --- a/drivers/ufs/core/ufshcd-crypto.c +++ b/drivers/ufs/core/ufshcd-crypto.c @@ -6,6 +6,9 @@ #include #include "ufshcd-crypto.h" +#undef CREATE_TRACE_POINTS +#include + /* Blk-crypto modes supported by UFS crypto */ static const struct ufs_crypto_alg_entry { enum ufs_crypto_alg ufs_alg; @@ -122,7 +125,13 @@ bool ufshcd_crypto_enable(struct ufs_hba *hba) return false; /* Reset might clear all keys, so reprogram all the keys. */ - blk_crypto_reprogram_all_keys(&hba->crypto_profile); + if (hba->crypto_profile.num_slots) { + int err = -EOPNOTSUPP; + + trace_android_rvh_ufs_reprogram_all_keys(hba, &err); + if (err == -EOPNOTSUPP) + blk_crypto_reprogram_all_keys(&hba->crypto_profile); + } if (hba->android_quirks & UFSHCD_ANDROID_QUIRK_BROKEN_CRYPTO_ENABLE) return false; diff --git a/include/trace/hooks/ufshcd.h b/include/trace/hooks/ufshcd.h index 64767108c069..97d59f6cb028 100644 --- a/include/trace/hooks/ufshcd.h +++ b/include/trace/hooks/ufshcd.h @@ -19,6 +19,10 @@ DECLARE_HOOK(android_vh_ufs_fill_prdt, unsigned int segments, int *err), TP_ARGS(hba, lrbp, segments, err)); +DECLARE_RESTRICTED_HOOK(android_rvh_ufs_reprogram_all_keys, + TP_PROTO(struct ufs_hba *hba, int *err), + TP_ARGS(hba, err), 1); + DECLARE_HOOK(android_vh_ufs_prepare_command, TP_PROTO(struct ufs_hba *hba, struct request *rq, struct ufshcd_lrb *lrbp, int *err), From fbcd29ac45d10dd685e1c1f98a11bdc6d4d77c35 Mon Sep 17 00:00:00 2001 From: Ray Chi Date: Fri, 9 Apr 2021 16:59:11 +0800 Subject: [PATCH 07/37] ANDROID: usb: dwc3: export tracepoint for dwc3 read/write There are two tracepoints in dwc3_readl() and dwc3_writel(). This patch will export the tracepoints so that vendor modules can use them. Bug: 184920962 Signed-off-by: Ray Chi Change-Id: I1170d853be1fa1c47afbba133567b1996418d8e8 --- drivers/usb/dwc3/trace.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/drivers/usb/dwc3/trace.c b/drivers/usb/dwc3/trace.c index 088995885678..8c4e2a7b142e 100644 --- a/drivers/usb/dwc3/trace.c +++ b/drivers/usb/dwc3/trace.c @@ -9,3 +9,6 @@ #define CREATE_TRACE_POINTS #include "trace.h" + +EXPORT_TRACEPOINT_SYMBOL_GPL(dwc3_readl); +EXPORT_TRACEPOINT_SYMBOL_GPL(dwc3_writel); From 01472f3af1855758388808e1f78da3fbeef66f2d Mon Sep 17 00:00:00 2001 From: Will McVicker Date: Wed, 31 Jan 2024 17:07:00 -0800 Subject: [PATCH 08/37] ANDROID: GKI: Update the pixel symbol list 2 function symbol(s) added 'int __traceiter_android_rvh_ufs_reprogram_all_keys(void*, struct ufs_hba*, int*)' 'int __traceiter_dwc3_readl(void*, void*, u32, u32)' 2 variable symbol(s) added 'struct tracepoint __tracepoint_android_rvh_ufs_reprogram_all_keys' 'struct tracepoint __tracepoint_dwc3_readl' Bug: 269652215 Change-Id: Id48d7d9770551c84f226f43de751eea48ae3eb7d Signed-off-by: Will McVicker --- android/abi_gki_aarch64.stg | 55 +++++++++++++++++++++++++++++++++++ android/abi_gki_aarch64_pixel | 7 +++++ 2 files changed, 62 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 058157fa278e..441397646f96 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -320946,6 +320946,13 @@ function { parameter_id: 0x6720d32f parameter_id: 0x11cfee5a } +function { + id: 0x9bb5603b + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x078316ff + parameter_id: 0x13580d6c +} function { id: 0x9bb5868f return_type_id: 0x6720d32f @@ -322439,6 +322446,14 @@ function { parameter_id: 0x2a670b41 parameter_id: 0x1c898f28 } +function { + id: 0x9bfc29dd + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x18bd6530 + parameter_id: 0xc9082b19 + parameter_id: 0xc9082b19 +} function { id: 0x9bfd1c84 return_type_id: 0x6720d32f @@ -337991,6 +338006,15 @@ elf_symbol { type_id: 0x9bca85c1 full_name: "__traceiter_android_rvh_uclamp_eff_get" } +elf_symbol { + id: 0x00e6d4cc + name: "__traceiter_android_rvh_ufs_reprogram_all_keys" + is_defined: true + symbol_type: FUNCTION + crc: 0xac38cf23 + type_id: 0x9bb5603b + full_name: "__traceiter_android_rvh_ufs_reprogram_all_keys" +} elf_symbol { id: 0xa63eb82a name: "__traceiter_android_rvh_update_blocked_fair" @@ -340529,6 +340553,15 @@ elf_symbol { type_id: 0x9ba39408 full_name: "__traceiter_dma_fence_emit" } +elf_symbol { + id: 0xafc53276 + name: "__traceiter_dwc3_readl" + is_defined: true + symbol_type: FUNCTION + crc: 0x26871a2b + type_id: 0x9bfc29dd + full_name: "__traceiter_dwc3_readl" +} elf_symbol { id: 0x5e5d9a70 name: "__traceiter_error_report_end" @@ -342050,6 +342083,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_rvh_uclamp_eff_get" } +elf_symbol { + id: 0xcfcbaf3e + name: "__tracepoint_android_rvh_ufs_reprogram_all_keys" + is_defined: true + symbol_type: OBJECT + crc: 0xa8c77d76 + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_rvh_ufs_reprogram_all_keys" +} elf_symbol { id: 0xc3add2dc name: "__tracepoint_android_rvh_update_blocked_fair" @@ -344588,6 +344630,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_dma_fence_emit" } +elf_symbol { + id: 0x53afc62c + name: "__tracepoint_dwc3_readl" + is_defined: true + symbol_type: OBJECT + crc: 0xe6691a80 + type_id: 0x18ccbd2c + full_name: "__tracepoint_dwc3_readl" +} elf_symbol { id: 0x3b13741e name: "__tracepoint_error_report_end" @@ -402135,6 +402186,7 @@ interface { symbol_id: 0x23097c08 symbol_id: 0xe3ee70ae symbol_id: 0xcce6f612 + symbol_id: 0x00e6d4cc symbol_id: 0xa63eb82a symbol_id: 0xcd824552 symbol_id: 0xb6d1fa25 @@ -402417,6 +402469,7 @@ interface { symbol_id: 0x7e705ab7 symbol_id: 0x7b03aae7 symbol_id: 0x92373f85 + symbol_id: 0xafc53276 symbol_id: 0x5e5d9a70 symbol_id: 0x104ffeec symbol_id: 0x6d4f31c4 @@ -402586,6 +402639,7 @@ interface { symbol_id: 0xafe46ece symbol_id: 0xe445d254 symbol_id: 0x64e2c288 + symbol_id: 0xcfcbaf3e symbol_id: 0xc3add2dc symbol_id: 0xdc2af26c symbol_id: 0xcc5017b7 @@ -402868,6 +402922,7 @@ interface { symbol_id: 0xbf086359 symbol_id: 0xef6e6795 symbol_id: 0xb2d6f207 + symbol_id: 0x53afc62c symbol_id: 0x3b13741e symbol_id: 0xd8f3ca82 symbol_id: 0xff315556 diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index e2940b3fcaf6..ce45d37ba6e0 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -400,6 +400,7 @@ device_property_present device_property_read_string device_property_read_u32_array + device_property_read_u8_array device_register device_remove_file device_remove_groups @@ -826,6 +827,7 @@ drm_self_refresh_helper_alter_state drm_send_event drm_send_event_locked + drm_sysfs_connector_status_event drm_universal_plane_init drm_vblank_init drm_writeback_connector_init @@ -1864,6 +1866,7 @@ remove_proc_entry remove_wait_queue request_firmware + request_firmware_direct request_firmware_nowait __request_percpu_irq __request_region @@ -2319,6 +2322,7 @@ __traceiter_android_rvh_set_user_nice_locked __traceiter_android_rvh_typec_tcpci_get_vbus __traceiter_android_rvh_uclamp_eff_get + __traceiter_android_rvh_ufs_reprogram_all_keys __traceiter_android_rvh_update_blocked_fair __traceiter_android_rvh_update_load_avg __traceiter_android_rvh_update_load_sum @@ -2370,6 +2374,7 @@ __traceiter_cpu_frequency __traceiter_device_pm_callback_end __traceiter_device_pm_callback_start + __traceiter_dwc3_readl __traceiter_gpu_mem_total __traceiter_hrtimer_expire_entry __traceiter_hrtimer_expire_exit @@ -2432,6 +2437,7 @@ __tracepoint_android_rvh_set_user_nice_locked __tracepoint_android_rvh_typec_tcpci_get_vbus __tracepoint_android_rvh_uclamp_eff_get + __tracepoint_android_rvh_ufs_reprogram_all_keys __tracepoint_android_rvh_update_blocked_fair __tracepoint_android_rvh_update_load_avg __tracepoint_android_rvh_update_load_sum @@ -2483,6 +2489,7 @@ __tracepoint_cpu_frequency __tracepoint_device_pm_callback_end __tracepoint_device_pm_callback_start + __tracepoint_dwc3_readl __tracepoint_gpu_mem_total __tracepoint_hrtimer_expire_entry __tracepoint_hrtimer_expire_exit From 9b476ebe99ad04458a259a7b91d93fb6caf6cff5 Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Thu, 1 Feb 2024 11:12:42 -0800 Subject: [PATCH 09/37] ANDROID: Build null_blk and scsi_debug as kernel modules Both kernel modules are important for testing block layer and SCSI core performance and functionality. Hence enable these in the kernel configuration. Bug: 323406846 Change-Id: I23cee78cd7d4e5f891395624a6bed01cffee4aa8 Signed-off-by: Bart Van Assche --- arch/arm64/configs/gki_defconfig | 2 ++ arch/x86/configs/gki_defconfig | 2 ++ modules.bzl | 5 +++++ 3 files changed, 9 insertions(+) diff --git a/arch/arm64/configs/gki_defconfig b/arch/arm64/configs/gki_defconfig index dbf1e1ca23fd..bc18ada0bd54 100644 --- a/arch/arm64/configs/gki_defconfig +++ b/arch/arm64/configs/gki_defconfig @@ -309,6 +309,7 @@ CONFIG_ARM_SCPI_PROTOCOL=y # CONFIG_ARM_SCPI_POWER_DOMAIN is not set # CONFIG_EFI_ARMSTUB_DTB_LOADER is not set CONFIG_GNSS=y +CONFIG_BLK_DEV_NULL_BLK=m CONFIG_ZRAM=m CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 @@ -322,6 +323,7 @@ CONFIG_UID_SYS_STATS=y CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y +CONFIG_SCSI_DEBUG=m CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y diff --git a/arch/x86/configs/gki_defconfig b/arch/x86/configs/gki_defconfig index 8330afe50d28..8090b1ca2a28 100644 --- a/arch/x86/configs/gki_defconfig +++ b/arch/x86/configs/gki_defconfig @@ -295,6 +295,7 @@ CONFIG_FW_LOADER_USER_HELPER=y # CONFIG_FW_CACHE is not set CONFIG_GNSS=y CONFIG_OF=y +CONFIG_BLK_DEV_NULL_BLK=m CONFIG_ZRAM=m CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_LOOP_MIN_COUNT=16 @@ -308,6 +309,7 @@ CONFIG_UID_SYS_STATS=y CONFIG_SCSI=y # CONFIG_SCSI_PROC_FS is not set CONFIG_BLK_DEV_SD=y +CONFIG_SCSI_DEBUG=m CONFIG_MD=y CONFIG_BLK_DEV_DM=y CONFIG_DM_CRYPT=y diff --git a/modules.bzl b/modules.bzl index 52d92225aab4..ad71a36c4ff5 100644 --- a/modules.bzl +++ b/modules.bzl @@ -8,6 +8,9 @@ This module contains a full list of kernel modules _COMMON_GKI_MODULES_LIST = [ # keep sorted + "crypto/crct10dif_common.ko", + "crypto/crct10dif_generic.ko", + "drivers/block/null_blk/null_blk.ko", "drivers/block/zram/zram.ko", "drivers/bluetooth/btbcm.ko", "drivers/bluetooth/btqca.ko", @@ -35,10 +38,12 @@ _COMMON_GKI_MODULES_LIST = [ "drivers/net/usb/rtl8150.ko", "drivers/net/usb/usbnet.ko", "drivers/net/wwan/wwan.ko", + "drivers/scsi/scsi_debug.ko", "drivers/usb/class/cdc-acm.ko", "drivers/usb/serial/ftdi_sio.ko", "drivers/usb/serial/usbserial.ko", "kernel/kheaders.ko", + "lib/crc-t10dif.ko", "lib/crypto/libarc4.ko", "mm/zsmalloc.ko", "net/6lowpan/6lowpan.ko", From b53c3cb351a8c0da8790b0d6e7a69278a0e93d2e Mon Sep 17 00:00:00 2001 From: Qais Yousef Date: Thu, 1 Feb 2024 09:53:04 +0000 Subject: [PATCH 10/37] ANDROID: Export cpufreq_driver_test_flags() The function is required by out of tree cpufreq governors. Bug: 322549912 Signed-off-by: Qais Yousef Change-Id: Ib62bb957d72878a56cbbd955447b372cdad3b92c --- drivers/cpufreq/cpufreq.c | 1 + 1 file changed, 1 insertion(+) diff --git a/drivers/cpufreq/cpufreq.c b/drivers/cpufreq/cpufreq.c index 111864a319e3..53b98d66894a 100644 --- a/drivers/cpufreq/cpufreq.c +++ b/drivers/cpufreq/cpufreq.c @@ -1983,6 +1983,7 @@ bool cpufreq_driver_test_flags(u16 flags) { return !!(cpufreq_driver->flags & flags); } +EXPORT_SYMBOL_GPL(cpufreq_driver_test_flags); /** * cpufreq_get_current_driver - Return the current driver's name. From 5eb1cbb38450e0a75783f9755c6d33152ce267c1 Mon Sep 17 00:00:00 2001 From: Qais Yousef Date: Thu, 1 Feb 2024 10:00:12 +0000 Subject: [PATCH 11/37] ANDROID: Update the ABI symbol list Adding the following symbols: - cpufreq_driver_test_flags Bug: 322549912 Change-Id: If11bb96309537e0ee20aaf609dc2cf4ae6324078 Signed-off-by: Qais Yousef --- android/abi_gki_aarch64.stg | 15 +++++++++++++++ android/abi_gki_aarch64_pixel | 1 + 2 files changed, 16 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 441397646f96..5f934645c0bc 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -331174,6 +331174,11 @@ function { parameter_id: 0x3e10b518 parameter_id: 0x18bd6530 } +function { + id: 0xdaf734f3 + return_type_id: 0x6d7f5ff6 + parameter_id: 0x914dbfdc +} function { id: 0xdb53d61f return_type_id: 0x3f095459 @@ -351003,6 +351008,15 @@ elf_symbol { type_id: 0x9ce01ea2 full_name: "cpufreq_driver_target" } +elf_symbol { + id: 0x9d35d7e0 + name: "cpufreq_driver_test_flags" + is_defined: true + symbol_type: FUNCTION + crc: 0x4d63667e + type_id: 0xdaf734f3 + full_name: "cpufreq_driver_test_flags" +} elf_symbol { id: 0x39e2d50e name: "cpufreq_enable_boost_support" @@ -403631,6 +403645,7 @@ interface { symbol_id: 0xd72ba404 symbol_id: 0x62250f4d symbol_id: 0x1b33e29e + symbol_id: 0x9d35d7e0 symbol_id: 0x39e2d50e symbol_id: 0x4eff590a symbol_id: 0xe94841a9 diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index ce45d37ba6e0..0a28ad08280d 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -238,6 +238,7 @@ cpufreq_driver_resolve_freq __cpufreq_driver_target cpufreq_driver_target + cpufreq_driver_test_flags cpufreq_enable_fast_switch cpufreq_freq_transition_begin cpufreq_freq_transition_end From 016b640235880e89b280dcbb6985ec6d6acf3fa2 Mon Sep 17 00:00:00 2001 From: chenyuwen Date: Mon, 29 Jan 2024 11:59:29 +0800 Subject: [PATCH 12/37] ANDROID: fuse: Fix the issue of fuse_dentry_canonical_path The d_canonical_path is added for Android. The another fuse daemon such as ntfs.3g do not implement it. The fsnotify can not work when using those fuse daemon. Fixes: aca265111afa ("ANDROID: fuse: Add support for d_canonical_path") Change-Id: I4244431fa1520b5bc33e07da456b3062b635dc5c Signed-off-by: chenyuwen --- fs/fuse/dir.c | 11 ++++++++++- fs/fuse/fuse_i.h | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/fs/fuse/dir.c b/fs/fuse/dir.c index 6770f1f6d226..dd8764ac2048 100644 --- a/fs/fuse/dir.c +++ b/fs/fuse/dir.c @@ -426,7 +426,12 @@ static int fuse_dentry_canonical_path(const struct path *path, #ifdef CONFIG_FUSE_BPF struct fuse_err_ret fer; +#endif + if (fm->fc->no_dentry_canonical_path) + goto out; + +#ifdef CONFIG_FUSE_BPF fer = fuse_bpf_backing(inode, struct fuse_dummy_io, fuse_canonical_path_initialize, fuse_canonical_path_backing, @@ -453,9 +458,13 @@ static int fuse_dentry_canonical_path(const struct path *path, free_page((unsigned long)path_name); if (err > 0) return 0; - if (err < 0) + if (err < 0 && err != -ENOSYS) return err; + if (err == -ENOSYS) + fm->fc->no_dentry_canonical_path = 1; + +out: canonical_path->dentry = path->dentry; canonical_path->mnt = path->mnt; path_get(canonical_path); diff --git a/fs/fuse/fuse_i.h b/fs/fuse/fuse_i.h index 723d462a54eb..5426ba83cb47 100644 --- a/fs/fuse/fuse_i.h +++ b/fs/fuse/fuse_i.h @@ -797,6 +797,9 @@ struct fuse_conn { /** Is bmap not implemented by fs? */ unsigned no_bmap:1; + /** Is dentry_canonical_path not implemented by fs? */ + unsigned no_dentry_canonical_path:1; + /** Is poll not implemented by fs? */ unsigned no_poll:1; From 76f0396b5761839858ea501b31508708a7517114 Mon Sep 17 00:00:00 2001 From: chenweitao Date: Fri, 2 Feb 2024 10:34:25 +0800 Subject: [PATCH 13/37] ANDROID: ABI: Update oplus symbol list 1 function symbol(s) added 'int __traceiter_android_vh_binder_detect_low_async_space_locked(void*, int, size_t*, int, bool*)' 1 variable symbol(s) added 'struct tracepoint __tracepoint_android_binder_detect_low_async_space_locked' Bug: 322915513 Change-Id: I99867fc9a643b50ba607d948a228c02bc30df424 Signed-off-by: chenweitao --- android/abi_gki_aarch64.stg | 29 +++++++++++++++++++++++++++++ android/abi_gki_aarch64_oplus | 2 ++ 2 files changed, 31 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 5f934645c0bc..c9156e45b69b 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -317481,6 +317481,15 @@ function { parameter_id: 0x1d19a9d5 parameter_id: 0x064d6086 } +function { + id: 0x9a3f4687 + return_type_id: 0x6720d32f + parameter_id: 0x18bd6530 + parameter_id: 0x6720d32f + parameter_id: 0x379d63b0 + parameter_id: 0x6720d32f + parameter_id: 0x11cfee5a +} function { id: 0x9a3f491c return_type_id: 0x6720d32f @@ -338254,6 +338263,15 @@ elf_symbol { type_id: 0x9bdcd3ab full_name: "__traceiter_android_vh_binder_del_ref" } +elf_symbol { + id: 0x6da7faa3 + name: "__traceiter_android_vh_binder_detect_low_async_space_locked" + is_defined: true + symbol_type: FUNCTION + crc: 0xb770ab60 + type_id: 0x9a3f4687 + full_name: "__traceiter_android_vh_binder_detect_low_async_space_locked" +} elf_symbol { id: 0xcb807696 name: "__traceiter_android_vh_binder_free_buf" @@ -342331,6 +342349,15 @@ elf_symbol { type_id: 0x18ccbd2c full_name: "__tracepoint_android_vh_binder_del_ref" } +elf_symbol { + id: 0xd995cae5 + name: "__tracepoint_android_vh_binder_detect_low_async_space_locked" + is_defined: true + symbol_type: OBJECT + crc: 0x5112d40e + type_id: 0x18ccbd2c + full_name: "__tracepoint_android_vh_binder_detect_low_async_space_locked" +} elf_symbol { id: 0x19dded7c name: "__tracepoint_android_vh_binder_free_buf" @@ -402227,6 +402254,7 @@ interface { symbol_id: 0x528da532 symbol_id: 0x530ad17d symbol_id: 0x6e0b473c + symbol_id: 0x6da7faa3 symbol_id: 0xcb807696 symbol_id: 0xbebf7d98 symbol_id: 0xe87f2d41 @@ -402680,6 +402708,7 @@ interface { symbol_id: 0xfb7cdd24 symbol_id: 0xc8703937 symbol_id: 0x61b56472 + symbol_id: 0xd995cae5 symbol_id: 0x19dded7c symbol_id: 0xf32898c6 symbol_id: 0x28cc114f diff --git a/android/abi_gki_aarch64_oplus b/android/abi_gki_aarch64_oplus index 38ee6cb19e5f..4249e546c66c 100644 --- a/android/abi_gki_aarch64_oplus +++ b/android/abi_gki_aarch64_oplus @@ -142,6 +142,7 @@ __traceiter_android_vh_binder_thread_read __traceiter_android_vh_binder_thread_release __traceiter_android_vh_binder_wait_for_work + __traceiter_android_vh_binder_detect_low_async_space_locked __traceiter_android_vh_cgroup_set_task __traceiter_android_vh_check_folio_look_around_ref __traceiter_android_vh_dup_task_struct @@ -233,6 +234,7 @@ __tracepoint_android_vh_binder_thread_read __tracepoint_android_vh_binder_thread_release __tracepoint_android_vh_binder_wait_for_work + __tracepoint_android_vh_binder_detect_low_async_space_locked __tracepoint_android_vh_cgroup_set_task __tracepoint_android_vh_check_folio_look_around_ref __tracepoint_android_vh_do_futex From ba97ad7b91bbb3b9ad03c6c265e7ffb4fd5ad732 Mon Sep 17 00:00:00 2001 From: Florian Westphal Date: Sat, 20 Jan 2024 22:50:04 +0100 Subject: [PATCH 14/37] UPSTREAM: netfilter: nf_tables: reject QUEUE/DROP verdict parameters commit f342de4e2f33e0e39165d8639387aa6c19dff660 upstream. This reverts commit e0abdadcc6e1. core.c:nf_hook_slow assumes that the upper 16 bits of NF_DROP verdicts contain a valid errno, i.e. -EPERM, -EHOSTUNREACH or similar, or 0. Due to the reverted commit, its possible to provide a positive value, e.g. NF_ACCEPT (1), which results in use-after-free. Its not clear to me why this commit was made. NF_QUEUE is not used by nftables; "queue" rules in nftables will result in use of "nft_queue" expression. If we later need to allow specifiying errno values from userspace (do not know why), this has to call NF_DROP_GETERR and check that "err <= 0" holds true. Bug: 323034288 Fixes: e0abdadcc6e1 ("netfilter: nf_tables: accept QUEUE/DROP verdict parameters") Cc: stable@vger.kernel.org Reported-by: Notselwyn Signed-off-by: Florian Westphal Signed-off-by: Pablo Neira Ayuso Signed-off-by: Greg Kroah-Hartman (cherry picked from commit 8e34430e33b8a80bc014f3efe29cac76bc30a4b4) Signed-off-by: Lee Jones Change-Id: Ie6c699cea6f92cd4a7642f196d5f5cbffe268a6d --- net/netfilter/nf_tables_api.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index 3d6ebb9877a4..c0b8aa3c3e40 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -10427,16 +10427,10 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data, data->verdict.code = ntohl(nla_get_be32(tb[NFTA_VERDICT_CODE])); switch (data->verdict.code) { - default: - switch (data->verdict.code & NF_VERDICT_MASK) { - case NF_ACCEPT: - case NF_DROP: - case NF_QUEUE: - break; - default: - return -EINVAL; - } - fallthrough; + case NF_ACCEPT: + case NF_DROP: + case NF_QUEUE: + break; case NFT_CONTINUE: case NFT_BREAK: case NFT_RETURN: @@ -10471,6 +10465,8 @@ static int nft_verdict_init(const struct nft_ctx *ctx, struct nft_data *data, data->verdict.chain = chain; break; + default: + return -EINVAL; } desc->len = sizeof(data->verdict); From 1e6c1ca9a2d74182de9b4458981aff2c008000f8 Mon Sep 17 00:00:00 2001 From: Dmitry Baryshkov Date: Sat, 13 Jan 2024 22:55:48 +0200 Subject: [PATCH 15/37] UPSTREAM: usb: typec: tcpm: fix the PD disabled case If the PD is disabled for the port, port->pds will be left as NULL, which causes the following crash during caps intilisation. Fix the crash. Unable to handle kernel NULL pointer dereference at virtual address 0000000000000000 Call trace: tcpm_register_port+0xaec/0xc44 qcom_pmic_typec_probe+0x1a4/0x254 platform_probe+0x68/0xc0 really_probe+0x148/0x2ac __driver_probe_device+0x78/0x12c driver_probe_device+0xd8/0x160 Bluetooth: hci0: QCA Product ID :0x0000000a __device_attach_driver+0xb8/0x138 bus_for_each_drv+0x80/0xdc Bluetooth: hci0: QCA SOC Version :0x40020150 __device_attach+0x9c/0x188 device_initial_probe+0x14/0x20 bus_probe_device+0xac/0xb0 deferred_probe_work_func+0x8c/0xc8 process_one_work+0x1ec/0x51c worker_thread+0x1ec/0x3e4 kthread+0x120/0x124 ret_from_fork+0x10/0x20 Fixes: cd099cde4ed2 ("usb: typec: tcpm: Support multiple capabilities") Signed-off-by: Dmitry Baryshkov Reviewed-by: Heikki Krogerus Link: https://lore.kernel.org/r/20240113-pmi632-typec-v2-5-182d9aa0a5b3@linaro.org Signed-off-by: Greg Kroah-Hartman BUG: 206108037 (cherry picked from commit f2e5d3de7e1fbf24483e7f996e519b3ebc3935a1) Change-Id: If3e81f4bc7c22830d8b0e8400b6e2fc8719a7f6b Signed-off-by: Kyle Tso --- drivers/usb/typec/tcpm/tcpm.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index 09f2bacaee75..963ffeae0071 100644 --- a/drivers/usb/typec/tcpm/tcpm.c +++ b/drivers/usb/typec/tcpm/tcpm.c @@ -6878,7 +6878,8 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) if (err) goto out_role_sw_put; - port->typec_caps.pd = port->pds[0]; + if (port->pds) + port->typec_caps.pd = port->pds[0]; port->typec_port = typec_register_port(port->dev, &port->typec_caps); if (IS_ERR(port->typec_port)) { From eb20497d6d0f2013ffa4625d6ce67e0b8bec7450 Mon Sep 17 00:00:00 2001 From: Andre Ding Date: Tue, 6 Feb 2024 17:48:26 +0800 Subject: [PATCH 16/37] ANDROID: abi_gki_aarch64_qcom: Update symbol list The Marvell phy AQR113c requires below symbols to enhance debugging. genphy_c45_an_config_aneg genphy_c45_check_and_restart_aneg genphy_c45_pma_setup_forced genphy_c45_read_status phy_modify_mmd_changed phy_resolve_aneg_linkmode phy_set_max_speed Bug: 324005886 Change-Id: Ie20cbecbc01c885eab701416ee499f0f1dc2dd66 Signed-off-by: Andre Ding --- android/abi_gki_aarch64.stg | 30 ++++++++++++++++++++++++++++++ android/abi_gki_aarch64_qcom | 7 +++++++ 2 files changed, 37 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index c9156e45b69b..6493a09d89b1 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -363931,6 +363931,24 @@ elf_symbol { type_id: 0x91dd4b0e full_name: "genphy_c37_read_status" } +elf_symbol { + id: 0xd1e108fe + name: "genphy_c45_an_config_aneg" + is_defined: true + symbol_type: FUNCTION + crc: 0x1cb65abd + type_id: 0x91dd4b0e + full_name: "genphy_c45_an_config_aneg" +} +elf_symbol { + id: 0x084b19b7 + name: "genphy_c45_check_and_restart_aneg" + is_defined: true + symbol_type: FUNCTION + crc: 0x219cff56 + type_id: 0x9068b671 + full_name: "genphy_c45_check_and_restart_aneg" +} elf_symbol { id: 0x607c937c name: "genphy_c45_fast_retrain" @@ -363949,6 +363967,15 @@ elf_symbol { type_id: 0x91dd4b0e full_name: "genphy_c45_pma_setup_forced" } +elf_symbol { + id: 0xa3a0e5a9 + name: "genphy_c45_read_status" + is_defined: true + symbol_type: FUNCTION + crc: 0x152eb861 + type_id: 0x91dd4b0e + full_name: "genphy_c45_read_status" +} elf_symbol { id: 0x618539bc name: "genphy_handle_interrupt_no_ack" @@ -405105,8 +405132,11 @@ interface { symbol_id: 0x343a2d56 symbol_id: 0xa0c0d25f symbol_id: 0xb87c5ff6 + symbol_id: 0xd1e108fe + symbol_id: 0x084b19b7 symbol_id: 0x607c937c symbol_id: 0xd99708c7 + symbol_id: 0xa3a0e5a9 symbol_id: 0x618539bc symbol_id: 0xe00705b3 symbol_id: 0xcaf802e6 diff --git a/android/abi_gki_aarch64_qcom b/android/abi_gki_aarch64_qcom index a02230f1881d..0b1de549cbd6 100644 --- a/android/abi_gki_aarch64_qcom +++ b/android/abi_gki_aarch64_qcom @@ -1207,6 +1207,10 @@ genlmsg_put genl_register_family genl_unregister_family + genphy_c45_an_config_aneg + genphy_c45_check_and_restart_aneg + genphy_c45_pma_setup_forced + genphy_c45_read_status __genphy_config_aneg genphy_read_abilities genphy_read_mmd_unsupported @@ -2370,9 +2374,12 @@ phy_mac_interrupt phy_modify phy_modify_mmd + phy_modify_mmd_changed phy_power_off phy_power_on phy_read_mmd + phy_resolve_aneg_linkmode + phy_set_max_speed phy_set_mode_ext phy_suspend phy_trigger_machine From 8c8bcbdf0bee03ef915b7f7f29a9896ee560d651 Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Mon, 2 Oct 2023 16:09:35 -0700 Subject: [PATCH 17/37] BACKPORT: f2fs: Support Block Size == Page Size This allows f2fs to support cases where the block size = page size for both 4K and 16K block sizes. Other sizes should work as well, should the need arise. This does not currently support 4K Block size filesystems if the page size is 16K. Change-Id: Ifab03cddeec1389a6a3fb64174063ffccbb93072 Signed-off-by: Daniel Rosenberg Signed-off-by: Jaegeuk Kim Bug: 248132568 (cherry picked from commit 8b8e202be3264fc33464f8dc319e0c1563ac89d8) (fixed minor conflict in fs/f2fs/inode.c) --- fs/f2fs/data.c | 2 +- fs/f2fs/inode.c | 2 +- fs/f2fs/node.c | 2 +- fs/f2fs/super.c | 4 +-- include/linux/f2fs_fs.h | 69 ++++++++++++++++++++++++----------------- 5 files changed, 46 insertions(+), 33 deletions(-) diff --git a/fs/f2fs/data.c b/fs/f2fs/data.c index 2dab40e70e88..db5076c223d9 100644 --- a/fs/f2fs/data.c +++ b/fs/f2fs/data.c @@ -4036,7 +4036,7 @@ next: sis->highest_bit = cur_lblock - 1; out: if (not_aligned) - f2fs_warn(sbi, "Swapfile (%u) is not align to section: 1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate(%u * N)", + f2fs_warn(sbi, "Swapfile (%u) is not align to section: 1) creat(), 2) ioctl(F2FS_IOC_SET_PIN_FILE), 3) fallocate(%lu * N)", not_aligned, blks_per_sec * F2FS_BLKSIZE); return ret; } diff --git a/fs/f2fs/inode.c b/fs/f2fs/inode.c index a99c151e3bdc..8761aad2329e 100644 --- a/fs/f2fs/inode.c +++ b/fs/f2fs/inode.c @@ -256,7 +256,7 @@ static bool sanity_check_inode(struct inode *inode, struct page *node_page) (!fi->i_inline_xattr_size || fi->i_inline_xattr_size > MAX_INLINE_XATTR_SIZE)) { set_sbi_flag(sbi, SBI_NEED_FSCK); - f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_inline_xattr_size: %d, max: %zu", + f2fs_warn(sbi, "%s: inode (ino=%lx) has corrupted i_inline_xattr_size: %d, max: %lu", __func__, inode->i_ino, fi->i_inline_xattr_size, MAX_INLINE_XATTR_SIZE); return false; diff --git a/fs/f2fs/node.c b/fs/f2fs/node.c index f306325e966a..9c5f70da8002 100644 --- a/fs/f2fs/node.c +++ b/fs/f2fs/node.c @@ -633,7 +633,7 @@ static void f2fs_ra_node_pages(struct page *parent, int start, int n) /* Then, try readahead for siblings of the desired node */ end = start + n; - end = min(end, NIDS_PER_BLOCK); + end = min(end, (int)NIDS_PER_BLOCK); for (i = start; i < end; i++) { nid = get_nid(parent, i, false); f2fs_ra_node_page(sbi, nid); diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index 6c8f18427cd8..ab79c9ccfeda 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -3420,7 +3420,7 @@ static int sanity_check_raw_super(struct f2fs_sb_info *sbi, return -EFSCORRUPTED; } - /* Currently, support 512/1024/2048/4096 bytes sector size */ + /* Currently, support 512/1024/2048/4096/16K bytes sector size */ if (le32_to_cpu(raw_super->log_sectorsize) > F2FS_MAX_LOG_SECTOR_SIZE || le32_to_cpu(raw_super->log_sectorsize) < @@ -4771,7 +4771,7 @@ static int __init init_f2fs_fs(void) int err; if (PAGE_SIZE != F2FS_BLKSIZE) { - printk("F2FS not supported on PAGE_SIZE(%lu) != %d\n", + printk("F2FS not supported on PAGE_SIZE(%lu) != BLOCK_SIZE(%lu)\n", PAGE_SIZE, F2FS_BLKSIZE); return -EINVAL; } diff --git a/include/linux/f2fs_fs.h b/include/linux/f2fs_fs.h index 1d6402529d10..9d798ddf88d7 100644 --- a/include/linux/f2fs_fs.h +++ b/include/linux/f2fs_fs.h @@ -13,10 +13,10 @@ #define F2FS_SUPER_OFFSET 1024 /* byte-size offset */ #define F2FS_MIN_LOG_SECTOR_SIZE 9 /* 9 bits for 512 bytes */ -#define F2FS_MAX_LOG_SECTOR_SIZE 12 /* 12 bits for 4096 bytes */ -#define F2FS_LOG_SECTORS_PER_BLOCK 3 /* log number for sector/blk */ -#define F2FS_BLKSIZE 4096 /* support only 4KB block */ -#define F2FS_BLKSIZE_BITS 12 /* bits for F2FS_BLKSIZE */ +#define F2FS_MAX_LOG_SECTOR_SIZE PAGE_SHIFT /* Max is Block Size */ +#define F2FS_LOG_SECTORS_PER_BLOCK (PAGE_SHIFT - 9) /* log number for sector/blk */ +#define F2FS_BLKSIZE PAGE_SIZE /* support only block == page */ +#define F2FS_BLKSIZE_BITS PAGE_SHIFT /* bits for F2FS_BLKSIZE */ #define F2FS_MAX_EXTENSION 64 /* # of extension entries */ #define F2FS_EXTENSION_LEN 8 /* max size of extension */ #define F2FS_BLK_ALIGN(x) (((x) + F2FS_BLKSIZE - 1) >> F2FS_BLKSIZE_BITS) @@ -209,14 +209,14 @@ struct f2fs_checkpoint { unsigned char sit_nat_version_bitmap[]; } __packed; -#define CP_CHKSUM_OFFSET 4092 /* default chksum offset in checkpoint */ +#define CP_CHKSUM_OFFSET (F2FS_BLKSIZE - sizeof(__le32)) /* default chksum offset in checkpoint */ #define CP_MIN_CHKSUM_OFFSET \ (offsetof(struct f2fs_checkpoint, sit_nat_version_bitmap)) /* * For orphan inode management */ -#define F2FS_ORPHANS_PER_BLOCK 1020 +#define F2FS_ORPHANS_PER_BLOCK ((F2FS_BLKSIZE - 4 * sizeof(__le32)) / sizeof(__le32)) #define GET_ORPHAN_BLOCKS(n) (((n) + F2FS_ORPHANS_PER_BLOCK - 1) / \ F2FS_ORPHANS_PER_BLOCK) @@ -242,14 +242,31 @@ struct f2fs_extent { #define F2FS_NAME_LEN 255 /* 200 bytes for inline xattrs by default */ #define DEFAULT_INLINE_XATTR_ADDRS 50 -#define DEF_ADDRS_PER_INODE 923 /* Address Pointers in an Inode */ + +#define OFFSET_OF_END_OF_I_EXT 360 +#define SIZE_OF_I_NID 20 + +struct node_footer { + __le32 nid; /* node id */ + __le32 ino; /* inode number */ + __le32 flag; /* include cold/fsync/dentry marks and offset */ + __le64 cp_ver; /* checkpoint version */ + __le32 next_blkaddr; /* next node page block address */ +} __packed; + +/* Address Pointers in an Inode */ +#define DEF_ADDRS_PER_INODE ((F2FS_BLKSIZE - OFFSET_OF_END_OF_I_EXT \ + - SIZE_OF_I_NID \ + - sizeof(struct node_footer)) / sizeof(__le32)) #define CUR_ADDRS_PER_INODE(inode) (DEF_ADDRS_PER_INODE - \ get_extra_isize(inode)) #define DEF_NIDS_PER_INODE 5 /* Node IDs in an Inode */ #define ADDRS_PER_INODE(inode) addrs_per_inode(inode) -#define DEF_ADDRS_PER_BLOCK 1018 /* Address Pointers in a Direct Block */ +/* Address Pointers in a Direct Block */ +#define DEF_ADDRS_PER_BLOCK ((F2FS_BLKSIZE - sizeof(struct node_footer)) / sizeof(__le32)) #define ADDRS_PER_BLOCK(inode) addrs_per_block(inode) -#define NIDS_PER_BLOCK 1018 /* Node IDs in an Indirect Block */ +/* Node IDs in an Indirect Block */ +#define NIDS_PER_BLOCK ((F2FS_BLKSIZE - sizeof(struct node_footer)) / sizeof(__le32)) #define ADDRS_PER_PAGE(page, inode) \ (IS_INODE(page) ? ADDRS_PER_INODE(inode) : ADDRS_PER_BLOCK(inode)) @@ -341,14 +358,6 @@ enum { #define OFFSET_BIT_MASK GENMASK(OFFSET_BIT_SHIFT - 1, 0) -struct node_footer { - __le32 nid; /* node id */ - __le32 ino; /* inode number */ - __le32 flag; /* include cold/fsync/dentry marks and offset */ - __le64 cp_ver; /* checkpoint version */ - __le32 next_blkaddr; /* next node page block address */ -} __packed; - struct f2fs_node { /* can be one of three types: inode, direct, and indirect types */ union { @@ -362,7 +371,7 @@ struct f2fs_node { /* * For NAT entries */ -#define NAT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_nat_entry)) +#define NAT_ENTRY_PER_BLOCK (F2FS_BLKSIZE / sizeof(struct f2fs_nat_entry)) struct f2fs_nat_entry { __u8 version; /* latest version of cached nat entry */ @@ -377,12 +386,13 @@ struct f2fs_nat_block { /* * For SIT entries * - * Each segment is 2MB in size by default so that a bitmap for validity of - * there-in blocks should occupy 64 bytes, 512 bits. + * A validity bitmap of 64 bytes covers 512 blocks of area. For a 4K page size, + * this results in a segment size of 2MB. For 16k pages, the default segment size + * is 8MB. * Not allow to change this. */ #define SIT_VBLOCK_MAP_SIZE 64 -#define SIT_ENTRY_PER_BLOCK (PAGE_SIZE / sizeof(struct f2fs_sit_entry)) +#define SIT_ENTRY_PER_BLOCK (F2FS_BLKSIZE / sizeof(struct f2fs_sit_entry)) /* * F2FS uses 4 bytes to represent block address. As a result, supported size of @@ -417,7 +427,7 @@ struct f2fs_sit_block { * For segment summary * * One summary block contains exactly 512 summary entries, which represents - * exactly 2MB segment by default. Not allow to change the basic units. + * exactly one segment by default. Not allow to change the basic units. * * NOTE: For initializing fields, you must use set_summary * @@ -428,12 +438,12 @@ struct f2fs_sit_block { * from node's page's beginning to get a data block address. * ex) data_blkaddr = (block_t)(nodepage_start_address + ofs_in_node) */ -#define ENTRIES_IN_SUM 512 +#define ENTRIES_IN_SUM (F2FS_BLKSIZE / 8) #define SUMMARY_SIZE (7) /* sizeof(struct summary) */ #define SUM_FOOTER_SIZE (5) /* sizeof(struct summary_footer) */ #define SUM_ENTRY_SIZE (SUMMARY_SIZE * ENTRIES_IN_SUM) -/* a summary entry for a 4KB-sized block in a segment */ +/* a summary entry for a block in a segment */ struct f2fs_summary { __le32 nid; /* parent node id */ union { @@ -517,7 +527,7 @@ struct f2fs_journal { }; } __packed; -/* 4KB-sized summary block structure */ +/* Block-sized summary block structure */ struct f2fs_summary_block { struct f2fs_summary entries[ENTRIES_IN_SUM]; struct f2fs_journal journal; @@ -558,11 +568,14 @@ typedef __le32 f2fs_hash_t; * Note: there are more reserved space in inline dentry than in regular * dentry, when converting inline dentry we should handle this carefully. */ -#define NR_DENTRY_IN_BLOCK 214 /* the number of dentry in a block */ + +/* the number of dentry in a block */ +#define NR_DENTRY_IN_BLOCK ((BITS_PER_BYTE * F2FS_BLKSIZE) / \ + ((SIZE_OF_DIR_ENTRY + F2FS_SLOT_LEN) * BITS_PER_BYTE + 1)) #define SIZE_OF_DIR_ENTRY 11 /* by byte */ #define SIZE_OF_DENTRY_BITMAP ((NR_DENTRY_IN_BLOCK + BITS_PER_BYTE - 1) / \ BITS_PER_BYTE) -#define SIZE_OF_RESERVED (PAGE_SIZE - ((SIZE_OF_DIR_ENTRY + \ +#define SIZE_OF_RESERVED (F2FS_BLKSIZE - ((SIZE_OF_DIR_ENTRY + \ F2FS_SLOT_LEN) * \ NR_DENTRY_IN_BLOCK + SIZE_OF_DENTRY_BITMAP)) #define MIN_INLINE_DENTRY_SIZE 40 /* just include '.' and '..' entries */ @@ -575,7 +588,7 @@ struct f2fs_dir_entry { __u8 file_type; /* file type */ } __packed; -/* 4KB-sized directory entry block */ +/* Block-sized directory entry block */ struct f2fs_dentry_block { /* validity bitmap for directory entries in each block */ __u8 dentry_bitmap[SIZE_OF_DENTRY_BITMAP]; From 6338e415095e0e747ee881f6eaa75c61504d3643 Mon Sep 17 00:00:00 2001 From: Daniel Rosenberg Date: Fri, 1 Dec 2023 17:05:40 -0800 Subject: [PATCH 18/37] BACKPORT: f2fs: Restrict max filesize for 16K f2fs Blocks are tracked by u32, so the max permitted filesize is (U32_MAX + 1) * BLOCK_SIZE. Additionally, in order to support crypto data unit sizes of 4K with a 16K block with IV_INO_LBLK_{32,64}, we must further restrict max filesize to (U32_MAX + 1) * 4096. This does not affect 4K blocksize f2fs as the natural limit for files are well below that. Fixes: cf46c5872022 ("BACKPORT: Support Block Size == Page Size") Signed-off-by: Daniel Rosenberg Signed-off-by: Jaegeuk Kim Change-Id: I8697e37841e1882a3f613e9aab1857ad7e4c3f2f Bug: 248132568 (cherry picked from commit a6a010f5def544af3efcfe21683905a712b60536) --- fs/f2fs/super.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/fs/f2fs/super.c b/fs/f2fs/super.c index ab79c9ccfeda..48dfcac6463a 100644 --- a/fs/f2fs/super.c +++ b/fs/f2fs/super.c @@ -3266,6 +3266,14 @@ loff_t max_file_blocks(struct inode *inode) leaf_count *= NIDS_PER_BLOCK; result += leaf_count; + /* + * For compatibility with FSCRYPT_POLICY_FLAG_IV_INO_LBLK_{64,32} with + * a 4K crypto data unit, we must restrict the max filesize to what can + * fit within U32_MAX + 1 data units. + */ + + result = min(result, (((loff_t)U32_MAX + 1) * 4096) >> F2FS_BLKSIZE_BITS); + return result; } From 696293ef723cab56b3bcfb436159cf0aa62fac6e Mon Sep 17 00:00:00 2001 From: Bo Ye Date: Mon, 5 Feb 2024 08:57:08 +0800 Subject: [PATCH 19/37] ANDROID: GKI: Update symbol list for mtk Add following symbols 1 function symbol(s) added 'bool usb_check_bulk_endpoints(const struct usb_interface*, const u8*)' Bug: 323718720 Change-Id: I0835786fb503e6e65f21116fa2b5d7e8fb83978d Signed-off-by: Bo Ye --- android/abi_gki_aarch64.stg | 16 ++++++++++++++++ android/abi_gki_aarch64_mtk | 1 + 2 files changed, 17 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 6493a09d89b1..1a118c993c5d 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -332487,6 +332487,12 @@ function { parameter_id: 0x292cb268 parameter_id: 0x11cfee5a } +function { + id: 0xf38427c4 + return_type_id: 0x6d7f5ff6 + parameter_id: 0x3771eb5c + parameter_id: 0x3f0185ef +} function { id: 0xf387c34f return_type_id: 0x6d7f5ff6 @@ -395789,6 +395795,15 @@ elf_symbol { type_id: 0xbf6cd8a9 full_name: "usb_calc_bus_time" } +elf_symbol { + id: 0x12289dad + name: "usb_check_bulk_endpoints" + is_defined: true + symbol_type: FUNCTION + crc: 0x7cd79799 + type_id: 0xf38427c4 + full_name: "usb_check_bulk_endpoints" +} elf_symbol { id: 0x23a5ab99 name: "usb_choose_configuration" @@ -408672,6 +408687,7 @@ interface { symbol_id: 0xb9dd1d1a symbol_id: 0x3d66dcb8 symbol_id: 0x1f68a496 + symbol_id: 0x12289dad symbol_id: 0x23a5ab99 symbol_id: 0x2a589f64 symbol_id: 0x7da41bc7 diff --git a/android/abi_gki_aarch64_mtk b/android/abi_gki_aarch64_mtk index fdc0e3b84455..2e2265dc1a57 100644 --- a/android/abi_gki_aarch64_mtk +++ b/android/abi_gki_aarch64_mtk @@ -3048,6 +3048,7 @@ usb_autopm_get_interface_no_resume usb_autopm_put_interface usb_autopm_put_interface_async + usb_check_bulk_endpoints usb_clear_halt usb_composite_probe usb_composite_unregister From 6053d8ffd4764c053dda5d7328ad8983f8fea03c Mon Sep 17 00:00:00 2001 From: Ard Biesheuvel Date: Tue, 23 Jan 2024 14:30:55 +0100 Subject: [PATCH 20/37] UPSTREAM: arm64: scs: Disable LTO for SCS patching code Full LTO takes the '-mbranch-protection=none' passed to the compiler when generating the dynamic shadow call stack patching code as a hint to stop emitting PAC instructions altogether. (Thin LTO appears unaffected by this) Work around this by disabling LTO for the compilation unit, which appears to convince the linker that it should still use PAC in the rest of the kernel.. Fixes: 3b619e22c460 ("arm64: implement dynamic shadow call stack for Clang") Signed-off-by: Ard Biesheuvel Reviewed-by: Kees Cook Reviewed-by: Sami Tolvanen Tested-by: Sami Tolvanen Link: https://lore.kernel.org/r/20240123133052.1417449-6-ardb+git@google.com Signed-off-by: Will Deacon (cherry picked from commit d104a6fef3fec137d8d44961224ab76edbd6cbc7) Bug: 317883735 Change-Id: Ic4bdb0a6e527f8cb2745282b81945aa7b7231502 Signed-off-by: Sami Tolvanen --- arch/arm64/kernel/Makefile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/arch/arm64/kernel/Makefile b/arch/arm64/kernel/Makefile index 8dd925f4a4c6..b96cc503ea04 100644 --- a/arch/arm64/kernel/Makefile +++ b/arch/arm64/kernel/Makefile @@ -81,7 +81,13 @@ obj-$(CONFIG_ARM64_MTE) += mte.o obj-y += vdso-wrap.o obj-$(CONFIG_COMPAT_VDSO) += vdso32-wrap.o obj-$(CONFIG_UNWIND_PATCH_PAC_INTO_SCS) += patch-scs.o + +# We need to prevent the SCS patching code from patching itself. Using +# -mbranch-protection=none here to avoid the patchable PAC opcodes from being +# generated triggers an issue with full LTO on Clang, which stops emitting PAC +# instructions altogether. So disable LTO as well for the compilation unit. CFLAGS_patch-scs.o += -mbranch-protection=none +CFLAGS_REMOVE_patch-scs.o += $(CC_FLAGS_LTO) # Force dependency (vdso*-wrap.S includes vdso.so through incbin) $(obj)/vdso-wrap.o: $(obj)/vdso/vdso.so From df2fe1add70e5d48ca5b244f5e47c2f520f678c2 Mon Sep 17 00:00:00 2001 From: Konrad Dybcio Date: Tue, 20 Jun 2023 13:43:21 +0200 Subject: [PATCH 21/37] UPSTREAM: drm/msm/dsi: Enable runtime PM commit 6ab502bc1cf3147ea1d8540d04b83a7a4cb6d1f1 upstream. Some devices power the DSI PHY/PLL through a power rail that we model as a GENPD. Enable runtime PM to make it suspendable. Signed-off-by: Konrad Dybcio Reviewed-by: Dmitry Baryshkov Patchwork: https://patchwork.freedesktop.org/patch/543352/ Link: https://lore.kernel.org/r/20230620-topic-dsiphy_rpm-v2-2-a11a751f34f0@linaro.org Signed-off-by: Dmitry Baryshkov Signed-off-by: Amit Pundir Signed-off-by: Greg Kroah-Hartman Bug: 146449535 Change-Id: I7cde481b64be594e5b4aa7fe7d9378d25f2e39b3 Signed-off-by: Amit Pundir --- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c index 7fc0975cb869..123b004cc284 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c @@ -671,6 +671,10 @@ static int dsi_phy_driver_probe(struct platform_device *pdev) return dev_err_probe(dev, PTR_ERR(phy->ahb_clk), "Unable to get ahb clk\n"); + ret = devm_pm_runtime_enable(&pdev->dev); + if (ret) + return ret; + /* PLL init will call into clk_register which requires * register access, so we need to enable power and ahb clock. */ From d3f73f04529a9b338fc09e256ed58248ca45ca5c Mon Sep 17 00:00:00 2001 From: Konrad Dybcio Date: Tue, 20 Jun 2023 13:43:20 +0200 Subject: [PATCH 22/37] UPSTREAM: drm/msm/dsi: Use pm_runtime_resume_and_get to prevent refcnt leaks [ Upstream commit 3d07a411b4faaf2b498760ccf12888f8de529de0 ] This helper has been introduced to avoid programmer errors (missing _put calls leading to dangling refcnt) when using pm_runtime_get, use it. While at it, start checking the return value. Signed-off-by: Konrad Dybcio Reviewed-by: Dmitry Baryshkov Fixes: 5c8290284402 ("drm/msm/dsi: Split PHY drivers to separate files") Patchwork: https://patchwork.freedesktop.org/patch/543350/ Link: https://lore.kernel.org/r/20230620-topic-dsiphy_rpm-v2-1-a11a751f34f0@linaro.org Signed-off-by: Dmitry Baryshkov Signed-off-by: Sasha Levin Bug: 146449535 Change-Id: I13c0463e50475f3a432818108bc48dd6482c3c7c Signed-off-by: Amit Pundir --- drivers/gpu/drm/msm/dsi/phy/dsi_phy.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c index 123b004cc284..c0bcf020ef66 100644 --- a/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c +++ b/drivers/gpu/drm/msm/dsi/phy/dsi_phy.c @@ -512,7 +512,9 @@ static int dsi_phy_enable_resource(struct msm_dsi_phy *phy) struct device *dev = &phy->pdev->dev; int ret; - pm_runtime_get_sync(dev); + ret = pm_runtime_resume_and_get(dev); + if (ret) + return ret; ret = clk_prepare_enable(phy->ahb_clk); if (ret) { From 4aedc102c3a31f590f8d3894d2b1fdf01f9585f3 Mon Sep 17 00:00:00 2001 From: Prakruthi Deepak Heragu Date: Mon, 5 Feb 2024 11:50:47 -0800 Subject: [PATCH 23/37] ANDROID: arm64: virt: Make the page_relinquish call generic Move out the kvm specific page_relinquish call and introduce a generic hypervisor_ops structure. Based on the hypervisor running underneath the guest, populate the operations to make specific hypercalls. Bug: 315173520 Change-Id: I93d5a92553a04d56811b0666dec6eacc1ca168e7 Signed-off-by: Prakruthi Deepak Heragu --- arch/arm64/include/asm/hypervisor.h | 11 ++++++++ arch/arm64/kernel/setup.c | 1 + arch/arm64/mm/mem_relinquish.c | 40 +++++++++++++++++------------ 3 files changed, 35 insertions(+), 17 deletions(-) diff --git a/arch/arm64/include/asm/hypervisor.h b/arch/arm64/include/asm/hypervisor.h index 9b4e4ed79623..9ad85b15dab0 100644 --- a/arch/arm64/include/asm/hypervisor.h +++ b/arch/arm64/include/asm/hypervisor.h @@ -2,6 +2,9 @@ #ifndef _ASM_ARM64_HYPERVISOR_H #define _ASM_ARM64_HYPERVISOR_H +#include +#include + #include void kvm_init_hyp_services(void); @@ -10,6 +13,14 @@ void kvm_arm_init_hyp_services(void); void kvm_init_memshare_services(void); void kvm_init_ioremap_services(void); +struct hypervisor_ops { +#ifdef CONFIG_MEMORY_RELINQUISH + void (*page_relinquish)(struct page *page); +#endif +}; + +extern struct hypervisor_ops hyp_ops; + #ifdef CONFIG_MEMORY_RELINQUISH void kvm_init_memrelinquish_services(void); #else diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c index a0bc75b721e0..20ca892d5e5c 100644 --- a/arch/arm64/kernel/setup.c +++ b/arch/arm64/kernel/setup.c @@ -58,6 +58,7 @@ static int num_standard_resources; static struct resource *standard_resources; +struct hypervisor_ops hyp_ops; phys_addr_t __fdt_pointer __initdata; diff --git a/arch/arm64/mm/mem_relinquish.c b/arch/arm64/mm/mem_relinquish.c index 7948098288e3..08bf966c7fc5 100644 --- a/arch/arm64/mm/mem_relinquish.c +++ b/arch/arm64/mm/mem_relinquish.c @@ -14,6 +14,24 @@ static unsigned long memshare_granule_sz; +static void kvm_page_relinquish(struct page *page) +{ + phys_addr_t phys, end; + u32 func_id = ARM_SMCCC_VENDOR_HYP_KVM_MEM_RELINQUISH_FUNC_ID; + + phys = page_to_phys(page); + end = phys + PAGE_SIZE; + + while (phys < end) { + struct arm_smccc_res res; + + arm_smccc_1_1_invoke(func_id, phys, 0, 0, &res); + BUG_ON(res.a0 != SMCCC_RET_SUCCESS); + + phys += memshare_granule_sz; + } +} + void kvm_init_memrelinquish_services(void) { int i; @@ -34,6 +52,9 @@ void kvm_init_memrelinquish_services(void) return; memshare_granule_sz = res.a0; + + if (memshare_granule_sz) + hyp_ops.page_relinquish = kvm_page_relinquish; } bool kvm_has_memrelinquish_services(void) @@ -44,22 +65,7 @@ EXPORT_SYMBOL_GPL(kvm_has_memrelinquish_services); void page_relinquish(struct page *page) { - phys_addr_t phys, end; - u32 func_id = ARM_SMCCC_VENDOR_HYP_KVM_MEM_RELINQUISH_FUNC_ID; - - if (!memshare_granule_sz) - return; - - phys = page_to_phys(page); - end = phys + PAGE_SIZE; - - while (phys < end) { - struct arm_smccc_res res; - - arm_smccc_1_1_invoke(func_id, phys, 0, 0, &res); - BUG_ON(res.a0 != SMCCC_RET_SUCCESS); - - phys += memshare_granule_sz; - } + if (hyp_ops.page_relinquish) + hyp_ops.page_relinquish(page); } EXPORT_SYMBOL_GPL(page_relinquish); From 886c9d1fc2b3a6c55c96e23e8ec0f5102a7e511d Mon Sep 17 00:00:00 2001 From: Prakruthi Deepak Heragu Date: Mon, 22 Jan 2024 12:10:04 -0800 Subject: [PATCH 24/37] ANDROID: arm64: virt: Invalidate tlb once the balloon before reporting/inflating Instead of invalidating the tlb of the guest every page it relinquishes, invalidate once before the host is informed about the free pages. Bug: 315173520 Change-Id: I8450fd552a27dfc791efa15e884982aeedaa3234 Signed-off-by: Prakruthi Deepak Heragu --- android/abi_gki_aarch64.stg | 10 ++++++++++ android/abi_gki_aarch64_virtual_device | 1 + arch/arm64/include/asm/hypervisor.h | 1 + arch/arm64/include/asm/mem_relinquish.h | 1 + arch/arm64/mm/mem_relinquish.c | 7 +++++++ drivers/virtio/virtio_balloon.c | 4 ++++ include/linux/mem_relinquish.h | 1 + 7 files changed, 25 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index 1a118c993c5d..ac4d5b6a98dc 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -380788,6 +380788,15 @@ elf_symbol { type_id: 0xf68b6f5e full_name: "poll_state_synchronize_srcu" } +elf_symbol { + id: 0x7bf7b7b1 + name: "post_page_relinquish_tlb_inv" + is_defined: true + symbol_type: FUNCTION + crc: 0xcc8be82d + type_id: 0x10985193 + full_name: "post_page_relinquish_tlb_inv" +} elf_symbol { id: 0xd612789c name: "power_supply_am_i_supplied" @@ -407019,6 +407028,7 @@ interface { symbol_id: 0x3020cd17 symbol_id: 0x25c6452e symbol_id: 0x324d8228 + symbol_id: 0x7bf7b7b1 symbol_id: 0xd612789c symbol_id: 0x561323f1 symbol_id: 0x50bfe1d8 diff --git a/android/abi_gki_aarch64_virtual_device b/android/abi_gki_aarch64_virtual_device index 1d728eb18373..8b1b9a58bf64 100644 --- a/android/abi_gki_aarch64_virtual_device +++ b/android/abi_gki_aarch64_virtual_device @@ -1143,6 +1143,7 @@ page_relinquish page_reporting_register page_reporting_unregister + post_page_relinquish_tlb_inv register_oom_notifier register_shrinker __SetPageMovable diff --git a/arch/arm64/include/asm/hypervisor.h b/arch/arm64/include/asm/hypervisor.h index 9ad85b15dab0..bc8c85959ece 100644 --- a/arch/arm64/include/asm/hypervisor.h +++ b/arch/arm64/include/asm/hypervisor.h @@ -16,6 +16,7 @@ void kvm_init_ioremap_services(void); struct hypervisor_ops { #ifdef CONFIG_MEMORY_RELINQUISH void (*page_relinquish)(struct page *page); + void (*post_page_relinquish_tlb_inv)(void); #endif }; diff --git a/arch/arm64/include/asm/mem_relinquish.h b/arch/arm64/include/asm/mem_relinquish.h index ac51786a4a11..5d03ccdbe778 100644 --- a/arch/arm64/include/asm/mem_relinquish.h +++ b/arch/arm64/include/asm/mem_relinquish.h @@ -11,5 +11,6 @@ struct page; bool kvm_has_memrelinquish_services(void); void page_relinquish(struct page *page); +void post_page_relinquish_tlb_inv(void); #endif /* __ASM_MEM_RELINQUISH_H */ diff --git a/arch/arm64/mm/mem_relinquish.c b/arch/arm64/mm/mem_relinquish.c index 08bf966c7fc5..410cdaaec265 100644 --- a/arch/arm64/mm/mem_relinquish.c +++ b/arch/arm64/mm/mem_relinquish.c @@ -69,3 +69,10 @@ void page_relinquish(struct page *page) hyp_ops.page_relinquish(page); } EXPORT_SYMBOL_GPL(page_relinquish); + +void post_page_relinquish_tlb_inv(void) +{ + if (hyp_ops.post_page_relinquish_tlb_inv) + hyp_ops.post_page_relinquish_tlb_inv(); +} +EXPORT_SYMBOL_GPL(post_page_relinquish_tlb_inv); diff --git a/drivers/virtio/virtio_balloon.c b/drivers/virtio/virtio_balloon.c index b5df72e909f9..320e36b5cb69 100644 --- a/drivers/virtio/virtio_balloon.c +++ b/drivers/virtio/virtio_balloon.c @@ -149,6 +149,8 @@ static void tell_host(struct virtio_balloon *vb, struct virtqueue *vq) sg_init_one(&sg, vb->pfns, sizeof(vb->pfns[0]) * vb->num_pfns); + post_page_relinquish_tlb_inv(); + /* We should always be able to add one buffer to an empty queue. */ virtqueue_add_outbuf(vq, &sg, 1, vb, GFP_KERNEL); virtqueue_kick(vq); @@ -177,6 +179,8 @@ static int virtballoon_free_page_report(struct page_reporting_dev_info *pr_dev_i if (WARN_ON_ONCE(err)) return err; + post_page_relinquish_tlb_inv(); + virtqueue_kick(vq); /* When host has read buffer, this completes via balloon_ack */ diff --git a/include/linux/mem_relinquish.h b/include/linux/mem_relinquish.h index b906c4196d11..111bdcbdc944 100644 --- a/include/linux/mem_relinquish.h +++ b/include/linux/mem_relinquish.h @@ -15,6 +15,7 @@ static inline bool kvm_has_memrelinquish_services(void) { return false; } static inline void page_relinquish(struct page *page) { } +static inline void post_page_relinquish_tlb_inv(void) { } #endif /* CONFIG_MEMORY_RELINQUISH */ From 8481b97df54aa82f21ac2292ad127b8c2375fcd7 Mon Sep 17 00:00:00 2001 From: Gao Xiang Date: Thu, 25 Jan 2024 20:00:39 +0800 Subject: [PATCH 25/37] BACKPORT: erofs: fix infinite loop due to a race of filling compressed_bvecs I encountered a race issue after lengthy (~594647 sec) stress tests on a 64k-page arm64 VM with several 4k-block EROFS images. The timing is like below: z_erofs_try_inplace_io z_erofs_fill_bio_vec cmpxchg(&compressed_bvecs[].page, NULL, ..) [access bufvec] compressed_bvecs[] = *bvec; Previously, z_erofs_submit_queue() just accessed bufvec->page only, so other fields in bufvec didn't matter. After the subpage block support is landed, .offset and .end can be used too, but filling bufvec isn't an atomic operation which can cause inconsistency. Let's use a spinlock to keep the atomicity of each bufvec. Fixes: 192351616a9d ("erofs: support I/O submission for sub-page compressed blocks") Signed-off-by: Gao Xiang Reviewed-by: Sandeep Dhavale Reviewed-by: Yue Hu Link: https://lore.kernel.org/r/20240125120039.3228103-1-hsiangkao@linux.alibaba.com Bug: 324640522 (cherry picked from commit cc4b2dd95f0d1eba8c691b36e8f4d1795582f1ff https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/ master) [dhavale: introduced spinlock in struct erofs_workgroup, upstream has a change where atomic is replaced by lockref but pulling that and related changes will cause unnecessary churn. Adding spinlock keeps the spirit of the change in-tact by fixing the race. Also updated commit message as we are not using lockref.] Change-Id: Id20a0a433277ab71d46bce48c81824564d1b391d Signed-off-by: Sandeep Dhavale --- fs/erofs/internal.h | 1 + fs/erofs/zdata.c | 75 +++++++++++++++++++++++---------------------- 2 files changed, 40 insertions(+), 36 deletions(-) diff --git a/fs/erofs/internal.h b/fs/erofs/internal.h index 23151da13a23..44d2907478aa 100644 --- a/fs/erofs/internal.h +++ b/fs/erofs/internal.h @@ -208,6 +208,7 @@ struct erofs_workgroup { /* overall workgroup reference count */ atomic_t refcount; + spinlock_t lock; }; static inline bool erofs_workgroup_try_to_freeze(struct erofs_workgroup *grp, diff --git a/fs/erofs/zdata.c b/fs/erofs/zdata.c index 0b1b6ca804b3..98e1c5713e37 100644 --- a/fs/erofs/zdata.c +++ b/fs/erofs/zdata.c @@ -575,21 +575,19 @@ static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe) __GFP_NOMEMALLOC | __GFP_NORETRY | __GFP_NOWARN; unsigned int i; - if (i_blocksize(fe->inode) != PAGE_SIZE) - return; - if (fe->mode < Z_EROFS_PCLUSTER_FOLLOWED) + if (i_blocksize(fe->inode) != PAGE_SIZE || + fe->mode < Z_EROFS_PCLUSTER_FOLLOWED) return; for (i = 0; i < pclusterpages; ++i) { struct page *page, *newpage; void *t; /* mark pages just found for debugging */ - /* the compressed page was loaded before */ + /* Inaccurate check w/o locking to avoid unneeded lookups */ if (READ_ONCE(pcl->compressed_bvecs[i].page)) continue; page = find_get_page(mc, pcl->obj.index + i); - if (page) { t = (void *)((unsigned long)page | 1); newpage = NULL; @@ -609,9 +607,13 @@ static void z_erofs_bind_cache(struct z_erofs_decompress_frontend *fe) set_page_private(newpage, Z_EROFS_PREALLOCATED_PAGE); t = (void *)((unsigned long)newpage | 1); } - - if (!cmpxchg_relaxed(&pcl->compressed_bvecs[i].page, NULL, t)) + spin_lock(&pcl->obj.lock); + if (!pcl->compressed_bvecs[i].page) { + pcl->compressed_bvecs[i].page = t; + spin_unlock(&pcl->obj.lock); continue; + } + spin_unlock(&pcl->obj.lock); if (page) put_page(page); @@ -729,31 +731,25 @@ int erofs_init_managed_cache(struct super_block *sb) return 0; } -static bool z_erofs_try_inplace_io(struct z_erofs_decompress_frontend *fe, - struct z_erofs_bvec *bvec) -{ - struct z_erofs_pcluster *const pcl = fe->pcl; - - while (fe->icur > 0) { - if (!cmpxchg(&pcl->compressed_bvecs[--fe->icur].page, - NULL, bvec->page)) { - pcl->compressed_bvecs[fe->icur] = *bvec; - return true; - } - } - return false; -} - /* callers must be with pcluster lock held */ static int z_erofs_attach_page(struct z_erofs_decompress_frontend *fe, struct z_erofs_bvec *bvec, bool exclusive) { + struct z_erofs_pcluster *pcl = fe->pcl; int ret; if (exclusive) { /* give priority for inplaceio to use file pages first */ - if (z_erofs_try_inplace_io(fe, bvec)) + spin_lock(&pcl->obj.lock); + while (fe->icur > 0) { + if (pcl->compressed_bvecs[--fe->icur].page) + continue; + pcl->compressed_bvecs[fe->icur] = *bvec; + spin_unlock(&pcl->obj.lock); return 0; + } + spin_unlock(&pcl->obj.lock); + /* otherwise, check if it can be used as a bvpage */ if (fe->mode >= Z_EROFS_PCLUSTER_FOLLOWED && !fe->candidate_bvpage) @@ -803,6 +799,7 @@ static int z_erofs_register_pcluster(struct z_erofs_decompress_frontend *fe) if (IS_ERR(pcl)) return PTR_ERR(pcl); + spin_lock_init(&pcl->obj.lock); atomic_set(&pcl->obj.refcount, 1); pcl->algorithmformat = map->m_algorithmformat; pcl->length = 0; @@ -1450,23 +1447,26 @@ static void z_erofs_fill_bio_vec(struct bio_vec *bvec, { gfp_t gfp = mapping_gfp_mask(mc); bool tocache = false; - struct z_erofs_bvec *zbv = pcl->compressed_bvecs + nr; + struct z_erofs_bvec zbv; struct address_space *mapping; - struct page *page, *oldpage; + struct page *page; int justfound, bs = i_blocksize(f->inode); /* Except for inplace pages, the entire page can be used for I/Os */ bvec->bv_offset = 0; bvec->bv_len = PAGE_SIZE; repeat: - oldpage = READ_ONCE(zbv->page); - if (!oldpage) + spin_lock(&pcl->obj.lock); + zbv = pcl->compressed_bvecs[nr]; + page = zbv.page; + justfound = (unsigned long)page & 1UL; + page = (struct page *)((unsigned long)page & ~1UL); + pcl->compressed_bvecs[nr].page = page; + spin_unlock(&pcl->obj.lock); + if (!page) goto out_allocpage; - justfound = (unsigned long)oldpage & 1UL; - page = (struct page *)((unsigned long)oldpage & ~1UL); bvec->bv_page = page; - DBG_BUGON(z_erofs_is_shortlived_page(page)); /* * Handle preallocated cached pages. We tried to allocate such pages @@ -1475,7 +1475,6 @@ repeat: */ if (page->private == Z_EROFS_PREALLOCATED_PAGE) { set_page_private(page, 0); - WRITE_ONCE(zbv->page, page); tocache = true; goto out_tocache; } @@ -1486,9 +1485,9 @@ repeat: * therefore it is impossible for `mapping` to be NULL. */ if (mapping && mapping != mc) { - if (zbv->offset < 0) - bvec->bv_offset = round_up(-zbv->offset, bs); - bvec->bv_len = round_up(zbv->end, bs) - bvec->bv_offset; + if (zbv.offset < 0) + bvec->bv_offset = round_up(-zbv.offset, bs); + bvec->bv_len = round_up(zbv.end, bs) - bvec->bv_offset; return; } @@ -1498,7 +1497,6 @@ repeat: /* the cached page is still in managed cache */ if (page->mapping == mc) { - WRITE_ONCE(zbv->page, page); /* * The cached page is still available but without a valid * `->private` pcluster hint. Let's reconnect them. @@ -1530,11 +1528,15 @@ repeat: put_page(page); out_allocpage: page = erofs_allocpage(&f->pagepool, gfp | __GFP_NOFAIL); - if (oldpage != cmpxchg(&zbv->page, oldpage, page)) { + spin_lock(&pcl->obj.lock); + if (pcl->compressed_bvecs[nr].page) { erofs_pagepool_add(&f->pagepool, page); + spin_unlock(&pcl->obj.lock); cond_resched(); goto repeat; } + pcl->compressed_bvecs[nr].page = page; + spin_unlock(&pcl->obj.lock); bvec->bv_page = page; out_tocache: if (!tocache || bs != PAGE_SIZE || @@ -1712,6 +1714,7 @@ submit_bio_retry: if (cur + bvec.bv_len > end) bvec.bv_len = end - cur; + DBG_BUGON(bvec.bv_len < sb->s_blocksize); if (!bio_add_page(bio, bvec.bv_page, bvec.bv_len, bvec.bv_offset)) goto submit_bio_retry; From fc6c1b3acb8381c8c763b8933ca251c11a7c03cb Mon Sep 17 00:00:00 2001 From: Carlos Llamas Date: Thu, 8 Feb 2024 18:51:20 +0000 Subject: [PATCH 26/37] ANDROID: GKI: explicit include of stringify.h The android_kabi.h header file uses the __stringify() macro without explicitly including its definition via linux/stringify.h. This can result in build breaking when using the ANDROID_KABI_USE macro: common/include/linux/ipv6.h:83:2: error: expected ')' ANDROID_KABI_USE(1, struct { __s32 accept_ra_min_lft; u32 padding; }); ^ [...] common/include/linux/android_kabi.h:44:24: note: expanded from macro '__ANDROID_KABI_CHECK_SIZE_ALIGN' __FILE__ ":" __stringify(__LINE__) ": " \ ^ To fix this let android_kabi.h include stringify.h explicitly instead of relying on includes of previous unrelated header files. Bug: 324437514 Change-Id: I16cced44e723871b2e1a92b312e60f38e41fea70 Signed-off-by: Carlos Llamas --- include/linux/android_kabi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/include/linux/android_kabi.h b/include/linux/android_kabi.h index f6dd7f00b386..1fa329ee4d73 100644 --- a/include/linux/android_kabi.h +++ b/include/linux/android_kabi.h @@ -33,6 +33,7 @@ #define _ANDROID_KABI_H #include +#include /* * Worker macros, don't use these, use the ones without a leading '_' From a8053aadcad12744498da8b94e83a1018395d330 Mon Sep 17 00:00:00 2001 From: Carlos Llamas Date: Tue, 13 Feb 2024 01:23:48 +0000 Subject: [PATCH 27/37] Reapply "net: add sysctl accept_ra_min_rtr_lft" This reverts commit c8da9c614c29cf80749e5eb65d44f2fa7d6a1770. Bug: 320243175 Change-Id: Ia31692230f2f5cbd2ac349edcb2be320497c52f3 Signed-off-by: Carlos Llamas --- Documentation/networking/ip-sysctl.rst | 8 ++++++++ include/linux/ipv6.h | 1 + include/uapi/linux/ipv6.h | 1 + net/ipv6/addrconf.c | 10 ++++++++++ net/ipv6/ndisc.c | 18 ++++++++++++++++-- 5 files changed, 36 insertions(+), 2 deletions(-) diff --git a/Documentation/networking/ip-sysctl.rst b/Documentation/networking/ip-sysctl.rst index 3301288a7c69..b0e9210f7a28 100644 --- a/Documentation/networking/ip-sysctl.rst +++ b/Documentation/networking/ip-sysctl.rst @@ -2148,6 +2148,14 @@ accept_ra_min_hop_limit - INTEGER Default: 1 +accept_ra_min_rtr_lft - INTEGER + Minimum acceptable router lifetime in Router Advertisement. + + RAs with a router lifetime less than this value shall be + ignored. RAs with a router lifetime of 0 are unaffected. + + Default: 0 + accept_ra_pinfo - BOOLEAN Learn Prefix Information in Router Advertisement. diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index ccd063754c14..d03c886ab88a 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -34,6 +34,7 @@ struct ipv6_devconf { __s32 accept_ra_defrtr; __u32 ra_defrtr_metric; __s32 accept_ra_min_hop_limit; + __s32 accept_ra_min_rtr_lft; __s32 accept_ra_pinfo; __s32 ignore_routes_with_linkdown; #ifdef CONFIG_IPV6_ROUTER_PREF diff --git a/include/uapi/linux/ipv6.h b/include/uapi/linux/ipv6.h index 53326dfc59ec..2038eff9b63f 100644 --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h @@ -198,6 +198,7 @@ enum { DEVCONF_IOAM6_ID_WIDE, DEVCONF_NDISC_EVICT_NOCARRIER, DEVCONF_ACCEPT_UNTRACKED_NA, + DEVCONF_ACCEPT_RA_MIN_RTR_LFT, DEVCONF_MAX }; diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index a7059f6b43ad..ecff66846dd2 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -202,6 +202,7 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = { .ra_defrtr_metric = IP6_RT_PRIO_USER, .accept_ra_from_local = 0, .accept_ra_min_hop_limit= 1, + .accept_ra_min_rtr_lft = 0, .accept_ra_pinfo = 1, #ifdef CONFIG_IPV6_ROUTER_PREF .accept_ra_rtr_pref = 1, @@ -263,6 +264,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { .ra_defrtr_metric = IP6_RT_PRIO_USER, .accept_ra_from_local = 0, .accept_ra_min_hop_limit= 1, + .accept_ra_min_rtr_lft = 0, .accept_ra_pinfo = 1, #ifdef CONFIG_IPV6_ROUTER_PREF .accept_ra_rtr_pref = 1, @@ -5623,6 +5625,7 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, array[DEVCONF_IOAM6_ID_WIDE] = cnf->ioam6_id_wide; array[DEVCONF_NDISC_EVICT_NOCARRIER] = cnf->ndisc_evict_nocarrier; array[DEVCONF_ACCEPT_UNTRACKED_NA] = cnf->accept_untracked_na; + array[DEVCONF_ACCEPT_RA_MIN_RTR_LFT] = cnf->accept_ra_min_rtr_lft; } static inline size_t inet6_ifla6_size(void) @@ -6816,6 +6819,13 @@ static const struct ctl_table addrconf_sysctl[] = { .mode = 0644, .proc_handler = proc_dointvec, }, + { + .procname = "accept_ra_min_rtr_lft", + .data = &ipv6_devconf.accept_ra_min_rtr_lft, + .maxlen = sizeof(int), + .mode = 0644, + .proc_handler = proc_dointvec, + }, { .procname = "accept_ra_pinfo", .data = &ipv6_devconf.accept_ra_pinfo, diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index 16adce999741..f13d0d2d5da2 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1284,6 +1284,8 @@ static void ndisc_router_discovery(struct sk_buff *skb) return; } + lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); + if (!ipv6_accept_ra(in6_dev)) { ND_PRINTK(2, info, "RA: %s, did not accept ra for dev: %s\n", @@ -1291,6 +1293,13 @@ static void ndisc_router_discovery(struct sk_buff *skb) goto skip_linkparms; } + if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_rtr_lft) { + ND_PRINTK(2, info, + "RA: router lifetime (%ds) is too short: %s\n", + lifetime, skb->dev->name); + goto skip_linkparms; + } + #ifdef CONFIG_IPV6_NDISC_NODETYPE /* skip link-specific parameters from interior routers */ if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { @@ -1343,8 +1352,6 @@ static void ndisc_router_discovery(struct sk_buff *skb) goto skip_defrtr; } - lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); - #ifdef CONFIG_IPV6_ROUTER_PREF pref = ra_msg->icmph.icmp6_router_pref; /* 10b is handled as if it were 00b (medium) */ @@ -1495,6 +1502,13 @@ skip_linkparms: goto out; } + if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_rtr_lft) { + ND_PRINTK(2, info, + "RA: router lifetime (%ds) is too short: %s\n", + lifetime, skb->dev->name); + goto out; + } + #ifdef CONFIG_IPV6_ROUTE_INFO if (!in6_dev->cnf.accept_ra_from_local && ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, From c2c02730293a86c6034f638e1dbf9a572e46388b Mon Sep 17 00:00:00 2001 From: Carlos Llamas Date: Tue, 13 Feb 2024 01:24:14 +0000 Subject: [PATCH 28/37] Reapply "net: change accept_ra_min_rtr_lft to affect all RA lifetimes" This reverts commit ee96408e49390e9ac13841aeb46dba8bbe1c4d51. Bug: 320243175 Change-Id: If51722d74fe9b326d69c96c0cdfca43db6e33b93 Signed-off-by: Carlos Llamas --- Documentation/networking/ip-sysctl.rst | 8 ++++---- include/linux/ipv6.h | 2 +- include/uapi/linux/ipv6.h | 2 +- net/ipv6/addrconf.c | 13 ++++++++----- net/ipv6/ndisc.c | 27 +++++++++++--------------- 5 files changed, 25 insertions(+), 27 deletions(-) diff --git a/Documentation/networking/ip-sysctl.rst b/Documentation/networking/ip-sysctl.rst index b0e9210f7a28..f5f7a464605f 100644 --- a/Documentation/networking/ip-sysctl.rst +++ b/Documentation/networking/ip-sysctl.rst @@ -2148,11 +2148,11 @@ accept_ra_min_hop_limit - INTEGER Default: 1 -accept_ra_min_rtr_lft - INTEGER - Minimum acceptable router lifetime in Router Advertisement. +accept_ra_min_lft - INTEGER + Minimum acceptable lifetime value in Router Advertisement. - RAs with a router lifetime less than this value shall be - ignored. RAs with a router lifetime of 0 are unaffected. + RA sections with a lifetime less than this value shall be + ignored. Zero lifetimes stay unaffected. Default: 0 diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index d03c886ab88a..40365a42fdf8 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -34,7 +34,7 @@ struct ipv6_devconf { __s32 accept_ra_defrtr; __u32 ra_defrtr_metric; __s32 accept_ra_min_hop_limit; - __s32 accept_ra_min_rtr_lft; + __s32 accept_ra_min_lft; __s32 accept_ra_pinfo; __s32 ignore_routes_with_linkdown; #ifdef CONFIG_IPV6_ROUTER_PREF diff --git a/include/uapi/linux/ipv6.h b/include/uapi/linux/ipv6.h index 2038eff9b63f..4fa8511b1e35 100644 --- a/include/uapi/linux/ipv6.h +++ b/include/uapi/linux/ipv6.h @@ -198,7 +198,7 @@ enum { DEVCONF_IOAM6_ID_WIDE, DEVCONF_NDISC_EVICT_NOCARRIER, DEVCONF_ACCEPT_UNTRACKED_NA, - DEVCONF_ACCEPT_RA_MIN_RTR_LFT, + DEVCONF_ACCEPT_RA_MIN_LFT, DEVCONF_MAX }; diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index ecff66846dd2..91fe6b4c9de4 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -202,7 +202,7 @@ static struct ipv6_devconf ipv6_devconf __read_mostly = { .ra_defrtr_metric = IP6_RT_PRIO_USER, .accept_ra_from_local = 0, .accept_ra_min_hop_limit= 1, - .accept_ra_min_rtr_lft = 0, + .accept_ra_min_lft = 0, .accept_ra_pinfo = 1, #ifdef CONFIG_IPV6_ROUTER_PREF .accept_ra_rtr_pref = 1, @@ -264,7 +264,7 @@ static struct ipv6_devconf ipv6_devconf_dflt __read_mostly = { .ra_defrtr_metric = IP6_RT_PRIO_USER, .accept_ra_from_local = 0, .accept_ra_min_hop_limit= 1, - .accept_ra_min_rtr_lft = 0, + .accept_ra_min_lft = 0, .accept_ra_pinfo = 1, #ifdef CONFIG_IPV6_ROUTER_PREF .accept_ra_rtr_pref = 1, @@ -2755,6 +2755,9 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) return; } + if (valid_lft != 0 && valid_lft < in6_dev->cnf.accept_ra_min_lft) + return; + /* * Two things going on here: * 1) Add routes for on-link prefixes @@ -5625,7 +5628,7 @@ static inline void ipv6_store_devconf(struct ipv6_devconf *cnf, array[DEVCONF_IOAM6_ID_WIDE] = cnf->ioam6_id_wide; array[DEVCONF_NDISC_EVICT_NOCARRIER] = cnf->ndisc_evict_nocarrier; array[DEVCONF_ACCEPT_UNTRACKED_NA] = cnf->accept_untracked_na; - array[DEVCONF_ACCEPT_RA_MIN_RTR_LFT] = cnf->accept_ra_min_rtr_lft; + array[DEVCONF_ACCEPT_RA_MIN_LFT] = cnf->accept_ra_min_lft; } static inline size_t inet6_ifla6_size(void) @@ -6820,8 +6823,8 @@ static const struct ctl_table addrconf_sysctl[] = { .proc_handler = proc_dointvec, }, { - .procname = "accept_ra_min_rtr_lft", - .data = &ipv6_devconf.accept_ra_min_rtr_lft, + .procname = "accept_ra_min_lft", + .data = &ipv6_devconf.accept_ra_min_lft, .maxlen = sizeof(int), .mode = 0644, .proc_handler = proc_dointvec, diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c index f13d0d2d5da2..8c5a99fe6803 100644 --- a/net/ipv6/ndisc.c +++ b/net/ipv6/ndisc.c @@ -1284,8 +1284,6 @@ static void ndisc_router_discovery(struct sk_buff *skb) return; } - lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); - if (!ipv6_accept_ra(in6_dev)) { ND_PRINTK(2, info, "RA: %s, did not accept ra for dev: %s\n", @@ -1293,13 +1291,6 @@ static void ndisc_router_discovery(struct sk_buff *skb) goto skip_linkparms; } - if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_rtr_lft) { - ND_PRINTK(2, info, - "RA: router lifetime (%ds) is too short: %s\n", - lifetime, skb->dev->name); - goto skip_linkparms; - } - #ifdef CONFIG_IPV6_NDISC_NODETYPE /* skip link-specific parameters from interior routers */ if (skb->ndisc_nodetype == NDISC_NODETYPE_NODEFAULT) { @@ -1340,6 +1331,14 @@ static void ndisc_router_discovery(struct sk_buff *skb) goto skip_defrtr; } + lifetime = ntohs(ra_msg->icmph.icmp6_rt_lifetime); + if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_lft) { + ND_PRINTK(2, info, + "RA: router lifetime (%ds) is too short: %s\n", + lifetime, skb->dev->name); + goto skip_defrtr; + } + /* Do not accept RA with source-addr found on local machine unless * accept_ra_from_local is set to true. */ @@ -1502,13 +1501,6 @@ skip_linkparms: goto out; } - if (lifetime != 0 && lifetime < in6_dev->cnf.accept_ra_min_rtr_lft) { - ND_PRINTK(2, info, - "RA: router lifetime (%ds) is too short: %s\n", - lifetime, skb->dev->name); - goto out; - } - #ifdef CONFIG_IPV6_ROUTE_INFO if (!in6_dev->cnf.accept_ra_from_local && ipv6_chk_addr(dev_net(in6_dev->dev), &ipv6_hdr(skb)->saddr, @@ -1533,6 +1525,9 @@ skip_linkparms: if (ri->prefix_len == 0 && !in6_dev->cnf.accept_ra_defrtr) continue; + if (ri->lifetime != 0 && + ntohl(ri->lifetime) < in6_dev->cnf.accept_ra_min_lft) + continue; if (ri->prefix_len < in6_dev->cnf.accept_ra_rt_info_min_plen) continue; if (ri->prefix_len > in6_dev->cnf.accept_ra_rt_info_max_plen) From 20131b787fb663230a401a3dde31cbc042da2469 Mon Sep 17 00:00:00 2001 From: Carlos Llamas Date: Tue, 13 Feb 2024 01:24:27 +0000 Subject: [PATCH 29/37] Reapply "net: release reference to inet6_dev pointer" This reverts commit d9fef973fe1c5a1c575832a337764e9a51b174e6. Bug: 320243175 Change-Id: I4627e1097dddbb697597cbb51e4ba9f4f1af61da Signed-off-by: Carlos Llamas --- net/ipv6/addrconf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 91fe6b4c9de4..c17764600ad5 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -2756,7 +2756,7 @@ void addrconf_prefix_rcv(struct net_device *dev, u8 *opt, int len, bool sllao) } if (valid_lft != 0 && valid_lft < in6_dev->cnf.accept_ra_min_lft) - return; + goto put; /* * Two things going on here: From 81c922621d75624ed914e30c0b5ac6fe5387de4d Mon Sep 17 00:00:00 2001 From: Carlos Llamas Date: Wed, 7 Feb 2024 22:17:44 +0000 Subject: [PATCH 30/37] ANDROID: GKI: fix ABI breakage in struct ipv6_devconf The following list of commits, which are in the 6.1.57 release, add a new field in struct ipv6_devconf and this breaks the abi. Fix this by using one of the reserved slots for upstream changes and update the stg file to preserve the build. b6912642746d ("net: release reference to inet6_dev pointer") bad004c384b7 ("net: change accept_ra_min_rtr_lft to affect all RA lifetimes") ec4162bb7018 ("net: add sysctl accept_ra_min_rtr_lft") type 'struct ipv6_devconf' changed member 'union { struct { __s32 accept_ra_min_lft; u32 padding; }; struct { u64 android_kabi_reserved1; }; union { }; }' was added member 'u64 android_kabi_reserved1' was removed Bug: 320243175 Change-Id: Icddcad574f3c29f6d3e63b10f8c7e51bdf46fe7f Signed-off-by: Carlos Llamas --- android/abi_gki_aarch64.stg | 35 ++++++++++++++++++++++++++++++++++- include/linux/ipv6.h | 4 ++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index ac4d5b6a98dc..f9b494c6777e 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -39374,6 +39374,10 @@ member { id: 0x2e1fd5ab type_id: 0x375126bc } +member { + id: 0x2e3fb8e1 + type_id: 0x37d09395 +} member { id: 0x2e407ff3 type_id: 0x362f8fdc @@ -39910,6 +39914,11 @@ member { type_id: 0x5d131624 offset: 64 } +member { + id: 0x3494a41f + type_id: 0x5d7cfe67 + offset: 2048 +} member { id: 0x349c23b4 type_id: 0x5d5ed2a3 @@ -42829,6 +42838,11 @@ member { type_id: 0x0faae5b1 offset: 704 } +member { + id: 0xbe977230 + name: "accept_ra_min_lft" + type_id: 0x0faae5b1 +} member { id: 0x2c2f941d name: "accept_ra_mtu" @@ -212488,6 +212502,15 @@ struct_union { member_id: 0xd72d8bb2 } } +struct_union { + id: 0x37d09395 + kind: STRUCT + definition { + bytesize: 8 + member_id: 0xbe977230 + member_id: 0x642f0821 + } +} struct_union { id: 0x37f08244 kind: STRUCT @@ -214385,6 +214408,16 @@ struct_union { member_id: 0x8c9fd173 } } +struct_union { + id: 0x5d7cfe67 + kind: UNION + definition { + bytesize: 8 + member_id: 0x2e3fb8e1 + member_id: 0x27000c61 + member_id: 0x36752b74 + } +} struct_union { id: 0x5d86aa37 kind: UNION @@ -237987,7 +238020,7 @@ struct_union { member_id: 0xef330e54 member_id: 0xb7f742d4 member_id: 0x04607474 - member_id: 0x2d0812b0 + member_id: 0x3494a41f member_id: 0x637607e0 member_id: 0xac894cc9 member_id: 0xe0f63db8 diff --git a/include/linux/ipv6.h b/include/linux/ipv6.h index 40365a42fdf8..f9f84a4e4204 100644 --- a/include/linux/ipv6.h +++ b/include/linux/ipv6.h @@ -34,7 +34,6 @@ struct ipv6_devconf { __s32 accept_ra_defrtr; __u32 ra_defrtr_metric; __s32 accept_ra_min_hop_limit; - __s32 accept_ra_min_lft; __s32 accept_ra_pinfo; __s32 ignore_routes_with_linkdown; #ifdef CONFIG_IPV6_ROUTER_PREF @@ -87,7 +86,8 @@ struct ipv6_devconf { struct ctl_table_header *sysctl_header; - ANDROID_KABI_RESERVE(1); + ANDROID_KABI_USE(1, struct { __s32 accept_ra_min_lft; u32 padding; }); + ANDROID_KABI_RESERVE(2); ANDROID_KABI_RESERVE(3); ANDROID_KABI_RESERVE(4); From e356cae9693c1621345e9da93f93a76f1dc87c33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= Date: Wed, 22 Mar 2023 12:32:51 -0700 Subject: [PATCH 31/37] ANDROID: Export kthread_set_per_cpu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit kthread_create_on_cpu no longer marks the created thread as a per cpu thread, so the affinity might get lost on suspend or other hotplug events. Export kthread_set_per_cpu so a module that needs a kthread to stay on a specific cpu can accomplish that. Bug: 274202992 Change-Id: Iaafc12f93f341f9e0586cb051b7f1c941f140866 Signed-off-by: Arve Hjønnevåg (cherry picked from commit 4fdc7e4658212c096bd19fe7196296955942f7e5) --- kernel/kthread.c | 1 + 1 file changed, 1 insertion(+) diff --git a/kernel/kthread.c b/kernel/kthread.c index 261021050f6c..b795a8c1de96 100644 --- a/kernel/kthread.c +++ b/kernel/kthread.c @@ -601,6 +601,7 @@ void kthread_set_per_cpu(struct task_struct *k, int cpu) kthread->cpu = cpu; set_bit(KTHREAD_IS_PER_CPU, &kthread->flags); } +EXPORT_SYMBOL_GPL(kthread_set_per_cpu); bool kthread_is_per_cpu(struct task_struct *p) { From 5a1f8b6b4613fae67c1a494780d7743f4ab00946 Mon Sep 17 00:00:00 2001 From: Philip Chen Date: Fri, 9 Feb 2024 23:21:21 +0000 Subject: [PATCH 32/37] ANDROID: Add pci_read_config_word to virtual device symbol list Commit a7dcf250aeb8 ("UPSTREAM: virtio: Add support for no-reset virtio PCI PM") requires pci_read_config_word. Bug: 318540621 Change-Id: I8fbf7a49dc395b6ed2946fa6834625c63b4223af Signed-off-by: Philip Chen --- android/abi_gki_aarch64_virtual_device | 1 + 1 file changed, 1 insertion(+) diff --git a/android/abi_gki_aarch64_virtual_device b/android/abi_gki_aarch64_virtual_device index 8b1b9a58bf64..487cba605c4f 100644 --- a/android/abi_gki_aarch64_virtual_device +++ b/android/abi_gki_aarch64_virtual_device @@ -314,6 +314,7 @@ pci_iounmap pci_read_config_byte pci_read_config_dword + pci_read_config_word __pci_register_driver pci_release_region pci_request_region From 9e2b7753337a887e6fab12e0ed0e2af4a9a6cc88 Mon Sep 17 00:00:00 2001 From: Mike McTernan Date: Tue, 13 Feb 2024 17:31:46 +0000 Subject: [PATCH 33/37] ANDROID: Update the ABI symbol list Adding the following symbols: - kthread_set_per_cpu 1 function symbol(s) added 'void kthread_set_per_cpu(struct task_struct*, int)' Bug: 274202992 Change-Id: I5802ade7fe64e3c4e3132a322a70b809cd9d007a Signed-off-by: Mike McTernan --- android/abi_gki_aarch64.stg | 10 ++++++++++ android/abi_gki_aarch64_pixel | 1 + 2 files changed, 11 insertions(+) diff --git a/android/abi_gki_aarch64.stg b/android/abi_gki_aarch64.stg index f9b494c6777e..9d57cc044674 100644 --- a/android/abi_gki_aarch64.stg +++ b/android/abi_gki_aarch64.stg @@ -371174,6 +371174,15 @@ elf_symbol { type_id: 0xf395f41f full_name: "kthread_queue_work" } +elf_symbol { + id: 0x1504ce0b + name: "kthread_set_per_cpu" + is_defined: true + symbol_type: FUNCTION + crc: 0xe89a5df5 + type_id: 0x1642b8aa + full_name: "kthread_set_per_cpu" +} elf_symbol { id: 0xeb6e491f name: "kthread_should_park" @@ -405989,6 +405998,7 @@ interface { symbol_id: 0x44f92a6d symbol_id: 0x40c3dc92 symbol_id: 0xb27aa180 + symbol_id: 0x1504ce0b symbol_id: 0xeb6e491f symbol_id: 0xf902c37c symbol_id: 0x9a04e3d3 diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index 0a28ad08280d..9fd68830cc74 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -1289,6 +1289,7 @@ kthread_park kthread_parkme kthread_queue_work + kthread_set_per_cpu kthread_should_park kthread_should_stop kthread_stop From 8d4d76a2bd2ba3791eb1eeb3d116e6ec4c6d21cd Mon Sep 17 00:00:00 2001 From: John Fastabend Date: Wed, 6 Dec 2023 15:27:05 -0800 Subject: [PATCH 34/37] UPSTREAM: net: tls, update curr on splice as well commit c5a595000e2677e865a39f249c056bc05d6e55fd upstream. The curr pointer must also be updated on the splice similar to how we do this for other copy types. Bug: 322282717 Fixes: d829e9c4112b ("tls: convert to generic sk_msg interface") Signed-off-by: John Fastabend Reported-by: Jann Horn Link: https://lore.kernel.org/r/20231206232706.374377-2-john.fastabend@gmail.com Signed-off-by: Jakub Kicinski Signed-off-by: Greg Kroah-Hartman (cherry picked from commit ba5efd8544fa62ae85daeb36077468bf2ce974ab) Signed-off-by: Lee Jones Change-Id: If942207e6338993096c9fbc8ce4c23a6bbecaf2e --- net/tls/tls_sw.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c index a0ce40635d50..080d7ea350aa 100644 --- a/net/tls/tls_sw.c +++ b/net/tls/tls_sw.c @@ -1225,6 +1225,8 @@ alloc_payload: } sk_msg_page_add(msg_pl, page, copy, offset); + msg_pl->sg.copybreak = 0; + msg_pl->sg.curr = msg_pl->sg.end; sk_mem_charge(sk, copy); offset += copy; From 7dc3b2e49eda58a19c7e16fae59ab1e3ed2f53d3 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Fri, 12 Jan 2024 23:28:45 +0100 Subject: [PATCH 35/37] UPSTREAM: netfilter: nf_tables: check if catch-all set element is active in next generation commit b1db244ffd041a49ecc9618e8feb6b5c1afcdaa7 upstream. When deactivating the catch-all set element, check the state in the next generation that represents this transaction. This bug uncovered after the recent removal of the element busy mark a2dd0233cbc4 ("netfilter: nf_tables: remove busy mark and gc batch API"). Bug: 323034444 Fixes: aaa31047a6d2 ("netfilter: nftables: add catch-all set element support") Cc: stable@vger.kernel.org Reported-by: lonial con Signed-off-by: Pablo Neira Ayuso Signed-off-by: Greg Kroah-Hartman (cherry picked from commit a372f1d01bc11aa85773a02353cd01aaf16dc18e) Signed-off-by: Lee Jones Change-Id: I40ac92a33db48a2709079d27d7d529946ba297c7 --- net/netfilter/nf_tables_api.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c index c0b8aa3c3e40..7beb2b0470a3 100644 --- a/net/netfilter/nf_tables_api.c +++ b/net/netfilter/nf_tables_api.c @@ -6152,7 +6152,7 @@ static int nft_setelem_catchall_deactivate(const struct net *net, list_for_each_entry(catchall, &set->catchall_list, list) { ext = nft_set_elem_ext(set, catchall->elem); - if (!nft_is_active(net, ext)) + if (!nft_is_active_next(net, ext)) continue; kfree(elem->priv); From b86713e341049f366131ed08c3d6c04452ad42d6 Mon Sep 17 00:00:00 2001 From: David Stevens Date: Fri, 8 Dec 2023 16:07:54 +0900 Subject: [PATCH 36/37] UPSTREAM: virtio: Add support for no-reset virtio PCI PM If a virtio_pci_device supports native PCI power management and has the No_Soft_Reset bit set, then skip resetting and reinitializing the device when suspending and restoring the device. This allows system-wide low power states like s2idle to be used in systems with stateful virtio devices that can't simply be re-initialized (e.g. virtio-fs). Signed-off-by: David Stevens Signed-off-by: Michael S. Tsirkin Bug: 318540621 Change-Id: Ifc60f72a6a6bd256fa14e291e615c7514dcb4d7d (cherry picked from commit dff4fa0e57856045359440d05af9e9b7f7048f52) Signed-off-by: Philip Chen (cherry picked from commit a7dcf250aeb8e2a572774a0e51fc0432875b6661) --- drivers/virtio/virtio_pci_common.c | 34 +++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/drivers/virtio/virtio_pci_common.c b/drivers/virtio/virtio_pci_common.c index a6c86f916dbd..08034a6517ff 100644 --- a/drivers/virtio/virtio_pci_common.c +++ b/drivers/virtio/virtio_pci_common.c @@ -492,8 +492,40 @@ static int virtio_pci_restore(struct device *dev) return virtio_device_restore(&vp_dev->vdev); } +static bool vp_supports_pm_no_reset(struct device *dev) +{ + struct pci_dev *pci_dev = to_pci_dev(dev); + u16 pmcsr; + + if (!pci_dev->pm_cap) + return false; + + pci_read_config_word(pci_dev, pci_dev->pm_cap + PCI_PM_CTRL, &pmcsr); + if (PCI_POSSIBLE_ERROR(pmcsr)) { + dev_err(dev, "Unable to query pmcsr"); + return false; + } + + return pmcsr & PCI_PM_CTRL_NO_SOFT_RESET; +} + +static int virtio_pci_suspend(struct device *dev) +{ + return vp_supports_pm_no_reset(dev) ? 0 : virtio_pci_freeze(dev); +} + +static int virtio_pci_resume(struct device *dev) +{ + return vp_supports_pm_no_reset(dev) ? 0 : virtio_pci_restore(dev); +} + static const struct dev_pm_ops virtio_pci_pm_ops = { - SET_SYSTEM_SLEEP_PM_OPS(virtio_pci_freeze, virtio_pci_restore) + .suspend = virtio_pci_suspend, + .resume = virtio_pci_resume, + .freeze = virtio_pci_freeze, + .thaw = virtio_pci_restore, + .poweroff = virtio_pci_freeze, + .restore = virtio_pci_restore, }; #endif From 92432f07d6635531a982c0d4c7ea1274915aac67 Mon Sep 17 00:00:00 2001 From: Will Song Date: Tue, 13 Feb 2024 23:15:35 -0800 Subject: [PATCH 37/37] ANDROID: GKI: Update the ABI symbol list Adding the following symbols: - devfreq_remove_governor Test: Build Bug: 325161541 Change-Id: I76dd0eed62685b71fd95f758fd9b401da87e4df2 Signed-off-by: Will Song --- android/abi_gki_aarch64_pixel | 1 + 1 file changed, 1 insertion(+) diff --git a/android/abi_gki_aarch64_pixel b/android/abi_gki_aarch64_pixel index 9fd68830cc74..289eec270fc5 100644 --- a/android/abi_gki_aarch64_pixel +++ b/android/abi_gki_aarch64_pixel @@ -370,6 +370,7 @@ devfreq_recommended_opp devfreq_register_opp_notifier devfreq_remove_device + devfreq_remove_governor devfreq_unregister_opp_notifier devfreq_update_interval dev_fwnode