All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gavin Shan <gwshan@linux.vnet.ibm.com>
To: Bjorn Helgaas <helgaas@kernel.org>
Cc: Gavin Shan <gwshan@linux.vnet.ibm.com>,
	linux-pci@vger.kernel.org, bhelgaas@google.com,
	clsoto@us.ibm.com
Subject: Re: [PATCH] PCI: Disable IOV before pcibios_sriov_disable()
Date: Tue, 21 Mar 2017 09:50:06 +1100	[thread overview]
Message-ID: <20170320225006.GA8591@gwshan> (raw)
In-Reply-To: <20170320154644.GA24572@bhelgaas-glaptop.roam.corp.google.com>

On Mon, Mar 20, 2017 at 10:46:44AM -0500, Bjorn Helgaas wrote:
>On Sat, Mar 18, 2017 at 11:19:07AM +1100, Gavin Shan wrote:
>> On Thu, Mar 09, 2017 at 11:34:32AM +1100, Gavin Shan wrote:
>> >On Tue, Mar 07, 2017 at 02:15:29PM -0600, Bjorn Helgaas wrote:
>> >>On Mon, Feb 27, 2017 at 11:18:32AM +1100, Gavin Shan wrote:
>> >>> The PowerNV platform is the only user of pcibios_sriov_disable().
>> >>> The IOV BAR could be shifted by pci_iov_update_resource(). The
>> >>> warning message in the function is printed if the IOV capability
>> >>> is in enabled (PCI_SRIOV_CTRL_VFE && PCI_SRIOV_CTRL_MSE) state.
>> >>> 
>> >>>    pci_disable_sriov
>> >>>    sriov_disable
>> >>>    pnv_pci_sriov_disable
>> >>>    pnv_pci_vf_resource_shift
>> >>>    pci_update_resource
>> >>>    pci_iov_update_resource
>> >>> 
>> >>> This fixes the issue by disabling IOV capability before calling
>> >>> pcibios_sriov_disable(). With it, the disabling path matches with
>> >>> the enabling path: pcibios_sriov_enable() is called before the
>> >>> IOV capability is enabled.
>> >>
>> >>I'm vaguely uncomfortable about this path:
>> >>
>> >>  pci_disable_sriov
>> >>    sriov_disable
>> >>      pcibios_sriov_disable           # powerpc version
>> >>	pnv_pci_sriov_disable
>> >>	  pnv_pci_vf_resource_shift
>> >>	    res = &dev->resource[i + PCI_IOV_RESOURCES]
>> >>	    res->start += size * offset
>> >>	    pci_update_resource
>> >>	      pci_iov_update_resource
>> >>	  pnv_pci_vf_release_m64
>> >>
>> >>1) "res" is already in the resource tree, so we shouldn't be changing
>> >>   its start address, because that may make the tree inconsistent,
>> >>   e.g., the resource may no longer be completely contained in its
>> >>   parent, it may conflict with a sibling, etc.
>> >>
>> >>2) If we update "res->start", shouldn't we update "res->end"
>> >>   correspondingly?
>> >>
>> >>It seems like it'd be better if we didn't update the device resources
>> >>in the enable/disable paths.  If we could do the resource adjustments
>> >>earlier, somewhere before we give the device to a driver, it seems
>> >>like it would avoid these issues.
>> >>
>> >>We might have talked about these questions in the past, so I apologize
>> >>if you've already explained this.  If that's the case, maybe we just
>> >>need some comments in the code to help the next confused reader.
>> >>
>> >
>> >Bjorn, thanks for review. I agree it's not perfect. We discussed this long
>> >time ago as I can remember. Let me try to make it a bit more clear: In our
>> >PHB hardware, there are 16 MMIO BARs. Each of them can be shared by 256 PEs
>> >(A) and owned exclusively by one PE (B). When VF BAR size is small enough,
>> >we take (A). Otherwise, we have to take (B). Only when taking (A), we need
>> >expand/move/shrink the IOV BAR. So lets stick to (A) for discussion here.
>> >
>> >Under (A), PF's IOV BAR size is extended to ((256 * (VF BAR size)) when the
>> >PF is probed. Then the @res, which corresponds to the IOV BAR, is assigned
>> >and put into the resource tree during resource sizing and assignment stage.
>> >The IOV capability is going to be enabled by PF's driver or sysfs entry, it
>> >calls into pnv_pci_sriov_enable() where number of contigous PEs (equal to
>> >number of VFs to be enabled) are allocated. We shift the IOV BAR base according
>> >to the starting PE number of the allocated block. Afterewards, the IOV BAR
>> >is restored when the IOV capability is disabled. So it's all about the PE.
>> >The IOV BAR's end address isn't touched, we needn't update @res->end when
>> >restoring the IOV BAR.
>> >
>> >In order to avoid moving IOV BAR base address, I need know the the PEs
>> >for the VFs before resourcd sizing and assignment stage. It means I need
>> >to reserve PEs in advance, which isn't nice because we never enable the
>> >VFs. In that case, the PEs are wasted.
>> >
>> >Yeah, it's nice to have add some comments in pnv_pci_vf_resource_shift()
>> >where pci_update_resource() is called. I will post another patch to
>> >linux-ppcdev and you'll be copied. If you agree, I think you can merge
>> >this patch as none of the concerns are too much related.
>> >
>> 
>> Sorry, Bjorn, ping! Please let me know if there are more concerns you have.
>
>I think we had a misunderstanding -- you mentioned adding some
>comments and wrote "I will post another patch", and I *thought* you
>meant you were going to post another version of *this* patch with some
>updated comments.  So I've been waiting for that updated patch.  But I
>think you've been waiting for me to merge *this* patch as-is.
>
>To avoid having this discussion a third time in the future, I think
>you should add some comments at the point where you update the
>resource.  Updating a resource after it's in the resource tree is
>clearly dangerous, so we need some explanation of why it's sort of OK
>in this particular case.
>
>If you can write a comment and dig up a URL to our previous
>discussion, I'd like to incorporate that into *this* patch before I
>merge it.  The sooner we can document this, the less work it will be
>in the future.
>

Ok. Sorry for the confusion and that I should looked into the code for more.
We already had one comment like below in arch/powerpc/platforms/powernv/pci-ioda.c::
pnv_pci_vf_resource_shift(). I think it's exactly what you like to have, please
help to confirm. I believe it was added based on your comments long time ago when
you review the SRIOV (for PowerNV) patches.

        /*
         * After doing so, there would be a "hole" in the /proc/iomem when
         * offset is a positive value. It looks like the device return some
         * mmio back to the system, which actually no one could use it.
         */

http://www.spinics.net/lists/linux-pci/msg39424.html

Thanks,
Gavin 

  reply	other threads:[~2017-03-20 22:50 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-02-27  0:18 [PATCH] PCI: Disable IOV before pcibios_sriov_disable() Gavin Shan
2017-03-07 20:15 ` Bjorn Helgaas
2017-03-09  0:34   ` Gavin Shan
2017-03-18  0:19     ` Gavin Shan
2017-03-20 15:46       ` Bjorn Helgaas
2017-03-20 22:50         ` Gavin Shan [this message]
2017-03-30 23:24           ` Gavin Shan
2017-04-13  7:53             ` Gavin Shan
2017-04-13 12:27               ` Bjorn Helgaas
2017-04-18  3:51                 ` Gavin Shan
2017-06-18 23:39                   ` Gavin Shan

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=20170320225006.GA8591@gwshan \
    --to=gwshan@linux.vnet.ibm.com \
    --cc=bhelgaas@google.com \
    --cc=clsoto@us.ibm.com \
    --cc=helgaas@kernel.org \
    --cc=linux-pci@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.