NetBSD

Fast forwardなどのベンチマーク

http://www.tancsa.com/blast.htmlFreeBSDやNetBSDでの色々な条件下でのスループットベンチマークが行われていて、fastfwd時の結果も載っている。 見た限り、つかっててもつかってなくてもそんなに差はない。

NetBSD-current ip_flowの仕組み

1度目のパケット ether_input()からipflow_fastforward()が実行されるが、一度も学習されていないフローはどこに送れば良いのか分からない為、 if ((ipf = ipflow_lookup(ip)) == NULL) return 0; でreturn 0でether_input()に戻り、schednetisr(NETISR_IP)…

NetBSD-current calloutの実装

これもnetisrのようにsoftintのラッパーのような構造になっている。 流れは以下の通り:callout_init_cpu()からsoftint_establish()が呼ばれ、callout_softclock()がsoftintのハンドラとして登録されるhardclock()より1tick毎にcallout_hardclock()が呼ばれ…

NetBSD-current ip_flowのまとめ

要するに、pf/ipfが有効だとip_flowは無効になっちゃうので、一般的なルータとしては何の役にも立たない。 だから、FreeBSDではとっとと捨てられてip_fastforwardに代わったのだと思われる。

NetBSD-current ipfの場合

ip_flowに関する調査の続き。一方、ipfの場合は以下のような所にhookが有る模様: dist/ipf/netinet/ip_fil_netbsd.c: error = pfil_add_hook((void *)fr_check_wrapper, NULL, dist/ipf/netinet/ip_fil_netbsd.c- PFIL_IN|PFIL_OUT, ph_inet); -- dist/ipf/…

NetBSD-current pfil_hooksとpf

ip_flowに関する調査の続き。pfil_hooksは複数のフィルタフレームワークを切り替えて使う為の機構だと思われる。pfil_add_hook()/pfil_remove_hook()でフック関数を追加・削除、 pfil_run_hooks()でプロトコルスタック内からフック関数群を実行する。フック…

NetBSD-current netisrの実装

ip_flowに関しての調査の続き。netisrの初期化は、softint_init()の中の以下の部分で行われる: #define DONETISR(n, f) \ softint_netisrs[(n)] = softint_establish(SOFTINT_NET|SOFTINT_MPSAFE,\ (void (*)(void *))(f), NULL) #include <net/netisr_dispatch.h> かなり変則的な</net/netisr_dispatch.h>…

ファストパスとBSD

IPパケットフォワーディングの高速化手法として、ファストパスというものがあるらしい。 どこで始まったのか知らないが、少なくともYAMAHAのルータの機能として日本語での資料が存在している: http://www.rtpro.yamaha.co.jp/RT/docs/fastpath/要するに、パ…

NetBSD-current ip_flowを通らない場合のNetBSD-currentのIPパケット受信処理

NetBSD-currentのip_flowに関して調査している。まずは、ip_flowを通らない場合のNetBSD-currentのIPパケット受信処理を調べて みた。個々のイーサネットデバイスドライバは、デバイスからパケットデータを取り出 してmbufに詰め、最後に (*ifp->if_input)(i…

NetBSD-currentでsysctlのエントリを増やす

ハンドル関数を実装する場合の例: static int sysctl_val1(SYSCTLFN_PROTO); static int sysctl_val1(SYSCTLFN_ARGS) { struct sysctlnode node; int error; static int t = 10; node = *rnode; node.sysctl_data = &t; error = sysctl_lookup(SYSCTLFN_CAL…

NetBSD-current/MIPSのプロセススケジューリング

クロック割り込み〜hardclock() クロック割り込み(MIPS_INT_MASK_5)が入り、 arch/evbmips/evbmips/interrupt.c: cpu_intr()が呼ばれ、 arch/mips/mips/mips3_clockintr.c: mips3_clockintr()が呼ばれ、 kern/kern_clock.c: hardclock()へたどり着く。ここ…

FreeBSDとの違い

roundrobin()の仕組み、tick値やrrticks値の設定はNetBSD 1.6と「BSDカーネルの設計と実装」の段階でのFreeBSDとは特に違いがないように見える。 4BSD由来のコードがそのまま生きているという事だろう。BSDカーネルの設計と実装―FreeBSD詳解作者: マーシャル…

クロックレートとタイムスライス

NetBSD 1.6のデフォルト値ではHZ = 100に設定されており、tick = 10000us = 10msである。 rrticks = hz / 10 = 10ticks = 100msであり、hardclock()が10ms毎、roundrobin()が100ms毎に実行される事になる。 つまり、1スレッド毎のタイムスライスは100msにな…

NetBSD 1.6/MIPSのプロセススケジューリング

hardclock()はtick毎に呼び出され、その中でroundrobin()はrrticks毎に呼び出される。roundrobin()はneed_resched()を呼び出し、need_resched()はaston()を呼び出す。 これにより、proc構造体のmd_astpendingフラグが有効になる。UserIntr,UserGenException,…

yamt-idlelwp branchに関する議論のスレッドで発見したパッチの解析

NetBSD-currentにはschedcpu()がないで少し言及したyamt-idlelwp branchに関する議論のスレッドで発見したパッチを解析してみた。 このパッチは恐らくスケジューラのモジュール化を目的としており、4.0からcurrentのコードへ至る途中の段階がどうなっていた…

NetBSD-current - sched_4bsd.cの解析

sched_tick() 100ms毎にプロセスを切り替える、とコメントに書いてあるように見えるが、実際にやっているのはcpu_need_resched()の呼び出しでci->ci_want_reschedを1にしたり、spc->spc_ticksを更新したり、spc->spc_flagsを書き換えたりする程度。kern_clo…

generic software interrupt framework

NetBSDにはgeneric software interrupt frameworkという仕組みがある。 これはボトムハーフハンドラを実現したり、クロック処理等に使われている。 Linuxの*_softirq()に近い。APIは、 void * softint_establish(u_int flags, void (*func)(void *), void *a…

NetBSD-currentのランキュー(kern/kern_runq.c)

NetBSD-currentでは、それまでkern/kern_synch.cにあったキュー関連の変数※とキューへのアクセス関数をまとめてkern/kern_runq.cへ移動した。 ※以下の変数 struct prochd sched_qs[RUNQUE_NQS]; /* run queues */ volatile uint32_t sched_whichqs; /* bitma…

NetBSD-currentでは、mi_switch()も激しく書き直されている

2.0より処理の単位がprocからlwpへ書き直された。引数がバージョンによって異なる: 1.6 mi_switch(struct proc *p) 2.0〜4.0 mi_switch(struct lwp *l, struct lwp *newl) current mi_switch(struct lwp *l) 1.6ではmi_switch()がcpu_switch()を呼び出し、…

NetBSD-currentにはschedcpu()がない

revision 1.188より、NetBSD-currentではschedcpu()が無くなっている。これは、スケジューラのモジュール化を進めていく中でschedcpu()をモジュール固有の機能/モジュール間で共通の機能に別けて整理し直した為と思われる。schedcpu()はsched_pstats()に名…

NetBSDのプロセススケジューラ解析 / 1.6→current間の主な変更点

スケジューリング機構に手を入れる事を目的として、NetBSDのプロセススケジューラを解析している。 作業の中で分かった事を順次まとめて行きたい。 スケジュールの単位がprocからlwpに変更され、スケジューリングに関する主要なパラメータがlwpに移った(2.0…