Message ID | 20210123080853.4214-1-dongli.zhang@oracle.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | [v2,1/1] vhost scsi: alloc vhost_scsi with kvzalloc() to avoid delay | expand |
According to my "git send-email" history, I have CCed jasowang@redhat.com. Not sure why Jason is not on the list. CCed Jason. Thank you very much! Dongli Zhang On 1/23/21 12:08 AM, Dongli Zhang wrote: > The size of 'struct vhost_scsi' is order-10 (~2.3MB). It may take long time > delay by kzalloc() to compact memory pages by retrying multiple times when > there is a lack of high-order pages. As a result, there is latency to > create a VM (with vhost-scsi) or to hotadd vhost-scsi-based storage. > > The prior commit 595cb754983d ("vhost/scsi: use vmalloc for order-10 > allocation") prefers to fallback only when really needed, while this patch > allocates with kvzalloc() with __GFP_NORETRY implicitly set to avoid > retrying memory pages compact for multiple times. > > The __GFP_NORETRY is implicitly set if the size to allocate is more than > PAGE_SZIE and when __GFP_RETRY_MAYFAIL is not explicitly set. > > Cc: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> > Cc: Joe Jin <joe.jin@oracle.com> > Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com> > --- > Changed since v1: > - To combine kzalloc() and vzalloc() as kvzalloc() > (suggested by Jason Wang) > > drivers/vhost/scsi.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > > diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c > index 4ce9f00ae10e..5de21ad4bd05 100644 > --- a/drivers/vhost/scsi.c > +++ b/drivers/vhost/scsi.c > @@ -1814,12 +1814,9 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) > struct vhost_virtqueue **vqs; > int r = -ENOMEM, i; > > - vs = kzalloc(sizeof(*vs), GFP_KERNEL | __GFP_NOWARN | __GFP_RETRY_MAYFAIL); > - if (!vs) { > - vs = vzalloc(sizeof(*vs)); > - if (!vs) > - goto err_vs; > - } > + vs = kvzalloc(sizeof(*vs), GFP_KERNEL); > + if (!vs) > + goto err_vs; > > vqs = kmalloc_array(VHOST_SCSI_MAX_VQ, sizeof(*vqs), GFP_KERNEL); > if (!vqs) >
On 2021/1/23 下午4:08, Dongli Zhang wrote: > The size of 'struct vhost_scsi' is order-10 (~2.3MB). It may take long time > delay by kzalloc() to compact memory pages by retrying multiple times when > there is a lack of high-order pages. As a result, there is latency to > create a VM (with vhost-scsi) or to hotadd vhost-scsi-based storage. > > The prior commit 595cb754983d ("vhost/scsi: use vmalloc for order-10 > allocation") prefers to fallback only when really needed, while this patch > allocates with kvzalloc() with __GFP_NORETRY implicitly set to avoid > retrying memory pages compact for multiple times. > > The __GFP_NORETRY is implicitly set if the size to allocate is more than > PAGE_SZIE and when __GFP_RETRY_MAYFAIL is not explicitly set. > > Cc: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> > Cc: Joe Jin <joe.jin@oracle.com> > Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com> > --- > Changed since v1: > - To combine kzalloc() and vzalloc() as kvzalloc() > (suggested by Jason Wang) > > drivers/vhost/scsi.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > > diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c > index 4ce9f00ae10e..5de21ad4bd05 100644 > --- a/drivers/vhost/scsi.c > +++ b/drivers/vhost/scsi.c > @@ -1814,12 +1814,9 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) > struct vhost_virtqueue **vqs; > int r = -ENOMEM, i; > > - vs = kzalloc(sizeof(*vs), GFP_KERNEL | __GFP_NOWARN | __GFP_RETRY_MAYFAIL); > - if (!vs) { > - vs = vzalloc(sizeof(*vs)); > - if (!vs) > - goto err_vs; > - } > + vs = kvzalloc(sizeof(*vs), GFP_KERNEL); > + if (!vs) > + goto err_vs; > > vqs = kmalloc_array(VHOST_SCSI_MAX_VQ, sizeof(*vqs), GFP_KERNEL); > if (!vqs) Acked-by: Jason Wang <jasowang@redhat.com>
Can anyone help to review this patch and give a review-by for it please? Thanks, Joe On 1/24/21 7:12 PM, Jason Wang wrote: > > On 2021/1/23 下午4:08, Dongli Zhang wrote: >> The size of 'struct vhost_scsi' is order-10 (~2.3MB). It may take long time >> delay by kzalloc() to compact memory pages by retrying multiple times when >> there is a lack of high-order pages. As a result, there is latency to >> create a VM (with vhost-scsi) or to hotadd vhost-scsi-based storage. >> >> The prior commit 595cb754983d ("vhost/scsi: use vmalloc for order-10 >> allocation") prefers to fallback only when really needed, while this patch >> allocates with kvzalloc() with __GFP_NORETRY implicitly set to avoid >> retrying memory pages compact for multiple times. >> >> The __GFP_NORETRY is implicitly set if the size to allocate is more than >> PAGE_SZIE and when __GFP_RETRY_MAYFAIL is not explicitly set. >> >> Cc: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> >> Cc: Joe Jin <joe.jin@oracle.com> >> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com> >> --- >> Changed since v1: >> - To combine kzalloc() and vzalloc() as kvzalloc() >> (suggested by Jason Wang) >> >> drivers/vhost/scsi.c | 9 +++------ >> 1 file changed, 3 insertions(+), 6 deletions(-) >> >> diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c >> index 4ce9f00ae10e..5de21ad4bd05 100644 >> --- a/drivers/vhost/scsi.c >> +++ b/drivers/vhost/scsi.c >> @@ -1814,12 +1814,9 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) >> struct vhost_virtqueue **vqs; >> int r = -ENOMEM, i; >> - vs = kzalloc(sizeof(*vs), GFP_KERNEL | __GFP_NOWARN | __GFP_RETRY_MAYFAIL); >> - if (!vs) { >> - vs = vzalloc(sizeof(*vs)); >> - if (!vs) >> - goto err_vs; >> - } >> + vs = kvzalloc(sizeof(*vs), GFP_KERNEL); >> + if (!vs) >> + goto err_vs; >> vqs = kmalloc_array(VHOST_SCSI_MAX_VQ, sizeof(*vqs), GFP_KERNEL); >> if (!vqs) > > > Acked-by: Jason Wang <jasowang@redhat.com> > > >
> The size of 'struct vhost_scsi' is order-10 (~2.3MB). It may take long time > delay by kzalloc() to compact memory pages by retrying multiple times when > there is a lack of high-order pages. As a result, there is latency to > create a VM (with vhost-scsi) or to hotadd vhost-scsi-based storage. > > The prior commit 595cb754983d ("vhost/scsi: use vmalloc for order-10 > allocation") prefers to fallback only when really needed, while this patch > allocates with kvzalloc() with __GFP_NORETRY implicitly set to avoid > retrying memory pages compact for multiple times. > > The __GFP_NORETRY is implicitly set if the size to allocate is more than > PAGE_SZIE and when __GFP_RETRY_MAYFAIL is not explicitly set. > > Cc: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> > Cc: Joe Jin <joe.jin@oracle.com> > Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com> > --- > Changed since v1: > - To combine kzalloc() and vzalloc() as kvzalloc() > (suggested by Jason Wang) > > drivers/vhost/scsi.c | 9 +++------ > 1 file changed, 3 insertions(+), 6 deletions(-) > > diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c > index 4ce9f00ae10e..5de21ad4bd05 100644 > --- a/drivers/vhost/scsi.c > +++ b/drivers/vhost/scsi.c > @@ -1814,12 +1814,9 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) > struct vhost_virtqueue **vqs; > int r = -ENOMEM, i; > > - vs = kzalloc(sizeof(*vs), GFP_KERNEL | __GFP_NOWARN | __GFP_RETRY_MAYFAIL); > - if (!vs) { > - vs = vzalloc(sizeof(*vs)); > - if (!vs) > - goto err_vs; > - } > + vs = kvzalloc(sizeof(*vs), GFP_KERNEL); > + if (!vs) > + goto err_vs; > > vqs = kmalloc_array(VHOST_SCSI_MAX_VQ, sizeof(*vqs), GFP_KERNEL); > if (!vqs) Acked-by: Pankaj Gupta <pankaj.gupta@cloud.ionos.com>
On Sun, Feb 07, 2021 at 11:03:30AM +0800, kernel test robot wrote: > > Greeting, > > FYI, we noticed the following commit (built with gcc-9): > > commit: 79991caf5202c7989928be534727805f8f68bb8d ("vdpa_sim_net: Add support for user supported devices") > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git Dongli-Zhang/vhost-scsi-alloc-vhost_scsi-with-kvzalloc-to-avoid-delay/20210129-191605 > > > in testcase: trinity > version: trinity-static-x86_64-x86_64-f93256fb_2019-08-28 > with following parameters: > > runtime: 300s > > test-description: Trinity is a linux system call fuzz tester. > test-url: http://codemonkey.org.uk/projects/trinity/ > > > on test machine: qemu-system-x86_64 -enable-kvm -cpu SandyBridge -smp 2 -m 8G > > caused below changes (please refer to attached dmesg/kmsg for entire log/backtrace): > Parav want to take a look?
diff --git a/drivers/vhost/scsi.c b/drivers/vhost/scsi.c index 4ce9f00ae10e..5de21ad4bd05 100644 --- a/drivers/vhost/scsi.c +++ b/drivers/vhost/scsi.c @@ -1814,12 +1814,9 @@ static int vhost_scsi_open(struct inode *inode, struct file *f) struct vhost_virtqueue **vqs; int r = -ENOMEM, i; - vs = kzalloc(sizeof(*vs), GFP_KERNEL | __GFP_NOWARN | __GFP_RETRY_MAYFAIL); - if (!vs) { - vs = vzalloc(sizeof(*vs)); - if (!vs) - goto err_vs; - } + vs = kvzalloc(sizeof(*vs), GFP_KERNEL); + if (!vs) + goto err_vs; vqs = kmalloc_array(VHOST_SCSI_MAX_VQ, sizeof(*vqs), GFP_KERNEL); if (!vqs)
The size of 'struct vhost_scsi' is order-10 (~2.3MB). It may take long time delay by kzalloc() to compact memory pages by retrying multiple times when there is a lack of high-order pages. As a result, there is latency to create a VM (with vhost-scsi) or to hotadd vhost-scsi-based storage. The prior commit 595cb754983d ("vhost/scsi: use vmalloc for order-10 allocation") prefers to fallback only when really needed, while this patch allocates with kvzalloc() with __GFP_NORETRY implicitly set to avoid retrying memory pages compact for multiple times. The __GFP_NORETRY is implicitly set if the size to allocate is more than PAGE_SZIE and when __GFP_RETRY_MAYFAIL is not explicitly set. Cc: Aruna Ramakrishna <aruna.ramakrishna@oracle.com> Cc: Joe Jin <joe.jin@oracle.com> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com> --- Changed since v1: - To combine kzalloc() and vzalloc() as kvzalloc() (suggested by Jason Wang) drivers/vhost/scsi.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-)