In both xenvbd/driver.h and xencrsh/driver.h there is #define XENVBD_MAX_PHYSICAL_BREAKS. This value is given to the PORT_CONFIGURATION_INFORMATION structure, in the NumberOfPhysicalBreaks member. Despite the misleading name (probably historical)
this value just means the actual number of pages the SRB should reference, rather than the number of discontinuities between physical pages or something similar. For example, if you’re using 11 segments per SRB, this value should be 11, not 10.
This issue seems to be present in V7, V8.2, and V9 XenVBD.
You can verify this by requesting some disk IO of the max size, using maybe sg_utils, diskspd, or fio, and adding some print statements in the driver with the SRB’s DataTransferLength. Or examine in a debugger. You’ll see that the size
is 4k less than you would expect (because it doesn’t have enough pages).