[Devel] Бага #3626 cifs kmem_cache_destroy problem

Pavel Shilovsky =?iso-8859-1?q?piastry_=CE=C1_etersoft=2Eru?=
Пн Мар 9 17:44:38 MSK 2009


Здравствуйте,

Разобрался с проблемой, связанной с появлением сообщения "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 *



Проводился следующий тест:
20 раз подряд выполнялись след. действия:
1) загрузка модуля
2) монтирование шары
3) отмонтирование шары
4) выгрузка модуля

Раньше этот тест падал уже на второй итерации, после применении патча он 
полностью проходит.

-- 
Best regards,
Pavel Shilovsky.


Подробная информация о списке рассылки devel