Re: git: 96e500a3f9f0 - main - hda: Push giant / newbus topo lock down a layer
- In reply to: Warner Losh : "git: 96e500a3f9f0 - main - hda: Push giant / newbus topo lock down a layer"
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 10 Dec 2021 13:53:38 UTC
It looks like bus_topo_unlock() is called twice in hdaa_sysctl_reconfig()
On 2021/12/10 9:05, Warner Losh wrote:
> The branch main has been updated by imp:
>
> URL: https://cgit.FreeBSD.org/src/commit/?id=96e500a3f9f0e317875b5d5c2097df804106bc3f
>
> commit 96e500a3f9f0e317875b5d5c2097df804106bc3f
> Author: Warner Losh <imp@FreeBSD.org>
> AuthorDate: 2021-12-09 23:52:55 +0000
> Commit: Warner Losh <imp@FreeBSD.org>
> CommitDate: 2021-12-10 00:04:58 +0000
>
> hda: Push giant / newbus topo lock down a layer
>
> Rather than picking up Giant at the start of these sysctl handlers, push
> acquiring Giant down a layer to protect walking the children and also
> to add/delete children for the reconfigure.
>
> Sponsored by: Netflix
> Reviewed by: mav, jhb
> Differential Revision: https://reviews.freebsd.org/D33057
> ---
> sys/dev/sound/pci/hda/hdaa.c | 13 +++++++++++--
> sys/dev/sound/pci/hda/hdac.c | 14 +++++++++++---
> 2 files changed, 22 insertions(+), 5 deletions(-)
>
> diff --git a/sys/dev/sound/pci/hda/hdaa.c b/sys/dev/sound/pci/hda/hdaa.c
> index 82c309996d75..ddc22c3bc139 100644
> --- a/sys/dev/sound/pci/hda/hdaa.c
> +++ b/sys/dev/sound/pci/hda/hdaa.c
> @@ -6463,16 +6463,25 @@ hdaa_sysctl_reconfig(SYSCTL_HANDLER_ARGS)
> HDA_BOOTHVERBOSE(
> device_printf(dev, "Reconfiguration...\n");
> );
> - if ((error = device_delete_children(dev)) != 0)
> +
> + bus_topo_lock();
> +
> + if ((error = device_delete_children(dev)) != 0) {
> + bus_topo_unlock();
> return (error);
> + }
> hdaa_lock(devinfo);
> hdaa_unconfigure(dev);
> hdaa_configure(dev);
> hdaa_unlock(devinfo);
> bus_generic_attach(dev);
> + bus_topo_unlock();
> HDA_BOOTHVERBOSE(
> device_printf(dev, "Reconfiguration done\n");
> );
> +
> + bus_topo_unlock();
> +
> return (0);
> }
>
> @@ -6669,7 +6678,7 @@ hdaa_attach(device_t dev)
> devinfo, 0, hdaa_sysctl_gpo_config, "A", "GPO configuration");
> SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
> SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
> - "reconfig", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT,
> + "reconfig", CTLTYPE_INT | CTLFLAG_RW,
> dev, 0, hdaa_sysctl_reconfig, "I", "Reprocess configuration");
> SYSCTL_ADD_INT(device_get_sysctl_ctx(dev),
> SYSCTL_CHILDREN(device_get_sysctl_tree(dev)), OID_AUTO,
> diff --git a/sys/dev/sound/pci/hda/hdac.c b/sys/dev/sound/pci/hda/hdac.c
> index 5d3f1d85a2ad..058eb63e268d 100644
> --- a/sys/dev/sound/pci/hda/hdac.c
> +++ b/sys/dev/sound/pci/hda/hdac.c
> @@ -1387,12 +1387,20 @@ sysctl_hdac_pindump(SYSCTL_HANDLER_ARGS)
> return (0);
> }
>
> - if ((err = device_get_children(dev, &devlist, &devcount)) != 0)
> + bus_topo_lock();
> +
> + if ((err = device_get_children(dev, &devlist, &devcount)) != 0) {
> + bus_topo_unlock();
> return (err);
> + }
> +
> hdac_lock(sc);
> for (i = 0; i < devcount; i++)
> HDAC_PINDUMP(devlist[i]);
> hdac_unlock(sc);
> +
> + bus_topo_unlock();
> +
> free(devlist, M_TEMP);
> return (0);
> }
> @@ -1607,11 +1615,11 @@ hdac_attach2(void *arg)
>
> SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev),
> SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
> - "pindump", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc->dev,
> + "pindump", CTLTYPE_INT | CTLFLAG_RW, sc->dev,
> sizeof(sc->dev), sysctl_hdac_pindump, "I", "Dump pin states/data");
> SYSCTL_ADD_PROC(device_get_sysctl_ctx(sc->dev),
> SYSCTL_CHILDREN(device_get_sysctl_tree(sc->dev)), OID_AUTO,
> - "polling", CTLTYPE_INT | CTLFLAG_RW | CTLFLAG_NEEDGIANT, sc->dev,
> + "polling", CTLTYPE_INT | CTLFLAG_RW, sc->dev,
> sizeof(sc->dev), sysctl_hdac_polling, "I", "Enable polling mode");
> }
>
>
--
-|-__ YAMAMOTO, Taku
| __ < <taku@tackymt.homeip.net>