On Mon, Oct 05, 2020 at 01:36:55PM +0300, Dmitry Osipenko wrote: > 05.10.2020 12:53, Thierry Reding пишет: > > On Fri, Oct 02, 2020 at 05:50:08PM +0300, Dmitry Osipenko wrote: > >> 02.10.2020 17:22, Dmitry Osipenko пишет: > >>>> static int tegra_smmu_of_xlate(struct device *dev, > >>>> struct of_phandle_args *args) > >>>> { > >>>> + struct platform_device *iommu_pdev = of_find_device_by_node(args->np); > >>>> + struct tegra_mc *mc = platform_get_drvdata(iommu_pdev); > >>>> u32 id = args->args[0]; > >>>> > >>>> + of_node_put(args->np); > >>>> + > >>>> + if (!mc || !mc->smmu) > >>>> + return -EPROBE_DEFER; > >>> platform_get_drvdata(NULL) will crash. > >>> > >> > >> Actually, platform_get_drvdata(NULL) can't happen. I overlooked this. > > > > How so? It's technically possible for the iommus property to reference a > > device tree node for which no platform device will ever be created, in > > which case of_find_device_by_node() will return NULL. That's very > > unlikely and perhaps worth just crashing on to make sure it gets fixed > > immediately. > > The tegra_smmu_ops are registered from the SMMU driver itself and MC > driver sets platform data before SMMU is initialized, hence device is > guaranteed to exist and mc can't be NULL. Yes, but that assumes that args->np points to the memory controller's device tree node. It's obviously a mistake to do this, but I don't think anyone will prevent you from doing this: iommus = <&{/chosen} 0>; In that case, since no platform device is created for the /chosen node, iommu_pdev will end up being NULL and platform_get_drvdata() will crash. That said, I'm fine with not adding a check for that. If anyone really does end up messing this up they deserve the crash. I'm still a bit undecided about the mc->smmu check because I haven't convinced myself yet that it can't happen. Thierry
Attachment:
signature.asc
Description: PGP signature