From: Yuval Shaia <yuval.shaia@oracle.com>
To: Sukrit Bhatnagar <skrtbhtngr@gmail.com>
Cc: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH v1 2/2] hw/pvrdma: add live migration support
Date: Wed, 4 Sep 2019 08:04:43 +0300 [thread overview]
Message-ID: <20190904050442.GA2844@lap1> (raw)
In-Reply-To: <CAMzgYoO24uhNUg_4RTVkw0JZ1Eerwyd549GX8T82M_18eUp8fA@mail.gmail.com>
On Wed, Sep 04, 2019 at 03:03:20AM +0530, Sukrit Bhatnagar wrote:
> On Thu, 29 Aug 2019 at 18:23, Yuval Shaia <yuval.shaia@oracle.com> wrote:
> >
> > On Wed, Aug 28, 2019 at 07:53:28PM +0530, Sukrit Bhatnagar wrote:
> > > vmstate_pvrdma describes the PCI and MSIX states as well as the dma
> > > address for dsr and the gid table of device.
> > > vmstate_pvrdma_gids describes each gid in the gid table.
> > >
> > > pvrdma_post_save() does the job of unregistering gid entries from the
> > > backend device in the source host.
> > >
> > > pvrdma_post_load() maps to dsr using the loaded dma address, registers
> > > each loaded gid into the backend device, and finally calls load_dsr()
> > > to perform other mappings and ring init operations.
> >
> > I think it worth to mention that the dma address is kept in driver/device
> > shared memory (dsr->dma) which is migrated as part of memory migration and
> > it is out of the scope of this change and so we do not need to save/load
> > the dma address during migration.
> >
> > Also you should specifically comment that this migration-support does not
> > includes QP migration. This means that support for life migration *during*
> > traffic is not yet supported.
> >
> > >
> > > Cc: Marcel Apfelbaum <marcel.apfelbaum@gmail.com>
> > > Cc: Yuval Shaia <yuval.shaia@oracle.com>
> > > Signed-off-by: Sukrit Bhatnagar <skrtbhtngr@gmail.com>
> > > ---
> > > hw/rdma/vmw/pvrdma_main.c | 77 +++++++++++++++++++++++++++++++++++++++
> > > 1 file changed, 77 insertions(+)
> > >
> > > diff --git a/hw/rdma/vmw/pvrdma_main.c b/hw/rdma/vmw/pvrdma_main.c
> > > index 6c90db96f9..6f8b56dea3 100644
> > > --- a/hw/rdma/vmw/pvrdma_main.c
> > > +++ b/hw/rdma/vmw/pvrdma_main.c
> > > @@ -28,6 +28,7 @@
> > > #include "sysemu/sysemu.h"
> > > #include "monitor/monitor.h"
> > > #include "hw/rdma/rdma.h"
> > > +#include "migration/register.h"
> > >
> > > #include "../rdma_rm.h"
> > > #include "../rdma_backend.h"
> > > @@ -593,6 +594,81 @@ static void pvrdma_shutdown_notifier(Notifier *n, void *opaque)
> > > pvrdma_fini(pci_dev);
> > > }
> > >
> > > +static int pvrdma_post_save(void *opaque)
> > > +{
> > > + int i, rc;
> > > + PVRDMADev *dev = opaque;
> > > +
> > > + for (i = 0; i < MAX_GIDS; i++) {
> > > +
> >
> > Empty line is redundant here.
> >
> > > + if (!dev->rdma_dev_res.port.gid_tbl[i].gid.global.interface_id) {
> > > + continue;
> > > + }
> > > + rc = rdma_backend_del_gid(&dev->backend_dev,
> > > + dev->backend_eth_device_name,
> > > + &dev->rdma_dev_res.port.gid_tbl[i].gid);
> > > + if (rc) {
> > > + return -EINVAL;
> >
> > Some error report will help here i guess.
>
> rdma_backend_del_gid() already generates an error report
> when rc isn't 0.
>
> Adding another statement for the same seems redundant.
Sure, make sense.
>
> > > + }
> > > + }
> > > +
> > > + return 0;
> > > +}
> > > +
> > > +static int pvrdma_post_load(void *opaque, int version_id)
> > > +{
> > > + int i, rc;
> > > + PVRDMADev *dev = opaque;
> > > + PCIDevice *pci_dev = PCI_DEVICE(dev);
> > > + DSRInfo *dsr_info = &dev->dsr_info;
> > > +
> > > + dsr_info->dsr = rdma_pci_dma_map(pci_dev, dsr_info->dma,
> > > + sizeof(struct pvrdma_device_shared_region));
> > > + if (!dsr_info->dsr) {
> > > + rdma_error_report("Failed to map to DSR");
> > > + return -ENOMEM;
> > > + }
> > > +
> > > + for (i = 0; i < MAX_GIDS; i++) {
> > > +
> >
> > Empty line is redundant here.
> >
> > > + if (!dev->rdma_dev_res.port.gid_tbl[i].gid.global.interface_id) {
> > > + continue;
> > > + }
> > > +
> > > + rc = rdma_backend_add_gid(&dev->backend_dev,
> > > + dev->backend_eth_device_name,
> > > + &dev->rdma_dev_res.port.gid_tbl[i].gid);
> > > + if (rc) {
> > > + return -EINVAL;
> > > + }
> > > + }
> > > +
> > > + return load_dsr(dev);
>
> Now that I will move load_dsr() before the del_gid loop,
You probably meant before add_gid loop.
> I can use goto jumps on exit/error paths, so that I can
> undo load_dsr if any del_gid fails.
Yeah, it will be easier to undo load_dsr than add_gid.
>
> > > +}
> > > +
> > > +static const VMStateDescription vmstate_pvrdma_gids = {
> > > + .name = "pvrdma-gids",
> > > + .fields = (VMStateField[]) {
> > > + VMSTATE_UINT8_ARRAY_V(gid.raw, RdmaRmGid, 16, 0),
> > > + VMSTATE_END_OF_LIST()
> > > + }
> > > +};
> > > +
> > > +static const VMStateDescription vmstate_pvrdma = {
> > > + .name = PVRDMA_HW_NAME,
> > > + .post_save = pvrdma_post_save,
> > > + .post_load = pvrdma_post_load,
> > > + .fields = (VMStateField[]) {
> > > + VMSTATE_PCI_DEVICE(parent_obj, PVRDMADev),
> > > + VMSTATE_MSIX(parent_obj, PVRDMADev),
> > > + VMSTATE_UINT64(dsr_info.dma, PVRDMADev),
> > > + VMSTATE_STRUCT_ARRAY(rdma_dev_res.port.gid_tbl, PVRDMADev,
> > > + MAX_PORT_GIDS, 0, vmstate_pvrdma_gids,
> > > + RdmaRmGid),
> > > + VMSTATE_END_OF_LIST()
> > > + }
> > > +};
> > > +
> > > static void pvrdma_realize(PCIDevice *pdev, Error **errp)
> > > {
> > > int rc = 0;
> > > @@ -688,6 +764,7 @@ static void pvrdma_class_init(ObjectClass *klass, void *data)
> > >
> > > dc->desc = "RDMA Device";
> > > dc->props = pvrdma_dev_properties;
> > > + dc->vmsd = &vmstate_pvrdma;
> > > set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
> > >
> > > ir->print_statistics = pvrdma_print_statistics;
> > > --
> > > 2.21.0
> > >
> > >
next prev parent reply other threads:[~2019-09-04 5:06 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-08-28 14:23 [Qemu-devel] [PATCH v1 0/2] Add live migration support in the PVRDMA device Sukrit Bhatnagar
2019-08-28 14:23 ` [Qemu-devel] [PATCH v1 1/2] hw/pvrdma: make DSR mapping idempotent in load_dsr() Sukrit Bhatnagar
2019-08-29 12:57 ` Yuval Shaia
2019-08-31 19:39 ` Marcel Apfelbaum
2019-08-28 14:23 ` [Qemu-devel] [PATCH v1 2/2] hw/pvrdma: add live migration support Sukrit Bhatnagar
2019-08-29 12:53 ` Yuval Shaia
2019-09-03 21:33 ` Sukrit Bhatnagar
2019-09-04 5:04 ` Yuval Shaia [this message]
2019-08-29 12:56 ` Yuval Shaia
2019-08-31 19:45 ` Marcel Apfelbaum
2019-09-01 9:35 ` Yuval Shaia
2019-09-03 11:05 ` Sukrit Bhatnagar
2019-08-29 12:00 ` [Qemu-devel] [PATCH v1 0/2] Add live migration support in the PVRDMA device Yuval Shaia
2019-08-31 19:37 ` Marcel Apfelbaum
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=20190904050442.GA2844@lap1 \
--to=yuval.shaia@oracle.com \
--cc=qemu-devel@nongnu.org \
--cc=skrtbhtngr@gmail.com \
/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.