Message ID | 20230818193546.2014874-1-bvanassche@acm.org |
---|---|
Headers | show |
Series | Improve performance for zoned UFS devices | expand |
On 8/18/2023 12:34 PM, Bart Van Assche wrote: > Call ufshcd_auto_hibern8_update() instead of writing directly into the > auto-hibernation control register. This patch is part of an effort to > move all auto-hibernation register changes into the UFSHCI driver core. > Reviewed-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
On 8/18/2023 12:34 PM, Bart Van Assche wrote: > Call ufshcd_auto_hibern8_update() instead of writing directly into the > auto-hibernation control register. This patch is part of an effort to > move all auto-hibernation register changes into the UFSHCI driver core. > Reviewed-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
On 8/18/2023 12:34 PM, Bart Van Assche wrote: > Calls to ufshcd_auto_hibern8_update() are already serialized: this > function is either called if user space software is not running > (preparing to suspend) or from a single sysfs store callback function. > Kernfs serializes sysfs .store() callbacks. > > No functionality is changed. This patch makes the next patch in this > series easier to read. > Reviewed-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
On 8/18/2023 12:34 PM, Bart Van Assche wrote: > UFSHCI 3.0 controllers do not preserve the write order if auto-hibernation > is enabled. If the write order is not preserved, an I/O scheduler is > required to serialize zoned writes. Hence do not allow auto-hibernation > to be enabled without I/O scheduler if a zoned logical unit is present > and if the controller is operating in legacy mode. This patch has been > tested with the following shell script: > Reviewed-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
On 8/18/2023 12:34 PM, Bart Van Assche wrote: > From the UFSHCI 4.0 specification, about the legacy (single queue) mode: > "The host controller always process transfer requests in-order according > to the order submitted to the list. In case of multiple commands with > single doorbell register ringing (batch mode), The dispatch order for > these transfer requests by host controller will base on their index in > the List. A transfer request with lower index value will be executed > before a transfer request with higher index value." > > From the UFSHCI 4.0 specification, about the MCQ mode: > "Command Submission > 1. Host SW writes an Entry to SQ > 2. Host SW updates SQ doorbell tail pointer > > Command Processing > 3. After fetching the Entry, Host Controller updates SQ doorbell head > pointer > 4. Host controller sends COMMAND UPIU to UFS device" > > In other words, for both legacy and MCQ mode, UFS controllers are > required to forward commands to the UFS device in the order these > commands have been received from the host. > > Notes: > - For legacy mode this is only correct if the host submits one > command at a time. The UFS driver does this. > - Also in legacy mode, the command order is not preserved if > auto-hibernation is enabled in the UFS controller. Hence, enable > zone write locking if auto-hibernation is enabled. > > This patch improves performance as follows on my test setup: > - With the mq-deadline scheduler: 2.5x more IOPS for small writes. > - When not using an I/O scheduler compared to using mq-deadline with > zone locking: 4x more IOPS for small writes. > Hi Bart, Thank you for double checking and the detailed explanation. Reviewed-by: Bao D. Nguyen <quic_nguyenb@quicinc.com>
On 8/19/2023 3:34 AM, Bart Van Assche wrote: > From the UFSHCI 4.0 specification, about the legacy (single queue) mode: > "The host controller always process transfer requests in-order according > to the order submitted to the list. In case of multiple commands with > single doorbell register ringing (batch mode), The dispatch order for > these transfer requests by host controller will base on their index in > the List. A transfer request with lower index value will be executed > before a transfer request with higher index value." > > From the UFSHCI 4.0 specification, about the MCQ mode: > "Command Submission > 1. Host SW writes an Entry to SQ > 2. Host SW updates SQ doorbell tail pointer > > Command Processing > 3. After fetching the Entry, Host Controller updates SQ doorbell head > pointer > 4. Host controller sends COMMAND UPIU to UFS device" > > In other words, for both legacy and MCQ mode, UFS controllers are > required to forward commands to the UFS device in the order these > commands have been received from the host. > > Notes: > - For legacy mode this is only correct if the host submits one > command at a time. The UFS driver does this. > - Also in legacy mode, the command order is not preserved if > auto-hibernation is enabled in the UFS controller. Hence, enable > zone write locking if auto-hibernation is enabled. > > This patch improves performance as follows on my test setup: > - With the mq-deadline scheduler: 2.5x more IOPS for small writes. > - When not using an I/O scheduler compared to using mq-deadline with > zone locking: 4x more IOPS for small writes. > > Cc: Martin K. Petersen <martin.petersen@oracle.com> > Cc: Can Guo <quic_cang@quicinc.com> > Cc: Avri Altman <avri.altman@wdc.com> > Cc: Bao D. Nguyen <quic_nguyenb@quicinc.com> > Signed-off-by: Bart Van Assche <bvanassche@acm.org> > --- > drivers/ufs/core/ufshcd.c | 22 ++++++++++++++++++++-- > 1 file changed, 20 insertions(+), 2 deletions(-) Reviewed-by: Can Guo <quic_cang@quicinc.com>