On 11/21/2018 6:23 PM, Christoph Hellwig wrote:
Hi all, this series optimizes a few bits in the block layer and nvme code related to polling. It starts by moving the queue types recently introduce entirely into the block layer instead of requiring an indirect call for them. It then switches nvme and the block layer to only allow polling with separate poll queues, which allows us to realize the following benefits: - poll queues can safely avoid disabling irqs on any locks (we already do that in NVMe, but it isn't 100% kosher as-is) - regular interrupt driven queues can drop the CQ lock entirely, as we won't race for completing CQs Then we drop the NVMe RDMA code, as it doesn't follow the new mode, and remove the nvme multipath polling code including the block hooks for it, which didn't make much sense to start with given that we started bypassing the multipath code for single controller subsystems early on. Last but not least we enable polling in the block layer by default if the underlying driver has poll queues, as that already requires explicit user action. Note that it would be really nice to have polling back for RDMA with dedicated poll queues, but that might take a while. Also based on Jens' polling aio patches we could now implement a model in nvmet where we have a thread polling both the backend nvme device and the RDMA CQs, which might give us some pretty nice performace (I know Sagi looked into something similar a while ago).
That's interesting. Can you share more on that ? what is the model (thread per core ?)
I'll take a deeper look into polling aio patches from Jens.
A git tree is also available at: git://git.infradead.org/users/hch/misc.git nvme-polling Gitweb: http://git.infradead.org/users/hch/block.git/shortlog/refs/heads/nvme-polling