All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vishnu Dasa <vdasa@vmware.com>
To: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
Cc: Dan Carpenter <dan.carpenter@oracle.com>,
	Jorgen Hansen <jhansen@vmware.com>,
	"arnd@arndb.de" <arnd@arndb.de>,
	"gregkh@linuxfoundation.org" <gregkh@linuxfoundation.org>,
	"acking@vmware.com" <acking@vmware.com>,
	"dtor@vmware.com" <dtor@vmware.com>,
	Pv-drivers <Pv-drivers@vmware.com>,
	"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>,
	"kernel-janitors@vger.kernel.org"
	<kernel-janitors@vger.kernel.org>
Subject: Re: [PATCH 3/3] VMCI: Fix some error handling paths in vmci_guest_probe_device()
Date: Thu, 24 Feb 2022 06:53:10 +0000	[thread overview]
Message-ID: <85DB8130-D600-464E-9717-1A0AFE795EA7@vmware.com> (raw)
In-Reply-To: <1bc15512-d811-b26a-d4f3-e14b30730c00@wanadoo.fr>



> On Feb 11, 2022, at 12:06 PM, Christophe JAILLET <christophe.jaillet@wanadoo.fr> wrote:
> 
> Le 11/02/2022 à 15:09, Dan Carpenter a écrit :
>> On Thu, Feb 10, 2022 at 11:27:34PM +0100, Christophe JAILLET wrote:
>>> The 'err_remove_vmci_dev_g' error label is not at the right place.
>>> This could lead to un-released resource.
>>> 
>>> There is also a missing label. If pci_alloc_irq_vectors() fails, the
>>> previous vmci_event_subscribe() call must be undone.
>>> 
>>> Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
>>> ---
>>> Review with GREAT care.
>>> 
>>> This patch is a recent rebase of an old patch that has never been
>>> submitted.
>>> This function is huge and modifying its error handling path is error
>>> prone (at least for me).
>>> 
>>> The patch is compile-tested only.
>> There is still one bug.  Sorry if the line numbers are off.
> 
> Thanks for the review Dan.
> Much appreciated.

Thanks, Christophe and Dan!

> 
>> drivers/misc/vmw_vmci/vmci_guest.c
>>    705                if (capabilities & VMCI_CAPS_NOTIFICATIONS) {
>>    706                        vmci_dev->notification_bitmap = dma_alloc_coherent(
>>                                                                   ^^^^^
>> Alloc
>>    707                                &pdev->dev, PAGE_SIZE, &vmci_dev->notification_base,
>>    708                                GFP_KERNEL);
>>    709                        if (!vmci_dev->notification_bitmap) {
>>    710                                dev_warn(&pdev->dev,
>>    711                                         "Unable to allocate notification bitmap\n");
>>    712                        } else {
>>    713                                memset(vmci_dev->notification_bitmap, 0, PAGE_SIZE);
>>    714                                caps_in_use |= VMCI_CAPS_NOTIFICATIONS;
>>    715                        }
>>    716                }
>>    717
>>    718                if (mmio_base != NULL) {
>>    719                        if (capabilities & VMCI_CAPS_DMA_DATAGRAM) {
>>    720                                caps_in_use |= VMCI_CAPS_DMA_DATAGRAM;
>>    721                        } else {
>>    722                                dev_err(&pdev->dev,
>>    723                                        "Missing capability: VMCI_CAPS_DMA_DATAGRAM\n");
>>    724                                error = -ENXIO;
>>    725                                goto err_free_data_buffers;
>> This should be goto err_free_notification_bitmap;
> 
> Agreed.
> The error handling path still looked odd to me because 2 things were undone without a label between the 2 steps.
> That was it. An err_free_notification_bitmap should be added and used.
> I missed it.

Good catch.  This fixes recent code, so a separate patch would be good.
"[PATCH v3 3/8] VMCI: dma dg: detect DMA datagram capability"

> 
>>    726                        }
>>    727                }
>> On of the rules for error handling is that the unwind code should mirror
>> the allocation code but instead of that this code will have:
>> Alloc:
>> 	if (capabilities & VMCI_CAPS_NOTIFICATIONS)
>> Free:
>> 	if (vmci_dev->notification_bitmap)
>> It's the same if statement but you wouldn't really know it from just
>> looking at it so it's confusing.
> 
> This one is fine I think. If the allocation of notification_bitmap fails, it is not an error. So it looks fine to test it the way it is done.
> Or we should have both 'if'.
> 

Right.  And we would need to check 'capabilities & VMCI_CAPS_NOTIFICATIONS',
'caps_in_use & VMCI_CAPS_NOTIFICATIONS' and then
'vmci_dev->notification_bitmap' if we go that route.  I think we can leave it as is.

> 
>> Whatever...  But where this really
>> hurts is with:
>> Alloc:
>> 	if (vmci_dev->exclusive_vectors) {
>> 		error = request_irq(pci_irq_vector(pdev, 1), ...
>> Free:
>> 	free_irq(pci_irq_vector(pdev, 1), vmci_dev);
>> No if statement.  It works because it's the last allocation but it's
>> confusing and fragile.
> 
> Agreed.

Sorry, I hope I'm not missing something obvious or misunderstanding the point.
But I don't think the problem implied here exists?

If 'request_irq(pci_irq_vector(pdev, 0), ...' fails we goto err_disable_msi and there
is no free_irq in this path.  If 'request_irq(pci_irq_vector(pdev, 1), ...' fails then we
goto err_free_irq and we do 'free_irq(pci_irq_vector(pdev, 0), vmci_dev)'.  Note that
this is for the previous one without the check for vmci_dev->exclusive_vectors.

> 
>> The other question I had was:
>>    882        err_remove_bitmap:
>>    883                if (vmci_dev->notification_bitmap) {
>>    884                        vmci_write_reg(vmci_dev, VMCI_CONTROL_RESET, VMCI_CONTROL_ADDR);
>>                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>> This doesn't mirror anything in the allocation code so who knows if its
>> done in the correct place/order.
> 
> Agreed. It puzzled me as well.
> 
> vmci_guest_remove_device() also has this kind of code, but it is not done the same way in this function. It is unconditional and not close to the dma_free_coherent() call.
> Odd.
> 
> I won't touch it by myself :)
> 
>>    885                        dma_free_coherent(&pdev->dev, PAGE_SIZE,
>>    886                                          vmci_dev->notification_bitmap,
>>    887                                          vmci_dev->notification_base);
>>    888                }
>> regards,
>> dan carpenter
> 
> All your comments are unrelated to my patch and looks like additional fixes.
> 
> Until recently, this file was mostly untouched.
> So, let see if a maintainer looks interested in these patches and if he prefers a patch that fixes everything or several patches, maybe easier to review.
> 
> Once again, big thanks.
> 
> CJ


  reply	other threads:[~2022-02-24  6:53 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-02-10 22:26 [PATCH 0/3] VMCI: Various fixes Christophe JAILLET
2022-02-10 22:27 ` [PATCH 1/3] VMCI: Fix the description of vmci_check_host_caps() Christophe JAILLET
2022-02-17  7:08   ` Vishnu Dasa
2022-02-10 22:27 ` [PATCH 2/3] VMCI: No need to clear memory after a dma_alloc_coherent() call Christophe JAILLET
2022-02-17  7:10   ` Vishnu Dasa
2022-02-10 22:27 ` [PATCH 3/3] VMCI: Fix some error handling paths in vmci_guest_probe_device() Christophe JAILLET
2022-02-11 14:09   ` Dan Carpenter
2022-02-11 20:06     ` Christophe JAILLET
2022-02-24  6:53       ` Vishnu Dasa [this message]
2022-02-24 10:03         ` Dan Carpenter
2022-02-24 16:08           ` Vishnu Dasa
2022-02-24  0:43   ` Vishnu Dasa

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=85DB8130-D600-464E-9717-1A0AFE795EA7@vmware.com \
    --to=vdasa@vmware.com \
    --cc=Pv-drivers@vmware.com \
    --cc=acking@vmware.com \
    --cc=arnd@arndb.de \
    --cc=christophe.jaillet@wanadoo.fr \
    --cc=dan.carpenter@oracle.com \
    --cc=dtor@vmware.com \
    --cc=gregkh@linuxfoundation.org \
    --cc=jhansen@vmware.com \
    --cc=kernel-janitors@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.