Hmm.. This is both true and false.
One problem for the kernel is that it doesn't do large memory
allocations very gracefully, and that is what Alan calls broken. In
some sense it is broken, but on the other hand it is also a documented
feature: not doing the large memory allocations allows us to do other
things better.
So yes, this _could_ be fixed by changing the memory allocation policy
of the kernel. And we may want to do that for other reasons.
However, it is equally correct to say that the current fragment handling
is broken too - it does an unnecessary packet re-assembly on receive.
This re-assembly simplifies some code, but it not only has a bad impact
on memory management, it also involves a "useless" copy operation.
So the best solution would be to have the ability to handle fragmented
UDP packets on receive without reassembling them - that would get better
NFS performance due to getting rid of the copy, and it would also result
in better network buffer allocation.
(We already do "fragment on-the-fly" when sending UDP packets, it's only
reciving that doesn't handle it very nicely. Receiving is the harder of
the two, though, so it's understandable).
Linus