memo391 : WP-1130

Created Tue Nov 30 16:57:49 2010
Last Modified Wed Dec 1 14:58:51 2010

*#1 Tue Nov 30 16:57:49 2010 / Wed Dec 1 00:55:46 2010

[N/A] Forward <= Today => Previous memo389

*Neut減衰長 => memo391


*putty:ウィンドウ->変換で文字コードをUTF-8にしとくと、imagesenderで日本語使っても大丈夫。

*WWW::Mechanizeでフォームのデフォルト値を読む:
    my $res = $mech->get('ないしょ'); # $mechはWWW::Mechanizeオブジェクト
    my $form = $mech->form_number(番号);
    my $textarea = $form->find_input(inputタグのname)->{value};

* nbbqデーモンをstopしたらnebula01が落ちた・・・->モブゆきさんありがとう!

* nbbqcomに、コマンドを打つたびにperlスクリプトを起動させる処理をぶっこむ。
→Mechanizeでnebulaページを自動更新!! => memo381

*[LINK] <- シドニア4巻。
カバーデザイナーが交代、テイストが若干変わった。どことなくBLAME!を感じる。
あと題字のフォントにディテールが入って、そこにもきゅんと来る。


*しくった・・・ vmeutil, vmestatのバックアップを忘れていた。ていうかusr/nbbq全体のバックアップをとっておくべきだった。






*#2 Tue Nov 30 17:40:39 2010 / Tue Nov 30 18:32:12 2010


run87(ロングラン)
./file/1291106341.ps

D207, D213(+VU103)でゲインシフトを観察。
D207, D213->同期
VU103->非同期
(18:32:12)

→これで原因がだいたい特定できた。
・LEMO-34chとQDCの接続部
・QDCそのもの
おそらく前者。
ケーブルを挿し直してから現象が見られるまでにdayオーダーのラグがあるので。

*#3 Tue Nov 30 17:42:10 2010 / Tue Nov 30 23:53:48 2010

*Attenuation Length

N101 on run79 => memo389
./file/1291108067.ps

のぼり3800mm
くだり4400mm.

カタスペでは380cm(in bulk).
->[LINK]

同様の方法で全neutのA.L.をざっくり見た(18:51:02)。
ただし、neut領域はY in [-900,+900]だが、
安全マージンとしてフィットは[-800,+800]で行う。
-----------------------------------------------------------------
NID  Au[mm]  Ad[mm]
101  3619.54 4406.70 <-上の例との不一致は、例では-900,+900でフィットしてたから
102  3476.59 3764.07
103  3829.70 3026.35
104  3810.44 3903.95
105  3417.07 3676.55
106  4204.97 4121.28
107  3215.70 3062.81
108  2881.22 3888.69
109  4019.89 4461.18
110  3888.39 4209.04
111  3292.81 2911.53
112  3075.50 2753.07
113  3565.53 3763.88
114  4041.53 3123.93
115  4352.73 4412.23
平均 3646    3699
偏差  411     566

201  3574.86 3991.49
202  3859.74 4323.93
203  3044.72 4146.66
204  3676.28 3465.60
205  3581.93 4740.12
206  3228.40 4009.45
207  4405.62 4070.50
208  3509.70 3095.49
209  3609.24 4227.08
210  4173.76 3953.66
211  3226.52 4343.80
212  4865.75 4302.70
213  5337.89 7272.46 !
214  4288.18 3922.43
215  7328.05 4923.46 ?
平均 3997    4111
偏差 1071     459
(213は除外して計算、215も除外すると100番台とまあまあ一致する)
----------------------------------------------







*#4 Wed Dec 1 01:25:36 2010 / Wed Dec 1 05:37:55 2010

* iseries対応のnbbq環境を気合いで自力復元

iseriesの機能を使うには ISERIESがdefineされている必要がある。
これはdriversのbb-modules.hで定義されていた。
bb-modules.hは10/7更新。

nbbqvio
file_operations構造体でデバイスをいじるときの作法を定義する?
ioctlとして何を使うかもここで指定。
きれいにまとまってる?=>[LINK]
/usr/nbbq/nbbqvio/nbbqvio.c:114:  ret = register_chrdev(nbbqvio_major,nbbqvio_name,&nbbqvio_fops);
最後のnbbqvio_fopsがfile_operations構造体。

nbbqvio.cで使用されているv***関数(vread,vwriteなど)はコントローラ独自のアクセサ。

関数名v***はまわりまわってdef-sbs620.hで定義されているマクロに従って独自のアクセサ関数名に置換される。
アクセサの実体はsbs620.cにある。
インクルード関係:
nbbqvio.c <- nbbqvio.h
          <- vioctrl.h
vioctrl.h <- def-sbs620.h

cmdvmeは cmdvme.c, libnbbqvio.cにのみ依存している。
cmdvme : cmdvme.o libnbbqvio.o
        $(CC) $(CFLAGS) cmdvme.o libnbbqvio.o -o cmdvme
cmdvme.c     <- nbbqvio.h
libnbbqvio.c <- nbbqvio.h

sbs620.cにある実体は、read, write(readl, writel)でデバイスファイルにアクセスする処理。

libnbbq.cにあるアクセサは、nbbqvio_fopsにセットされたioctlを使う。
#if LINUX_VERSION_CODE >=  0x020600
static struct file_operations nbbqvio_fops = {
  .read = nbbqvio_read,
  .poll = nbbqvio_poll,
  .ioctl = nbbqvio_ioctl,
  .open = nbbqvio_open,
  .release = nbbqvio_release,
};
#else
#if LINUX_VERSION_CODE >=  0x020400
static struct file_operations nbbqvio_fops = {
  read: nbbqvio_read,
  poll: nbbqvio_poll,
  ioctl: nbbqvio_ioctl,
  open: nbbqvio_open,
  release: nbbqvio_release,
};
#else
static struct file_operations nbbqvio_fops = {
  NULL,             // loff_t  llseek
  nbbqvio_read,     // ssize_t read
  NULL,             // ssize_t write
  NULL,             // int     readdir
  nbbqvio_poll,     // uint    poll
  nbbqvio_ioctl,    // int     ioctl
  NULL,             // int     mmap
  nbbqvio_open,     // int     open
  NULL,             // int     flush
  nbbqvio_release,  // int     release
};

->ioctlはnbbqvio_ioctl.
そしてその定義は
static int nbbqvio_ioctl(struct inode* inode, struct file *filep,
                         unsigned int cmd, unsigned long arg){
  unsigned short sval=0;
  unsigned long addr, lval=0, x;
#ifdef ISERIES
  unsigned int dn = 0;
#endif

/*    printk("filep->f_version     : %lu \n",filep->f_version); */
/*    printk("MINOR(inode->i_rdev) : %d \n",MINOR(inode->i_rdev)); */

  switch(cmd){
  case NBBQVIO_AMSR:
    /* int am */
    x = copy_from_user(&lval,(void *)arg,4);
    set_amsr((char)lval);
    break;
  case NBBQVIO_READ16:
    /* ulong addr, ushort data */
    x =copy_from_user(&addr,(void *)arg,4);
    vread16(addr,&sval);
    x = copy_to_user((void *)arg+4,&sval,2);
    break;
  case NBBQVIO_READ32:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    vread32(addr,&lval);
    x = copy_to_user((void *)arg+4,&lval,4);
    break;
  case NBBQVIO_WRITE16:
    /* ulong addr, ushort data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&sval,(void *)arg+4,2);
    vwrite16(addr,&sval);
    break;
  case NBBQVIO_WRITE32:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&lval,(void *)arg+4,4);
    vwrite32(addr,&lval);
    break;
  case NBBQVIO_DMAR16:
    break;
  case NBBQVIO_DMAR32:
    break;
  case NBBQVIO_DMAW16:
    break;
  case NBBQVIO_DMAW32:
    break;
#ifdef ISERIES
    /* i-seriese */
  case NBBQVIO_AMSR_I:
    /* int am */
    x = copy_from_user(&lval,(void *)arg,4);
    x = copy_from_user(&dn,(void*)arg+4,4);
    set_amsr_i((char)lval,dn);
    break;
  case NBBQVIO_READ16_I:
    /* ulong addr, ushort data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&dn,(void *)arg+4,4);
    vread16_i(addr,&sval,dn);
    x = copy_to_user((void *)arg+8,&sval,2);
    break;
  case NBBQVIO_READ32_I:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&dn,(void *)arg+4,4);
    vread32_i(addr,&lval,dn);
    x = copy_to_user((void *)arg+8,&lval,4);
    break;
  case NBBQVIO_WRITE16_I:
    /* ulong addr, ushort data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&sval,(void *)arg+4,2);
    x = copy_from_user(&dn,(void *)arg+8,4);
    vwrite16_i(addr,&sval,dn);
    break;
  case NBBQVIO_WRITE32_I:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&lval,(void *)arg+4,4);
    x = copy_from_user(&dn,(void *)arg+8,4);
    vwrite32_i(addr,&lval,dn);
    break;
  case NBBQVIO_DMAR16_I:
    break;
  case NBBQVIO_DMAR32_I:
    break;
  case NBBQVIO_DMAW16_I:
    break;
  case NBBQVIO_DMAW32_I:
    break;
#endif
  }
  return 1;
}

結局vread, vwriteを使用している。
なので、おそらくcmdvmeでアクセサに_iを付け足してやればよい?
i-seriesのioctlを使うときはリクエスト定数末尾に_Iを付加してやる。
    /* i-seriese */
  case NBBQVIO_AMSR_I:
  case NBBQVIO_READ16_I:
  case NBBQVIO_READ32_I:
  case NBBQVIO_WRITE16_I:
  case NBBQVIO_WRITE32_I:
  case NBBQVIO_DMAR16_I:
  case NBBQVIO_DMAR32_I:
  case NBBQVIO_DMAW16_I:
  case NBBQVIO_DMAW32_I:

vmeutil/nbbqvio.hに、nbbqvio/nbbqvio.hから上記の定数定義をもってきた(4:08:07)
また extern v***_iも追加。
libnbbqvio.cにv***_iの実体を定義する。

普通のアクセサ------------
unsigned long vme_read32(unsigned long addr){
  nbbqvio_val[0] = addr;
  ioctl(nbbqvio_fd,NBBQVIO_READ32,nbbqvio_val);

  return nbbqvio_val[1];
}

ioctl---------------------
  case NBBQVIO_READ32:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    vread32(addr,&lval);
    x = copy_to_user((void *)arg+4,&lval,4);
    break;

argはunsigned long.これを(void *)でポインタとしてキャストしている。
argはnbbqvio_valで、これはunsigned longの配列。
配列=ポインタであることを考えると(void *)arg+4 = nbbqvio_val[1].

ioctl(i-series)--------------
  case NBBQVIO_READ32_I:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&dn,(void *)arg+4,4);
    vread32_i(addr,&lval,dn);
    x = copy_to_user((void *)arg+8,&lval,4);
    break;
******
  case NBBQVIO_WRITE32_I:
    /* ulong addr, ulong data */
    x = copy_from_user(&addr,(void *)arg,4);
    x = copy_from_user(&lval,(void *)arg+4,4);
    x = copy_from_user(&dn,(void *)arg+8,4);
    vwrite32_i(addr,&lval,dn);
    break;


つまり、アクセサ側ではdnはnbbqvio_val[1](または[2],write時)としてセットすればよい。


紆余曲折を経て、警告は出るものの(nbbqvio.cでの_iシリーズの暗黙の宣言エラー)コンパイルは通るようになった。
anapawでデータも来る。しかし来すぎる。案の定ヒストグラムは空。(5:29:45)
->警告は解決。bb-vme.hのコメントアウトを外した。
grepでは/*~*/でのコメントアウトが分からない・・・

*#5 Wed Dec 1 14:52:11 2010 / Wed Dec 1 14:58:51 2010

答え合わせ

・defineの順番がまずい
・nbbqvio_valの長さが1足りない
・init_nbbqvio, release_nbbqvioもi-series対応
あとはあってた?
defineの順番を間違えたのはいただけないが。。。
配列の長さ違いを見落としたのもよくない。

*Linked from: