| Added |
Translation |
|
Title: Linux, Description: En el kernel de Linux, la siguiente vulnerabilidad ha sido resuelta:
coresight: tmc-etr: Soluciona condición de carrera entre el modo sysfs y perf
Al intentar ejecutar los modos perf y sysfs simultáneamente, el WARN_ON() en tmc_etr_enable_hw() se activa a veces:
ADVERTENCIA: CPU: 42 PID: 3911571 en drivers/hwtracing/coresight/coresight-tmc-etr.c:1060 tmc_etr_enable_hw+0xc0/0xd8 [coresight_tmc]
[..recorte..]
Rastro de llamada:
tmc_etr_enable_hw+0xc0/0xd8 [coresight_tmc] (P)
tmc_enable_etr_sink+0x11c/0x250 [coresight_tmc] (L)
tmc_enable_etr_sink+0x11c/0x250 [coresight_tmc]
coresight_enable_path+0x1c8/0x218 [coresight]
coresight_enable_sysfs+0xa4/0x228 [coresight]
enable_source_store+0x58/0xa8 [coresight]
dev_attr_store+0x20/0x40
sysfs_kf_write+0x4c/0x68
kernfs_fop_write_iter+0x120/0x1b8
vfs_write+0x2c8/0x388
ksys_write+0x74/0x108
__arm64_sys_write+0x24/0x38
el0_svc_common.constprop.0+0x64/0x148
do_el0_svc+0x24/0x38
el0_svc+0x3c/0x130
el0t_64_sync_handler+0xc8/0xd0
el0t_64_sync+0x1ac/0x1b0
---[ fin del rastro 0000000000000000 ]---
Dado que la habilitación del modo sysfs está separada en dos regiones críticas, una para la asignación del búfer sysfs y otra para la habilitación del hardware, es posible que haya una condición de carrera con el modo perf. Soluciona esto verificando dos veces si el modo perf ha sido utilizado antes de habilitar el hardware en el modo sysfs.
modo:
[modo sysfs] [modo perf]
tmc_etr_get_sysfs_buffer()
spin_lock(&drvdata->spinlock)
[asignación de búfer sysfs]
spin_unlock(&drvdata->spinlock)
spin_lock(&drvdata->spinlock)
tmc_etr_enable_hw()
drvdata->etr_buf = etr_perf->etr_buf
spin_unlock(&drvdata->spinlock)
spin_lock(&drvdata->spinlock)
tmc_etr_enable_hw()
WARN_ON(drvdata->etr_buf) // ADVERTENCIA ya que etr_buf inicializado en
el lado perf
spin_unlock(&drvdata->spinlock)
Con esta solución, mantenemos la verificación de CS_MODE_PERF en get_etr_sysfs_buf. Esto asegura que verifiquemos si el modo perf ya está en ejecución antes de asignar realmente el búfer. Entonces podemos ahorrar el tiempo de asignar/liberar el búfer sysfs si hay una condición de carrera con el modo perf.
|