From: Bjorn Helgaas <bjorn.helgaas@hp.com>
To: ykzhao <yakui.zhao@intel.com>
Cc: "lenb@kernel.org" <lenb@kernel.org>,
"linux-acpi@vger.kernel.org" <linux-acpi@vger.kernel.org>,
"minyard@acm.org" <minyard@acm.org>
Subject: Re: [PATCH_v7 2/2] ACPI/IPMI: Add the IPMI opregion driver to enable ACPI to access BMC controller
Date: Fri, 16 Jul 2010 10:01:21 -0600 [thread overview]
Message-ID: <201007161001.21956.bjorn.helgaas@hp.com> (raw)
In-Reply-To: <1279247675.3660.104.camel@localhost.localdomain>
On Thursday, July 15, 2010 08:34:35 pm ykzhao wrote:
> On Fri, 2010-07-16 at 00:27 +0800, Bjorn Helgaas wrote:
> > On Wednesday, July 14, 2010 07:31:06 pm ykzhao wrote:
> > > On Thu, 2010-07-15 at 01:24 +0800, Bjorn Helgaas wrote:
> > > Will you please look at this thread
> > > http://marc.info/?l=linux-acpi&m=127608894610765&w=4?
> > >
> > > Before this patch, I followed your comment and put the ACPI IPMI
> > > opregion code into the IPMI_SI module.
> > >
> > > But in fact the IPMI opregion code has nothing to do with the ipmi
> > > system interface. It is enough to use the IPMI API interface. In such
> > > case maybe it is a better choice to put the IPMI opregion code into the
> > > separate file. (In fact Corey suggests that the IPMI opregion code be
> > > put into the separate file).
> >
> > The ACPI IPMI opregion code deals with an ACPI device, and the
> > obvious place where you have that device is the driver "add"
> > function, i.e., ipmi_pnp_probe(). That's the point where the
> > PNP core will help you out by matching device IDs and handling
> > hotplug for you.
>
> The "IPI0001" device defined in ACPI table serves the following two
> purposes:
> 1. IPMI detection and registration: This is defined in IPMI spec. Now
> it is discovered in the drivers/char/ipmi/ipmi_si_intf
> 2. IPMI opregion support: This is defined in ACPI4.0 spec.This
> is to enable that the ACPI AML code can communicate with the BMC
> controller.
>
> Yes. If we put the opregion code with the detection code together, it
> will be simple. And it is unnecessary to get the corresponding device
> list again. But as the IPMI opregion code only uses the API interface of
> IPMI subsystem, it will be better to put it into the separate file. In
> fact this is also Corey's idea.
I don't care if you put it in a separate file. My only point is that
you shouldn't try to duplicate the device discovery that's already
done in the PNP core.
> Yes. The hotplug scenario should be considered. This will be handled
> under two places:
> a. the IPMI pnp detection:
> b. install opregion handle for the hotplug IPI0001 device
>
> But in fact the acpi_pnp device is enumerated only once at the boot
> time.
Drivers cannot rely on anything like "the acpi_pnp device is
enumerated only once at boot-time." Device enumeration happens
in the ACPI core and PNP core, not in drivers, and drivers can't
assume anything about when it happens.
> In such case it is impossible to get the corresponding pnp device
> when one "IPI0001" device is hotplug. Of course the "ipmi_si" can't see
> the hotplugged "IPI0001" device. If we really want to handle the
> hotplug scenario, IMO we should change the detection mechanism from pnp
> to ACPI again. Otherwise it is difficult to handle the hotplug scenario.
No, you're missing the point. *All* drivers should be written in
the standard style that supports hotplug, because then all devices,
both those present at boot and any added later, are handled the same
way.
ipmi_si can indeed see any hotplugged IPI0001 device, simply because
it uses pnp_register_driver(). The PNP core calls ipmi_pnp_probe()
when any IPI0001 device is discovered. This device could be present
at boot, or it could be added later.
> It is an idea to maintain the device list of "impi_si". But if we look
> at the source code of "ipmi_si_intf", the corresponding device list is
> defined as *static*.
This is a problem you're creating for yourself by trying to completely
separate acpi_ipmi from ipmi_pnp_probe(). I'm suggesting that you can
make your life easier by adding some kind of hook in the ipmi_pnp_probe()
path to set up the opregion handler.
> Another matter is that the "info->dev" in ipmi_pnp_probe is changed from
> acpi_dev to pnp_dev. Now in order to *correctly* create the user
> interface between ACPI and BMC controller, it is realized by comparing
> the "device handle". And the prerequisite is that we should get the
> corresponding pnp device list of "IPI0001".
> If we don't export the symbol of "pnp_bus_type", do you have any idea to
> get the corresponding device list of "IPI0001"?
If you have the pnp_dev for an IPI0001 device, you can always get the
ACPI handle with pnp_acpi_device().
> > > > > +static void ipmi_bmc_gone(int iface)
> > > > > +{
> > > > > + struct acpi_ipmi_device *ipmi_device, *temp;
> > > > > +
> > > > > + if (list_empty(&driver_data.ipmi_devices))
> > > > > + return;
> > > >
> > > > You don't need to test for list_empty before using
> > > > list_for_each_entry_safe()
> > >
> > > IMO it is needed as it does the operation of list deletion.
> >
> > I don't think so:
> >
> > * list_for_each_entry_safe - iterate over list of given type safe against removal of list entry
>
> There exist a lot of examples about the removal of list_entry by using
> list_for_each_entry_safe. For example:
> >drivers/char/ipmi/ipmi_msghandler.c
That only means other drivers also contain this unnecessary code.
There are many examples of list deletion using list_for_each_entry_safe()
where we don't check list_empty() first. For example:
pnp_free_resources()
pnp_clean_resource_table()
pnp_free_options()
omap_mux_late_init()
vpe_module_exit()/release_vpe()
fsl_dma_slave_free()
cbe_ptcal_disable()
pmi_of_remove()
Maybe you could remove the check and do some testing to convince
yourself that it's safe.
Bjorn
next prev parent reply other threads:[~2010-07-16 16:01 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-07-14 12:54 [PATCH -v7 0/2] ACPI: Install the ACPI IPMI opregion yakui.zhao
2010-07-14 12:54 ` [PATCH 1/2_v7] ACPI: Export symbol of pnp_bus_type yakui.zhao
2010-07-14 12:54 ` [PATCH_v7 2/2] ACPI/IPMI: Add the IPMI opregion driver to enable ACPI to access BMC controller yakui.zhao
2010-07-14 17:24 ` Bjorn Helgaas
2010-07-15 1:31 ` ykzhao
2010-07-15 16:27 ` Bjorn Helgaas
2010-07-16 2:34 ` ykzhao
2010-07-16 16:01 ` Bjorn Helgaas [this message]
2010-07-19 1:52 ` ykzhao
2010-07-19 14:54 ` Bjorn Helgaas
2010-07-20 0:09 ` ykzhao
2010-07-14 16:57 ` [PATCH 1/2_v7] ACPI: Export symbol of pnp_bus_type Bjorn Helgaas
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=201007161001.21956.bjorn.helgaas@hp.com \
--to=bjorn.helgaas@hp.com \
--cc=lenb@kernel.org \
--cc=linux-acpi@vger.kernel.org \
--cc=minyard@acm.org \
--cc=yakui.zhao@intel.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox