网卡驱动加载异步优化
openharmony/kernel/linux/linux-5.10/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
注意次优化需要按照之前 https://laval.csdn.net/6645d58c931dbe49ec6d1eca.html 文章来验证,直接修改源码会导致补丁patch失败,而且无法编译。
先贴上优化结果
启动时间从3.9秒直接缩短到2.87秒,注意每个开发板可能加了不同的驱动,对于稳定性的影响请自己验证。
下面直接贴出优化内容,纯干货:
openharmony/drivers/hdf_core/framework/model/input/driver/hdf_touch.c
int DoRegisterTouchChipDevice(void * data){
ChipDevice *chipDev =(ChipDevice *) data;
int32_t ret;
InputDevice *inputDev = NULL;
if ((chipDev == NULL) || (chipDev->chipCfg == NULL)) {
return HDF_ERR_INVALID_PARAM;
}
ret = DeviceBindDriver(chipDev);
if (ret != HDF_SUCCESS) {
HDF_LOGE("%s: chip device match driver failed", __func__);
return HDF_FAILURE;
}
ret = ChipDriverInit(chipDev);
if (ret != HDF_SUCCESS) {
goto EXIT;
}
inputDev = InputDeviceInstance(chipDev);
if (inputDev == NULL) {
return HDF_ERR_MALLOC_FAIL;
}
ret = RegisterInputDevice(inputDev);
if (ret != HDF_SUCCESS) {
goto EXIT1;
}
chipDev->driver->inputDev = inputDev;
chipDev->ops->SetAbility(chipDev);
return HDF_SUCCESS;
EXIT1:
OsalMemFree(inputDev);
EXIT:
chipDev->driver->device = NULL;
return HDF_FAILURE;
}
int32_t RegisterTouchChipDevice(ChipDevice *chipDev)
{
struct task_struct *task;
task = kthread_run(DoRegisterTouchChipDevice, chipDev, "RegisterTouchChipDevicThread");
return HDF_SUCCESS;
}
此优化在于将触摸屏注册异步线程执行,触摸屏的慢的原因在于i2c通讯中有sleep,用异步方式进行优化。
https://patchwork.kernel.org/project/linux-mediatek/patch/20220311112656.25348-1-mark-pk.tsai@mediatek.com/raw/
当存在大量的trace_event的时候初始化tracefs文件系统也很慢,同样用异步处理,当然也可以直接禁用此功能。
openharmony/kernel/linux/linux-5.10/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
注意次优化需要按照之前 https://laval.csdn.net/6645d58c931dbe49ec6d1eca.html 文章来验证,直接修改源码会导致补丁patch失败,而且无法编译。
static int do_rk_gmac_probe(void * de)
{
struct platform_device *pdev = de;
struct plat_stmmacenet_data *plat_dat;
struct stmmac_resources stmmac_res;
const struct rk_gmac_ops *data;
int ret;
data = of_device_get_match_data(&pdev->dev);
if (!data) {
dev_err(&pdev->dev, "no of match data provided\n");
return -EINVAL;
}
ret = stmmac_get_platform_resources(pdev, &stmmac_res);
if (ret)
return ret;
plat_dat = stmmac_probe_config_dt(pdev, &stmmac_res.mac);
if (IS_ERR(plat_dat))
return PTR_ERR(plat_dat);
if (!of_device_is_compatible(pdev->dev.of_node, "snps,dwmac-4.20a"))
plat_dat->has_gmac = true;
plat_dat->fix_mac_speed = rk_fix_speed;
plat_dat->get_eth_addr = rk_get_eth_addr;
plat_dat->bsp_priv = rk_gmac_setup(pdev, plat_dat, data);
if (IS_ERR(plat_dat->bsp_priv)) {
ret = PTR_ERR(plat_dat->bsp_priv);
goto err_remove_config_dt;
}
ret = rk_gmac_clk_init(plat_dat);
if (ret)
goto err_remove_config_dt;
ret = rk_gmac_powerup(plat_dat->bsp_priv);
if (ret)
goto err_remove_config_dt;
ret = stmmac_dvr_probe(&pdev->dev, plat_dat, &stmmac_res);
if (ret)
goto err_gmac_powerdown;
ret = dwmac_rk_create_loopback_sysfs(&pdev->dev);
if (ret)
goto err_gmac_powerdown;
printk("xuzhenhai %s:%d",__FILE__,__LINE__);
return 0;
err_gmac_powerdown:
printk("xuzhenhai %s:%d",__FILE__,__LINE__);
rk_gmac_powerdown(plat_dat->bsp_priv);
err_remove_config_dt:
printk("xuzhenhai %s:%d",__FILE__,__LINE__);
stmmac_remove_config_dt(pdev, plat_dat);
return ret;
}
static int rk_gmac_probe(struct platform_device *pdev)
{
struct task_struct *task;
task = kthread_run(do_rk_gmac_probe, pdev, "rk_gmac_probe_thread");
return 0;
}
此补丁也是对网卡的probe进行异步处理,特别是多个网卡的开发板,目前不确定是否存在多线程问题。
openharmony/drivers/hdf_core/framework/model/audio/common/src/audio_codec_base.c
#include "audio_codec_base.h"
#include "i2c_if.h"
#include "audio_driver_log.h"
#include "audio_parse.h"
#include "audio_sapm.h"
#include "osal_time.h"
#define HDF_LOG_TAG HDF_AUDIO_KADM
#define COMM_SHIFT_8BIT 8
#define COMM_MASK_FF 0xFF
#define COMM_WAIT_TIMES 1 // ms
#define I2C_REG_LEN 1
#define I2C_REG_MSGLEN 3
#define I2C_MSG_NUM 2
#define I2C_MSG_BUF_SIZE_1 1
#define I2C_MSG_BUF_SIZE_2 2
COMM_WAIT_TIMES的值调整小,目前在设置寄存器的时候回进入循环sleep逻辑,这样会导致无谓的cpu浪费。
打开CONFIG_INITRD_ASYNC选项
上述补丁在其他平台上的效果请自己验证确认。
更多推荐
所有评论(0)