[ewg] Re: RFC: modify upstream code to make backporting easier
Ralph Campbell
ralph.campbell at qlogic.com
Tue Sep 11 13:19:19 PDT 2007
Looks OK to me from the InfiniPath side.
Keeping the backported code as close as possible to the
upstream code is a good thing in my view.
On Tue, 2007-09-11 at 09:28 +0300, Michael S. Tsirkin wrote:
> Roland, Ralph, all,
> I'd like to get your opinion on the following matter:
> OFED is backporting upstream rdma code to older kernels.
> While doing so, I really take pains to keep the ported
> code as close as possible to upstream original,
> mostly by using preprocessor to implement, as closely
> as possible, the APIs from recent kernels on top of
> older ones.
>
> As an example where this works well, see my backport of the
> new workqueue API to 2.6.19:
> http://www.openfabrics.org/git/?p=ofed_1_3/linux-2.6.git;a=blob;f=kernel_addons/backport/2.6.19/include/linux/workqueue.h;hb=HEAD
>
> However, sometimes I am forced to patch the upstream code. Here's an
> example of the patch needed to make ipath build on
> 2.6.22:
>
>
> diff --git a/drivers/infiniband/hw/ipath/ipath_driver.c b/drivers/infiniband/hw/ipath/ipath_driver.c
> index 09c5fd8..94edb5d 100644
> --- a/drivers/infiniband/hw/ipath/ipath_driver.c
> +++ b/drivers/infiniband/hw/ipath/ipath_driver.c
> @@ -287,6 +287,7 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
> struct ipath_devdata *dd;
> unsigned long long addr;
> u32 bar0 = 0, bar1 = 0;
> + u8 rev;
>
> dd = ipath_alloc_devdata(pdev);
> if (IS_ERR(dd)) {
> @@ -448,7 +449,13 @@ static int __devinit ipath_init_one(struct pci_dev *pdev,
> dd->ipath_deviceid = ent->device; /* save for later use */
> dd->ipath_vendorid = ent->vendor;
>
> - dd->ipath_pcirev = pdev->revision;
> + ret = pci_read_config_byte(pdev, PCI_REVISION_ID, &rev);
> + if (ret) {
> + ipath_dev_err(dd, "Failed to read PCI revision ID unit "
> + "%u: err %d\n", dd->ipath_unit, -ret);
> + goto bail_regions; /* shouldn't ever happen */
> + }
> + dd->ipath_pcirev = rev;
>
> #if defined(__powerpc__)
> /* There isn't a generic way to specify writethrough mappings */
>
>
> As you can see, there's nothing I can do with macros outside the code
> to make it work without code changes.
> However, the patching mechanism is pretty fragile with respect
> to code reorgs etc.
> I wonder whether it's acceptable in cases such as this to add
> a wrapper in upstream code. For example, upstream could have:
>
> #ifndef pci_get_revision
> #define pci_get_revision(dev) ((dev)->revision)
> #endif
>
> and then all a 2.6.22 backport needs to do is define it's own
> pci_get_revision macro.
>
> Upstream maintainers, can you pls comment ASAP on whether such approach would be
> acceptable e.g. for 2.6.24? If I could get rid of backport
> patches, it might make sense to start thinking about converting fixes
> patches to git commits, post 1.3, as well.
>
> Thanks,
>
More information about the ewg
mailing list