GELI には修正が入っている2007年03月13日 10時05分09秒

以前に 7.0-CURRENT で geli が動かなくなったのは書いた。

しばらくした後に、 current メーリングリストに修正が投稿され、それがそのまま取り込まれた。

動作しなくなったのは以下の変更が原因だ。


% cd /usr/src/sys/geom/eli
% cvs diff -r 1.33 -r 1.34 g_eli.c
Index: g_eli.c
===================================================================
RCS file: /home/ncvs/src/sys/geom/eli/g_eli.c,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- g_eli.c     2 Nov 2006 09:01:34 -0000       1.33
+++ g_eli.c     28 Jan 2007 20:29:12 -0000      1.34
@@ -324,6 +324,13 @@
 
        wr = arg;
        sc = wr->w_softc;
+#ifdef SMP
+       /* Before sched_bind() to a CPU, wait for all CPUs to go on-line. */
+       if (sc->sc_crypto == G_ELI_CRYPTO_SW && g_eli_threads == 0) {
+               while (!smp_started)
+                       tsleep(wr, 0, "geli:smp", hz / 4);
+       }
+#endif
        mtx_lock_spin(&sched_lock);
        sched_prio(curthread, PRIBIO);
        if (sc->sc_crypto == G_ELI_CRYPTO_SW && g_eli_threads == 0)

見ての通り、SMP カーネルの場合に、sleep を入れて同期を取りたいようだ。原因は一つの CPU しかない機械で、SMP を使うと危険なのは簡単にわかるが、どのように対処すればいいかは検討が付かなかったので、 1.33 に戻しておいた。

それに対しての修正。


% cvs diff -r 1.33 -r 1.35 g_eli.c
Index: g_eli.c
===================================================================
RCS file: /home/ncvs/src/sys/geom/eli/g_eli.c,v
retrieving revision 1.33
retrieving revision 1.35
diff -u -r1.33 -r1.35
--- g_eli.c     2 Nov 2006 09:01:34 -0000       1.33
+++ g_eli.c     2 Mar 2007 09:38:16 -0000       1.35
@@ -324,6 +324,14 @@
 
        wr = arg;
        sc = wr->w_softc;
+#ifdef SMP
+       /* Before sched_bind() to a CPU, wait for all CPUs to go on-line. */
+       if (mp_ncpus > 1 && sc->sc_crypto == G_ELI_CRYPTO_SW &&
+           g_eli_threads == 0) {
+               while (!smp_started)
+                       tsleep(wr, 0, "geli:smp", hz / 4);
+       }
+#endif
        mtx_lock_spin(&sched_lock);
        sched_prio(curthread, PRIBIO);
        if (sc->sc_crypto == G_ELI_CRYPTO_SW && g_eli_threads == 0)

mp_ncpus で CPU の数が一つよりも多いときにのみ、tsleep を入れて、同期を図るのが修正だ。

確かに、そのまま見た通りの修正だが、どのようにすれば CPU の数を取得できるのかを、知らなければできない修正だ。ソースもかなりの量があり、問題に当たっても自分で直して涼しい顔で運用するのにはかなりの経験が必要になりそうだ。

前回