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;	/* bitmap of non-empty queues */
struct slpque sched_slpque[SLPQUE_TABLESIZE]; /* sleep queues */

恐らくスケジューラのモジュール化の一環だと思われる。
単に移動しただけでなく、構造がかなり変わっており、カーネルに一本だったランキューがCPU毎に二本(リアルタイムプロセスのキュー、通常プロセスのキュー)に増えている。

但し、今の所2本に別けた意味はあまり無いように見える。
これがrunqueueの構造体:

typedef struct {
	/* Lock and bitmap */
	uint32_t	r_bitmap[PRI_COUNT >> BITMAP_SHIFT];
	/* Counters */
	u_int		r_count;	/* Count of the threads */
	u_int		r_avgcount;	/* Average count of threads */
	u_int		r_mcount;	/* Count of migratable threads */
	/* Runqueues */
	queue_t		r_rt_queue[PRI_RT_COUNT];
	queue_t		r_ts_queue[PRI_TS_COUNT];
	/* Event counters */
	struct evcnt	r_ev_pull;
	struct evcnt	r_ev_push;
	struct evcnt	r_ev_stay;
	struct evcnt	r_ev_localize;
} runqueue_t;

これがrunqueueを触る唯一の関数:

/*
 * Control of the runqueue.
 */

static void *
sched_getrq(runqueue_t *ci_rq, const pri_t prio)
{

	KASSERT(prio < PRI_COUNT);
	return (prio <= PRI_HIGHEST_TS) ?
	    &ci_rq->r_ts_queue[prio].q_head :
	    &ci_rq->r_rt_queue[prio - PRI_HIGHEST_TS - 1].q_head;
}

上記の関数で一緒くたに扱ってしまっているのだから、現状ではキューが1つの時と意味が変わらない気がする。
将来のスケジューラ拡張を見越した構造にしているのだろうか。