Subject: kern/3759: bdwrite() gets bp->b_dev == NODEV, causing 4x disk slowdown.
To: None <firstname.lastname@example.org>
From: Jonathan Stone <jonathan@DSG.Stanford.EDU>
Date: 06/17/1997 20:12:40
>Synopsis: bdwrite() gets bp->b_dev == NODEV, references off ebd of bdevsw
>Responsible: kern-bug-people (Kernel Bug People)
>Arrival-Date: Tue Jun 17 20:20:02 1997
>Release: NetBSD-current as at 1997-06-15
System: NetBSD Cup.DSG.Stanford.EDU 1.2F NetBSD 1.2F (PLACEBO) #5: Wed Jun 11 16:16:09 PDT 1997 jonathan@Cup.DSG.Stanford.EDU:/usr/src/sys/arch/i386/compile/PLACEBO i386
Appears on NetBSD 1.2F on a pmax and amiga
(disregard line above).
[[ Information below due to Michael L. Hitch, email@example.com]]
Disk throughput (as reported by iostat and bonnie) is reduced by a
factor of 4 when DEBUG is not defined.
This is due to bdwrite() being called with a buffer where
bp->b_dev == NODEV. bdwrite() tests for tape devices, and
issues bawrite() instead.
The bogus b_dev value of NODEV causes bdwrite() to reference junk
instead of a valid bdevsw entry. On pmaxes, this junk often ends up
being framebuffer font data, which if interpreted as a bdevsw entry,
has the D_TAPE bit set. This causes bdwrite() to issue bawrite()
instead, causing multiple writes to disk as the buffer fills, and a
factor of *FOUR* decrease in disk throughput.
Run bonnie, with a patch in bdwrite() to look for
bp->b_dev == NODEV.
Fix the buffer code to set bp->dev properly.
Defensive programming: maybe add an #ifdef DEBUG rangecheck
to bdwrite(), and elsewhere in vfs_bio.c?