[Devel] Бага #3626 cifs kmem_cache_destroy problem
Evgeny Sinelnikov
=?iso-8859-1?q?sin_=CE=C1_etersoft=2Eru?=
Пн Мар 9 21:06:00 MSK 2009
9 марта 2009 г. 17:44 пользователь Pavel Shilovsky
<piastry на etersoft.ru> написал:
> Разобрался с проблемой, связанной с появлением сообщения "Cannot allocate
> memory" во время частой перезагрузки модуля. Проблема была, в том, что поток,
> следящий за входящими сообщениями из сокета, не успевал очищать кеш запросов
> при отмонтировании шары.
>
> Ниже приведён патч, решающий эту проблему
> diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
> index 1ae6314..18ba45a 100644
> --- a/fs/cifs/cifsglob.h
> +++ b/fs/cifs/cifsglob.h
> @@ -176,6 +176,7 @@ struct TCP_Server_Info {
> struct mac_key mac_signing_key;
> char ntlmv2_hash[16];
> unsigned long lstrp; /* when we got last response from this server */
> + int running;
> };
>
> /*
> diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
> index f254235..39daaf2 100644
> --- a/fs/cifs/connect.c
> +++ b/fs/cifs/connect.c
> @@ -347,6 +347,7 @@ cifs_demultiplex_thread(struct TCP_Server_Info *server)
> bool isMultiRsp;
> int reconnect;
>
> + server->running = 1;
> current->flags |= PF_MEMALLOC;
> cFYI(1, ("Demultiplex PID: %d", task_pid_nr(current)));
>
> @@ -758,6 +759,8 @@ multi_t2_fnd:
>
> kfree(server->hostname);
> task_to_wake = xchg(&server->tsk, NULL);
> + server->running = 0;
> + msleep(20);
> kfree(server);
>
> length = atomic_dec_return(&tcpSesAllocCount);
> @@ -1408,6 +1411,9 @@ cifs_put_tcp_session(struct TCP_Server_Info *server)
> task = xchg(&server->tsk, NULL);
> if (task)
> force_sig(SIGKILL, task);
> +
> + while(server->running == 1)
> + msleep(10);
> }
>
> static struct cifsSesInfo *
>
Такой вариант вариант ожидания называется активным, обычно для этого
используются spinlock'и. Может быть и здесь они будут уместны? Не
стоит забывать про SMP...
http://en.wikipedia.org/wiki/Spin_locking
http://www.linuxjournal.com/article/5833
>
>
> Проводился следующий тест:
> 20 раз подряд выполнялись след. действия:
> 1) загрузка модуля
> 2) монтирование шары
> 3) отмонтирование шары
> 4) выгрузка модуля
>
> Раньше этот тест падал уже на второй итерации, после применении патча он
> полностью проходит.
>
Ну, хорошо... значит проблема, скорее всего, именно в этом... Как
только подготовишь поправки для использования системных объектов для
"блокировок в цикле", продублируй патч для стабильных веток ядра...
--
Sin (Sinelnikov Evgeny)
Подробная информация о списке рассылки devel