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

Pavel Shilovsky =?iso-8859-1?q?piastry_=CE=C1_etersoft=2Eru?=
Сб Мар 14 22:51:32 MSK 2009


On Monday 09 March 2009 21:06:00 Evgeny Sinelnikov wrote:
> Такой вариант вариант ожидания называется активным, обычно для этого
> используются spinlock'и. Может быть и здесь они будут уместны? Не
> стоит забывать про SMP...
> http://en.wikipedia.org/wiki/Spin_locking
> http://www.linuxjournal.com/article/5833

В ходе общения с разработчиками драйвера выяснилось, что надо в таких случаях 
использовать struct completion.

diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index 1ae6314..f5e7b01 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 */
+       struct completion done;
 };

 /*
diff --git a/fs/cifs/connect.c b/fs/cifs/connect.c
index f254235..fdacf2d 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;

+       init_completion(&server->done);
        current->flags |= PF_MEMALLOC;
        cFYI(1, ("Demultiplex PID: %d", task_pid_nr(current)));

@@ -758,7 +759,6 @@ multi_t2_fnd:

        kfree(server->hostname);
        task_to_wake = xchg(&server->tsk, NULL);
-       kfree(server);

        length = atomic_dec_return(&tcpSesAllocCount);
        if (length  > 0)
@@ -775,6 +775,8 @@ multi_t2_fnd:
                set_current_state(TASK_RUNNING);
        }

+       complete_all(&server->done);
+
        return 0;
 }

@@ -1408,6 +1410,10 @@ cifs_put_tcp_session(struct TCP_Server_Info *server)
        task = xchg(&server->tsk, NULL);
        if (task)
                force_sig(SIGKILL, task);
+
+       wait_for_completion_interruptible(&server->done);
+
+       kfree(server);
 }

 static struct cifsSesInfo *


-- 
Best regards,
Pavel Shilovsky.


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