From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751521AbcGFJSq (ORCPT ); Wed, 6 Jul 2016 05:18:46 -0400 Received: from mx0b-001b2d01.pphosted.com ([148.163.158.5]:47719 "EHLO mx0a-001b2d01.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751103AbcGFJSl (ORCPT ); Wed, 6 Jul 2016 05:18:41 -0400 X-IBM-Helo: d06dlp02.portsmouth.uk.ibm.com X-IBM-MailFrom: cornelia.huck@de.ibm.com X-IBM-RcptTo: linux-kernel@vger.kernel.org Date: Wed, 6 Jul 2016 11:18:32 +0200 From: Cornelia Huck To: Minfei Huang , mst@redhat.com Cc: Minfei Huang , linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org Subject: Re: [PATCH] virtio: Return correct errno for function init_vq's failure In-Reply-To: <1466993358-12064-1-git-send-email-mnghuan@gmail.com> References: <1466993358-12064-1-git-send-email-mnghuan@gmail.com> Organization: IBM Deutschland Research & Development GmbH Vorsitzende des Aufsichtsrats: Martina Koederitz =?UTF-8?B?R2VzY2jDpGZ0c2bDvGhydW5nOg==?= Dirk Wittkopp Sitz der Gesellschaft: =?UTF-8?B?QsO2Ymxpbmdlbg==?= Registergericht: Amtsgericht Stuttgart, HRB 243294 X-Mailer: Claws Mail 3.11.1 (GTK+ 2.24.23; x86_64-pc-linux-gnu) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16070609-0016-0000-0000-0000020592E3 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16070609-0017-0000-0000-000022290541 Message-Id: <20160706111832.5d4d6f43.cornelia.huck@de.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2016-07-06_05:,, signatures=0 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 spamscore=0 suspectscore=0 malwarescore=0 phishscore=0 adultscore=0 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1607060083 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Mon, 27 Jun 2016 10:09:18 +0800 Minfei Huang wrote: > The error number -ENOENT or 0 will be returned, if we can not allocate > more memory in function init_vq. If host can support multiple virtual > queues, and we fails to allocate necessary memory structures for vq, > kernel may crash due to incorrect returning. > > To fix it, kernel will return correct value in init_vq. > > Signed-off-by: Minfei Huang > Signed-off-by: Minfei Huang > --- > drivers/block/virtio_blk.c | 5 ++--- > 1 file changed, 2 insertions(+), 3 deletions(-) > > diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c > index 42758b5..40ecb2b 100644 > --- a/drivers/block/virtio_blk.c > +++ b/drivers/block/virtio_blk.c > @@ -393,11 +393,10 @@ static int init_vq(struct virtio_blk *vblk) > if (err) > num_vqs = 1; > > + err = -ENOMEM; > vblk->vqs = kmalloc(sizeof(*vblk->vqs) * num_vqs, GFP_KERNEL); > - if (!vblk->vqs) { > - err = -ENOMEM; > + if (!vblk->vqs) > goto out; > - } > > names = kmalloc(sizeof(*names) * num_vqs, GFP_KERNEL); > if (!names) The error handling in this function looks horrible. When mq was introduced, init_vq started mixing up several things: - The mq feature is not available - which is not an error, and therefore should not have any influence on the return code. - One of the several memory allocations failed - only ->vqs gets special treatment, however. - The ->find_vqs callback failed. Your patch fixes the code, but it is still very convoluted due to the temporary arrays. May it be worthwile to introduce a helper for setting up the virtqueues where all virtqueues are essentially the same and just get a consecutive number? Michael?