Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On 07/03/18 at 11:57pm, Andy Shevchenko wrote: > On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He wrote: > > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > >> wrote: > > >> > I briefly looked at the code and error codes we have, so, my proposal > >> > is one of the following > >> > >> > - use -ECANCELED (not the best choice for first occurrence here, > >> > though I can't find better) > >> > >> Actually -ENOTSUPP might suit the first case (although the actual > >> would be something like -EOVERLAP, which we don't have) > > > > Sorry for late reply, and many thanks for your great suggestion. > > > > > I am fine to use -ENOTSUPP as the first returned value, and -ECANCELED > > for the 2nd one. > > I have no strong opinion, but I like (slightly better) this approach ^^^ Done, post v6 in this way, many thanks. > > > Or define an enum as you suggested inside the function > > or in header file. > > > > > Or use -EBUSY for the first case because existing resource is > > overlapping but not fully contained by 'res'; and -EINVAL for > > the 2nd case since didn't find any one resources which is contained by > > 'res', means we passed in a invalid resource. > > > > All is fine to me, I can repost with each of them. > > >> > - use positive integers (or enum), like > >> > #define RES_REPARENTED 0 > >> > #define RES_OVERLAPPED 1 > >> > #define RES_NOCONFLICT 2 > > -- > With Best Regards, > Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He wrote: > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko >> wrote: >> > I briefly looked at the code and error codes we have, so, my proposal >> > is one of the following >> >> > - use -ECANCELED (not the best choice for first occurrence here, >> > though I can't find better) >> >> Actually -ENOTSUPP might suit the first case (although the actual >> would be something like -EOVERLAP, which we don't have) > > Sorry for late reply, and many thanks for your great suggestion. > > I am fine to use -ENOTSUPP as the first returned value, and -ECANCELED > for the 2nd one. I have no strong opinion, but I like (slightly better) this approach ^^^ > Or define an enum as you suggested inside the function > or in header file. > > Or use -EBUSY for the first case because existing resource is > overlapping but not fully contained by 'res'; and -EINVAL for > the 2nd case since didn't find any one resources which is contained by > 'res', means we passed in a invalid resource. > > All is fine to me, I can repost with each of them. >> > - use positive integers (or enum), like >> > #define RES_REPARENTED 0 >> > #define RES_OVERLAPPED 1 >> > #define RES_NOCONFLICT 2 -- With Best Regards, Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
Hi Andy, On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > wrote: > >> Hmm, I just copied it from arch/powerpc/kernel/pci-common.c. The > >> function interface expects an integer returned value, not sure what a > >> real error codes look like, could you give more hints? Will change > >> accordingly. > > > > I briefly looked at the code and error codes we have, so, my proposal > > is one of the following > > > - use -ECANCELED (not the best choice for first occurrence here, > > though I can't find better) > > Actually -ENOTSUPP might suit the first case (although the actual > would be something like -EOVERLAP, which we don't have) Sorry for late reply, and many thanks for your great suggestion. I am fine to use -ENOTSUPP as the first returned value, and -ECANCELED for the 2nd one. Or define an enum as you suggested inside the function or in header file. Or use -EBUSY for the first case because existing resource is overlapping but not fully contained by 'res'; and -EINVAL for the 2nd case since didn't find any one resources which is contained by 'res', means we passed in a invalid resource. All is fine to me, I can repost with each of them. Thanks Baoquan > > > - use positive integers (or enum), like > > #define RES_REPARENTED 0 > > #define RES_OVERLAPPED 1 > > #define RES_NOCONFLICT 2 > > > > > >>> > + if (firstpp == NULL) > >>> > + firstpp = pp; > >>> > + } > >>> > >>> > + if (firstpp == NULL) > >>> > + return -1; /* didn't find any conflicting entries? > >>> > */ > >>> > >>> Ditto. > > > > Ditto. > > > >>> > >>> > +} > >>> > +EXPORT_SYMBOL(reparent_resources); > > > > -- > > With Best Regards, > > Andy Shevchenko > > > > -- > With Best Regards, > Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He wrote: >> On 06/12/18 at 11:29am, Andy Shevchenko wrote: >>> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He wrote: > >>> > +{ >>> >>> > + for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { >>> > + if (p->end < res->start) >>> > + continue; >>> > + if (res->end < p->start) >>> > + break; >>> >>> > + if (p->start < res->start || p->end > res->end) >>> > + return -1; /* not completely contained */ >>> >>> Usually we are expecting real eeror codes. >> >> Hmm, I just copied it from arch/powerpc/kernel/pci-common.c. The >> function interface expects an integer returned value, not sure what a >> real error codes look like, could you give more hints? Will change >> accordingly. > > I briefly looked at the code and error codes we have, so, my proposal > is one of the following > - use -ECANCELED (not the best choice for first occurrence here, > though I can't find better) Actually -ENOTSUPP might suit the first case (although the actual would be something like -EOVERLAP, which we don't have) > - use positive integers (or enum), like > #define RES_REPARENTED 0 > #define RES_OVERLAPPED 1 > #define RES_NOCONFLICT 2 > > >>> > + if (firstpp == NULL) >>> > + firstpp = pp; >>> > + } >>> >>> > + if (firstpp == NULL) >>> > + return -1; /* didn't find any conflicting entries? */ >>> >>> Ditto. > > Ditto. > >>> >>> > +} >>> > +EXPORT_SYMBOL(reparent_resources); > > -- > With Best Regards, > Andy Shevchenko -- With Best Regards, Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He wrote: > On 06/12/18 at 11:29am, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He wrote: >> > +{ >> >> > + for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { >> > + if (p->end < res->start) >> > + continue; >> > + if (res->end < p->start) >> > + break; >> >> > + if (p->start < res->start || p->end > res->end) >> > + return -1; /* not completely contained */ >> >> Usually we are expecting real eeror codes. > > Hmm, I just copied it from arch/powerpc/kernel/pci-common.c. The > function interface expects an integer returned value, not sure what a > real error codes look like, could you give more hints? Will change > accordingly. I briefly looked at the code and error codes we have, so, my proposal is one of the following - use -ECANCELED (not the best choice for first occurrence here, though I can't find better) - use positive integers (or enum), like #define RES_REPARENTED 0 #define RES_OVERLAPPED 1 #define RES_NOCONFLICT 2 >> > + if (firstpp == NULL) >> > + firstpp = pp; >> > + } >> >> > + if (firstpp == NULL) >> > + return -1; /* didn't find any conflicting entries? */ >> >> Ditto. Ditto. >> >> > +} >> > +EXPORT_SYMBOL(reparent_resources); -- With Best Regards, Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He wrote: > > reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c > > and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c > > so that it's shared. Later its code also need be updated using list_head > > to replace singly linked list. > > While this is a good deduplication of the code, some requirements for > public functions would be good to satisfy. > > > +/* > > + * Reparent resource children of pr that conflict with res > > + * under res, and make res replace those children. > > + */ > > kernel doc format, though... Will rewrite it, thanks. > > > +static int reparent_resources(struct resource *parent, > > +struct resource *res) > > ...is it really public with static keyword?! > > > > > +{ > > > + for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > > + if (p->end < res->start) > > + continue; > > + if (res->end < p->start) > > + break; > > > + if (p->start < res->start || p->end > res->end) > > + return -1; /* not completely contained */ > > Usually we are expecting real eeror codes. > > > + if (firstpp == NULL) > > + firstpp = pp; > > + } > > > + if (firstpp == NULL) > > + return -1; /* didn't find any conflicting entries? */ > > Ditto. > > > +} > > +EXPORT_SYMBOL(reparent_resources); > > -- > With Best Regards, > Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He wrote: > > reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c > > and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c > > so that it's shared. Later its code also need be updated using list_head > > to replace singly linked list. > > While this is a good deduplication of the code, some requirements for > public functions would be good to satisfy. > > > +/* > > + * Reparent resource children of pr that conflict with res > > + * under res, and make res replace those children. > > + */ > > kernel doc format, though... > > > +static int reparent_resources(struct resource *parent, > > +struct resource *res) > > ...is it really public with static keyword?! Thanks for looking into this. This is a code bug, I copied and changed, but forgot merging the changing to local commit. And the error reported by test robot in patch 2 was changed too locally, forgot merging it to patch. Will repost to address this. > > > > > +{ > > > + for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > > + if (p->end < res->start) > > + continue; > > + if (res->end < p->start) > > + break; > > > + if (p->start < res->start || p->end > res->end) > > + return -1; /* not completely contained */ > > Usually we are expecting real eeror codes. Hmm, I just copied it from arch/powerpc/kernel/pci-common.c. The function interface expects an integer returned value, not sure what a real error codes look like, could you give more hints? Will change accordingly. > > > + if (firstpp == NULL) > > + firstpp = pp; > > + } > > > + if (firstpp == NULL) > > + return -1; /* didn't find any conflicting entries? */ > > Ditto. > > > +} > > +EXPORT_SYMBOL(reparent_resources); > > -- > With Best Regards, > Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He wrote: > reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c > and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c > so that it's shared. Later its code also need be updated using list_head > to replace singly linked list. While this is a good deduplication of the code, some requirements for public functions would be good to satisfy. > +/* > + * Reparent resource children of pr that conflict with res > + * under res, and make res replace those children. > + */ kernel doc format, though... > +static int reparent_resources(struct resource *parent, > +struct resource *res) ...is it really public with static keyword?! > +{ > + for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > + if (p->end < res->start) > + continue; > + if (res->end < p->start) > + break; > + if (p->start < res->start || p->end > res->end) > + return -1; /* not completely contained */ Usually we are expecting real eeror codes. > + if (firstpp == NULL) > + firstpp = pp; > + } > + if (firstpp == NULL) > + return -1; /* didn't find any conflicting entries? */ Ditto. > +} > +EXPORT_SYMBOL(reparent_resources); -- With Best Regards, Andy Shevchenko ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
Hi Baoquan, I love your patch! Yet something to improve: [auto build test ERROR on linus/master] [also build test ERROR on v4.17 next-20180608] [if your patch is applied to the wrong git tree, please drop us a note to help improve the system] url: https://github.com/0day-ci/linux/commits/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180612-113600 config: i386-tinyconfig (attached as .config) compiler: gcc-7 (Debian 7.3.0-16) 7.3.0 reproduce: # save the attached .config to linux build tree make ARCH=i386 Note: the linux-review/Baoquan-He/resource-Use-list_head-to-link-sibling-resource/20180612-113600 HEAD 5545e79eef6387857faf41cdffa7be6b1f5d4efe builds fine. It only hurts bisectibility. All errors (new ones prefixed by >>): >> kernel/resource.c:990:12: error: static declaration of 'reparent_resources' >> follows non-static declaration static int reparent_resources(struct resource *parent, ^~ In file included from kernel/resource.c:14:0: include/linux/ioport.h:195:5: note: previous declaration of 'reparent_resources' was here int reparent_resources(struct resource *parent, struct resource *res); ^~ kernel/resource.c:990:12: warning: 'reparent_resources' defined but not used [-Wunused-function] static int reparent_resources(struct resource *parent, ^~ vim +/reparent_resources +990 kernel/resource.c 985 986 /* 987 * Reparent resource children of pr that conflict with res 988 * under res, and make res replace those children. 989 */ > 990 static int reparent_resources(struct resource *parent, 991 struct resource *res) 992 { 993 struct resource *p, **pp; 994 struct resource **firstpp = NULL; 995 996 for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { 997 if (p->end < res->start) 998 continue; 999 if (res->end < p->start) 1000 break; 1001 if (p->start < res->start || p->end > res->end) 1002 return -1; /* not completely contained */ 1003 if (firstpp == NULL) 1004 firstpp = pp; 1005 } 1006 if (firstpp == NULL) 1007 return -1; /* didn't find any conflicting entries? */ 1008 res->parent = parent; 1009 res->child = *firstpp; 1010 res->sibling = *pp; 1011 *firstpp = res; 1012 *pp = NULL; 1013 for (p = res->child; p != NULL; p = p->sibling) { 1014 p->parent = res; 1015 pr_debug("PCI: Reparented %s %pR under %s\n", 1016 p->name, p, res->name); 1017 } 1018 return 0; 1019 } 1020 EXPORT_SYMBOL(reparent_resources); 1021 --- 0-DAY kernel test infrastructureOpen Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation .config.gz Description: application/gzip ___ devel mailing list de...@linuxdriverproject.org http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel
Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
On 06/12/18 at 11:28am, Baoquan He wrote: > reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c > and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c > so that it's shared. Later its code also need be updated using list_head > to replace singly linked list. > > Signed-off-by: Baoquan He > Cc: Michal Simek > Cc: Benjamin Herrenschmidt > Cc: Paul Mackerras > Cc: Michael Ellerman > --- > v4->v5: > Fix several code bugs reported by test robot on ARCH powerpc and > microblaze. Oops, I mistakenly added the patch change log of the current patch 0002 here. This patch is a newly added one. > > v3->v4: > Fix several bugs test robot reported. And change patch log. > > v2->v3: > Rename resource functions first_child() and sibling() to > resource_first_chils() and resource_sibling(). Dan suggested this. > > Move resource_first_chils() and resource_sibling() to linux/ioport.h > and make them as inline function. Rob suggested this. Accordingly add > linux/list.h including in linux/ioport.h, please help review if this > bring efficiency degradation or code redundancy. > > The change on struct resource {} bring two pointers of size increase, > mention this in git log to make it more specifically, Rob suggested > this. > > arch/microblaze/pci/pci-common.c | 37 - > arch/powerpc/kernel/pci-common.c | 35 --- > include/linux/ioport.h | 1 + > kernel/resource.c| 36 > 4 files changed, 37 insertions(+), 72 deletions(-) > > diff --git a/arch/microblaze/pci/pci-common.c > b/arch/microblaze/pci/pci-common.c > index f34346d56095..7899bafab064 100644 > --- a/arch/microblaze/pci/pci-common.c > +++ b/arch/microblaze/pci/pci-common.c > @@ -619,43 +619,6 @@ int pcibios_add_device(struct pci_dev *dev) > EXPORT_SYMBOL(pcibios_add_device); > > /* > - * Reparent resource children of pr that conflict with res > - * under res, and make res replace those children. > - */ > -static int __init reparent_resources(struct resource *parent, > - struct resource *res) > -{ > - struct resource *p, **pp; > - struct resource **firstpp = NULL; > - > - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > - if (p->end < res->start) > - continue; > - if (res->end < p->start) > - break; > - if (p->start < res->start || p->end > res->end) > - return -1; /* not completely contained */ > - if (firstpp == NULL) > - firstpp = pp; > - } > - if (firstpp == NULL) > - return -1; /* didn't find any conflicting entries? */ > - res->parent = parent; > - res->child = *firstpp; > - res->sibling = *pp; > - *firstpp = res; > - *pp = NULL; > - for (p = res->child; p != NULL; p = p->sibling) { > - p->parent = res; > - pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n", > - p->name, > - (unsigned long long)p->start, > - (unsigned long long)p->end, res->name); > - } > - return 0; > -} > - > -/* > * Handle resources of PCI devices. If the world were perfect, we could > * just allocate all the resource regions and do nothing more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/arch/powerpc/kernel/pci-common.c > b/arch/powerpc/kernel/pci-common.c > index fe9733aa..926035bb378d 100644 > --- a/arch/powerpc/kernel/pci-common.c > +++ b/arch/powerpc/kernel/pci-common.c > @@ -1088,41 +1088,6 @@ resource_size_t pcibios_align_resource(void *data, > const struct resource *res, > EXPORT_SYMBOL(pcibios_align_resource); > > /* > - * Reparent resource children of pr that conflict with res > - * under res, and make res replace those children. > - */ > -static int reparent_resources(struct resource *parent, > - struct resource *res) > -{ > - struct resource *p, **pp; > - struct resource **firstpp = NULL; > - > - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { > - if (p->end < res->start) > - continue; > - if (res->end < p->start) > - break; > - if (p->start < res->start || p->end > res->end) > - return -1; /* not completely contained */ > - if (firstpp == NULL) > - firstpp = pp; > - } > - if (firstpp == NULL) > - return -1; /* didn't find any conflicting entries? */ > - res->parent = parent; > - res->child = *firstpp; > - res->sibling = *pp; > - *firstpp = res; > - *pp = NULL; > - for (p = res->child; p != NULL; p = p->sibling) { > -
[PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public
reparent_resources() is duplicated in arch/microblaze/pci/pci-common.c and arch/powerpc/kernel/pci-common.c, so move it to kernel/resource.c so that it's shared. Later its code also need be updated using list_head to replace singly linked list. Signed-off-by: Baoquan He Cc: Michal Simek Cc: Benjamin Herrenschmidt Cc: Paul Mackerras Cc: Michael Ellerman --- v4->v5: Fix several code bugs reported by test robot on ARCH powerpc and microblaze. v3->v4: Fix several bugs test robot reported. And change patch log. v2->v3: Rename resource functions first_child() and sibling() to resource_first_chils() and resource_sibling(). Dan suggested this. Move resource_first_chils() and resource_sibling() to linux/ioport.h and make them as inline function. Rob suggested this. Accordingly add linux/list.h including in linux/ioport.h, please help review if this bring efficiency degradation or code redundancy. The change on struct resource {} bring two pointers of size increase, mention this in git log to make it more specifically, Rob suggested this. arch/microblaze/pci/pci-common.c | 37 - arch/powerpc/kernel/pci-common.c | 35 --- include/linux/ioport.h | 1 + kernel/resource.c| 36 4 files changed, 37 insertions(+), 72 deletions(-) diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index f34346d56095..7899bafab064 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -619,43 +619,6 @@ int pcibios_add_device(struct pci_dev *dev) EXPORT_SYMBOL(pcibios_add_device); /* - * Reparent resource children of pr that conflict with res - * under res, and make res replace those children. - */ -static int __init reparent_resources(struct resource *parent, -struct resource *res) -{ - struct resource *p, **pp; - struct resource **firstpp = NULL; - - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { - if (p->end < res->start) - continue; - if (res->end < p->start) - break; - if (p->start < res->start || p->end > res->end) - return -1; /* not completely contained */ - if (firstpp == NULL) - firstpp = pp; - } - if (firstpp == NULL) - return -1; /* didn't find any conflicting entries? */ - res->parent = parent; - res->child = *firstpp; - res->sibling = *pp; - *firstpp = res; - *pp = NULL; - for (p = res->child; p != NULL; p = p->sibling) { - p->parent = res; - pr_debug("PCI: Reparented %s [%llx..%llx] under %s\n", -p->name, -(unsigned long long)p->start, -(unsigned long long)p->end, res->name); - } - return 0; -} - -/* * Handle resources of PCI devices. If the world were perfect, we could * just allocate all the resource regions and do nothing more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index fe9733aa..926035bb378d 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -1088,41 +1088,6 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res, EXPORT_SYMBOL(pcibios_align_resource); /* - * Reparent resource children of pr that conflict with res - * under res, and make res replace those children. - */ -static int reparent_resources(struct resource *parent, -struct resource *res) -{ - struct resource *p, **pp; - struct resource **firstpp = NULL; - - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { - if (p->end < res->start) - continue; - if (res->end < p->start) - break; - if (p->start < res->start || p->end > res->end) - return -1; /* not completely contained */ - if (firstpp == NULL) - firstpp = pp; - } - if (firstpp == NULL) - return -1; /* didn't find any conflicting entries? */ - res->parent = parent; - res->child = *firstpp; - res->sibling = *pp; - *firstpp = res; - *pp = NULL; - for (p = res->child; p != NULL; p = p->sibling) { - p->parent = res; - pr_debug("PCI: Reparented %s %pR under %s\n", -p->name, p, res->name); - } - return 0; -} - -/* * Handle resources of PCI devices. If the world were perfect, we could * just allocate all the resource regions and do nothing mor