From: Andrea Parri <parri.andrea@gmail.com>
To: "Michael Kelley (LINUX)" <mikelley@microsoft.com>
Cc: KY Srinivasan <kys@microsoft.com>,
Haiyang Zhang <haiyangz@microsoft.com>,
Stephen Hemminger <sthemmin@microsoft.com>,
Wei Liu <wei.liu@kernel.org>, Dexuan Cui <decui@microsoft.com>,
Wei Hu <weh@microsoft.com>,
Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>,
Rob Herring <robh@kernel.org>,
Krzysztof Wilczynski <kw@linux.com>,
Bjorn Helgaas <bhelgaas@google.com>,
"linux-hyperv@vger.kernel.org" <linux-hyperv@vger.kernel.org>,
"linux-pci@vger.kernel.org" <linux-pci@vger.kernel.org>,
"linux-kernel@vger.kernel.org" <linux-kernel@vger.kernel.org>
Subject: Re: [RFC PATCH 4/4] PCI: hv: Fix synchronization between channel callback and hv_compose_msi_msg()
Date: Fri, 1 Apr 2022 18:30:15 +0200 [thread overview]
Message-ID: <20220401163015.GC437893@anparri> (raw)
In-Reply-To: <PH0PR21MB302522DE89BB5A0F59B1C29AD7E19@PH0PR21MB3025.namprd21.prod.outlook.com>
> > @@ -1662,6 +1662,55 @@ static u32 hv_compose_msi_req_v3(
> > return sizeof(*int_pkt);
> > }
> >
> > +/* As in vmbus_request_addr() but without the requestor lock */
> > +static u64 __hv_pci_request_addr(struct vmbus_channel *channel, u64 trans_id)
> > +{
> > + struct vmbus_requestor *rqstor = &channel->requestor;
> > + u64 req_addr;
> > +
> > + if (trans_id >= rqstor->size ||
> > + !test_bit(trans_id, rqstor->req_bitmap))
> > + return VMBUS_RQST_ERROR;
> > +
> > + req_addr = rqstor->req_arr[trans_id];
> > + rqstor->req_arr[trans_id] = rqstor->next_request_id;
> > + rqstor->next_request_id = trans_id;
> > +
> > + bitmap_clear(rqstor->req_bitmap, trans_id, 1);
> > +
> > + return req_addr;
> > +}
> > +
> > +/*
> > + * Clear/remove @trans_id from @channel's requestor, provided the memory
> > + * address stored at @trans_id equals @rqst_addr.
> > + */
> > +static void hv_pci_request_addr_match(struct vmbus_channel *channel,
> > + u64 trans_id, u64 rqst_addr)
> > +{
> > + struct vmbus_requestor *rqstor = &channel->requestor;
> > + unsigned long flags;
> > + u64 req_addr;
> > +
> > + spin_lock_irqsave(&rqstor->req_lock, flags);
> > +
> > + if (trans_id >= rqstor->size ||
> > + !test_bit(trans_id, rqstor->req_bitmap)) {
> > + spin_unlock_irqrestore(&rqstor->req_lock, flags);
> > + return;
> > + }
> > +
> > + req_addr = rqstor->req_arr[trans_id];
> > + if (req_addr == rqst_addr) {
> > + rqstor->req_arr[trans_id] = rqstor->next_request_id;
> > + rqstor->next_request_id = trans_id;
> > +
> > + bitmap_clear(rqstor->req_bitmap, trans_id, 1);
> > + }
> > +
> > + spin_unlock_irqrestore(&rqstor->req_lock, flags);
> > +}
> > +
>
> Even though these two new functions are used only in the Hyper-V
> vPCI driver, it seems like they should go in drivers/hv/channel.c
> along with vmbus_next_request_id() and vmbus_request_addr().
> And maybe vmbus_request_addr(), which gets the spin lock,
> could be implemented to call the new version above that
> assumes the spin lock is already held. Also, the new function
> that requires matching on the rqst_addr might also be folded
> into common code via an optional rqst_addr argument.
Noted.
> > @@ -2747,17 +2808,27 @@ static void hv_pci_onchannelcallback(void *context)
> > switch (desc->type) {
> > case VM_PKT_COMP:
> >
> > - req_addr = chan->request_addr_callback(chan, req_id);
> > + spin_lock_irqsave(&rqstor->req_lock, flags);
>
> Obtaining the lock (and releasing it below) might be better abstracted into
> a lock_requestor() and unlock_requestor() pair that are implemented in
> drivers/hv/channel.c along with the other related functions.
Seems like these helpers should go 'inline' in <linux/hyper.h>, let me
do it...
Thanks,
Andrea
prev parent reply other threads:[~2022-04-01 16:45 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-28 14:42 [RFC PATCH 0/4] PCI: hv: Miscellaneous changes Andrea Parri (Microsoft)
2022-03-28 14:42 ` [RFC PATCH 1/4] Drivers: hv: vmbus: Remove special code for unsolicited messages Andrea Parri (Microsoft)
2022-03-31 18:00 ` Michael Kelley (LINUX)
2022-04-07 2:54 ` Andrea Parri
2022-03-28 14:42 ` [RFC PATCH 2/4] PCI: hv: Use vmbus_requestor to generate transaction IDs for VMbus hardening Andrea Parri (Microsoft)
2022-03-31 18:12 ` Michael Kelley (LINUX)
2022-04-01 16:00 ` Andrea Parri
2022-03-28 14:42 ` [RFC PATCH 3/4] Drivers: hv: vmbus: Introduce vmbus_sendpacket_getid() Andrea Parri (Microsoft)
2022-03-31 19:47 ` Michael Kelley (LINUX)
2022-04-01 16:09 ` Andrea Parri
2022-03-28 14:42 ` [RFC PATCH 4/4] PCI: hv: Fix synchronization between channel callback and hv_compose_msi_msg() Andrea Parri (Microsoft)
2022-03-31 20:04 ` Michael Kelley (LINUX)
2022-04-01 16:30 ` Andrea Parri [this message]
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=20220401163015.GC437893@anparri \
--to=parri.andrea@gmail.com \
--cc=bhelgaas@google.com \
--cc=decui@microsoft.com \
--cc=haiyangz@microsoft.com \
--cc=kw@linux.com \
--cc=kys@microsoft.com \
--cc=linux-hyperv@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=lorenzo.pieralisi@arm.com \
--cc=mikelley@microsoft.com \
--cc=robh@kernel.org \
--cc=sthemmin@microsoft.com \
--cc=weh@microsoft.com \
--cc=wei.liu@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.