[flashrom] [PATCH 1/5] Let pcidev clean itself up.

Carl-Daniel Hailfinger c-d.hailfinger.devel.2006 at gmx.net
Wed Jan 2 02:06:44 CET 2013


Am 01.01.2013 18:29 schrieb Stefan Tauner:
> We got a nice shutdown function registration infrastructure, but did not use it
> very wisely. Instead we added shutdown functions to a myriad of programmers
> unnecessarily. In this patch we get rid of those that do only call pci_cleanup(pacc)
> by adding a shutdown function the pcidev.c itself that gets registered by
> pcidev_init().
>
> Signed-off-by: Stefan Tauner <stefan.tauner at student.tuwien.ac.at>

Thanks for your patch, I really like it.
A few comments:


> diff --git a/nicrealtek.c b/nicrealtek.c
> index 3c3b261..0929e5d 100644
> --- a/nicrealtek.c
> +++ b/nicrealtek.c
> @@ -51,22 +51,25 @@ static const struct par_programmer par_programmer_nicrealtek = {
>  		.chip_writen		= fallback_chip_writen,
>  };
>  
> +#if 0
>  static int nicrealtek_shutdown(void *data)
>  {
>  	/* FIXME: We forgot to disable software access again. */
> -	pci_cleanup(pacc);
>  	return 0;
>  }
> +#endif
>  
>  int nicrealtek_init(void)
>  {
>  	if (rget_io_perms())
>  		return 1;
>  
> +	/* No need to check for errors, pcidev_init() will not return in case of errors. */
>  	io_base_addr = pcidev_init(PCI_BASE_ADDRESS_0, nics_realtek);
> -
> +#if 0
>  	if (register_shutdown(nicrealtek_shutdown, NULL))
>  		return 1;
> +#endif
>  
>  	/* Beware, this ignores the vendor ID! */
>  	switch (pcidev_dev->device_id) {

Please remove the #if 0 in the hunks above. It's not performance critical.


> diff --git a/pcidev.c b/pcidev.c
> index 1a26e99..37bcc22 100644
> --- a/pcidev.c
> +++ b/pcidev.c
> @@ -154,6 +154,14 @@ uintptr_t pcidev_readbar(struct pci_dev *dev, int bar)
>  	return (uintptr_t)addr;
>  }
>  
> +static int pcidev_shutdown(void *data)

Hm yes... I don't like the name that much, but I don't see a better
alternative, so disregard this comment.


> +{
> +	if (pacc != NULL)
> +		pci_cleanup(pacc);

undo_pci_write() spits out an error message for pacc==NULL, but here you
don't... that is inconsistent. If anything, it's really an error here.
Or am I missing something.


> +	pcidev_dev = NULL;
> +	return 0;
> +}
> +
>  uintptr_t pcidev_init(int bar, const struct dev_entry *devs)
>  {
>  	struct pci_dev *dev;
> @@ -166,6 +174,8 @@ uintptr_t pcidev_init(int bar, const struct dev_entry *devs)
>  
>  	pacc = pci_alloc();     /* Get the pci_access structure */
>  	pci_init(pacc);         /* Initialize the PCI library */
> +	if (register_shutdown(pcidev_shutdown, NULL))

Hm. My local tree has
register_shutdown(pci_cleanup_wrapper, pacc);
instead. I think your variant is better because it doesn't keep a
possibly deleted pointer around. Then again, deleting pacc should never
ever happen outside pcidev_shutdown.


> +		return 1;
>  	pci_scan_bus(pacc);     /* We want to get the list of devices */
>  	pci_filter_init(pacc, &filter);
>  
> @@ -244,6 +254,11 @@ struct undo_pci_write_data {
>  int undo_pci_write(void *p)
>  {
>  	struct undo_pci_write_data *data = p;
> +	if (pacc == NULL) {
> +		msg_perr("%s: Tried to undo PCI writes without a valid PCI context!\n"
> +			 "Please report a bug at flashrom at flashrom.org\n", __func__);
> +		return 1;
> +	}

Debatable, but OK. See my comment about the pacc check in pcidev_shutdown.


>  	msg_pdbg("Restoring PCI config space for %02x:%02x:%01x reg 0x%02x\n",
>  		 data->dev.bus, data->dev.dev, data->dev.func, data->reg);
>  	switch (data->type) {

Everything else is fine.

Regards,
Carl-Daniel

-- 
http://www.hailfinger.org/





More information about the flashrom mailing list