SMP
CONFIG_RFS_ACCELは一言でいうとRFSをMultiqueue NIC上で実現する機能で、もう少し説明すると、あるパケットが届いたら宛先プロセスの所属するCPUに対して割り込めるようNICにヒントを出す、というものなのだが、どれくらいの範囲のNICに対応しているのかと…
※追記:実際にはカーネルにprintkを突っ込みまくるという、ずっと泥臭い方法で調査をしてました。多分役にたたないと思うけど、一応その時のdiffも併せて公開しておきます。Linux 3.2.0+用なので、他のバージョンだと当たらないかもしれません。 Debug print…
※追記:MSIはPCI 3.0からじゃなくてPCI 2.3からだとの指摘を受けて書き換え。※追記:hisakさんから詳しくコメントが入っているので、併せて読んで下さい。 とてつもなく遅れたKernel/VM Advent Calendarの25日目の記事です。 Linuxにおける/proc/irq//smp_af…
NICのドライバはパケットを受信してnetif_receive_skbかnapi_gro_receiveを呼ぶ。napi_gro_receiveの場合はGRO処理をパケットに施した後に結合済みパケットをnetif_receive_skbを呼ぶ。netif_receive_skbでenqueue_to_backlogをコール。 ret = enqueue_to_ba…
Linuxのポーリング処理のコードを読んでみよう 〜割り込み編〜 - かーねる・う゛いえむにっきの続き。まず、前回最後にスケジュールしたNET_RX_SOFTIRQってソフトウェア割り込みがどこで登録されてて、どれがハンドラかって所から見てみる。net_dev_init()っ…
Linuxのポーリング処理のコードを読んでみよう 〜初期化編〜 - かーねる・う゛いえむにっきの続き。まず、割り込みがかかるとe1000_intrが呼ばれる。 3370 static irqreturn_t e1000_intr(int irq, void *data) 3371 { 3372 struct net_device *netdev = dat…
みんなの大好きなe1000のドライバから、ポーリング処理を追ってみようと思う。 カーネルのバージョンは、fxr.watson.orgに現時点で上がっている2.6.36-rc2。 但し、何故かnet/core/dev.cのページが破損してるので、その部分は配布ソースコードから。 252 mod…
この記事の続きになる訳だが、いくらSolaris最強って言っても、大手メーカーがこぞってつつき回して性能改善したり機能追加したりしてるはずのLinuxで何も対策が打たれてない訳が無いよね。じゃあどうなってるんだろう、って話。例によって、Linuxとか全ッ然…
「SolarisのネットワークスタックはSMPに強い」という噂を聞いていたので、取り敢えずどんな感じなのか資料を斜め読みしてみた。 Solarisとか全ッ然知らないので、間違ってたらツッコミ下さい。資料: Oracle and Sun Microsystems | Strategic Acquisitions…
現状: cpu1でクロック割り込みはかかる cpu0→cpu0のIPIはかかる cpu1→cpu0のIPIはかかる cpu1→cpu1のIPIはかからない cpu0→cpu1のIPIはかからない 何となく、割り込みコントローラへの設定などなどがしくってるような気がするけど、IMR0の値もステータスレ…
Linuxを参考に、IPIのIRQをヘッダに足してみる。 Index: hub.h =================================================================== RCS file: /cvs/src/sys/arch/sgi/xbow/hub.h,v retrieving revision 1.7 diff -u -p -r1.7 hub.h --- hub.h 8 Nov 2009…
全く動作確認取ってないしコンパイルすら通してないけど、俺のゴーストはこれで大丈夫とささやいてるから多分大体あってるはず。 アクセスするレジスタ類はLinuxのip27のコードに合わせて、interm,imaskの配列化は以前ip30向けに実装したコードを参照。 Inde…
hw_cpu_hatch()で割り込み有効にしてbreakかけてddbが上がるかどうか確かめればExceptionをハンドルしてtrap出来てるか分かるという単純極まりない事実に気づいて早速試してみる。 /* * Build proper TLB refill handler trampolines. */ extern void xtlb_m…
この間の起動テストコードに、CPU初期化時にセカンダリプロセッサを探してnasid, physidをstruct cpu_hwinfo secondarycpu_hwinfo[MAXCPUS]に保存し、後でこれを見に行って順に起こすというコードを足した。 でもbootcpu_hwinfoとsecondarycpu_hwinfo[]が分…
久しぶりにコードをコミットした。リハビリ中な気分。 +#ifdef MULTIPROCESSOR +LEAF(getcurcpu, 0) + GET_CPU_INFO(v0, v1) + jr ra +END(getcurcpu) nopで埋め忘れてる。 +#ifdef MULTIPROCESSOR +LEAF(getcurcpu, 0) + GET_CPU_INFO(v0, v1) + jr ra + no…
OpenBSDでカレントプロセッサのcpu_info(※per-CPUなデータを保存する構造体)のポインタを取得するにはcurcpu()というマクロを呼ぶのだが、現状のOpenBSD/sgiではこんな風になっている: #define curcpu() cpu_info[cpu_number()] で、cpu_number()はハード…
前にも書いた通り、cpu0,cpu1,cpu2の3つを認識させ、cpu1を無効なまま放置してcpu2を起動するのがファーストステップである。As I mentioned before, detect cpu0, cpu1, cpu2 and leave cpu1 disabled and launch cpu2 is the first step. Index: sgi/sgi/…
取り敢えず、最小限の作業で手元の2コア1ノード構成が動くまでにやらねばならぬ事。・スレーブCPUの起動、LAUNCHで。 ・Exceptionテーブルコピー、uvmでの使用禁止などプライベートエリアの手当て ・取り敢えずcpu0,cpu2がオンラインでcpu1がオフラインに見…
プロセッサの検出はKLCONFIGで出来る事が分かったが、起動はどうしているのだろうか。 Linuxでは、arch/mips/sgi-ip27/ip27-smp.cにこんな事が書いてある: static void __cpuinit ip27_boot_secondary(int cpu, struct task_struct *idle) { unsigned long …
Linuxのソースコードを読んでいくと、どうもCPU構成の情報はKLCONFIGという所から読み込んでやればいいらしい事が分かる。arch/mips/sgi-ip27/ip27-smp.cというファイルを覗くとこんな関数がある: static int do_cpumask(cnodeid_t cnode, nasid_t nasid, i…
まだ分かってない事も多いのだが、追々調べる。 Originのコンセプト これは、ディスプレイコネクタもなく2Uである事からも分かるように、デスクサイドに置くようなタイプのマシンでなくラックに詰め込んで何らかの処理(レンダリングファーム用?それともHP…
動画:http://www.ustream.tv/recorded/5403563 スライド:http://www.slideshare.net/syuu1228/smp-implementation-for-openbsdsgi 論文:http://www.openbsd.org/papers/asiabsdcon2010_smp_for_sgi.pdf ペース配分がイマイチだったという指摘はあったもの…
大事な事なので何度も言うよ! AsiaBSDConでお話する事になりました。 私の発表は2010/3/13 15:30〜です。 AsiaBSDCon 2010 - 会議日程題名は、SMP Implementation for OpenBSD/sgiです。 まぁ、今までのOpenBSD workのまとめですね。 登録費がかなり高く、…
cd /usr; cvs checkout -P src でGENERIC-IP30に option MULTIPROCESSORを書き加えてカーネルをビルドすればSMPで起動します。まだ足りない機能があり動作も不安定ですが、とりあえずブートくらいは可能です。
interrupt 100%ってなにそれこわい load averages: 0.15, 1.88, 2.69 20:43:19 20 processes: 19 idle, 1 on processor CPU0 states: 0.0% user, 0.0% nice, 0.0% system, 100% interrupt, 0.0% idle CPU1 states: 0.0% user, 0.0% nice, 0.0% system, 100% …
きゃほーい( ´∀`) load averages: 5.27, 2.97, 1.43 20:26:08 34 processes: 4 running, 28 idle, 2 on processor CPU0 states: 87.5% user, 0.0% nice, 0.0% system, 12.5% interrupt, 0.0% idle CPU1 states: 87.9% user, 0.0% nice, 0.0% system, 12.1…
残念です(´・ω・`)… >> bootp(): Setting $netaddr to 192.168.3.2 (from server ) Obtaining from server 5175104+561280 entry: 0xa800000020020000 ARCS64 Firmware Version 64.0 Found SGI-IP30, setting up. Initial setup done, switching console. Co…
出来たよ(`・ω・´) http://www.openbsd.org/cgi-bin/cvsweb/src/sys/arch/mips64/include/ちゃんと僕の名前がCVSに乗りました。
void mips64_ipi_init(void) { unsigned cpu = cpu_number(); int ret; ret = xheart_intr_establish(mips64_ipi_intr, NULL, HEART_INTR_IPI(cpu), IPL_HIGH, "ipi"); if (ret) panic("xheart_intr_establish failed:%d\n", ret); } 間違えて引数に割り込み…
取り合えず実装してみたんだが、動いていない模様。 うーん。xheartのデータシートが欲しいよう。HEART_INTR_IPI(x)はHEART_INTR_MAXよりデカいけど正しいのか分からない。 HEART_IMR(0)はHEART_IMR(cpu_number())に書き直した。 Index: xbow/xheartreg.h ==…