Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 06 Oct 2003 14:06:09 +0200
From:      Poul-Henning Kamp <phk@phk.freebsd.dk>
To:        arch@freebsd.org
Subject:   Alignment of disk-I/O from userland.
Message-ID:  <21229.1065441969@critter.freebsd.dk>

next in thread | raw e-mail | index | archive | help

Some disk controllers require that the memory buffer for a DMA
transfer be aligned on a particular bounday, typically four bytes,
but in some cases larger than that.

If a userland program does a read or write on a disk device (/dev/ad0
for instance),  we do some VM swizzle in physio and the request is
in essence a zero-copy thing directly into the process' pages, and
as an sideeffect of this, the pointer passed to the device driver
has the same offset into a page as the users request (the lower 12
bits on i386).

That means that userland programs can send down I/O requests which
are not properly aligned.

This program, in other words, would be a problem for some of our
disk controllers:

	#include <stdlib.h>

	int
	main(int argc, char **argv)
	{
		char *p;

		p = malloc(8192);	/* page aligned */
		read (0, p + 1, 2048);	/* not */
	}

Most code which does disk I/O from userland uses malloc'ed buffers for
the sectors and the alignment comes for free, but we currently have
no requirement that it be so.

How much code (apart from newfs(8)!) would we break by enforcing a
minimum alignment of for instance 16 bytes on disk-I/O requests
from userland ?

It would be a trivial matter to do the "bounce-buffering" somewhere
along the road, but I am not convinced it is the right thing to do
because all of sudden some requests would take a performance hit to
do a copy and some would not...

Qualified, informed input requested.

No Bikesheds please.

Poul-Henning

-- 
Poul-Henning Kamp       | UNIX since Zilog Zeus 3.20
phk@FreeBSD.ORG         | TCP/IP since RFC 956
FreeBSD committer       | BSD since 4.3-tahoe
Never attribute to malice what can adequately be explained by incompetence.



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?21229.1065441969>