[lvc-project] [PATCH 6.1] mm/damon: get rid of overlapping areas

Марков Глеб Игоревич markov.gi at npc-ksb.ru
Tue Jun 23 13:26:28 MSK 2026


Использование strtok() в ядре не представляется возможным, столкнулся с ошибкой формата:

'dbgfs_monitor_on_write':mm/damon/dbgfs.c:1013:17: error: implicit declaration
of function 'strtok'; did you mean 'kstrtol'?
 
Кроме того, функция избавляется в том числе и от лидирующих пробельных символов.
Использование strsep() в цикле позволяет корректно смещать указатель и перехватывать
первый токен, который будет найден до символов-разделителей (если они есть) и после.
 
Замена strncmp() на менее (на первый взгляд) безопасный strcmp() гарантирует
корректность, поскольку его значение явно определено и работа с изолированным токеном,
имхо, является более безопасным вариантом, чем использовать внешний count при сравнении.

Альтернатива в виде strim() тоже отпадает, поскольку обрезается лишь значение после токена,
а теоретические лидирующие пробелы не отпадают, а значит работа будет вестить с
некорректным значением.

Вторник, Июнь 23, 2026 12:50 MSK, Fedor Pchelkin <pchelkin at ispras.ru> писал(а):
 
On Tue, 23. Jun 12:43, Markov Gleb wrote:
> @@ -1003,19 +1003,27 @@ static ssize_t dbgfs_monitor_on_write(struct file *file,
> {
> ssize_t ret;
> char *kbuf;
> + char *token;
> + char *temp_buf;
> 
> kbuf = user_input_str(buf, count, ppos);
> if (IS_ERR(kbuf))
> return PTR_ERR(kbuf);
> 
> - /* Remove white space */
> - if (sscanf(kbuf, "%s", kbuf) != 1) {
> + /* Will use temporary to avoid problems with original */
> + temp_buf = kbuf;
> +
> + do {
> + token = strsep(&temp_buf, " \t\r\n\v\f");

Что это?

Просьба заиспользовать существующую в ядре функцию для очистки
пробельных символов из конца буфера.

> + } while (token && *token == '\0');
> +
> + if (!token) {
> kfree(kbuf);
> return -EINVAL;
> }
> 
> mutex_lock(&damon_dbgfs_lock);
> - if (!strncmp(kbuf, "on", count)) {
> + if (!strcmp(token, "on")) {

Зачем?

> int i;
> 
> for (i = 0; i < dbgfs_nr_ctxs; i++) {
> @@ -1026,7 +1034,7 @@ static ssize_t dbgfs_monitor_on_write(struct file *file,
> }
> }
> ret = damon_start(dbgfs_ctxs, dbgfs_nr_ctxs, true);
> - } else if (!strncmp(kbuf, "off", count)) {
> + } else if (!strcmp(token, "off")) {

Зачем?

> ret = damon_stop(dbgfs_ctxs, dbgfs_nr_ctxs);
> } else {
> ret = -EINVAL;
> -- 
> 2.43.0
 



 
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://linuxtesting.org/pipermail/lvc-project/attachments/20260623/5e8d8fce/attachment.html>


More information about the lvc-project mailing list