[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