I have a driver that uses kiobufs to perform I/O.  Prior to these
changes, the kiobuf allocation and manipulation was very quick and
efficient.  It is now very slow.
The kiobuf part of the I/O request is as follows:
	alloc_kiovec()
	map_user_kiobuf()
	... do I/O, using kiobuf to store mappings ...
	kiobuf_wait_for_io()
	free_kiovec()
Now that the kiobuf is several KB in size, and 1024 buffer heads
are allocated, the alloc_kiovec part goes from a percent or so of
CPU usage to do 13000 requests per second to around 90% CPU usage
to do 3000 per second.
It looks as though the raw driver allocates one kiobuf at open time
(rather than on a per-request basis), but if two or more requests
are issued to a single raw device, it too devolves into the allocate
on every request strategy.
Before I go further, I'd appreciate if someone could confirm my
hypotheses and also explain rawio-bench (and maybe point me to some
source, if available).
thanks
jeremy
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/