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/