Hyper-V vmbus driver
gregkh at suse.de
Mon Apr 25 03:03:54 UTC 2011
On Mon, Apr 25, 2011 at 02:15:47AM +0000, KY Srinivasan wrote:
> > On Sun, Apr 24, 2011 at 04:18:24PM +0000, KY Srinivasan wrote:
> > > > On Mon, Apr 11, 2011 at 12:07:08PM -0700, Greg KH wrote:
> > > >
> > > > Due to other external issues, my patch backlog is still not gotten
> > > > through yet, sorry. Sometimes "real life" intrudes on the best of
> > > > plans.
> > > >
> > > > I'll get to this when I get through the rest of your hv patches, and the
> > > > other patches pending that I have in my queues.
> > >
> > > Thanks Greg. The latest re-send of my hv patches are against the tree:
> > > git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging-2.6.git
> > > that I picked up on April 22, 2011. I hope there won't be any issues
> > > this time around.
> > Me too :)
> Just curious; when are you planning to drain the hv patch queue next.
When I get a chance to get to it :)
> > > > But, I would recommend you going through and looking at the code and
> > > > verifying that you feel the bus code is "ready". At a very quick
> > > > glance, you should not have individual drivers have to set their 'struct
> > > > device' pointers directly, that is something that the bus does, not the
> > > > driver. The driver core will call your bus and your bus will then do
> > > > the matching and call the probe function of the driver if needed.
> > >
> > > Are you referring to the fact that in the vmbus_match function,
> > > the current code binds the device specific driver to the
> > > corresponding hv_device structure?
> > Yes, that's the problem (well, kind of the problem.)
> > You seem to be doing things a bit "odd" and that's due to the old way
> > the code was written.
> > First off, don't embed a struct bus_type in another structure, that's
> > not needed at all. Why is that done? Anyway...
> Currently, struct bus_type is embedded in struct hv_bus that has very minimal
> additional state. I will clean this up.
> > In your vmbus_match function, you should be matching to see if your
> > device matches the driver that is passed to you. You do this by looking
> > at some type of "id". For the vmbus you should do this by looking at
> > the GUID, right? And it looks like you do do this, so that's fine.
> > And then your vmbus_probe() function calls the driver probe function,
> > with the device it is to bind to. BUT, you need to have your probe
> > function pass in the correct device type (i.e. struct hv_device, NOT
> > struct device.)
> I will clean this up.
> > That way, your hv_driver will have a type all its own, with probe
> > functions that look nothing like the probe functions that 'struct
> > driver' has in it. Look at 'struct pci_driver' for an example of this.
> > Don't try to overload the probe/remove/suspend/etc functions of your
> > hv_driver by using the "base" 'struct device_driver' callbacks, that's
> > putting knowledge of the driver core into the individual hv drivers,
> > where it's not needed at all.
> > And, by doing that, you should be able to drop your private pointer in
> > the hv_driver function completly, right? That shouldn't be needed at
> > all.
> After sending you the mail this afternoon, I worked on patches that do exactly that.
> I did this with the current model where probe/remove/ etc. get a pointer
> to struct device. Within a specific driver you can always map a struct device
> pointer to the class specific device driver. I will keep that code; I will however
> do what you are suggesting here and make probe/remove etc. take a pointer
> to struct hv_device.
> > > > See the PCI driver structure for an example of this if you are curious.
> > > > It should also allow you to get rid of that unneeded *priv pointer in
> > > > the struct hv_driver.
> > >
> > > I am pretty sure, I can get rid of this. The way this code was originally
> > > structured, in the vmbus_match() function, you needed to get at the
> > > device specific driver pointer so that we could do the binding between
> > > the hv_device and the correspond device specific driver. The earlier code
> > > depended on the structure layout to map a pointer to the hv_driver to
> > > the corresponding device specific driver (net, block etc.) To get rid of
> > > this layout dependency, I introduced an addition field (priv) in the hv_driver.
> > >
> > > There is, I suspect sufficient state available to:
> > >
> > > (a) Not require the vmbus_match() function to do the binding.
> > No, you still want that, see above.
> The current code has the following
> assignment after a match is found:
> device_ctx->drv = drv->priv;
> What I meant was that I would get rid of this assignment (binding)
> since I can get that information quite easily in the class specific
> (net, block, etc.) where it is needed.
Yes, that is good as it is not needed.
It's also a flaw in that you would not allow multiple devices attached
to the same driver, but as you can't run this bus that way, it was never
> > > (b) And to get at the device specific driver structure from the generic
> > > driver structure without having to have an explicit mapping
> > > maintained in the hv_driver structure.
> > Kind of, see above for more details.
> > If you want a good example, again, look at the PCI core code, it's
> > pretty simple in this area (hint, don't look at the USB code, it does
> > much more complex things than you want, due to things that the USB bus
> > imposes on devices, that's never a good example to look at.)
> > Hope this helps. Please let me know if it doesn't :)
> Thanks for this detailed mail Greg. As I am writing this email, I have
> pretty much completed the code for much of what we have discussed
> here. These are on top of my patches that are yet to be applied (the
> ones that I sent on April 22). Since some of these changes also affect
> netvsc code and Haiyang had sent some patches to deal with forward
> declarations in the netvsc code, I have locally applied haiyang's
> patches. I will send you these patches soon.
More information about the devel