1) Register callback and begin data mapping
2) Succeed in mapping first part of packet and 1 page of bounced buffer
3) Bounce buffer is exhausted, callback will not be invoked until the
next unmap
4) Deadlock
You could add some sort of call to determine if the bounce memory is
exhausted and try to take some corrective action in #2 but it gets ugly.
So as I said earlier, I think the callback model makes sense when you
have streaming data (where there are no packet boundaries). I think
it's pretty difficult to avoid deadlocking though with callbacks in a
packet model (where boundaries must be preserved).