记录一次WLAN Panic导致的gcore问题分析

记录一次WLAN Panic导致的gcore问题分析

背景

  • 高通Q+A架构
  • 问题出现在几天前,测试同事大面积报出了开机后直接卡死的问题;经过初步分析,确认是进入了Guest Coredump(gcore)

分析

确认直接原因

解析gcore文件(步骤移步这里),查看kernel log,可以发现是由于WLAN Panic导致:

01-01 00:00:39.520[32.076410]     0     0     0 E [soft_i][0x25ccc6fe][13:42:29.575902] wlan: [0:E:HIF] hif_tasklet_latency: tasklet ce2 latency: from_timer 1, curr_jiffies 4294900315, ce2_tasklet_sched_time 4294898450,ce2_tasklet_exec_time 4294898304, detect_latency_threshold 3900ms detect_latency_timer_timeout 4000ms, cpu_id 1, called: hif_latency_detect_timeout_handler [wlan]
01-01 00:00:39.522[32.077767]     0     0     0 E [soft_i][0x25cd2d04][13:42:29.577262] wlan: [0:E:HIF] hif_credit_latency: credit report latency: from timer 1, curr_jiffies 4294900315, credit_request_time 4294898875,credit_report_time 4294898121, detect_latency_threshold 3900ms, detect_latency_timer_timeout 4000ms, cpu_id 1, called: hif_latency_detect_timeout_handler [wlan]
01-01 00:00:39.523[32.079079]     0     0     0 E [kworke][0x25cd8f96][13:42:29.578576] wlan: [19:E:QDF] cds_trigger_recovery_handler: critical host timeout trigger fw recovery for reason code 24
01-01 00:00:39.523[32.079401]     0     0     0 D cnss    : Start to dump SOC Scratch registers
...
...
...
01-01 00:00:40.222[32.777764]     0     0     0 E WLAN Panic @ cds_trigger_recovery_handler:1995: WLAN recovery is not enabled (via hif_credit_latency:732)
01-01 00:00:40.222[32.777831]     0     0     0 I subsys-restart: subsystem_restart_dev(): Restart sequence requested for wlan_0, restart_level = SYSTEM.
01-01 00:00:40.222[32.777954]     0     0     0 I ------------[ cut here ]------------
01-01 00:00:40.222[32.777956]     0     0     0 D cnss    : PM relax, state: 0xb07, count: 0
01-01 00:00:40.222[32.777958]     0     0     0 F kernel BUG at ../../vendor/qcom/opensource/wlan/qcacld-3.0/.qca6490/cmn/qdf/linux/src/qdf_trace.c:4389!
01-01 00:00:40.222[32.778150]     0     0     0 F Internal error: Oops - BUG: 0 [#1] PREEMPT SMP
01-01 00:00:40.222[32.778219]     0     0     0 I Modules linked in: wlan(O) btpower_new(O) cnss2 pci_msm_drv gvm_spf_machine_dlkm stub_dlkm
01-01 00:00:40.222[32.778336]     0     0     0 I CPU: 1 PID: 19 Comm: kworker/1:0 Tainted: G           O      5.4.219-qgki-debug-g5a2838044f45 #1
01-01 00:00:40.222[32.778468]     0     0     0 I Hardware name: Qualcomm Technologies, Inc. Direwolf Single LA Virtual Machine (DT)
01-01 00:00:40.223[32.778774]     0     0     0 I Workqueue: cds_recovery_workqueue __qdf_defer_func.cfi_jt [wlan]
01-01 00:00:40.223[32.778877]     0     0     0 I pstate  : 60c00005 (nZCv daif +PAN +UAO)
01-01 00:00:40.223[32.779126]     0     0     0 I pc      : __qdf_bug+0x0/0x4 [wlan]
01-01 00:00:40.223[32.779360]     0     0     0 I lr      : cds_trigger_recovery_work+0x4ac/0x4b0 [wlan]
01-01 00:00:40.223[32.779527]     0     0     0 I sp      : ffffffc013d13d00

确定分析方向

看到这里,其实有两个疑问:

  1. 为何每次gcore调用栈都是一样的,都指向WLAN Panic,而不是其他线程出现;
  2. 开机过程中CPU占用几乎全满,但内核线程通常优先级高于用户线程,不应该抢不赢,且持续4秒之久(阈值设置为3900ms);

这两个疑问导向两个分析方向:

  1. 是否WLAN驱动本身存在逻辑缺陷;
  2. 是否存在优先级高于内核线程的用户线程长时间占用CPU资源;

解答

关于第1个疑问

与WLAN BSP同事确认,高通对此回复是:tasklet调度太慢,触发driver的内部检测机制,trigger crash,需要Android侧优化CPU占用

结合简单地追踪代码与调用栈,我认为可以总结成如下几点:

  1. crash是WLAN驱动主动触发的;
  2. 触发crash的原因从中断请求到tasklet调度,整个耗时太长,触发了WLAN驱动内部检测机制(类似看门狗);
  3. 这是保护机制,不能去掉,所以需要通过优化CPU占用来规避;

那么第一个疑问算是解答了——每次都是WLAN Panic不是因为WLAN驱动有问题,而是WLAN驱动内部有严格的时延检测机制,而其他模块可能没有;

但是同样生成了新的疑问:这个问题到底是中断没触发,还是触发了以后tasklet依旧没有调度到导致的?

关于第1.1个疑问

驱动与内核实际上我不太了解,因此去查阅了一些资料,并向BSP同事请教了一些基本概念,总结如下:

  1. 中断会打断内核中进程的正常调度运行,绝大多数情况下不会出现延迟;
    ——在结合此题的现象:

    • 中断如果没有被执行,一般都是因为有线程屏蔽了中断或抢占,这种程度的延时必然会出现Hard/Soft Lockup,不过很遗憾,日志中并没有线索指向这点;
    • 如果WLAN中断未响应,那同样的会出现其他中断未响应的情况,但是日志中也没有线索指向这点;

    综上,不太可能是中断没响应

  2. tasklet在下半部执行,运行在中断上下文或者ksoftirqd辅助线程,但无论如何,都是可能被RT线程(设置为SCHED_FIFOSCHED_RR调度策略的线程)抢占的;

  3. WLAN驱动设置了中断亲和力(Affinity),要求在大核运行;

那么关于这个疑问的结论就比较明显了:应该是下半部,也就是此处的tasklet没有执行;

关于第2个疑问

其实,上面也解答了这个疑问,此问题大概率就是tasklet由于被RT线程抢占,导致响应延迟

验证

首先,为了尝试复现这个现象,我需要创建几个RT线程来抢占CPU资源;
由于此前通过BSP同事的科普,我知道WLAN中断只会在大核处理,那么理论上只需要创建4个RT线程,就可以占满所有大核;

因此首先,我通过如下方式创建了4个线程:

# 创建一个后台线程,执行死循环逻辑,执行4次,即为4个线程
$ while true;do cat /dev/random > /dev/null; done &

此时这4个线程调度策略应该是默认的SCHED_OTHER(SCHED_NORMAL),于是借助chrt命令依次将其修改为RT线程:

// -r 表示 SCHED_RR
// -p <$tid> 则是指定线程id
// 99 是RT线程可设置的最大优先级
# chrt -r -p <$tid> 99
// 如此执行4次

最后,利用cpuset这个cgroup子系统,我将这4个线程限制在大核运行:

// 创建一个cpuset分组,配置为仅大核运行
# mkdir /dev/cpuset/gold
...
// 本机大核为CPU0/1/2/3
# echo 0-3 > /dev/cpuset/gold/cpus
// 依次将4个线程移至该分组
# echo <$tid> > /dev/cpuset/gold/task

然后,Android侧直接触发gcore了,导出解析后查看kernel log,调用栈与报错日志均与原问题一样;

此时,可以确认:

  1. 大核簇上过多RT线程会导致WLAN驱动里的软中断响应延时;

然后,多做一些对比,我在重启机器以后,再次重复上述步骤,唯一不同的是,这次我没有把这4个线程设置为RT线程;

于是,无事发生;

此时,另一条结论可以得出:

  1. 即便CPU满载,但只要不是RT线程抢占,软中断是可以及时响应的;

到这里,问题基本已经定位确认了:开机阶段CPU占用高,其中也有不少RT线程,如果此时它们全被调度到了大核上,那么WLAN的软中断就有可能会被大幅推迟,导致触发其内部的延时检测机制,从而引起Panic,生成gcore;

措施

  1. 减少应用层的RT线程数量,具体来说,是FIFO线程,因为Android framework中,AMS(ActivityManagerService)有一个属性sys.use_fifo_ui被打开了,这会导致前台应用的渲染线程被设置为FIFO调度,而且前台进程的大部分线程对大核调度是有亲和性的,这势必会加剧这个问题出现的概率;
  2. 通过限制、调整RT线程可执行的最长时间片(RT Throttle),来确保其不会把CPU资源耗尽;
  3. 通过cpuclt等机制,限制上层应用能占用的最大CPU比例,从而保留一定余量给到内核;

措施1实施后,问题就已经不再复现了,因此措施2与3没有实施,而是成为后续持续优化的备选方案;

思考

这个问题涉及到了我很多知识盲区,表面上是WLAN的问题,但实际上牵扯到了Linux内核调度、WLAN驱动,甚至system_server的策略;

整体来说是一个综合性的问题,虽然没有抓到出现问题瞬间的trace(几乎不可能)来直接证明这个结论,但是通过上面梳理,以及措施实施后的效果来看,其正确性是可以被印证的;

当问题解决时,内心还是有那么一点点成就感,感觉自己又进步了一点点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570885.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ROC和AUC

什么是ROC和AUC ROC曲线&#xff08;Receiver Operating Characteristic curve&#xff09;和AUC&#xff08;Area Under the Curve&#xff09;是用于评估二分类模型性能的重要工具。 ROC曲线以真正例率&#xff08;True Positive Rate&#xff0c;也称为召回率或灵敏度&…

【Java--数据结构】提升数据处理速度!深入理解Java中的顺序表机制

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 两种创建顺序表的方法及区别 认识ArrayList的构造方法 不带参数的构造方法 带参数的构造方法 利用Collection 构造方法 举例 ArrayList 常用方法演示 add addAll remo…

Docker容器搭建Hadoop集群(hadoop-3.1.3)

Docker容器环境下搭建Hadoop集群&#xff08;完全分布式&#xff09; hadoop版本为hadoop-3.1.3 &#xff08;1&#xff09;安装额外的速度较快的镜像库 yum install -y epel-release &#xff08;2&#xff09;安装同步工具&#xff0c;方便在多台服务器上进行文件的传输 …

LLM - 大语言模型(LLM) 的 评估体系

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://blog.csdn.net/caroline_wendy/article/details/138160155 大语言模型(LLM)的评估是复杂且多维的过程,涉及多个方面,包括评估体系、评估方法、评估实践。评估体系包括评估数据集、模型输出、样本/输出变换…

C++11 数据结构5 队列的概念,队列的顺序存储,实现,测试

一&#xff0c;队列的概念 队列是一种特殊的受限制的线性表。 队列&#xff08;queue&#xff09;是只允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的t&#xff08;First In First Out&#xff09;的线性表&#xff0c;简称FIF…

Day16-Java进阶-线程通信线程生命周期线程池单例设计模式

1. 线程通信 1.1 线程通信介绍 1.2 两条线程通信 package com.itheima.correspondence;public class CorrespondenceDemo1 {/*两条线程通信*/public static void main(String[] args) {Printer1 p new Printer1();new Thread(new Runnable() {Overridepublic void run() {syn…

机器学习运用-民宿价格

项目简介 随着旅游业的蓬勃发展&#xff0c;民宿市场迎来了前所未有的增长机遇。正好最近在参加拓尔思数据挖掘公益实习活动&#xff0c;我的项目将应用机器学习技术开发一个价格预测模型。可以达到更好地理解和预测民宿价格的目的&#xff0c;该模型综合考虑了从容纳人数、便…

【Java】文件操作(一)

文章目录 ✍一、文件的基本认识1.文件是什么&#xff1f;2.文本文件和二进制文件3.文件权限4.相对路径和绝对路径1.1绝对路径1.2相对路径 ✍二、文件的基本操作1.FIle的属性2.File的构造方法3.File类的方法3.1File类的获取操作3.2File类的判断操作3.3文件创建和删除3.4其他的常…

this指向

调用方式示例 函数中this的指向通过new调用new method()新对象直接调用method()全局对象通过对象调用obj.method()前面的对象call、apply、bindmethod.call(ctx)第一个参数 我们说的this指向是一个函数里边的this指向&#xff0c;如果这个this不在函数里边&#xff0c;那th…

C. Inhabitant of the Deep Sea

本题链接&#xff1a;Problem - C - Codeforces 题目&#xff1a; 样例&#xff1a; 输入 6 4 5 1 2 4 3 4 6 1 2 4 3 5 20 2 7 1 8 2 2 2 3 2 2 15 1 5 2 7 5 2输出 2 3 5 0 2 2 思路&#xff1a; 数学模拟。 根据题意&#xff0c;一前一后的攻击&#xff0c;攻击k次后&…

PotPlayer详细安装教程

安装步骤 进入官网&#xff1a; https://potplayer.tv/ 根据自己电脑的windows系统选择对应的版本安装 选择合适的字体 下载完成 优化设置 刚下好的potplayer仅限于能用&#xff0c;所有设置均为默认状态&#xff0c;我们需要进行优化 首先打开potplayer 右击选择选项 在…

三、CPU基础-缓存

计算机中缓存一般分为两个部分 1.内存 2.CPU Cache 一、CPU Cache分级 CPU Cache 通常分为大小不等的三级缓存&#xff0c;分别是 L1 Cache、L2 Cache 和 L3 Cache。 L1 Cache 和 L2 Cache 都是每个 CPU 核心独有的&#xff08;通常会分为「数据缓存」和「指令缓存」&#…

Git--原理与使用

目录 一、课程目标二、初始Git三、安装Git3.1 Linux-centos 四、Git的基本操作4.1 创建Git本地仓库 五、配置Git六、认识工作区、暂存区、版本库七、添加文件八、查看.git九、修改文件十、版本回退十一、撤销修改11.1 情况一&#xff1a;对于工作区的代码&#xff0c;还有add11…

海康NVR接入视频监控平台部分视频浏览失败,显示503错误的解决办法

目录 一、问题概述 二、问题排查 &#xff08;一&#xff09;排查思路介绍 &#xff08;二&#xff09;平台排查 1、确定排查的思路 2、信令控制模块的排查 3、媒体转发模块的排查 &#xff08;三&#xff09;客户设备排查 1.观察正常视频的设置 2. 调查问题原因 三…

B端设计实战:基于角色属性的权限设计

编辑导读:“权限控制”是中后台的基础能力,用于管控操作人员在平台内可做的事项内容。即通过权限控制,可以决定哪些人在平台内可以做哪些事。本文作者围绕角色&属性的权限设计展开分析,希望对你有帮助。 Hello,我是一名交互设计师。 随着3月暖春的即将到来,苏州的疫…

足球场体育馆三维可视化:颠覆传统观赛体验,开启视觉新纪元

在数字化浪潮席卷全球的今天&#xff0c;三维可视化技术正以其独特的魅力引领着体育场馆建设的革新潮流。这一技术的出现&#xff0c;不仅为观众带来了前所未有的视觉享受&#xff0c;更在体育产业的发展中&#xff0c;开启了一扇通往未来的大门。 足球场体育馆三维可视化&…

YOLOV1学习笔记

1. 前置知识简介 1.1 方向梯度直方图&#xff08;HOG, Histogram of Oriented Gradient&#xff09; 在计算机视觉以及数字图像处理中方向梯度直方图是一种能对物体进行检测的基于形状边缘特征的描述算子&#xff08;用于量化图像局部特征的算法工具&#xff0c;它将图像中的…

string 类以及模拟实现

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary_walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Flutter 中优雅切换应用主题的组件

Flutter 中优雅切换应用主题的组件 视频 https://youtu.be/L–XLpc452I https://www.bilibili.com/video/BV1wD421n75p/ 前言 原文 https://ducafecat.com/blog/flutter-app-theme-switch Adaptive Theme 这个组件通过包裹 MaterialApp 的方式整体管理 theme 主题&#xff0…

Java冲突

本身 父类 接口(多) 如果出现同样名字的方法,就会出现冲突 * 情况描述1: * 当一个类,继承了父类,实现了某接口,父类中的成员方法和接口中的方法重名 * 解决方法: * 子类就近选择父类成员方法 亲爹优先原则 * *使用格式: * 父类:super.方法名 * 父接口:父接口名.super.方…
最新文章