提交 ab548fd2 编写于 作者: A Andrea Parri (Microsoft) 提交者: Martin K. Petersen

scsi: storvsc: Fix max_outstanding_req_per_channel for Win8 and newer

Current code overestimates the value of max_outstanding_req_per_channel for
Win8 and newer hosts, since vmscsi_size_delta is set to the initial value
of sizeof(vmscsi_win8_extension) rather than zero.  This may lead to wrong
decisions when using ring_avail_percent_lowater equals to zero.  The
estimate of max_outstanding_req_per_channel is 'exact' for Win7 and older
hosts.  A better choice, keeping the algorithm for the estimation simple,
is to err the other way around, i.e., to underestimate for Win7 and older
but to use the exact value for Win8 and newer.

Link: https://lore.kernel.org/r/20201217203321.4539-2-parri.andrea@gmail.com
Cc: "James E.J. Bottomley" <jejb@linux.ibm.com>
Cc: "Martin K. Petersen" <martin.petersen@oracle.com>
Cc: linux-scsi@vger.kernel.org
Suggested-by: NDexuan Cui <decui@microsoft.com>
Reviewed-by: NDexuan Cui <decui@microsoft.com>
Reviewed-by: NMichael Kelley <mikelley@microsoft.com>
Signed-off-by: NAndrea Parri (Microsoft) <parri.andrea@gmail.com>
Signed-off-by: NMartin K. Petersen <martin.petersen@oracle.com>
上级 181dd9a4
...@@ -2161,12 +2161,15 @@ static int __init storvsc_drv_init(void) ...@@ -2161,12 +2161,15 @@ static int __init storvsc_drv_init(void)
* than the ring buffer size since that page is reserved for * than the ring buffer size since that page is reserved for
* the ring buffer indices) by the max request size (which is * the ring buffer indices) by the max request size (which is
* vmbus_channel_packet_multipage_buffer + struct vstor_packet + u64) * vmbus_channel_packet_multipage_buffer + struct vstor_packet + u64)
*
* The computation underestimates max_outstanding_req_per_channel
* for Win7 and older hosts because it does not take into account
* the vmscsi_size_delta correction to the max request size.
*/ */
max_outstanding_req_per_channel = max_outstanding_req_per_channel =
((storvsc_ringbuffer_size - PAGE_SIZE) / ((storvsc_ringbuffer_size - PAGE_SIZE) /
ALIGN(MAX_MULTIPAGE_BUFFER_PACKET + ALIGN(MAX_MULTIPAGE_BUFFER_PACKET +
sizeof(struct vstor_packet) + sizeof(u64) - sizeof(struct vstor_packet) + sizeof(u64),
vmscsi_size_delta,
sizeof(u64))); sizeof(u64)));
#if IS_ENABLED(CONFIG_SCSI_FC_ATTRS) #if IS_ENABLED(CONFIG_SCSI_FC_ATTRS)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册