Paolo, I re-checked that corner more carefully. I do not want to overstate it as a common path, but I also do not think the current code rules it out.
rcv_wscale is fixed at connection setup, while full_space/free_space are recomputed later from the current receive-buffer state. The tree explicitly allows later SO_RCVBUF reduction, and the window clamp can also change later, so I do not see an invariant that keeps full_space above one scale quantum once the scale has been negotiated. That said, my reason for keeping the small non-zero case is not that unconditional scale-down would be less safe. It is that it would also change the long-standing behavior that avoids scaling a non-zero offer away to zero. My intent here was to remove the larger-window round-up slack without changing that smaller legacy case in the same patch. If you would prefer to also change that small non-zero case, I can do that in v2 instead. I will also rename gran to granularity in v2, if so. Thanks, Wesley

