* [PATCH v5 0/4] resource: Use list_head to link sibling resource
@ 2018-06-12 3:28 ` Baoquan He
0 siblings, 0 replies; 81+ messages in thread
From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw)
To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh,
fengguang.wu, bp
Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang,
keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list,
lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm,
patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal,
thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul,
bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr,
linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel,
linuxppc-dev, davem
This patchset is doing:
1) Replace struct resource's sibling list from singly linked list to
list_head. Clearing out those pointer operation within singly linked
list for better code readability.
2) Based on list_head replacement, add a new function
walk_system_ram_res_rev() which can does reversed iteration on
iomem_resource's siblings.
3) Change kexec_file loading to search system RAM top down for kernel
loadin, using walk_system_ram_res_rev().
Note:
This patchset passed testing on my kvm guest, x86_64 arch with network
enabling. The thing we need pay attetion to is that a root resource's
child member need be initialized specifically with LIST_HEAD_INIT() if
statically defined or INIT_LIST_HEAD() for dynamically definition. Here
Just like we do for iomem_resource/ioport_resource, or the change in
get_pci_domain_busn_res().
Links of the old post (Boris pointed out that we should use
https://lkml.kernel.org/r/Message-ID, while it can't be opened from
my side, so paste all of them here.):
v4:
https://lkml.kernel.org/r/20180507063224.24229-1-bhe@redhat.com
https://lkml.org/lkml/2018/5/7/36
v3:
https://lkml.kernel.org/r/20180419001848.3041-1-bhe@redhat.com
https://lkml.org/lkml/2018/4/18/767
v2:
https://lkml.kernel.org/r/20180408024724.16812-1-bhe@redhat.com
https://lkml.org/lkml/2018/4/7/169
v1:
https://lkml.kernel.org/r/20180322033722.9279-1-bhe@redhat.com
https://lkml.org/lkml/2018/3/21/952
Changelog:
v4->v5:
Add new patch 0001 to move duplicated reparent_resources() to
kernel/resource.c to make it be shared by different ARCH-es.
Fix several code bugs reported by test robot on ARCH powerpc and
microblaze.
v3->v4:
Fix several bugs test robot reported. Rewrite cover letter and patch
log according to reviewer's comment.
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.
v1->v2:
Use list_head instead to link resource siblings. This is suggested by
Andrew.
Rewrite walk_system_ram_res_rev() after list_head is taken to link
resouce siblings.
Baoquan He (4):
resource: Move reparent_resources() to kernel/resource.c and make it
public
resource: Use list_head to link sibling resource
resource: add walk_system_ram_res_rev()
kexec_file: Load kernel at top of system RAM if required
arch/arm/plat-samsung/pm-check.c | 6 +-
arch/microblaze/pci/pci-common.c | 41 +----
arch/powerpc/kernel/pci-common.c | 39 +----
arch/sparc/kernel/ioport.c | 2 +-
arch/xtensa/include/asm/pci-bridge.h | 4 +-
drivers/eisa/eisa-bus.c | 2 +
drivers/gpu/drm/drm_memory.c | 3 +-
drivers/gpu/drm/gma500/gtt.c | 5 +-
drivers/hv/vmbus_drv.c | 52 +++---
drivers/input/joystick/iforce/iforce-main.c | 4 +-
drivers/nvdimm/namespace_devs.c | 6 +-
drivers/nvdimm/nd.h | 5 +-
drivers/of/address.c | 4 +-
drivers/parisc/lba_pci.c | 4 +-
drivers/pci/host/vmd.c | 8 +-
drivers/pci/probe.c | 2 +
drivers/pci/setup-bus.c | 2 +-
include/linux/ioport.h | 21 ++-
kernel/kexec_file.c | 2 +
kernel/resource.c | 259 ++++++++++++++++++----------
20 files changed, 244 insertions(+), 227 deletions(-)
--
2.13.6
_______________________________________________
kexec mailing list
kexec@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/kexec
^ permalink raw reply [flat|nested] 81+ messages in thread* [PATCH v5 0/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Baoquan He This patchset is doing: 1) Replace struct resource's sibling list from singly linked list to list_head. Clearing out those pointer operation within singly linked list for better code readability. 2) Based on list_head replacement, add a new function walk_system_ram_res_rev() which can does reversed iteration on iomem_resource's siblings. 3) Change kexec_file loading to search system RAM top down for kernel loadin, using walk_system_ram_res_rev(). Note: This patchset passed testing on my kvm guest, x86_64 arch with network enabling. The thing we need pay attetion to is that a root resource's child member need be initialized specifically with LIST_HEAD_INIT() if statically defined or INIT_LIST_HEAD() for dynamically definition. Here Just like we do for iomem_resource/ioport_resource, or the change in get_pci_domain_busn_res(). Links of the old post (Boris pointed out that we should use https://lkml.kernel.org/r/Message-ID, while it can't be opened from my side, so paste all of them here.): v4: https://lkml.kernel.org/r/20180507063224.24229-1-bhe@redhat.com https://lkml.org/lkml/2018/5/7/36 v3: https://lkml.kernel.org/r/20180419001848.3041-1-bhe@redhat.com https://lkml.org/lkml/2018/4/18/767 v2: https://lkml.kernel.org/r/20180408024724.16812-1-bhe@redhat.com https://lkml.org/lkml/2018/4/7/169 v1: https://lkml.kernel.org/r/20180322033722.9279-1-bhe@redhat.com https://lkml.org/lkml/2018/3/21/952 Changelog: v4->v5: Add new patch 0001 to move duplicated reparent_resources() to kernel/resource.c to make it be shared by different ARCH-es. Fix several code bugs reported by test robot on ARCH powerpc and microblaze. v3->v4: Fix several bugs test robot reported. Rewrite cover letter and patch log according to reviewer's comment. 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. v1->v2: Use list_head instead to link resource siblings. This is suggested by Andrew. Rewrite walk_system_ram_res_rev() after list_head is taken to link resouce siblings. Baoquan He (4): resource: Move reparent_resources() to kernel/resource.c and make it public resource: Use list_head to link sibling resource resource: add walk_system_ram_res_rev() kexec_file: Load kernel at top of system RAM if required arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 41 +---- arch/powerpc/kernel/pci-common.c | 39 +---- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++--- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 21 ++- kernel/kexec_file.c | 2 + kernel/resource.c | 259 ++++++++++++++++++---------- 20 files changed, 244 insertions(+), 227 deletions(-) -- 2.13.6 ^ permalink raw reply [flat|nested] 81+ messages in thread
* [PATCH v5 0/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem This patchset is doing: 1) Replace struct resource's sibling list from singly linked list to list_head. Clearing out those pointer operation within singly linked list for better code readability. 2) Based on list_head replacement, add a new function walk_system_ram_res_rev() which can does reversed iteration on iomem_resource's siblings. 3) Change kexec_file loading to search system RAM top down for kernel loadin, using walk_system_ram_res_rev(). Note: This patchset passed testing on my kvm guest, x86_64 arch with network enabling. The thing we need pay attetion to is that a root resource's child member need be initialized specifically with LIST_HEAD_INIT() if statically defined or INIT_LIST_HEAD() for dynamically definition. Here Just like we do for iomem_resource/ioport_resource, or the change in get_pci_domain_busn_res(). Links of the old post (Boris pointed out that we should use https://lkml.kernel.org/r/Message-ID, while it can't be opened from my side, so paste all of them here.): v4: https://lkml.kernel.org/r/20180507063224.24229-1-bhe@redhat.com https://lkml.org/lkml/2018/5/7/36 v3: https://lkml.kernel.org/r/20180419001848.3041-1-bhe@redhat.com https://lkml.org/lkml/2018/4/18/767 v2: https://lkml.kernel.org/r/20180408024724.16812-1-bhe@redhat.com https://lkml.org/lkml/2018/4/7/169 v1: https://lkml.kernel.org/r/20180322033722.9279-1-bhe@redhat.com https://lkml.org/lkml/2018/3/21/952 Changelog: v4->v5: Add new patch 0001 to move duplicated reparent_resources() to kernel/resource.c to make it be shared by different ARCH-es. Fix several code bugs reported by test robot on ARCH powerpc and microblaze. v3->v4: Fix several bugs test robot reported. Rewrite cover letter and patch log according to reviewer's comment. 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. v1->v2: Use list_head instead to link resource siblings. This is suggested by Andrew. Rewrite walk_system_ram_res_rev() after list_head is taken to link resouce siblings. Baoquan He (4): resource: Move reparent_resources() to kernel/resource.c and make it public resource: Use list_head to link sibling resource resource: add walk_system_ram_res_rev() kexec_file: Load kernel at top of system RAM if required arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 41 +---- arch/powerpc/kernel/pci-common.c | 39 +---- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++--- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 21 ++- kernel/kexec_file.c | 2 + kernel/resource.c | 259 ++++++++++++++++++---------- 20 files changed, 244 insertions(+), 227 deletions(-) -- 2.13.6 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* [PATCH v5 0/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devel-tBiZLqfeLfOHmIFyCCdPziST3g8Odh+X, linuxppc-dev This patchset is doing: 1) Replace struct resource's sibling list from singly linked list to list_head. Clearing out those pointer operation within singly linked list for better code readability. 2) Based on list_head replacement, add a new function walk_system_ram_res_rev() which can does reversed iteration on iomem_resource's siblings. 3) Change kexec_file loading to search system RAM top down for kernel loadin, using walk_system_ram_res_rev(). Note: This patchset passed testing on my kvm guest, x86_64 arch with network enabling. The thing we need pay attetion to is that a root resource's child member need be initialized specifically with LIST_HEAD_INIT() if statically defined or INIT_LIST_HEAD() for dynamically definition. Here Just like we do for iomem_resource/ioport_resource, or the change in get_pci_domain_busn_res(). Links of the old post (Boris pointed out that we should use https://lkml.kernel.org/r/Message-ID, while it can't be opened from my side, so paste all of them here.): v4: https://lkml.kernel.org/r/20180507063224.24229-1-bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org https://lkml.org/lkml/2018/5/7/36 v3: https://lkml.kernel.org/r/20180419001848.3041-1-bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org https://lkml.org/lkml/2018/4/18/767 v2: https://lkml.kernel.org/r/20180408024724.16812-1-bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org https://lkml.org/lkml/2018/4/7/169 v1: https://lkml.kernel.org/r/20180322033722.9279-1-bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org https://lkml.org/lkml/2018/3/21/952 Changelog: v4->v5: Add new patch 0001 to move duplicated reparent_resources() to kernel/resource.c to make it be shared by different ARCH-es. Fix several code bugs reported by test robot on ARCH powerpc and microblaze. v3->v4: Fix several bugs test robot reported. Rewrite cover letter and patch log according to reviewer's comment. 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. v1->v2: Use list_head instead to link resource siblings. This is suggested by Andrew. Rewrite walk_system_ram_res_rev() after list_head is taken to link resouce siblings. Baoquan He (4): resource: Move reparent_resources() to kernel/resource.c and make it public resource: Use list_head to link sibling resource resource: add walk_system_ram_res_rev() kexec_file: Load kernel at top of system RAM if required arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 41 +---- arch/powerpc/kernel/pci-common.c | 39 +---- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++--- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 21 ++- kernel/kexec_file.c | 2 + kernel/resource.c | 259 ++++++++++++++++++---------- 20 files changed, 244 insertions(+), 227 deletions(-) -- 2.13.6 ^ permalink raw reply [flat|nested] 81+ messages in thread
* [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, Paul Mackerras, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, Michael Ellerman, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, Benjamin Herrenschmidt, ebiederm, devel, linuxppc-dev, davem 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 <bhe@redhat.com> Cc: Michal Simek <monstr@monstr.eu> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> --- 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 fe9733ffffaa..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 more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/include/linux/ioport.h b/include/linux/ioport.h index da0ebaec25f0..dfdcd0bfe54e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, struct resource *lookup_resource(struct resource *root, resource_size_t start); int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size); +int reparent_resources(struct resource *parent, struct resource *res); resource_size_t resource_alignment(struct resource *res); static inline resource_size_t resource_size(const struct resource *res) { diff --git a/kernel/resource.c b/kernel/resource.c index 30e1bc68503b..5e7c56d5d838 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, } EXPORT_SYMBOL(adjust_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; +} +EXPORT_SYMBOL(reparent_resources); + static void __init __reserve_region_with_split(struct resource *root, resource_size_t start, resource_size_t end, const char *name) -- 2.13.6 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Baoquan He, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman 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 <bhe@redhat.com> Cc: Michal Simek <monstr@monstr.eu> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> --- 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 fe9733ffffaa..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 more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/include/linux/ioport.h b/include/linux/ioport.h index da0ebaec25f0..dfdcd0bfe54e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, struct resource *lookup_resource(struct resource *root, resource_size_t start); int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size); +int reparent_resources(struct resource *parent, struct resource *res); resource_size_t resource_alignment(struct resource *res); static inline resource_size_t resource_size(const struct resource *res) { diff --git a/kernel/resource.c b/kernel/resource.c index 30e1bc68503b..5e7c56d5d838 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, } EXPORT_SYMBOL(adjust_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; +} +EXPORT_SYMBOL(reparent_resources); + static void __init __reserve_region_with_split(struct resource *root, resource_size_t start, resource_size_t end, const char *name) -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r 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 <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org> Cc: Benjamin Herrenschmidt <benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org> Cc: Paul Mackerras <paulus-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org> Cc: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org> --- 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 fe9733ffffaa..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 more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/include/linux/ioport.h b/include/linux/ioport.h index da0ebaec25f0..dfdcd0bfe54e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, struct resource *lookup_resource(struct resource *root, resource_size_t start); int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size); +int reparent_resources(struct resource *parent, struct resource *res); resource_size_t resource_alignment(struct resource *res); static inline resource_size_t resource_size(const struct resource *res) { diff --git a/kernel/resource.c b/kernel/resource.c index 30e1bc68503b..5e7c56d5d838 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, } EXPORT_SYMBOL(adjust_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; +} +EXPORT_SYMBOL(reparent_resources); + static void __init __reserve_region_with_split(struct resource *root, resource_size_t start, resource_size_t end, const char *name) -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, Paul Mackerras, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, Michael Ellerman, patrik.r.jakobsson, linux-input, gustavo, dyoung, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, Benjamin Herrenschmidt, ebiederm, devel, linuxppc-dev, davem 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 <bhe@redhat.com> Cc: Michal Simek <monstr@monstr.eu> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> --- 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 fe9733ffffaa..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 more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/include/linux/ioport.h b/include/linux/ioport.h index da0ebaec25f0..dfdcd0bfe54e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, struct resource *lookup_resource(struct resource *root, resource_size_t start); int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size); +int reparent_resources(struct resource *parent, struct resource *res); resource_size_t resource_alignment(struct resource *res); static inline resource_size_t resource_size(const struct resource *res) { diff --git a/kernel/resource.c b/kernel/resource.c index 30e1bc68503b..5e7c56d5d838 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, } EXPORT_SYMBOL(adjust_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; +} +EXPORT_SYMBOL(reparent_resources); + static void __init __reserve_region_with_split(struct resource *root, resource_size_t start, resource_size_t end, const char *name) -- 2.13.6 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r 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 <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org> Cc: Benjamin Herrenschmidt <benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org> Cc: Paul Mackerras <paulus-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org> Cc: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org> --- 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 fe9733ffffaa..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 more. It isn't. * On the other hand, we cannot just re-allocate all devices, as it would diff --git a/include/linux/ioport.h b/include/linux/ioport.h index da0ebaec25f0..dfdcd0bfe54e 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, struct resource *lookup_resource(struct resource *root, resource_size_t start); int adjust_resource(struct resource *res, resource_size_t start, resource_size_t size); +int reparent_resources(struct resource *parent, struct resource *res); resource_size_t resource_alignment(struct resource *res); static inline resource_size_t resource_size(const struct resource *res) { diff --git a/kernel/resource.c b/kernel/resource.c index 30e1bc68503b..5e7c56d5d838 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, } EXPORT_SYMBOL(adjust_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; +} +EXPORT_SYMBOL(reparent_resources); + static void __init __reserve_region_with_split(struct resource *root, resource_size_t start, resource_size_t end, const char *name) -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:34 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:34 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, Paul Mackerras, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm, Michael Ellerman, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, Benjamin Herrenschmidt, ebiederm, devel, linuxppc-dev, davem 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 <bhe@redhat.com> > Cc: Michal Simek <monstr@monstr.eu> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Michael Ellerman <mpe@ellerman.id.au> > --- > 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 fe9733ffffaa..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 more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index da0ebaec25f0..dfdcd0bfe54e 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, > struct resource *lookup_resource(struct resource *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > +int reparent_resources(struct resource *parent, struct resource *res); > resource_size_t resource_alignment(struct resource *res); > static inline resource_size_t resource_size(const struct resource *res) > { > diff --git a/kernel/resource.c b/kernel/resource.c > index 30e1bc68503b..5e7c56d5d838 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, > } > EXPORT_SYMBOL(adjust_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; > +} > +EXPORT_SYMBOL(reparent_resources); > + > static void __init __reserve_region_with_split(struct resource *root, > resource_size_t start, resource_size_t end, > const char *name) > -- > 2.13.6 > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:34 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:34 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman 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 <bhe@redhat.com> > Cc: Michal Simek <monstr@monstr.eu> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Michael Ellerman <mpe@ellerman.id.au> > --- > 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 fe9733ffffaa..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 more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index da0ebaec25f0..dfdcd0bfe54e 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, > struct resource *lookup_resource(struct resource *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > +int reparent_resources(struct resource *parent, struct resource *res); > resource_size_t resource_alignment(struct resource *res); > static inline resource_size_t resource_size(const struct resource *res) > { > diff --git a/kernel/resource.c b/kernel/resource.c > index 30e1bc68503b..5e7c56d5d838 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, > } > EXPORT_SYMBOL(adjust_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; > +} > +EXPORT_SYMBOL(reparent_resources); > + > static void __init __reserve_region_with_split(struct resource *root, > resource_size_t start, resource_size_t end, > const char *name) > -- > 2.13.6 > ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:34 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:34 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Benjamin Herrenschmidt <ben 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 <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > Cc: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org> > Cc: Benjamin Herrenschmidt <benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org> > Cc: Paul Mackerras <paulus-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org> > Cc: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org> > --- > 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 fe9733ffffaa..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 more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index da0ebaec25f0..dfdcd0bfe54e 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, > struct resource *lookup_resource(struct resource *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > +int reparent_resources(struct resource *parent, struct resource *res); > resource_size_t resource_alignment(struct resource *res); > static inline resource_size_t resource_size(const struct resource *res) > { > diff --git a/kernel/resource.c b/kernel/resource.c > index 30e1bc68503b..5e7c56d5d838 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, > } > EXPORT_SYMBOL(adjust_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; > +} > +EXPORT_SYMBOL(reparent_resources); > + > static void __init __reserve_region_with_split(struct resource *root, > resource_size_t start, resource_size_t end, > const char *name) > -- > 2.13.6 > ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:34 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:34 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, Paul Mackerras, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm, Michael Ellerman, patrik.r.jakobsson, linux-input, gustavo, dyoung, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, Benjamin Herrenschmidt, ebiederm, devel, linuxppc-dev, davem 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 <bhe@redhat.com> > Cc: Michal Simek <monstr@monstr.eu> > Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> > Cc: Paul Mackerras <paulus@samba.org> > Cc: Michael Ellerman <mpe@ellerman.id.au> > --- > 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 fe9733ffffaa..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 more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index da0ebaec25f0..dfdcd0bfe54e 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, > struct resource *lookup_resource(struct resource *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > +int reparent_resources(struct resource *parent, struct resource *res); > resource_size_t resource_alignment(struct resource *res); > static inline resource_size_t resource_size(const struct resource *res) > { > diff --git a/kernel/resource.c b/kernel/resource.c > index 30e1bc68503b..5e7c56d5d838 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, > } > EXPORT_SYMBOL(adjust_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; > +} > +EXPORT_SYMBOL(reparent_resources); > + > static void __init __reserve_region_with_split(struct resource *root, > resource_size_t start, resource_size_t end, > const char *name) > -- > 2.13.6 > _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:34 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:34 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, Benjamin Herrenschmidt <ben> 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 <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> > Cc: Michal Simek <monstr-pSz03upnqPeHXe+LvDLADg@public.gmane.org> > Cc: Benjamin Herrenschmidt <benh-XVmvHMARGAS8U2dJNN8I7kB+6BGkLq7r@public.gmane.org> > Cc: Paul Mackerras <paulus-eUNUBHrolfbYtjvyW6yDsg@public.gmane.org> > Cc: Michael Ellerman <mpe-Gsx/Oe8HsFggBc27wqDAHg@public.gmane.org> > --- > 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 fe9733ffffaa..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 more. It isn't. > * On the other hand, we cannot just re-allocate all devices, as it would > diff --git a/include/linux/ioport.h b/include/linux/ioport.h > index da0ebaec25f0..dfdcd0bfe54e 100644 > --- a/include/linux/ioport.h > +++ b/include/linux/ioport.h > @@ -192,6 +192,7 @@ extern int allocate_resource(struct resource *root, struct resource *new, > struct resource *lookup_resource(struct resource *root, resource_size_t start); > int adjust_resource(struct resource *res, resource_size_t start, > resource_size_t size); > +int reparent_resources(struct resource *parent, struct resource *res); > resource_size_t resource_alignment(struct resource *res); > static inline resource_size_t resource_size(const struct resource *res) > { > diff --git a/kernel/resource.c b/kernel/resource.c > index 30e1bc68503b..5e7c56d5d838 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -983,6 +983,42 @@ int adjust_resource(struct resource *res, resource_size_t start, > } > EXPORT_SYMBOL(adjust_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; > +} > +EXPORT_SYMBOL(reparent_resources); > + > static void __init __reserve_region_with_split(struct resource *root, > resource_size_t start, resource_size_t end, > const char *name) > -- > 2.13.6 > ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public 2018-06-12 3:28 ` Baoquan He ` (2 preceding siblings ...) (?) @ 2018-06-12 3:55 ` kbuild test robot -1 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 3:55 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, Paul Mackerras, baiyaowei, kys, frowand.list, dan.j.williams, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, Michael Ellerman, patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, vgoyal, ebiederm, thomas.lendacky, haiyangz, maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, linux-kernel, Benjamin Herrenschmidt, kbuild-all, devel, akpm, fengguang.wu, linuxppc-dev, davem [-- Attachment #1: Type: text/plain, Size: 2814 bytes --] 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 6347 bytes --] [-- Attachment #3: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:55 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 3:55 UTC (permalink / raw) To: Baoquan He Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Baoquan He, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman [-- Attachment #1: Type: text/plain, Size: 2814 bytes --] 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 6347 bytes --] ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:55 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 3:55 UTC (permalink / raw) To: Baoquan He Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci [-- Attachment #1: Type: text/plain, Size: 2814 bytes --] 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 6347 bytes --] ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:55 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 3:55 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre, brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, Paul Mackerras, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, linux-nvdimm, Michael Ellerman, patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm, thomas.lendacky, haiyangz, maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, linux-kernel, Benjamin Herrenschmidt, kbuild-all, devel, akpm, fengguang.wu, linuxppc-dev, davem 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 3:55 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 3:55 UTC (permalink / raw) To: Baoquan He Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp, patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci [-- Attachment #1: Type: text/plain, Size: 2814 bytes --] 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 6347 bytes --] ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 8:29 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 8:29 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 8:29 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 8:29 UTC (permalink / raw) To: Baoquan He Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 8:29 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 8:29 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 8:29 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 8:29 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 8:29 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 8:29 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:38 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:38 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:38 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:38 UTC (permalink / raw) To: Andy Shevchenko Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:38 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:38 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:38 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:38 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:38 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:38 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public 2018-06-12 9:38 ` Baoquan He ` (2 preceding siblings ...) (?) @ 2018-06-12 14:20 ` Andy Shevchenko -1 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:20 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 11:29am, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:20 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:20 UTC (permalink / raw) To: Baoquan He Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 11:29am, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:20 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:20 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > On 06/12/18 at 11:29am, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:20 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:20 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 11:29am, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:20 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:20 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > On 06/12/18 at 11:29am, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:24 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:24 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe@redhat.com> wrote: >> On 06/12/18 at 11:29am, Andy Shevchenko wrote: >>> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:24 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:24 UTC (permalink / raw) To: Baoquan He Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe@redhat.com> wrote: >> On 06/12/18 at 11:29am, Andy Shevchenko wrote: >>> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:24 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:24 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko <andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: >> On 06/12/18 at 11:29am, Andy Shevchenko wrote: >>> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:24 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:24 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko <andy.shevchenko@gmail.com> wrote: > On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe@redhat.com> wrote: >> On 06/12/18 at 11:29am, Andy Shevchenko wrote: >>> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 14:24 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-06-12 14:24 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko <andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > On Tue, Jun 12, 2018 at 12:38 PM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: >> On 06/12/18 at 11:29am, Andy Shevchenko wrote: >>> On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 14:55 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-03 14:55 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller Hi Andy, On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > <andy.shevchenko@gmail.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 14:55 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-03 14:55 UTC (permalink / raw) To: Andy Shevchenko Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman Hi Andy, On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > <andy.shevchenko@gmail.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 14:55 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-03 14:55 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett Hi Andy, On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > <andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 14:55 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-03 14:55 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller Hi Andy, On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > <andy.shevchenko@gmail.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 14:55 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-03 14:55 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett Hi Andy, On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > <andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public 2018-07-03 14:55 ` Baoquan He (?) (?) @ 2018-07-03 20:57 ` Andy Shevchenko -1 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-07-03 20:57 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko >> <andy.shevchenko@gmail.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 20:57 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-07-03 20:57 UTC (permalink / raw) To: Baoquan He Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko >> <andy.shevchenko@gmail.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 20:57 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-07-03 20:57 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko >> <andy.shevchenko@gmail.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-03 20:57 ` Andy Shevchenko 0 siblings, 0 replies; 81+ messages in thread From: Andy Shevchenko @ 2018-07-03 20:57 UTC (permalink / raw) To: Baoquan He Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko >> <andy.shevchenko@gmail.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-04 4:18 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-04 4:18 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On 07/03/18 at 11:57pm, Andy Shevchenko wrote: > On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > >> <andy.shevchenko@gmail.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-04 4:18 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-04 4:18 UTC (permalink / raw) To: Andy Shevchenko Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On 07/03/18 at 11:57pm, Andy Shevchenko wrote: > On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > >> <andy.shevchenko@gmail.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-04 4:18 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-04 4:18 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett On 07/03/18 at 11:57pm, Andy Shevchenko wrote: > On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > >> <andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-04 4:18 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-04 4:18 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On 07/03/18 at 11:57pm, Andy Shevchenko wrote: > On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe@redhat.com> wrote: > > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > >> <andy.shevchenko@gmail.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-07-04 4:18 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-07-04 4:18 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett On 07/03/18 at 11:57pm, Andy Shevchenko wrote: > On Tue, Jul 3, 2018 at 5:55 PM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > > On 06/12/18 at 05:24pm, Andy Shevchenko wrote: > >> On Tue, Jun 12, 2018 at 5:20 PM, Andy Shevchenko > >> <andy.shevchenko-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:49 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:49 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Dan Williams, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Vivek Goyal, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:49 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:49 UTC (permalink / raw) To: Andy Shevchenko Cc: Linux Kernel Mailing List, Andrew Morton, Rob Herring, Dan Williams, Nicolas Pitre, Josh Triplett, kbuild test robot, Borislav Petkov, Patrik Jakobsson, David Airlie, KY Srinivasan, Haiyang Zhang, Stephen Hemminger, Dmitry Torokhov, Frank Rowand, Keith Busch, Jon Derrick, Lorenzo Pieralisi, Bjorn Helgaas, Thomas Gleixner, brijesh.singh, Jérôme Glisse, Tom Lendacky, Greg Kroah-Hartman, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, Eric Biederman, Vivek Goyal, Dave Young, Yinghai Lu, kexec, Michal Simek, David S. Miller, Chris Zankel, Max Filippov, Gustavo Padovan, Maarten Lankhorst, Sean Paul, linux-parisc, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, Benjamin Herrenschmidt, Paul Mackerras, Michael Ellerman On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:49 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:49 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:49 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:49 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh, devicetree, David Airlie, linux-pci, richard.weiyang, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst, Josh Triplett, Jérôme Glisse, Rob Herring, Sean Paul, Bjorn Helgaas, Thomas Gleixner, Yinghai Lu, Jon Derrick, Chris Zankel, Michal Simek, linux-parisc, Greg Kroah-Hartman, Dmitry Torokhov, kexec, Linux Kernel Mailing List, Benjamin Herrenschmidt, Eric Biederman, devel, Andrew Morton, kbuild test robot, open list:LINUX FOR POWERPC PA SEMI PWRFICIENT, David S. Miller On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe@redhat.com> 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 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public @ 2018-06-12 9:49 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 9:49 UTC (permalink / raw) To: Andy Shevchenko Cc: Nicolas Pitre, brijesh.singh-5C7GfCeVMHo, devicetree, David Airlie, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, Keith Busch, Max Filippov, Paul Mackerras, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, KY Srinivasan, Frank Rowand, Lorenzo Pieralisi, Stephen Hemminger, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, Michael Ellerman, Patrik Jakobsson, linux-input, Gustavo Padovan, Borislav Petkov, Dave Young, Tom Lendacky, Haiyang Zhang, Maarten Lankhorst On 06/12/18 at 11:29am, Andy Shevchenko wrote: > On Tue, Jun 12, 2018 at 6:28 AM, Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 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 ^ permalink raw reply [flat|nested] 81+ messages in thread
* [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem The struct resource uses singly linked list to link siblings, implemented by pointer operation. Replace it with list_head for better code readability. Based on this list_head replacement, it will be very easy to do reverse iteration on iomem_resource's sibling list in later patch. Besides, type of member variables of struct resource, sibling and child, are changed from 'struct resource *' to 'struct list_head'. This brings two pointers of size increase. Suggested-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Cc: David Airlie <airlied@linux.ie> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Rob Herring <robh+dt@kernel.org> Cc: Frank Rowand <frowand.list@gmail.com> Cc: Keith Busch <keith.busch@intel.com> Cc: Jonathan Derrick <jonathan.derrick@intel.com> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: devel@linuxdriverproject.org Cc: linux-input@vger.kernel.org Cc: linux-nvdimm@lists.01.org Cc: devicetree@vger.kernel.org Cc: linux-pci@vger.kernel.org --- arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 4 +- arch/powerpc/kernel/pci-common.c | 4 +- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++---- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 17 ++- kernel/resource.c | 211 ++++++++++++++-------------- 19 files changed, 176 insertions(+), 169 deletions(-) diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c index cd2c02c68bc3..5494355b1c49 100644 --- a/arch/arm/plat-samsung/pm-check.c +++ b/arch/arm/plat-samsung/pm-check.c @@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg); static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) { while (ptr != NULL) { - if (ptr->child != NULL) - s3c_pm_run_res(ptr->child, fn, arg); + if (!list_empty(&ptr->child)) + s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg); if ((ptr->flags & IORESOURCE_SYSTEM_RAM) == IORESOURCE_SYSTEM_RAM) { @@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) arg = (fn)(ptr, arg); } - ptr = ptr->sibling; + ptr = resource_sibling(ptr); } } diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 7899bafab064..2bf73e27e231 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 926035bb378d..28fbe83c9daf 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } } diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index cca9134cfa7d..99efe4e98b16 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v) struct resource *root = m->private, *r; const char *nm; - for (r = root->child; r != NULL; r = r->sibling) { + list_for_each_entry(r, &root->child, sibling) { if ((nm = r->name) == NULL) nm = "???"; seq_printf(m, "%016llx-%016llx: %s\n", (unsigned long long)r->start, diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h index 0b68c76ec1e6..f487b06817df 100644 --- a/arch/xtensa/include/asm/pci-bridge.h +++ b/arch/xtensa/include/asm/pci-bridge.h @@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res, res->flags = flags; res->name = name; res->parent = NULL; - res->sibling = NULL; - res->child = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c index 1e8062f6dbfc..dba78f75fd06 100644 --- a/drivers/eisa/eisa-bus.c +++ b/drivers/eisa/eisa-bus.c @@ -408,6 +408,8 @@ static struct resource eisa_root_res = { .start = 0, .end = 0xffffffff, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(eisa_root_res.sibling), + .child = LIST_HEAD_INIT(eisa_root_res.child), }; static int eisa_bus_count; diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c index 3c54044214db..53e300a993dc 100644 --- a/drivers/gpu/drm/drm_memory.c +++ b/drivers/gpu/drm/drm_memory.c @@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void) struct resource *tmp; resource_size_t max_iomem = 0; - for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) { + list_for_each_entry(tmp, &iomem_resource.child, sibling) max_iomem = max(max_iomem, tmp->end); - } return max_iomem; } diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 3949b0990916..addd3bc009af 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c @@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume) int psb_gtt_restore(struct drm_device *dev) { struct drm_psb_private *dev_priv = dev->dev_private; - struct resource *r = dev_priv->gtt_mem->child; + struct resource *r; struct gtt_range *range; unsigned int restored = 0, total = 0, size = 0; @@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev) mutex_lock(&dev_priv->gtt_mutex); psb_gtt_init(dev, 1); - while (r != NULL) { + list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) { range = container_of(r, struct gtt_range, resource); if (range->pages) { psb_gtt_insert(dev, range, 1); size += range->resource.end - range->resource.start; restored++; } - r = r->sibling; total++; } mutex_unlock(&dev_priv->gtt_mutex); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index b10fe26c4891..d87ec5a1bc4c 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) { resource_size_t start = 0; resource_size_t end = 0; - struct resource *new_res; + struct resource *new_res, *tmp; struct resource **old_res = &hyperv_mmio; - struct resource **prev_res = NULL; switch (res->type) { @@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) /* * If two ranges are adjacent, merge them. */ - do { - if (!*old_res) { - *old_res = new_res; - break; - } - - if (((*old_res)->end + 1) == new_res->start) { - (*old_res)->end = new_res->end; + if (!*old_res) { + *old_res = new_res; + return AE_OK; + } + tmp = *old_res; + list_for_each_entry_from(tmp, &tmp->parent->child, sibling) { + if ((tmp->end + 1) == new_res->start) { + tmp->end = new_res->end; kfree(new_res); break; } - if ((*old_res)->start == new_res->end + 1) { - (*old_res)->start = new_res->start; + if (tmp->start == new_res->end + 1) { + tmp->start = new_res->start; kfree(new_res); break; } - if ((*old_res)->start > new_res->end) { - new_res->sibling = *old_res; - if (prev_res) - (*prev_res)->sibling = new_res; - *old_res = new_res; + if (tmp->start > new_res->end) { + list_add(&new_res->sibling, tmp->sibling.prev); break; } - - prev_res = old_res; - old_res = &(*old_res)->sibling; - - } while (1); + } return AE_OK; } static int vmbus_acpi_remove(struct acpi_device *device) { - struct resource *cur_res; - struct resource *next_res; + struct resource *res; if (hyperv_mmio) { if (fb_mmio) { @@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device) fb_mmio = NULL; } - for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) { - next_res = cur_res->sibling; - kfree(cur_res); - } + res = hyperv_mmio; + list_for_each_entry_from(res, &res->parent->child, sibling) + kfree(res); } return 0; @@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj, } } - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= max) || (iter->end <= min)) continue; @@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size) struct resource *iter; down(&hyperv_mmio_lock); - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= start + size) || (iter->end <= start)) continue; diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index daeeb4c7e3b0..5c0be27b33ff 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c @@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce) iforce->device_memory.end = 200; iforce->device_memory.flags = IORESOURCE_MEM; iforce->device_memory.parent = NULL; - iforce->device_memory.child = NULL; - iforce->device_memory.sibling = NULL; + INIT_LIST_HEAD(&iforce->device_memory.child); + INIT_LIST_HEAD(&iforce->device_memory.sibling); /* * Wait until device ready - until it sends its first response. diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c index 28afdd668905..f53d410d9981 100644 --- a/drivers/nvdimm/namespace_devs.c +++ b/drivers/nvdimm/namespace_devs.c @@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, retry: first = 0; for_each_dpa_resource(ndd, res) { - struct resource *next = res->sibling, *new_res = NULL; + struct resource *next = resource_sibling(res), *new_res = NULL; resource_size_t allocate, available = 0; enum alloc_loc loc = ALLOC_ERR; const char *action; @@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, * an initial "pmem-reserve pass". Only do an initial BLK allocation * when none of the DPA space is reserved. */ - if ((is_pmem || !ndd->dpa.child) && n == to_allocate) + if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate) return init_dpa_allocation(label_id, nd_region, nd_mapping, n); return n; } @@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region, retry: for_each_dpa_resource(ndd, res) { int rc; - struct resource *next = res->sibling; + struct resource *next = resource_sibling(res); resource_size_t end = res->start + resource_size(res); if (!next || strcmp(res->name, label_id->id) != 0 diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 32e0364b48b9..da7da15e03e7 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h @@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd); (unsigned long long) (res ? res->start : 0), ##arg) #define for_each_dpa_resource(ndd, res) \ - for (res = (ndd)->dpa.child; res; res = res->sibling) + list_for_each_entry(res, &(ndd)->dpa.child, sibling) #define for_each_dpa_resource_safe(ndd, res, next) \ - for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \ - res; res = next, next = next ? next->sibling : NULL) + list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling) struct nd_percpu_lane { int count; diff --git a/drivers/of/address.c b/drivers/of/address.c index 53349912ac75..e2e25719ab52 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range, { int err; res->flags = range->flags; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); res->name = np->full_name; if (res->flags & IORESOURCE_IO) { diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 69bd98421eb1..7482bdfd1959 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d) for (i = d; i ; --i) printk(" "); printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, (long)r->start, (long)r->end, r->flags); - lba_dump_res(r->child, d+2); - lba_dump_res(r->sibling, d); + lba_dump_res(resource_first_child(&r->child), d+2); + lba_dump_res(resource_sibling(r), d); } diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c index 942b64fc7f1f..e3ace20345c7 100644 --- a/drivers/pci/host/vmd.c +++ b/drivers/pci/host/vmd.c @@ -542,14 +542,14 @@ static struct pci_ops vmd_ops = { static void vmd_attach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1]; - vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2]; + list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child); + list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child); } static void vmd_detach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = NULL; - vmd->dev->resource[VMD_MEMBAR2].child = NULL; + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child); + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child); } /* diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ac876e32de4b..9624dd1dfd49 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr) r->res.start = 0; r->res.end = 0xff; r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED; + INIT_LIST_HEAD(&r->res.child); + INIT_LIST_HEAD(&r->res.sibling); list_add_tail(&r->list, &pci_domain_busn_res_list); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 79b1824e83b4..8e685af8938d 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type) continue; /* Ignore BARs which are still in use */ - if (res->child) + if (!list_empty(&res->child)) continue; ret = add_to_list(&saved, bridge, res, 0, 0); diff --git a/include/linux/ioport.h b/include/linux/ioport.h index dfdcd0bfe54e..b7456ae889dd 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -12,6 +12,7 @@ #ifndef __ASSEMBLY__ #include <linux/compiler.h> #include <linux/types.h> +#include <linux/list.h> /* * Resources are tree-like, allowing * nesting etc.. @@ -22,7 +23,8 @@ struct resource { const char *name; unsigned long flags; unsigned long desc; - struct resource *parent, *sibling, *child; + struct list_head child, sibling; + struct resource *parent; }; /* @@ -216,7 +218,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2) return r1->start <= r2->start && r1->end >= r2->end; } - /* Convenience shorthand with allocation */ #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0) #define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED) @@ -287,6 +288,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2) return (r1->start <= r2->end && r1->end >= r2->start); } +static inline struct resource *resource_sibling(struct resource *res) +{ + if (res->parent && !list_is_last(&res->sibling, &res->parent->child)) + return list_next_entry(res, sibling); + return NULL; +} + +static inline struct resource *resource_first_child(struct list_head *head) +{ + return list_first_entry_or_null(head, struct resource, sibling); +} + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_IOPORT_H */ diff --git a/kernel/resource.c b/kernel/resource.c index 5e7c56d5d838..ef9a20b75234 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -31,6 +31,8 @@ struct resource ioport_resource = { .start = 0, .end = IO_SPACE_LIMIT, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(ioport_resource.sibling), + .child = LIST_HEAD_INIT(ioport_resource.child), }; EXPORT_SYMBOL(ioport_resource); @@ -39,6 +41,8 @@ struct resource iomem_resource = { .start = 0, .end = -1, .flags = IORESOURCE_MEM, + .sibling = LIST_HEAD_INIT(iomem_resource.sibling), + .child = LIST_HEAD_INIT(iomem_resource.child), }; EXPORT_SYMBOL(iomem_resource); @@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock); * by boot mem after the system is up. So for reusing the resource entry * we need to remember the resource. */ -static struct resource *bootmem_resource_free; +static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free); static DEFINE_SPINLOCK(bootmem_resource_lock); static struct resource *next_resource(struct resource *p, bool sibling_only) { /* Caller wants to traverse through siblings only */ if (sibling_only) - return p->sibling; + return resource_sibling(p); - if (p->child) - return p->child; - while (!p->sibling && p->parent) + if (!list_empty(&p->child)) + return resource_first_child(&p->child); + while (!resource_sibling(p) && p->parent) p = p->parent; - return p->sibling; + return resource_sibling(p); } static void *r_next(struct seq_file *m, void *v, loff_t *pos) @@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos) struct resource *p = PDE_DATA(file_inode(m->file)); loff_t l = 0; read_lock(&resource_lock); - for (p = p->child; p && l < *pos; p = r_next(m, p, &l)) + for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l)) ; return p; } @@ -153,8 +157,7 @@ static void free_resource(struct resource *res) if (!PageSlab(virt_to_head_page(res))) { spin_lock(&bootmem_resource_lock); - res->sibling = bootmem_resource_free; - bootmem_resource_free = res; + list_add(&res->sibling, &bootmem_resource_free); spin_unlock(&bootmem_resource_lock); } else { kfree(res); @@ -166,10 +169,9 @@ static struct resource *alloc_resource(gfp_t flags) struct resource *res = NULL; spin_lock(&bootmem_resource_lock); - if (bootmem_resource_free) { - res = bootmem_resource_free; - bootmem_resource_free = res->sibling; - } + res = resource_first_child(&bootmem_resource_free); + if (res) + list_del(&res->sibling); spin_unlock(&bootmem_resource_lock); if (res) @@ -177,6 +179,8 @@ static struct resource *alloc_resource(gfp_t flags) else res = kzalloc(sizeof(struct resource), flags); + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); return res; } @@ -185,7 +189,7 @@ static struct resource * __request_resource(struct resource *root, struct resour { resource_size_t start = new->start; resource_size_t end = new->end; - struct resource *tmp, **p; + struct resource *tmp; if (end < start) return root; @@ -193,64 +197,62 @@ static struct resource * __request_resource(struct resource *root, struct resour return root; if (end > root->end) return root; - p = &root->child; - for (;;) { - tmp = *p; - if (!tmp || tmp->start > end) { - new->sibling = tmp; - *p = new; + + if (list_empty(&root->child)) { + list_add(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; + } + + list_for_each_entry(tmp, &root->child, sibling) { + if (tmp->start > end) { + list_add(&new->sibling, tmp->sibling.prev); new->parent = root; + INIT_LIST_HEAD(&new->child); return NULL; } - p = &tmp->sibling; if (tmp->end < start) continue; return tmp; } + + list_add_tail(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; } static int __release_resource(struct resource *old, bool release_child) { - struct resource *tmp, **p, *chd; + struct resource *tmp, *next, *chd; - p = &old->parent->child; - for (;;) { - tmp = *p; - if (!tmp) - break; + list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) { if (tmp == old) { - if (release_child || !(tmp->child)) { - *p = tmp->sibling; + if (release_child || list_empty(&tmp->child)) { + list_del(&tmp->sibling); } else { - for (chd = tmp->child;; chd = chd->sibling) { + list_for_each_entry(chd, &tmp->child, sibling) chd->parent = tmp->parent; - if (!(chd->sibling)) - break; - } - *p = tmp->child; - chd->sibling = tmp->sibling; + list_splice(&tmp->child, tmp->sibling.prev); + list_del(&tmp->sibling); } + old->parent = NULL; return 0; } - p = &tmp->sibling; } return -EINVAL; } static void __release_child_resources(struct resource *r) { - struct resource *tmp, *p; + struct resource *tmp, *next; resource_size_t size; - p = r->child; - r->child = NULL; - while (p) { - tmp = p; - p = p->sibling; - + list_for_each_entry_safe(tmp, next, &r->child, sibling) { tmp->parent = NULL; - tmp->sibling = NULL; + INIT_LIST_HEAD(&tmp->sibling); __release_child_resources(tmp); printk(KERN_DEBUG "release child resource %pR\n", tmp); @@ -259,6 +261,8 @@ static void __release_child_resources(struct resource *r) tmp->start = 0; tmp->end = size - 1; } + + INIT_LIST_HEAD(&tmp->child); } void release_child_resources(struct resource *r) @@ -343,7 +347,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, read_lock(&resource_lock); - for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { + for (p = resource_first_child(&iomem_resource.child); p; + p = next_resource(p, sibling_only)) { if ((p->flags & res->flags) != res->flags) continue; if ((desc != IORES_DESC_NONE) && (desc != p->desc)) @@ -532,7 +537,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags, struct resource *p; read_lock(&resource_lock); - for (p = iomem_resource.child; p ; p = p->sibling) { + list_for_each_entry(p, &iomem_resource.child, sibling) { bool is_type = (((p->flags & flags) == flags) && ((desc == IORES_DESC_NONE) || (desc == p->desc))); @@ -586,7 +591,7 @@ static int __find_resource(struct resource *root, struct resource *old, resource_size_t size, struct resource_constraint *constraint) { - struct resource *this = root->child; + struct resource *this = resource_first_child(&root->child); struct resource tmp = *new, avail, alloc; tmp.start = root->start; @@ -596,7 +601,7 @@ static int __find_resource(struct resource *root, struct resource *old, */ if (this && this->start == root->start) { tmp.start = (this == old) ? old->start : this->end + 1; - this = this->sibling; + this = resource_sibling(this); } for(;;) { if (this) @@ -632,7 +637,7 @@ next: if (!this || this->end == root->end) if (this != old) tmp.start = this->end + 1; - this = this->sibling; + this = resource_sibling(this); } return -EBUSY; } @@ -676,7 +681,7 @@ static int reallocate_resource(struct resource *root, struct resource *old, goto out; } - if (old->child) { + if (!list_empty(&old->child)) { err = -EBUSY; goto out; } @@ -757,7 +762,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start) struct resource *res; read_lock(&resource_lock); - for (res = root->child; res; res = res->sibling) { + list_for_each_entry(res, &root->child, sibling) { if (res->start == start) break; } @@ -790,32 +795,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou break; } - for (next = first; ; next = next->sibling) { + for (next = first; ; next = resource_sibling(next)) { /* Partial overlap? Bad, and unfixable */ if (next->start < new->start || next->end > new->end) return next; - if (!next->sibling) + if (!resource_sibling(next)) break; - if (next->sibling->start > new->end) + if (resource_sibling(next)->start > new->end) break; } - new->parent = parent; - new->sibling = next->sibling; - new->child = first; + list_add(&new->sibling, &next->sibling); + INIT_LIST_HEAD(&new->child); - next->sibling = NULL; - for (next = first; next; next = next->sibling) + /* + * From first to next, they all fall into new's region, so change them + * as new's children. + */ + list_cut_position(&new->child, first->sibling.prev, &next->sibling); + list_for_each_entry(next, &new->child, sibling) next->parent = new; - if (parent->child == first) { - parent->child = new; - } else { - next = parent->child; - while (next->sibling != first) - next = next->sibling; - next->sibling = new; - } return NULL; } @@ -937,19 +937,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start, if ((start < parent->start) || (end > parent->end)) goto out; - if (res->sibling && (res->sibling->start <= end)) + if (resource_sibling(res) && (resource_sibling(res)->start <= end)) goto out; - tmp = parent->child; - if (tmp != res) { - while (tmp->sibling != res) - tmp = tmp->sibling; + if (res->sibling.prev != &parent->child) { + tmp = list_prev_entry(res, sibling); if (start <= tmp->end) goto out; } skip: - for (tmp = res->child; tmp; tmp = tmp->sibling) + list_for_each_entry(tmp, &res->child, sibling) if ((tmp->start < start) || (tmp->end > end)) goto out; @@ -987,31 +985,33 @@ EXPORT_SYMBOL(adjust_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) +int reparent_resources(struct resource *parent, struct resource *res) { - struct resource *p, **pp; - struct resource **firstpp = NULL; + struct resource *p, *first = NULL; - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { + list_for_each_entry(p, &parent->child, 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 (first == NULL) + first = p; } - if (firstpp == NULL) + if (first == 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; + list_add(&res->sibling, &p->sibling.prev); + INIT_LIST_HEAD(&res->child); + + /* + * From first to p's previous sibling, they all fall into + * res's region, change them as res's children. + */ + list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); + list_for_each_entry(p, &new->child, sibling) { + p->parent = new; pr_debug("PCI: Reparented %s %pR under %s\n", p->name, p, res->name); } @@ -1210,34 +1210,32 @@ EXPORT_SYMBOL(__request_region); void __release_region(struct resource *parent, resource_size_t start, resource_size_t n) { - struct resource **p; + struct resource *res; resource_size_t end; - p = &parent->child; + res = resource_first_child(&parent->child); end = start + n - 1; write_lock(&resource_lock); for (;;) { - struct resource *res = *p; - if (!res) break; if (res->start <= start && res->end >= end) { if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } if (res->start != start || res->end != end) break; - *p = res->sibling; + list_del(&res->sibling); write_unlock(&resource_lock); if (res->flags & IORESOURCE_MUXED) wake_up(&muxed_resource_wait); free_resource(res); return; } - p = &res->sibling; + res = resource_sibling(res); } write_unlock(&resource_lock); @@ -1272,9 +1270,7 @@ EXPORT_SYMBOL(__release_region); int release_mem_region_adjustable(struct resource *parent, resource_size_t start, resource_size_t size) { - struct resource **p; - struct resource *res; - struct resource *new_res; + struct resource *res, *new_res; resource_size_t end; int ret = -EINVAL; @@ -1285,16 +1281,16 @@ int release_mem_region_adjustable(struct resource *parent, /* The alloc_resource() result gets checked later */ new_res = alloc_resource(GFP_KERNEL); - p = &parent->child; + res = resource_first_child(&parent->child); write_lock(&resource_lock); - while ((res = *p)) { + while ((res)) { if (res->start >= end) break; /* look for the next resource if it does not fit into */ if (res->start > start || res->end < end) { - p = &res->sibling; + res = resource_sibling(res); continue; } @@ -1302,14 +1298,14 @@ int release_mem_region_adjustable(struct resource *parent, break; if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } /* found the target resource; let's adjust accordingly */ if (res->start == start && res->end == end) { /* free the whole entry */ - *p = res->sibling; + list_del(&res->sibling); free_resource(res); ret = 0; } else if (res->start == start && res->end != end) { @@ -1332,14 +1328,13 @@ int release_mem_region_adjustable(struct resource *parent, new_res->flags = res->flags; new_res->desc = res->desc; new_res->parent = res->parent; - new_res->sibling = res->sibling; - new_res->child = NULL; + INIT_LIST_HEAD(&new_res->child); ret = __adjust_resource(res, res->start, start - res->start); if (ret) break; - res->sibling = new_res; + list_add(&new_res->sibling, &res->sibling); new_res = NULL; } @@ -1520,7 +1515,7 @@ static int __init reserve_setup(char *str) res->end = io_start + io_num - 1; res->flags |= IORESOURCE_BUSY; res->desc = IORES_DESC_NONE; - res->child = NULL; + INIT_LIST_HEAD(&res->child); if (request_resource(parent, res) == 0) reserved = x+1; } @@ -1540,7 +1535,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size) loff_t l; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? @@ -1596,7 +1591,7 @@ bool iomem_is_exclusive(u64 addr) addr = addr & PAGE_MASK; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? -- 2.13.6 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Baoquan He The struct resource uses singly linked list to link siblings, implemented by pointer operation. Replace it with list_head for better code readability. Based on this list_head replacement, it will be very easy to do reverse iteration on iomem_resource's sibling list in later patch. Besides, type of member variables of struct resource, sibling and child, are changed from 'struct resource *' to 'struct list_head'. This brings two pointers of size increase. Suggested-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Cc: David Airlie <airlied@linux.ie> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Rob Herring <robh+dt@kernel.org> Cc: Frank Rowand <frowand.list@gmail.com> Cc: Keith Busch <keith.busch@intel.com> Cc: Jonathan Derrick <jonathan.derrick@intel.com> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: devel@linuxdriverproject.org Cc: linux-input@vger.kernel.org Cc: linux-nvdimm@lists.01.org Cc: devicetree@vger.kernel.org Cc: linux-pci@vger.kernel.org --- arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 4 +- arch/powerpc/kernel/pci-common.c | 4 +- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++---- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 17 ++- kernel/resource.c | 211 ++++++++++++++-------------- 19 files changed, 176 insertions(+), 169 deletions(-) diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c index cd2c02c68bc3..5494355b1c49 100644 --- a/arch/arm/plat-samsung/pm-check.c +++ b/arch/arm/plat-samsung/pm-check.c @@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg); static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) { while (ptr != NULL) { - if (ptr->child != NULL) - s3c_pm_run_res(ptr->child, fn, arg); + if (!list_empty(&ptr->child)) + s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg); if ((ptr->flags & IORESOURCE_SYSTEM_RAM) == IORESOURCE_SYSTEM_RAM) { @@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) arg = (fn)(ptr, arg); } - ptr = ptr->sibling; + ptr = resource_sibling(ptr); } } diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 7899bafab064..2bf73e27e231 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 926035bb378d..28fbe83c9daf 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } } diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index cca9134cfa7d..99efe4e98b16 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v) struct resource *root = m->private, *r; const char *nm; - for (r = root->child; r != NULL; r = r->sibling) { + list_for_each_entry(r, &root->child, sibling) { if ((nm = r->name) == NULL) nm = "???"; seq_printf(m, "%016llx-%016llx: %s\n", (unsigned long long)r->start, diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h index 0b68c76ec1e6..f487b06817df 100644 --- a/arch/xtensa/include/asm/pci-bridge.h +++ b/arch/xtensa/include/asm/pci-bridge.h @@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res, res->flags = flags; res->name = name; res->parent = NULL; - res->sibling = NULL; - res->child = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c index 1e8062f6dbfc..dba78f75fd06 100644 --- a/drivers/eisa/eisa-bus.c +++ b/drivers/eisa/eisa-bus.c @@ -408,6 +408,8 @@ static struct resource eisa_root_res = { .start = 0, .end = 0xffffffff, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(eisa_root_res.sibling), + .child = LIST_HEAD_INIT(eisa_root_res.child), }; static int eisa_bus_count; diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c index 3c54044214db..53e300a993dc 100644 --- a/drivers/gpu/drm/drm_memory.c +++ b/drivers/gpu/drm/drm_memory.c @@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void) struct resource *tmp; resource_size_t max_iomem = 0; - for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) { + list_for_each_entry(tmp, &iomem_resource.child, sibling) max_iomem = max(max_iomem, tmp->end); - } return max_iomem; } diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 3949b0990916..addd3bc009af 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c @@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume) int psb_gtt_restore(struct drm_device *dev) { struct drm_psb_private *dev_priv = dev->dev_private; - struct resource *r = dev_priv->gtt_mem->child; + struct resource *r; struct gtt_range *range; unsigned int restored = 0, total = 0, size = 0; @@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev) mutex_lock(&dev_priv->gtt_mutex); psb_gtt_init(dev, 1); - while (r != NULL) { + list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) { range = container_of(r, struct gtt_range, resource); if (range->pages) { psb_gtt_insert(dev, range, 1); size += range->resource.end - range->resource.start; restored++; } - r = r->sibling; total++; } mutex_unlock(&dev_priv->gtt_mutex); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index b10fe26c4891..d87ec5a1bc4c 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) { resource_size_t start = 0; resource_size_t end = 0; - struct resource *new_res; + struct resource *new_res, *tmp; struct resource **old_res = &hyperv_mmio; - struct resource **prev_res = NULL; switch (res->type) { @@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) /* * If two ranges are adjacent, merge them. */ - do { - if (!*old_res) { - *old_res = new_res; - break; - } - - if (((*old_res)->end + 1) == new_res->start) { - (*old_res)->end = new_res->end; + if (!*old_res) { + *old_res = new_res; + return AE_OK; + } + tmp = *old_res; + list_for_each_entry_from(tmp, &tmp->parent->child, sibling) { + if ((tmp->end + 1) == new_res->start) { + tmp->end = new_res->end; kfree(new_res); break; } - if ((*old_res)->start == new_res->end + 1) { - (*old_res)->start = new_res->start; + if (tmp->start == new_res->end + 1) { + tmp->start = new_res->start; kfree(new_res); break; } - if ((*old_res)->start > new_res->end) { - new_res->sibling = *old_res; - if (prev_res) - (*prev_res)->sibling = new_res; - *old_res = new_res; + if (tmp->start > new_res->end) { + list_add(&new_res->sibling, tmp->sibling.prev); break; } - - prev_res = old_res; - old_res = &(*old_res)->sibling; - - } while (1); + } return AE_OK; } static int vmbus_acpi_remove(struct acpi_device *device) { - struct resource *cur_res; - struct resource *next_res; + struct resource *res; if (hyperv_mmio) { if (fb_mmio) { @@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device) fb_mmio = NULL; } - for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) { - next_res = cur_res->sibling; - kfree(cur_res); - } + res = hyperv_mmio; + list_for_each_entry_from(res, &res->parent->child, sibling) + kfree(res); } return 0; @@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj, } } - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= max) || (iter->end <= min)) continue; @@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size) struct resource *iter; down(&hyperv_mmio_lock); - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= start + size) || (iter->end <= start)) continue; diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index daeeb4c7e3b0..5c0be27b33ff 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c @@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce) iforce->device_memory.end = 200; iforce->device_memory.flags = IORESOURCE_MEM; iforce->device_memory.parent = NULL; - iforce->device_memory.child = NULL; - iforce->device_memory.sibling = NULL; + INIT_LIST_HEAD(&iforce->device_memory.child); + INIT_LIST_HEAD(&iforce->device_memory.sibling); /* * Wait until device ready - until it sends its first response. diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c index 28afdd668905..f53d410d9981 100644 --- a/drivers/nvdimm/namespace_devs.c +++ b/drivers/nvdimm/namespace_devs.c @@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, retry: first = 0; for_each_dpa_resource(ndd, res) { - struct resource *next = res->sibling, *new_res = NULL; + struct resource *next = resource_sibling(res), *new_res = NULL; resource_size_t allocate, available = 0; enum alloc_loc loc = ALLOC_ERR; const char *action; @@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, * an initial "pmem-reserve pass". Only do an initial BLK allocation * when none of the DPA space is reserved. */ - if ((is_pmem || !ndd->dpa.child) && n == to_allocate) + if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate) return init_dpa_allocation(label_id, nd_region, nd_mapping, n); return n; } @@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region, retry: for_each_dpa_resource(ndd, res) { int rc; - struct resource *next = res->sibling; + struct resource *next = resource_sibling(res); resource_size_t end = res->start + resource_size(res); if (!next || strcmp(res->name, label_id->id) != 0 diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 32e0364b48b9..da7da15e03e7 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h @@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd); (unsigned long long) (res ? res->start : 0), ##arg) #define for_each_dpa_resource(ndd, res) \ - for (res = (ndd)->dpa.child; res; res = res->sibling) + list_for_each_entry(res, &(ndd)->dpa.child, sibling) #define for_each_dpa_resource_safe(ndd, res, next) \ - for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \ - res; res = next, next = next ? next->sibling : NULL) + list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling) struct nd_percpu_lane { int count; diff --git a/drivers/of/address.c b/drivers/of/address.c index 53349912ac75..e2e25719ab52 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range, { int err; res->flags = range->flags; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); res->name = np->full_name; if (res->flags & IORESOURCE_IO) { diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 69bd98421eb1..7482bdfd1959 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d) for (i = d; i ; --i) printk(" "); printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, (long)r->start, (long)r->end, r->flags); - lba_dump_res(r->child, d+2); - lba_dump_res(r->sibling, d); + lba_dump_res(resource_first_child(&r->child), d+2); + lba_dump_res(resource_sibling(r), d); } diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c index 942b64fc7f1f..e3ace20345c7 100644 --- a/drivers/pci/host/vmd.c +++ b/drivers/pci/host/vmd.c @@ -542,14 +542,14 @@ static struct pci_ops vmd_ops = { static void vmd_attach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1]; - vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2]; + list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child); + list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child); } static void vmd_detach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = NULL; - vmd->dev->resource[VMD_MEMBAR2].child = NULL; + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child); + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child); } /* diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ac876e32de4b..9624dd1dfd49 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr) r->res.start = 0; r->res.end = 0xff; r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED; + INIT_LIST_HEAD(&r->res.child); + INIT_LIST_HEAD(&r->res.sibling); list_add_tail(&r->list, &pci_domain_busn_res_list); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 79b1824e83b4..8e685af8938d 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type) continue; /* Ignore BARs which are still in use */ - if (res->child) + if (!list_empty(&res->child)) continue; ret = add_to_list(&saved, bridge, res, 0, 0); diff --git a/include/linux/ioport.h b/include/linux/ioport.h index dfdcd0bfe54e..b7456ae889dd 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -12,6 +12,7 @@ #ifndef __ASSEMBLY__ #include <linux/compiler.h> #include <linux/types.h> +#include <linux/list.h> /* * Resources are tree-like, allowing * nesting etc.. @@ -22,7 +23,8 @@ struct resource { const char *name; unsigned long flags; unsigned long desc; - struct resource *parent, *sibling, *child; + struct list_head child, sibling; + struct resource *parent; }; /* @@ -216,7 +218,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2) return r1->start <= r2->start && r1->end >= r2->end; } - /* Convenience shorthand with allocation */ #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0) #define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED) @@ -287,6 +288,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2) return (r1->start <= r2->end && r1->end >= r2->start); } +static inline struct resource *resource_sibling(struct resource *res) +{ + if (res->parent && !list_is_last(&res->sibling, &res->parent->child)) + return list_next_entry(res, sibling); + return NULL; +} + +static inline struct resource *resource_first_child(struct list_head *head) +{ + return list_first_entry_or_null(head, struct resource, sibling); +} + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_IOPORT_H */ diff --git a/kernel/resource.c b/kernel/resource.c index 5e7c56d5d838..ef9a20b75234 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -31,6 +31,8 @@ struct resource ioport_resource = { .start = 0, .end = IO_SPACE_LIMIT, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(ioport_resource.sibling), + .child = LIST_HEAD_INIT(ioport_resource.child), }; EXPORT_SYMBOL(ioport_resource); @@ -39,6 +41,8 @@ struct resource iomem_resource = { .start = 0, .end = -1, .flags = IORESOURCE_MEM, + .sibling = LIST_HEAD_INIT(iomem_resource.sibling), + .child = LIST_HEAD_INIT(iomem_resource.child), }; EXPORT_SYMBOL(iomem_resource); @@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock); * by boot mem after the system is up. So for reusing the resource entry * we need to remember the resource. */ -static struct resource *bootmem_resource_free; +static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free); static DEFINE_SPINLOCK(bootmem_resource_lock); static struct resource *next_resource(struct resource *p, bool sibling_only) { /* Caller wants to traverse through siblings only */ if (sibling_only) - return p->sibling; + return resource_sibling(p); - if (p->child) - return p->child; - while (!p->sibling && p->parent) + if (!list_empty(&p->child)) + return resource_first_child(&p->child); + while (!resource_sibling(p) && p->parent) p = p->parent; - return p->sibling; + return resource_sibling(p); } static void *r_next(struct seq_file *m, void *v, loff_t *pos) @@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos) struct resource *p = PDE_DATA(file_inode(m->file)); loff_t l = 0; read_lock(&resource_lock); - for (p = p->child; p && l < *pos; p = r_next(m, p, &l)) + for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l)) ; return p; } @@ -153,8 +157,7 @@ static void free_resource(struct resource *res) if (!PageSlab(virt_to_head_page(res))) { spin_lock(&bootmem_resource_lock); - res->sibling = bootmem_resource_free; - bootmem_resource_free = res; + list_add(&res->sibling, &bootmem_resource_free); spin_unlock(&bootmem_resource_lock); } else { kfree(res); @@ -166,10 +169,9 @@ static struct resource *alloc_resource(gfp_t flags) struct resource *res = NULL; spin_lock(&bootmem_resource_lock); - if (bootmem_resource_free) { - res = bootmem_resource_free; - bootmem_resource_free = res->sibling; - } + res = resource_first_child(&bootmem_resource_free); + if (res) + list_del(&res->sibling); spin_unlock(&bootmem_resource_lock); if (res) @@ -177,6 +179,8 @@ static struct resource *alloc_resource(gfp_t flags) else res = kzalloc(sizeof(struct resource), flags); + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); return res; } @@ -185,7 +189,7 @@ static struct resource * __request_resource(struct resource *root, struct resour { resource_size_t start = new->start; resource_size_t end = new->end; - struct resource *tmp, **p; + struct resource *tmp; if (end < start) return root; @@ -193,64 +197,62 @@ static struct resource * __request_resource(struct resource *root, struct resour return root; if (end > root->end) return root; - p = &root->child; - for (;;) { - tmp = *p; - if (!tmp || tmp->start > end) { - new->sibling = tmp; - *p = new; + + if (list_empty(&root->child)) { + list_add(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; + } + + list_for_each_entry(tmp, &root->child, sibling) { + if (tmp->start > end) { + list_add(&new->sibling, tmp->sibling.prev); new->parent = root; + INIT_LIST_HEAD(&new->child); return NULL; } - p = &tmp->sibling; if (tmp->end < start) continue; return tmp; } + + list_add_tail(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; } static int __release_resource(struct resource *old, bool release_child) { - struct resource *tmp, **p, *chd; + struct resource *tmp, *next, *chd; - p = &old->parent->child; - for (;;) { - tmp = *p; - if (!tmp) - break; + list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) { if (tmp == old) { - if (release_child || !(tmp->child)) { - *p = tmp->sibling; + if (release_child || list_empty(&tmp->child)) { + list_del(&tmp->sibling); } else { - for (chd = tmp->child;; chd = chd->sibling) { + list_for_each_entry(chd, &tmp->child, sibling) chd->parent = tmp->parent; - if (!(chd->sibling)) - break; - } - *p = tmp->child; - chd->sibling = tmp->sibling; + list_splice(&tmp->child, tmp->sibling.prev); + list_del(&tmp->sibling); } + old->parent = NULL; return 0; } - p = &tmp->sibling; } return -EINVAL; } static void __release_child_resources(struct resource *r) { - struct resource *tmp, *p; + struct resource *tmp, *next; resource_size_t size; - p = r->child; - r->child = NULL; - while (p) { - tmp = p; - p = p->sibling; - + list_for_each_entry_safe(tmp, next, &r->child, sibling) { tmp->parent = NULL; - tmp->sibling = NULL; + INIT_LIST_HEAD(&tmp->sibling); __release_child_resources(tmp); printk(KERN_DEBUG "release child resource %pR\n", tmp); @@ -259,6 +261,8 @@ static void __release_child_resources(struct resource *r) tmp->start = 0; tmp->end = size - 1; } + + INIT_LIST_HEAD(&tmp->child); } void release_child_resources(struct resource *r) @@ -343,7 +347,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, read_lock(&resource_lock); - for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { + for (p = resource_first_child(&iomem_resource.child); p; + p = next_resource(p, sibling_only)) { if ((p->flags & res->flags) != res->flags) continue; if ((desc != IORES_DESC_NONE) && (desc != p->desc)) @@ -532,7 +537,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags, struct resource *p; read_lock(&resource_lock); - for (p = iomem_resource.child; p ; p = p->sibling) { + list_for_each_entry(p, &iomem_resource.child, sibling) { bool is_type = (((p->flags & flags) == flags) && ((desc == IORES_DESC_NONE) || (desc == p->desc))); @@ -586,7 +591,7 @@ static int __find_resource(struct resource *root, struct resource *old, resource_size_t size, struct resource_constraint *constraint) { - struct resource *this = root->child; + struct resource *this = resource_first_child(&root->child); struct resource tmp = *new, avail, alloc; tmp.start = root->start; @@ -596,7 +601,7 @@ static int __find_resource(struct resource *root, struct resource *old, */ if (this && this->start == root->start) { tmp.start = (this == old) ? old->start : this->end + 1; - this = this->sibling; + this = resource_sibling(this); } for(;;) { if (this) @@ -632,7 +637,7 @@ next: if (!this || this->end == root->end) if (this != old) tmp.start = this->end + 1; - this = this->sibling; + this = resource_sibling(this); } return -EBUSY; } @@ -676,7 +681,7 @@ static int reallocate_resource(struct resource *root, struct resource *old, goto out; } - if (old->child) { + if (!list_empty(&old->child)) { err = -EBUSY; goto out; } @@ -757,7 +762,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start) struct resource *res; read_lock(&resource_lock); - for (res = root->child; res; res = res->sibling) { + list_for_each_entry(res, &root->child, sibling) { if (res->start == start) break; } @@ -790,32 +795,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou break; } - for (next = first; ; next = next->sibling) { + for (next = first; ; next = resource_sibling(next)) { /* Partial overlap? Bad, and unfixable */ if (next->start < new->start || next->end > new->end) return next; - if (!next->sibling) + if (!resource_sibling(next)) break; - if (next->sibling->start > new->end) + if (resource_sibling(next)->start > new->end) break; } - new->parent = parent; - new->sibling = next->sibling; - new->child = first; + list_add(&new->sibling, &next->sibling); + INIT_LIST_HEAD(&new->child); - next->sibling = NULL; - for (next = first; next; next = next->sibling) + /* + * From first to next, they all fall into new's region, so change them + * as new's children. + */ + list_cut_position(&new->child, first->sibling.prev, &next->sibling); + list_for_each_entry(next, &new->child, sibling) next->parent = new; - if (parent->child == first) { - parent->child = new; - } else { - next = parent->child; - while (next->sibling != first) - next = next->sibling; - next->sibling = new; - } return NULL; } @@ -937,19 +937,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start, if ((start < parent->start) || (end > parent->end)) goto out; - if (res->sibling && (res->sibling->start <= end)) + if (resource_sibling(res) && (resource_sibling(res)->start <= end)) goto out; - tmp = parent->child; - if (tmp != res) { - while (tmp->sibling != res) - tmp = tmp->sibling; + if (res->sibling.prev != &parent->child) { + tmp = list_prev_entry(res, sibling); if (start <= tmp->end) goto out; } skip: - for (tmp = res->child; tmp; tmp = tmp->sibling) + list_for_each_entry(tmp, &res->child, sibling) if ((tmp->start < start) || (tmp->end > end)) goto out; @@ -987,31 +985,33 @@ EXPORT_SYMBOL(adjust_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) +int reparent_resources(struct resource *parent, struct resource *res) { - struct resource *p, **pp; - struct resource **firstpp = NULL; + struct resource *p, *first = NULL; - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { + list_for_each_entry(p, &parent->child, 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 (first == NULL) + first = p; } - if (firstpp == NULL) + if (first == 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; + list_add(&res->sibling, &p->sibling.prev); + INIT_LIST_HEAD(&res->child); + + /* + * From first to p's previous sibling, they all fall into + * res's region, change them as res's children. + */ + list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); + list_for_each_entry(p, &new->child, sibling) { + p->parent = new; pr_debug("PCI: Reparented %s %pR under %s\n", p->name, p, res->name); } @@ -1210,34 +1210,32 @@ EXPORT_SYMBOL(__request_region); void __release_region(struct resource *parent, resource_size_t start, resource_size_t n) { - struct resource **p; + struct resource *res; resource_size_t end; - p = &parent->child; + res = resource_first_child(&parent->child); end = start + n - 1; write_lock(&resource_lock); for (;;) { - struct resource *res = *p; - if (!res) break; if (res->start <= start && res->end >= end) { if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } if (res->start != start || res->end != end) break; - *p = res->sibling; + list_del(&res->sibling); write_unlock(&resource_lock); if (res->flags & IORESOURCE_MUXED) wake_up(&muxed_resource_wait); free_resource(res); return; } - p = &res->sibling; + res = resource_sibling(res); } write_unlock(&resource_lock); @@ -1272,9 +1270,7 @@ EXPORT_SYMBOL(__release_region); int release_mem_region_adjustable(struct resource *parent, resource_size_t start, resource_size_t size) { - struct resource **p; - struct resource *res; - struct resource *new_res; + struct resource *res, *new_res; resource_size_t end; int ret = -EINVAL; @@ -1285,16 +1281,16 @@ int release_mem_region_adjustable(struct resource *parent, /* The alloc_resource() result gets checked later */ new_res = alloc_resource(GFP_KERNEL); - p = &parent->child; + res = resource_first_child(&parent->child); write_lock(&resource_lock); - while ((res = *p)) { + while ((res)) { if (res->start >= end) break; /* look for the next resource if it does not fit into */ if (res->start > start || res->end < end) { - p = &res->sibling; + res = resource_sibling(res); continue; } @@ -1302,14 +1298,14 @@ int release_mem_region_adjustable(struct resource *parent, break; if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } /* found the target resource; let's adjust accordingly */ if (res->start == start && res->end == end) { /* free the whole entry */ - *p = res->sibling; + list_del(&res->sibling); free_resource(res); ret = 0; } else if (res->start == start && res->end != end) { @@ -1332,14 +1328,13 @@ int release_mem_region_adjustable(struct resource *parent, new_res->flags = res->flags; new_res->desc = res->desc; new_res->parent = res->parent; - new_res->sibling = res->sibling; - new_res->child = NULL; + INIT_LIST_HEAD(&new_res->child); ret = __adjust_resource(res, res->start, start - res->start); if (ret) break; - res->sibling = new_res; + list_add(&new_res->sibling, &res->sibling); new_res = NULL; } @@ -1520,7 +1515,7 @@ static int __init reserve_setup(char *str) res->end = io_start + io_num - 1; res->flags |= IORESOURCE_BUSY; res->desc = IORES_DESC_NONE; - res->child = NULL; + INIT_LIST_HEAD(&res->child); if (request_resource(parent, res) == 0) reserved = x+1; } @@ -1540,7 +1535,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size) loff_t l; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? @@ -1596,7 +1591,7 @@ bool iomem_is_exclusive(u64 addr) addr = addr & PAGE_MASK; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devel-tBiZLqfeLfOHmIFyCCdPziST3g8Odh+X, linuxppc-dev VGhlIHN0cnVjdCByZXNvdXJjZSB1c2VzIHNpbmdseSBsaW5rZWQgbGlzdCB0byBsaW5rIHNpYmxp bmdzLCBpbXBsZW1lbnRlZApieSBwb2ludGVyIG9wZXJhdGlvbi4gUmVwbGFjZSBpdCB3aXRoIGxp c3RfaGVhZCBmb3IgYmV0dGVyIGNvZGUgcmVhZGFiaWxpdHkuCgpCYXNlZCBvbiB0aGlzIGxpc3Rf aGVhZCByZXBsYWNlbWVudCwgaXQgd2lsbCBiZSB2ZXJ5IGVhc3kgdG8gZG8gcmV2ZXJzZQppdGVy YXRpb24gb24gaW9tZW1fcmVzb3VyY2UncyBzaWJsaW5nIGxpc3QgaW4gbGF0ZXIgcGF0Y2guCgpC ZXNpZGVzLCB0eXBlIG9mIG1lbWJlciB2YXJpYWJsZXMgb2Ygc3RydWN0IHJlc291cmNlLCBzaWJs aW5nIGFuZCBjaGlsZCwgYXJlCmNoYW5nZWQgZnJvbSAnc3RydWN0IHJlc291cmNlIConIHRvICdz dHJ1Y3QgbGlzdF9oZWFkJy4gVGhpcyBicmluZ3MgdHdvCnBvaW50ZXJzIG9mIHNpemUgaW5jcmVh c2UuCgpTdWdnZXN0ZWQtYnk6IEFuZHJldyBNb3J0b24gPGFrcG1AbGludXgtZm91bmRhdGlvbi5v cmc+ClNpZ25lZC1vZmYtYnk6IEJhb3F1YW4gSGUgPGJoZUByZWRoYXQuY29tPgpDYzogUGF0cmlr IEpha29ic3NvbiA8cGF0cmlrLnIuamFrb2Jzc29uQGdtYWlsLmNvbT4KQ2M6IERhdmlkIEFpcmxp ZSA8YWlybGllZEBsaW51eC5pZT4KQ2M6ICJLLiBZLiBTcmluaXZhc2FuIiA8a3lzQG1pY3Jvc29m dC5jb20+CkNjOiBIYWl5YW5nIFpoYW5nIDxoYWl5YW5nekBtaWNyb3NvZnQuY29tPgpDYzogU3Rl cGhlbiBIZW1taW5nZXIgPHN0aGVtbWluQG1pY3Jvc29mdC5jb20+CkNjOiBEbWl0cnkgVG9yb2to b3YgPGRtaXRyeS50b3Jva2hvdkBnbWFpbC5jb20+CkNjOiBEYW4gV2lsbGlhbXMgPGRhbi5qLndp bGxpYW1zQGludGVsLmNvbT4KQ2M6IFJvYiBIZXJyaW5nIDxyb2JoK2R0QGtlcm5lbC5vcmc+CkNj OiBGcmFuayBSb3dhbmQgPGZyb3dhbmQubGlzdEBnbWFpbC5jb20+CkNjOiBLZWl0aCBCdXNjaCA8 a2VpdGguYnVzY2hAaW50ZWwuY29tPgpDYzogSm9uYXRoYW4gRGVycmljayA8am9uYXRoYW4uZGVy cmlja0BpbnRlbC5jb20+CkNjOiBMb3JlbnpvIFBpZXJhbGlzaSA8bG9yZW56by5waWVyYWxpc2lA YXJtLmNvbT4KQ2M6IEJqb3JuIEhlbGdhYXMgPGJoZWxnYWFzQGdvb2dsZS5jb20+CkNjOiBUaG9t YXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KQ2M6IEJyaWplc2ggU2luZ2ggPGJyaWpl c2guc2luZ2hAYW1kLmNvbT4KQ2M6ICJKw6lyw7RtZSBHbGlzc2UiIDxqZ2xpc3NlQHJlZGhhdC5j b20+CkNjOiBCb3Jpc2xhdiBQZXRrb3YgPGJwQHN1c2UuZGU+CkNjOiBUb20gTGVuZGFja3kgPHRo b21hcy5sZW5kYWNreUBhbWQuY29tPgpDYzogR3JlZyBLcm9haC1IYXJ0bWFuIDxncmVna2hAbGlu dXhmb3VuZGF0aW9uLm9yZz4KQ2M6IFlhb3dlaSBCYWkgPGJhaXlhb3dlaUBjbXNzLmNoaW5hbW9i aWxlLmNvbT4KQ2M6IFdlaSBZYW5nIDxyaWNoYXJkLndlaXlhbmdAZ21haWwuY29tPgpDYzogZGV2 ZWxAbGludXhkcml2ZXJwcm9qZWN0Lm9yZwpDYzogbGludXgtaW5wdXRAdmdlci5rZXJuZWwub3Jn CkNjOiBsaW51eC1udmRpbW1AbGlzdHMuMDEub3JnCkNjOiBkZXZpY2V0cmVlQHZnZXIua2VybmVs Lm9yZwpDYzogbGludXgtcGNpQHZnZXIua2VybmVsLm9yZwotLS0KIGFyY2gvYXJtL3BsYXQtc2Ft c3VuZy9wbS1jaGVjay5jICAgICAgICAgICAgfCAgIDYgKy0KIGFyY2gvbWljcm9ibGF6ZS9wY2kv cGNpLWNvbW1vbi5jICAgICAgICAgICAgfCAgIDQgKy0KIGFyY2gvcG93ZXJwYy9rZXJuZWwvcGNp LWNvbW1vbi5jICAgICAgICAgICAgfCAgIDQgKy0KIGFyY2gvc3BhcmMva2VybmVsL2lvcG9ydC5j ICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIGFyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BjaS1i cmlkZ2UuaCAgICAgICAgfCAgIDQgKy0KIGRyaXZlcnMvZWlzYS9laXNhLWJ1cy5jICAgICAgICAg ICAgICAgICAgICAgfCAgIDIgKwogZHJpdmVycy9ncHUvZHJtL2RybV9tZW1vcnkuYyAgICAgICAg ICAgICAgICB8ICAgMyArLQogZHJpdmVycy9ncHUvZHJtL2dtYTUwMC9ndHQuYyAgICAgICAgICAg ICAgICB8ICAgNSArLQogZHJpdmVycy9odi92bWJ1c19kcnYuYyAgICAgICAgICAgICAgICAgICAg ICB8ICA1MiArKystLS0tCiBkcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFp bi5jIHwgICA0ICstCiBkcml2ZXJzL252ZGltbS9uYW1lc3BhY2VfZGV2cy5jICAgICAgICAgICAg IHwgICA2ICstCiBkcml2ZXJzL252ZGltbS9uZC5oICAgICAgICAgICAgICAgICAgICAgICAgIHwg ICA1ICstCiBkcml2ZXJzL29mL2FkZHJlc3MuYyAgICAgICAgICAgICAgICAgICAgICAgIHwgICA0 ICstCiBkcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMgICAgICAgICAgICAgICAgICAgIHwgICA0ICst CiBkcml2ZXJzL3BjaS9ob3N0L3ZtZC5jICAgICAgICAgICAgICAgICAgICAgIHwgICA4ICstCiBk cml2ZXJzL3BjaS9wcm9iZS5jICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAyICsKIGRyaXZl cnMvcGNpL3NldHVwLWJ1cy5jICAgICAgICAgICAgICAgICAgICAgfCAgIDIgKy0KIGluY2x1ZGUv bGludXgvaW9wb3J0LmggICAgICAgICAgICAgICAgICAgICAgfCAgMTcgKystCiBrZXJuZWwvcmVz b3VyY2UuYyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMjExICsrKysrKysrKysrKysrLS0t LS0tLS0tLS0tLS0KIDE5IGZpbGVzIGNoYW5nZWQsIDE3NiBpbnNlcnRpb25zKCspLCAxNjkgZGVs ZXRpb25zKC0pCgpkaWZmIC0tZ2l0IGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWNoZWNrLmMg Yi9hcmNoL2FybS9wbGF0LXNhbXN1bmcvcG0tY2hlY2suYwppbmRleCBjZDJjMDJjNjhiYzMuLjU0 OTQzNTViMWM0OSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWNoZWNrLmMK KysrIGIvYXJjaC9hcm0vcGxhdC1zYW1zdW5nL3BtLWNoZWNrLmMKQEAgLTQ2LDggKzQ2LDggQEAg dHlwZWRlZiB1MzIgKihydW5fZm5fdCkoc3RydWN0IHJlc291cmNlICpwdHIsIHUzMiAqYXJnKTsK IHN0YXRpYyB2b2lkIHMzY19wbV9ydW5fcmVzKHN0cnVjdCByZXNvdXJjZSAqcHRyLCBydW5fZm5f dCBmbiwgdTMyICphcmcpCiB7CiAJd2hpbGUgKHB0ciAhPSBOVUxMKSB7Ci0JCWlmIChwdHItPmNo aWxkICE9IE5VTEwpCi0JCQlzM2NfcG1fcnVuX3JlcyhwdHItPmNoaWxkLCBmbiwgYXJnKTsKKwkJ aWYgKCFsaXN0X2VtcHR5KCZwdHItPmNoaWxkKSkKKwkJCXMzY19wbV9ydW5fcmVzKHJlc291cmNl X2ZpcnN0X2NoaWxkKCZwdHItPmNoaWxkKSwgZm4sIGFyZyk7CiAKIAkJaWYgKChwdHItPmZsYWdz ICYgSU9SRVNPVVJDRV9TWVNURU1fUkFNKQogCQkJCT09IElPUkVTT1VSQ0VfU1lTVEVNX1JBTSkg ewpAQCAtNTcsNyArNTcsNyBAQCBzdGF0aWMgdm9pZCBzM2NfcG1fcnVuX3JlcyhzdHJ1Y3QgcmVz b3VyY2UgKnB0ciwgcnVuX2ZuX3QgZm4sIHUzMiAqYXJnKQogCQkJYXJnID0gKGZuKShwdHIsIGFy Zyk7CiAJCX0KIAotCQlwdHIgPSBwdHItPnNpYmxpbmc7CisJCXB0ciA9IHJlc291cmNlX3NpYmxp bmcocHRyKTsKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNv bW1vbi5jIGIvYXJjaC9taWNyb2JsYXplL3BjaS9wY2ktY29tbW9uLmMKaW5kZXggNzg5OWJhZmFi MDY0Li4yYmY3M2UyN2UyMzEgMTAwNjQ0Ci0tLSBhL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNv bW1vbi5jCisrKyBiL2FyY2gvbWljcm9ibGF6ZS9wY2kvcGNpLWNvbW1vbi5jCkBAIC01MzMsNyAr NTMzLDkgQEAgdm9pZCBwY2lfcHJvY2Vzc19icmlkZ2VfT0ZfcmFuZ2VzKHN0cnVjdCBwY2lfY29u dHJvbGxlciAqaG9zZSwKIAkJCXJlcy0+ZmxhZ3MgPSByYW5nZS5mbGFnczsKIAkJCXJlcy0+c3Rh cnQgPSByYW5nZS5jcHVfYWRkcjsKIAkJCXJlcy0+ZW5kID0gcmFuZ2UuY3B1X2FkZHIgKyByYW5n ZS5zaXplIC0gMTsKLQkJCXJlcy0+cGFyZW50ID0gcmVzLT5jaGlsZCA9IHJlcy0+c2libGluZyA9 IE5VTEw7CisJCQlyZXMtPnBhcmVudCA9IE5VTEw7CisJCQlJTklUX0xJU1RfSEVBRCgmcmVzLT5j aGlsZCk7CisJCQlJTklUX0xJU1RfSEVBRCgmcmVzLT5zaWJsaW5nKTsKIAkJfQogCX0KIApkaWZm IC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMgYi9hcmNoL3Bvd2VycGMv a2VybmVsL3BjaS1jb21tb24uYwppbmRleCA5MjYwMzViYjM3OGQuLjI4ZmJlODNjOWRhZiAxMDA2 NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKKysrIGIvYXJjaC9wb3dl cnBjL2tlcm5lbC9wY2ktY29tbW9uLmMKQEAgLTc2MSw3ICs3NjEsOSBAQCB2b2lkIHBjaV9wcm9j ZXNzX2JyaWRnZV9PRl9yYW5nZXMoc3RydWN0IHBjaV9jb250cm9sbGVyICpob3NlLAogCQkJcmVz LT5mbGFncyA9IHJhbmdlLmZsYWdzOwogCQkJcmVzLT5zdGFydCA9IHJhbmdlLmNwdV9hZGRyOwog CQkJcmVzLT5lbmQgPSByYW5nZS5jcHVfYWRkciArIHJhbmdlLnNpemUgLSAxOwotCQkJcmVzLT5w YXJlbnQgPSByZXMtPmNoaWxkID0gcmVzLT5zaWJsaW5nID0gTlVMTDsKKwkJCXJlcy0+cGFyZW50 ID0gTlVMTDsKKwkJCUlOSVRfTElTVF9IRUFEKCZyZXMtPmNoaWxkKTsKKwkJCUlOSVRfTElTVF9I RUFEKCZyZXMtPnNpYmxpbmcpOwogCQl9CiAJfQogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9r ZXJuZWwvaW9wb3J0LmMgYi9hcmNoL3NwYXJjL2tlcm5lbC9pb3BvcnQuYwppbmRleCBjY2E5MTM0 Y2ZhN2QuLjk5ZWZlNGU5OGIxNiAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0 LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaW9wb3J0LmMKQEAgLTY2OSw3ICs2NjksNyBAQCBz dGF0aWMgaW50IHNwYXJjX2lvX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYp CiAJc3RydWN0IHJlc291cmNlICpyb290ID0gbS0+cHJpdmF0ZSwgKnI7CiAJY29uc3QgY2hhciAq bm07CiAKLQlmb3IgKHIgPSByb290LT5jaGlsZDsgciAhPSBOVUxMOyByID0gci0+c2libGluZykg eworCWxpc3RfZm9yX2VhY2hfZW50cnkociwgJnJvb3QtPmNoaWxkLCBzaWJsaW5nKSB7CiAJCWlm ICgobm0gPSByLT5uYW1lKSA9PSBOVUxMKSBubSA9ICI/Pz8iOwogCQlzZXFfcHJpbnRmKG0sICIl MDE2bGx4LSUwMTZsbHg6ICVzXG4iLAogCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpci0+c3RhcnQs CmRpZmYgLS1naXQgYS9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmggYi9hcmNo L3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKaW5kZXggMGI2OGM3NmVjMWU2Li5mNDg3 YjA2ODE3ZGYgMTAwNjQ0Ci0tLSBhL2FyY2gveHRlbnNhL2luY2x1ZGUvYXNtL3BjaS1icmlkZ2Uu aAorKysgYi9hcmNoL3h0ZW5zYS9pbmNsdWRlL2FzbS9wY2ktYnJpZGdlLmgKQEAgLTcxLDggKzcx LDggQEAgc3RhdGljIGlubGluZSB2b2lkIHBjaWJpb3NfaW5pdF9yZXNvdXJjZShzdHJ1Y3QgcmVz b3VyY2UgKnJlcywKIAlyZXMtPmZsYWdzID0gZmxhZ3M7CiAJcmVzLT5uYW1lID0gbmFtZTsKIAly ZXMtPnBhcmVudCA9IE5VTEw7Ci0JcmVzLT5zaWJsaW5nID0gTlVMTDsKLQlyZXMtPmNoaWxkID0g TlVMTDsKKwlJTklUX0xJU1RfSEVBRCgmcmVzLT5jaGlsZCk7CisJSU5JVF9MSVNUX0hFQUQoJnJl cy0+c2libGluZyk7CiB9CiAKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9laXNhL2Vpc2EtYnVzLmMg Yi9kcml2ZXJzL2Vpc2EvZWlzYS1idXMuYwppbmRleCAxZTgwNjJmNmRiZmMuLmRiYTc4Zjc1ZmQw NiAxMDA2NDQKLS0tIGEvZHJpdmVycy9laXNhL2Vpc2EtYnVzLmMKKysrIGIvZHJpdmVycy9laXNh L2Vpc2EtYnVzLmMKQEAgLTQwOCw2ICs0MDgsOCBAQCBzdGF0aWMgc3RydWN0IHJlc291cmNlIGVp c2Ffcm9vdF9yZXMgPSB7CiAJLnN0YXJ0ID0gMCwKIAkuZW5kICAgPSAweGZmZmZmZmZmLAogCS5m bGFncyA9IElPUkVTT1VSQ0VfSU8sCisJLnNpYmxpbmcgPSBMSVNUX0hFQURfSU5JVChlaXNhX3Jv b3RfcmVzLnNpYmxpbmcpLAorCS5jaGlsZCAgPSBMSVNUX0hFQURfSU5JVChlaXNhX3Jvb3RfcmVz LmNoaWxkKSwKIH07CiAKIHN0YXRpYyBpbnQgZWlzYV9idXNfY291bnQ7CmRpZmYgLS1naXQgYS9k cml2ZXJzL2dwdS9kcm0vZHJtX21lbW9yeS5jIGIvZHJpdmVycy9ncHUvZHJtL2RybV9tZW1vcnku YwppbmRleCAzYzU0MDQ0MjE0ZGIuLjUzZTMwMGE5OTNkYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9n cHUvZHJtL2RybV9tZW1vcnkuYworKysgYi9kcml2ZXJzL2dwdS9kcm0vZHJtX21lbW9yeS5jCkBA IC0xNTUsOSArMTU1LDggQEAgdTY0IGRybV9nZXRfbWF4X2lvbWVtKHZvaWQpCiAJc3RydWN0IHJl c291cmNlICp0bXA7CiAJcmVzb3VyY2Vfc2l6ZV90IG1heF9pb21lbSA9IDA7CiAKLQlmb3IgKHRt cCA9IGlvbWVtX3Jlc291cmNlLmNoaWxkOyB0bXA7IHRtcCA9IHRtcC0+c2libGluZykgeworCWxp c3RfZm9yX2VhY2hfZW50cnkodG1wLCAmaW9tZW1fcmVzb3VyY2UuY2hpbGQsIHNpYmxpbmcpCiAJ CW1heF9pb21lbSA9IG1heChtYXhfaW9tZW0sICB0bXAtPmVuZCk7Ci0JfQogCiAJcmV0dXJuIG1h eF9pb21lbTsKIH0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9nbWE1MDAvZ3R0LmMgYi9k cml2ZXJzL2dwdS9kcm0vZ21hNTAwL2d0dC5jCmluZGV4IDM5NDliMDk5MDkxNi4uYWRkZDNiYzAw OWFmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2dwdS9kcm0vZ21hNTAwL2d0dC5jCisrKyBiL2RyaXZl cnMvZ3B1L2RybS9nbWE1MDAvZ3R0LmMKQEAgLTU2NSw3ICs1NjUsNyBAQCBpbnQgcHNiX2d0dF9p bml0KHN0cnVjdCBkcm1fZGV2aWNlICpkZXYsIGludCByZXN1bWUpCiBpbnQgcHNiX2d0dF9yZXN0 b3JlKHN0cnVjdCBkcm1fZGV2aWNlICpkZXYpCiB7CiAJc3RydWN0IGRybV9wc2JfcHJpdmF0ZSAq ZGV2X3ByaXYgPSBkZXYtPmRldl9wcml2YXRlOwotCXN0cnVjdCByZXNvdXJjZSAqciA9IGRldl9w cml2LT5ndHRfbWVtLT5jaGlsZDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnI7CiAJc3RydWN0IGd0dF9y YW5nZSAqcmFuZ2U7CiAJdW5zaWduZWQgaW50IHJlc3RvcmVkID0gMCwgdG90YWwgPSAwLCBzaXpl ID0gMDsKIApAQCAtNTczLDE0ICs1NzMsMTMgQEAgaW50IHBzYl9ndHRfcmVzdG9yZShzdHJ1Y3Qg ZHJtX2RldmljZSAqZGV2KQogCW11dGV4X2xvY2soJmRldl9wcml2LT5ndHRfbXV0ZXgpOwogCXBz Yl9ndHRfaW5pdChkZXYsIDEpOwogCi0Jd2hpbGUgKHIgIT0gTlVMTCkgeworCWxpc3RfZm9yX2Vh Y2hfZW50cnkociwgJmRldl9wcml2LT5ndHRfbWVtLT5jaGlsZCwgc2libGluZykgewogCQlyYW5n ZSA9IGNvbnRhaW5lcl9vZihyLCBzdHJ1Y3QgZ3R0X3JhbmdlLCByZXNvdXJjZSk7CiAJCWlmIChy YW5nZS0+cGFnZXMpIHsKIAkJCXBzYl9ndHRfaW5zZXJ0KGRldiwgcmFuZ2UsIDEpOwogCQkJc2l6 ZSArPSByYW5nZS0+cmVzb3VyY2UuZW5kIC0gcmFuZ2UtPnJlc291cmNlLnN0YXJ0OwogCQkJcmVz dG9yZWQrKzsKIAkJfQotCQlyID0gci0+c2libGluZzsKIAkJdG90YWwrKzsKIAl9CiAJbXV0ZXhf dW5sb2NrKCZkZXZfcHJpdi0+Z3R0X211dGV4KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaHYvdm1i dXNfZHJ2LmMgYi9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCmluZGV4IGIxMGZlMjZjNDg5MS4uZDg3 ZWM1YTFiYzRjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2h2L3ZtYnVzX2Rydi5jCisrKyBiL2RyaXZl cnMvaHYvdm1idXNfZHJ2LmMKQEAgLTE0MTIsOSArMTQxMiw4IEBAIHN0YXRpYyBhY3BpX3N0YXR1 cyB2bWJ1c193YWxrX3Jlc291cmNlcyhzdHJ1Y3QgYWNwaV9yZXNvdXJjZSAqcmVzLCB2b2lkICpj dHgpCiB7CiAJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0ID0gMDsKIAlyZXNvdXJjZV9zaXplX3QgZW5k ID0gMDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKm5ld19yZXM7CisJc3RydWN0IHJlc291cmNlICpuZXdf cmVzLCAqdG1wOwogCXN0cnVjdCByZXNvdXJjZSAqKm9sZF9yZXMgPSAmaHlwZXJ2X21taW87Ci0J c3RydWN0IHJlc291cmNlICoqcHJldl9yZXMgPSBOVUxMOwogCiAJc3dpdGNoIChyZXMtPnR5cGUp IHsKIApAQCAtMTQ2MSw0NCArMTQ2MCwzNiBAQCBzdGF0aWMgYWNwaV9zdGF0dXMgdm1idXNfd2Fs a19yZXNvdXJjZXMoc3RydWN0IGFjcGlfcmVzb3VyY2UgKnJlcywgdm9pZCAqY3R4KQogCS8qCiAJ ICogSWYgdHdvIHJhbmdlcyBhcmUgYWRqYWNlbnQsIG1lcmdlIHRoZW0uCiAJICovCi0JZG8gewot CQlpZiAoISpvbGRfcmVzKSB7Ci0JCQkqb2xkX3JlcyA9IG5ld19yZXM7Ci0JCQlicmVhazsKLQkJ fQotCi0JCWlmICgoKCpvbGRfcmVzKS0+ZW5kICsgMSkgPT0gbmV3X3Jlcy0+c3RhcnQpIHsKLQkJ CSgqb2xkX3JlcyktPmVuZCA9IG5ld19yZXMtPmVuZDsKKwlpZiAoISpvbGRfcmVzKSB7CisJCSpv bGRfcmVzID0gbmV3X3JlczsKKwkJcmV0dXJuIEFFX09LOworCX0KKwl0bXAgPSAqb2xkX3JlczsK KwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20odG1wLCAmdG1wLT5wYXJlbnQtPmNoaWxkLCBzaWJs aW5nKSB7CisJCWlmICgodG1wLT5lbmQgKyAxKSA9PSBuZXdfcmVzLT5zdGFydCkgeworCQkJdG1w LT5lbmQgPSBuZXdfcmVzLT5lbmQ7CiAJCQlrZnJlZShuZXdfcmVzKTsKIAkJCWJyZWFrOwogCQl9 CiAKLQkJaWYgKCgqb2xkX3JlcyktPnN0YXJ0ID09IG5ld19yZXMtPmVuZCArIDEpIHsKLQkJCSgq b2xkX3JlcyktPnN0YXJ0ID0gbmV3X3Jlcy0+c3RhcnQ7CisJCWlmICh0bXAtPnN0YXJ0ID09IG5l d19yZXMtPmVuZCArIDEpIHsKKwkJCXRtcC0+c3RhcnQgPSBuZXdfcmVzLT5zdGFydDsKIAkJCWtm cmVlKG5ld19yZXMpOwogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoKCpvbGRfcmVzKS0+c3RhcnQg PiBuZXdfcmVzLT5lbmQpIHsKLQkJCW5ld19yZXMtPnNpYmxpbmcgPSAqb2xkX3JlczsKLQkJCWlm IChwcmV2X3JlcykKLQkJCQkoKnByZXZfcmVzKS0+c2libGluZyA9IG5ld19yZXM7Ci0JCQkqb2xk X3JlcyA9IG5ld19yZXM7CisJCWlmICh0bXAtPnN0YXJ0ID4gbmV3X3Jlcy0+ZW5kKSB7CisJCQls aXN0X2FkZCgmbmV3X3Jlcy0+c2libGluZywgdG1wLT5zaWJsaW5nLnByZXYpOwogCQkJYnJlYWs7 CiAJCX0KLQotCQlwcmV2X3JlcyA9IG9sZF9yZXM7Ci0JCW9sZF9yZXMgPSAmKCpvbGRfcmVzKS0+ c2libGluZzsKLQotCX0gd2hpbGUgKDEpOworCX0KIAogCXJldHVybiBBRV9PSzsKIH0KIAogc3Rh dGljIGludCB2bWJ1c19hY3BpX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKIHsK LQlzdHJ1Y3QgcmVzb3VyY2UgKmN1cl9yZXM7Ci0Jc3RydWN0IHJlc291cmNlICpuZXh0X3JlczsK KwlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsKIAogCWlmIChoeXBlcnZfbW1pbykgewogCQlpZiAoZmJf bW1pbykgewpAQCAtMTUwNywxMCArMTQ5OCw5IEBAIHN0YXRpYyBpbnQgdm1idXNfYWNwaV9yZW1v dmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCiAJCQlmYl9tbWlvID0gTlVMTDsKIAkJfQog Ci0JCWZvciAoY3VyX3JlcyA9IGh5cGVydl9tbWlvOyBjdXJfcmVzOyBjdXJfcmVzID0gbmV4dF9y ZXMpIHsKLQkJCW5leHRfcmVzID0gY3VyX3Jlcy0+c2libGluZzsKLQkJCWtmcmVlKGN1cl9yZXMp OwotCQl9CisJCXJlcyA9IGh5cGVydl9tbWlvOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20o cmVzLCAmcmVzLT5wYXJlbnQtPmNoaWxkLCBzaWJsaW5nKQorCQkJa2ZyZWUocmVzKTsKIAl9CiAK IAlyZXR1cm4gMDsKQEAgLTE1OTYsNyArMTU4Niw4IEBAIGludCB2bWJ1c19hbGxvY2F0ZV9tbWlv KHN0cnVjdCByZXNvdXJjZSAqKm5ldywgc3RydWN0IGh2X2RldmljZSAqZGV2aWNlX29iaiwKIAkJ fQogCX0KIAotCWZvciAoaXRlciA9IGh5cGVydl9tbWlvOyBpdGVyOyBpdGVyID0gaXRlci0+c2li bGluZykgeworCWl0ZXIgPSBoeXBlcnZfbW1pbzsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20o aXRlciwgJml0ZXItPnBhcmVudC0+Y2hpbGQsIHNpYmxpbmcpIHsKIAkJaWYgKChpdGVyLT5zdGFy dCA+PSBtYXgpIHx8IChpdGVyLT5lbmQgPD0gbWluKSkKIAkJCWNvbnRpbnVlOwogCkBAIC0xNjM5 LDcgKzE2MzAsOCBAQCB2b2lkIHZtYnVzX2ZyZWVfbW1pbyhyZXNvdXJjZV9zaXplX3Qgc3RhcnQs IHJlc291cmNlX3NpemVfdCBzaXplKQogCXN0cnVjdCByZXNvdXJjZSAqaXRlcjsKIAogCWRvd24o Jmh5cGVydl9tbWlvX2xvY2spOwotCWZvciAoaXRlciA9IGh5cGVydl9tbWlvOyBpdGVyOyBpdGVy ID0gaXRlci0+c2libGluZykgeworCWl0ZXIgPSBoeXBlcnZfbW1pbzsKKwlsaXN0X2Zvcl9lYWNo X2VudHJ5X2Zyb20oaXRlciwgJml0ZXItPnBhcmVudC0+Y2hpbGQsIHNpYmxpbmcpIHsKIAkJaWYg KChpdGVyLT5zdGFydCA+PSBzdGFydCArIHNpemUpIHx8IChpdGVyLT5lbmQgPD0gc3RhcnQpKQog CQkJY29udGludWU7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvam95c3RpY2svaWZvcmNl L2lmb3JjZS1tYWluLmMgYi9kcml2ZXJzL2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFp bi5jCmluZGV4IGRhZWViNGM3ZTNiMC4uNWMwYmUyN2IzM2ZmIDEwMDY0NAotLS0gYS9kcml2ZXJz L2lucHV0L2pveXN0aWNrL2lmb3JjZS9pZm9yY2UtbWFpbi5jCisrKyBiL2RyaXZlcnMvaW5wdXQv am95c3RpY2svaWZvcmNlL2lmb3JjZS1tYWluLmMKQEAgLTMwNSw4ICszMDUsOCBAQCBpbnQgaWZv cmNlX2luaXRfZGV2aWNlKHN0cnVjdCBpZm9yY2UgKmlmb3JjZSkKIAlpZm9yY2UtPmRldmljZV9t ZW1vcnkuZW5kID0gMjAwOwogCWlmb3JjZS0+ZGV2aWNlX21lbW9yeS5mbGFncyA9IElPUkVTT1VS Q0VfTUVNOwogCWlmb3JjZS0+ZGV2aWNlX21lbW9yeS5wYXJlbnQgPSBOVUxMOwotCWlmb3JjZS0+ ZGV2aWNlX21lbW9yeS5jaGlsZCA9IE5VTEw7Ci0JaWZvcmNlLT5kZXZpY2VfbWVtb3J5LnNpYmxp bmcgPSBOVUxMOworCUlOSVRfTElTVF9IRUFEKCZpZm9yY2UtPmRldmljZV9tZW1vcnkuY2hpbGQp OworCUlOSVRfTElTVF9IRUFEKCZpZm9yY2UtPmRldmljZV9tZW1vcnkuc2libGluZyk7CiAKIC8q CiAgKiBXYWl0IHVudGlsIGRldmljZSByZWFkeSAtIHVudGlsIGl0IHNlbmRzIGl0cyBmaXJzdCBy ZXNwb25zZS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL25hbWVzcGFjZV9kZXZzLmMgYi9k cml2ZXJzL252ZGltbS9uYW1lc3BhY2VfZGV2cy5jCmluZGV4IDI4YWZkZDY2ODkwNS4uZjUzZDQx MGQ5OTgxIDEwMDY0NAotLS0gYS9kcml2ZXJzL252ZGltbS9uYW1lc3BhY2VfZGV2cy5jCisrKyBi L2RyaXZlcnMvbnZkaW1tL25hbWVzcGFjZV9kZXZzLmMKQEAgLTYzNyw3ICs2MzcsNyBAQCBzdGF0 aWMgcmVzb3VyY2Vfc2l6ZV90IHNjYW5fYWxsb2NhdGUoc3RydWN0IG5kX3JlZ2lvbiAqbmRfcmVn aW9uLAogIHJldHJ5OgogCWZpcnN0ID0gMDsKIAlmb3JfZWFjaF9kcGFfcmVzb3VyY2UobmRkLCBy ZXMpIHsKLQkJc3RydWN0IHJlc291cmNlICpuZXh0ID0gcmVzLT5zaWJsaW5nLCAqbmV3X3JlcyA9 IE5VTEw7CisJCXN0cnVjdCByZXNvdXJjZSAqbmV4dCA9IHJlc291cmNlX3NpYmxpbmcocmVzKSwg Km5ld19yZXMgPSBOVUxMOwogCQlyZXNvdXJjZV9zaXplX3QgYWxsb2NhdGUsIGF2YWlsYWJsZSA9 IDA7CiAJCWVudW0gYWxsb2NfbG9jIGxvYyA9IEFMTE9DX0VSUjsKIAkJY29uc3QgY2hhciAqYWN0 aW9uOwpAQCAtNzYzLDcgKzc2Myw3IEBAIHN0YXRpYyByZXNvdXJjZV9zaXplX3Qgc2Nhbl9hbGxv Y2F0ZShzdHJ1Y3QgbmRfcmVnaW9uICpuZF9yZWdpb24sCiAJICogYW4gaW5pdGlhbCAicG1lbS1y ZXNlcnZlIHBhc3MiLiAgT25seSBkbyBhbiBpbml0aWFsIEJMSyBhbGxvY2F0aW9uCiAJICogd2hl biBub25lIG9mIHRoZSBEUEEgc3BhY2UgaXMgcmVzZXJ2ZWQuCiAJICovCi0JaWYgKChpc19wbWVt IHx8ICFuZGQtPmRwYS5jaGlsZCkgJiYgbiA9PSB0b19hbGxvY2F0ZSkKKwlpZiAoKGlzX3BtZW0g fHwgbGlzdF9lbXB0eSgmbmRkLT5kcGEuY2hpbGQpKSAmJiBuID09IHRvX2FsbG9jYXRlKQogCQly ZXR1cm4gaW5pdF9kcGFfYWxsb2NhdGlvbihsYWJlbF9pZCwgbmRfcmVnaW9uLCBuZF9tYXBwaW5n LCBuKTsKIAlyZXR1cm4gbjsKIH0KQEAgLTc3OSw3ICs3NzksNyBAQCBzdGF0aWMgaW50IG1lcmdl X2RwYShzdHJ1Y3QgbmRfcmVnaW9uICpuZF9yZWdpb24sCiAgcmV0cnk6CiAJZm9yX2VhY2hfZHBh X3Jlc291cmNlKG5kZCwgcmVzKSB7CiAJCWludCByYzsKLQkJc3RydWN0IHJlc291cmNlICpuZXh0 ID0gcmVzLT5zaWJsaW5nOworCQlzdHJ1Y3QgcmVzb3VyY2UgKm5leHQgPSByZXNvdXJjZV9zaWJs aW5nKHJlcyk7CiAJCXJlc291cmNlX3NpemVfdCBlbmQgPSByZXMtPnN0YXJ0ICsgcmVzb3VyY2Vf c2l6ZShyZXMpOwogCiAJCWlmICghbmV4dCB8fCBzdHJjbXAocmVzLT5uYW1lLCBsYWJlbF9pZC0+ aWQpICE9IDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL25kLmggYi9kcml2ZXJzL252ZGlt bS9uZC5oCmluZGV4IDMyZTAzNjRiNDhiOS4uZGE3ZGExNWUwM2U3IDEwMDY0NAotLS0gYS9kcml2 ZXJzL252ZGltbS9uZC5oCisrKyBiL2RyaXZlcnMvbnZkaW1tL25kLmgKQEAgLTEwMiwxMSArMTAy LDEwIEBAIHVuc2lnbmVkIHNpemVvZl9uYW1lc3BhY2VfbGFiZWwoc3RydWN0IG52ZGltbV9kcnZk YXRhICpuZGQpOwogCQkodW5zaWduZWQgbG9uZyBsb25nKSAocmVzID8gcmVzLT5zdGFydCA6IDAp LCAjI2FyZykKIAogI2RlZmluZSBmb3JfZWFjaF9kcGFfcmVzb3VyY2UobmRkLCByZXMpIFwKLQlm b3IgKHJlcyA9IChuZGQpLT5kcGEuY2hpbGQ7IHJlczsgcmVzID0gcmVzLT5zaWJsaW5nKQorCWxp c3RfZm9yX2VhY2hfZW50cnkocmVzLCAmKG5kZCktPmRwYS5jaGlsZCwgc2libGluZykKIAogI2Rl ZmluZSBmb3JfZWFjaF9kcGFfcmVzb3VyY2Vfc2FmZShuZGQsIHJlcywgbmV4dCkgXAotCWZvciAo cmVzID0gKG5kZCktPmRwYS5jaGlsZCwgbmV4dCA9IHJlcyA/IHJlcy0+c2libGluZyA6IE5VTEw7 IFwKLQkJCXJlczsgcmVzID0gbmV4dCwgbmV4dCA9IG5leHQgPyBuZXh0LT5zaWJsaW5nIDogTlVM TCkKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmVzLCBuZXh0LCAmKG5kZCktPmRwYS5jaGls ZCwgc2libGluZykKIAogc3RydWN0IG5kX3BlcmNwdV9sYW5lIHsKIAlpbnQgY291bnQ7CmRpZmYg LS1naXQgYS9kcml2ZXJzL29mL2FkZHJlc3MuYyBiL2RyaXZlcnMvb2YvYWRkcmVzcy5jCmluZGV4 IDUzMzQ5OTEyYWM3NS4uZTJlMjU3MTlhYjUyIDEwMDY0NAotLS0gYS9kcml2ZXJzL29mL2FkZHJl c3MuYworKysgYi9kcml2ZXJzL29mL2FkZHJlc3MuYwpAQCAtMzMwLDcgKzMzMCw5IEBAIGludCBv Zl9wY2lfcmFuZ2VfdG9fcmVzb3VyY2Uoc3RydWN0IG9mX3BjaV9yYW5nZSAqcmFuZ2UsCiB7CiAJ aW50IGVycjsKIAlyZXMtPmZsYWdzID0gcmFuZ2UtPmZsYWdzOwotCXJlcy0+cGFyZW50ID0gcmVz LT5jaGlsZCA9IHJlcy0+c2libGluZyA9IE5VTEw7CisJcmVzLT5wYXJlbnQgPSBOVUxMOworCUlO SVRfTElTVF9IRUFEKCZyZXMtPmNoaWxkKTsKKwlJTklUX0xJU1RfSEVBRCgmcmVzLT5zaWJsaW5n KTsKIAlyZXMtPm5hbWUgPSBucC0+ZnVsbF9uYW1lOwogCiAJaWYgKHJlcy0+ZmxhZ3MgJiBJT1JF U09VUkNFX0lPKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3BhcmlzYy9sYmFfcGNpLmMgYi9kcml2 ZXJzL3BhcmlzYy9sYmFfcGNpLmMKaW5kZXggNjliZDk4NDIxZWIxLi43NDgyYmRmZDE5NTkgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvcGFyaXNjL2xiYV9wY2kuYworKysgYi9kcml2ZXJzL3BhcmlzYy9s YmFfcGNpLmMKQEAgLTE3MCw4ICsxNzAsOCBAQCBsYmFfZHVtcF9yZXMoc3RydWN0IHJlc291cmNl ICpyLCBpbnQgZCkKIAlmb3IgKGkgPSBkOyBpIDsgLS1pKSBwcmludGsoIiAiKTsKIAlwcmludGso S0VSTl9ERUJVRyAiJXAgWyVseCwlbHhdLyVseFxuIiwgciwKIAkJKGxvbmcpci0+c3RhcnQsIChs b25nKXItPmVuZCwgci0+ZmxhZ3MpOwotCWxiYV9kdW1wX3JlcyhyLT5jaGlsZCwgZCsyKTsKLQls YmFfZHVtcF9yZXMoci0+c2libGluZywgZCk7CisJbGJhX2R1bXBfcmVzKHJlc291cmNlX2ZpcnN0 X2NoaWxkKCZyLT5jaGlsZCksIGQrMik7CisJbGJhX2R1bXBfcmVzKHJlc291cmNlX3NpYmxpbmco ciksIGQpOwogfQogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2hvc3Qvdm1kLmMgYi9kcml2 ZXJzL3BjaS9ob3N0L3ZtZC5jCmluZGV4IDk0MmI2NGZjN2YxZi4uZTNhY2UyMDM0NWM3IDEwMDY0 NAotLS0gYS9kcml2ZXJzL3BjaS9ob3N0L3ZtZC5jCisrKyBiL2RyaXZlcnMvcGNpL2hvc3Qvdm1k LmMKQEAgLTU0MiwxNCArNTQyLDE0IEBAIHN0YXRpYyBzdHJ1Y3QgcGNpX29wcyB2bWRfb3BzID0g ewogCiBzdGF0aWMgdm9pZCB2bWRfYXR0YWNoX3Jlc291cmNlcyhzdHJ1Y3Qgdm1kX2RldiAqdm1k KQogewotCXZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMV0uY2hpbGQgPSAmdm1kLT5yZXNv dXJjZXNbMV07Ci0Jdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIyXS5jaGlsZCA9ICZ2bWQt PnJlc291cmNlc1syXTsKKwlsaXN0X2FkZCgmdm1kLT5yZXNvdXJjZXNbMV0uc2libGluZywgJnZt ZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMV0uY2hpbGQpOworCWxpc3RfYWRkKCZ2bWQtPnJl c291cmNlc1syXS5zaWJsaW5nLCAmdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIyXS5jaGls ZCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZtZF9kZXRhY2hfcmVzb3VyY2VzKHN0cnVjdCB2bWRfZGV2 ICp2bWQpCiB7Ci0Jdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIxXS5jaGlsZCA9IE5VTEw7 Ci0Jdm1kLT5kZXYtPnJlc291cmNlW1ZNRF9NRU1CQVIyXS5jaGlsZCA9IE5VTEw7CisJSU5JVF9M SVNUX0hFQUQoJnZtZC0+ZGV2LT5yZXNvdXJjZVtWTURfTUVNQkFSMV0uY2hpbGQpOworCUlOSVRf TElTVF9IRUFEKCZ2bWQtPmRldi0+cmVzb3VyY2VbVk1EX01FTUJBUjJdLmNoaWxkKTsKIH0KIAog LyoKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL3Byb2JlLmMgYi9kcml2ZXJzL3BjaS9wcm9iZS5j CmluZGV4IGFjODc2ZTMyZGU0Yi4uOTYyNGRkMWRmZDQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL3Bj aS9wcm9iZS5jCisrKyBiL2RyaXZlcnMvcGNpL3Byb2JlLmMKQEAgLTU5LDYgKzU5LDggQEAgc3Rh dGljIHN0cnVjdCByZXNvdXJjZSAqZ2V0X3BjaV9kb21haW5fYnVzbl9yZXMoaW50IGRvbWFpbl9u cikKIAlyLT5yZXMuc3RhcnQgPSAwOwogCXItPnJlcy5lbmQgPSAweGZmOwogCXItPnJlcy5mbGFn cyA9IElPUkVTT1VSQ0VfQlVTIHwgSU9SRVNPVVJDRV9QQ0lfRklYRUQ7CisJSU5JVF9MSVNUX0hF QUQoJnItPnJlcy5jaGlsZCk7CisJSU5JVF9MSVNUX0hFQUQoJnItPnJlcy5zaWJsaW5nKTsKIAog CWxpc3RfYWRkX3RhaWwoJnItPmxpc3QsICZwY2lfZG9tYWluX2J1c25fcmVzX2xpc3QpOwogCmRp ZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYyBiL2RyaXZlcnMvcGNpL3NldHVwLWJ1 cy5jCmluZGV4IDc5YjE4MjRlODNiNC4uOGU2ODVhZjg5MzhkIDEwMDY0NAotLS0gYS9kcml2ZXJz L3BjaS9zZXR1cC1idXMuYworKysgYi9kcml2ZXJzL3BjaS9zZXR1cC1idXMuYwpAQCAtMjEwNyw3 ICsyMTA3LDcgQEAgaW50IHBjaV9yZWFzc2lnbl9icmlkZ2VfcmVzb3VyY2VzKHN0cnVjdCBwY2lf ZGV2ICpicmlkZ2UsIHVuc2lnbmVkIGxvbmcgdHlwZSkKIAkJCQljb250aW51ZTsKIAogCQkJLyog SWdub3JlIEJBUnMgd2hpY2ggYXJlIHN0aWxsIGluIHVzZSAqLwotCQkJaWYgKHJlcy0+Y2hpbGQp CisJCQlpZiAoIWxpc3RfZW1wdHkoJnJlcy0+Y2hpbGQpKQogCQkJCWNvbnRpbnVlOwogCiAJCQly ZXQgPSBhZGRfdG9fbGlzdCgmc2F2ZWQsIGJyaWRnZSwgcmVzLCAwLCAwKTsKZGlmZiAtLWdpdCBh L2luY2x1ZGUvbGludXgvaW9wb3J0LmggYi9pbmNsdWRlL2xpbnV4L2lvcG9ydC5oCmluZGV4IGRm ZGNkMGJmZTU0ZS4uYjc0NTZhZTg4OWRkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2lvcG9y dC5oCisrKyBiL2luY2x1ZGUvbGludXgvaW9wb3J0LmgKQEAgLTEyLDYgKzEyLDcgQEAKICNpZm5k ZWYgX19BU1NFTUJMWV9fCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KICNpbmNsdWRlIDxs aW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KIC8qCiAgKiBSZXNvdXJjZXMg YXJlIHRyZWUtbGlrZSwgYWxsb3dpbmcKICAqIG5lc3RpbmcgZXRjLi4KQEAgLTIyLDcgKzIzLDgg QEAgc3RydWN0IHJlc291cmNlIHsKIAljb25zdCBjaGFyICpuYW1lOwogCXVuc2lnbmVkIGxvbmcg ZmxhZ3M7CiAJdW5zaWduZWQgbG9uZyBkZXNjOwotCXN0cnVjdCByZXNvdXJjZSAqcGFyZW50LCAq c2libGluZywgKmNoaWxkOworCXN0cnVjdCBsaXN0X2hlYWQgY2hpbGQsIHNpYmxpbmc7CisJc3Ry dWN0IHJlc291cmNlICpwYXJlbnQ7CiB9OwogCiAvKgpAQCAtMjE2LDcgKzIxOCw2IEBAIHN0YXRp YyBpbmxpbmUgYm9vbCByZXNvdXJjZV9jb250YWlucyhzdHJ1Y3QgcmVzb3VyY2UgKnIxLCBzdHJ1 Y3QgcmVzb3VyY2UgKnIyKQogCXJldHVybiByMS0+c3RhcnQgPD0gcjItPnN0YXJ0ICYmIHIxLT5l bmQgPj0gcjItPmVuZDsKIH0KIAotCiAvKiBDb252ZW5pZW5jZSBzaG9ydGhhbmQgd2l0aCBhbGxv Y2F0aW9uICovCiAjZGVmaW5lIHJlcXVlc3RfcmVnaW9uKHN0YXJ0LG4sbmFtZSkJCV9fcmVxdWVz dF9yZWdpb24oJmlvcG9ydF9yZXNvdXJjZSwgKHN0YXJ0KSwgKG4pLCAobmFtZSksIDApCiAjZGVm aW5lIHJlcXVlc3RfbXV4ZWRfcmVnaW9uKHN0YXJ0LG4sbmFtZSkJX19yZXF1ZXN0X3JlZ2lvbigm aW9wb3J0X3Jlc291cmNlLCAoc3RhcnQpLCAobiksIChuYW1lKSwgSU9SRVNPVVJDRV9NVVhFRCkK QEAgLTI4Nyw2ICsyODgsMTggQEAgc3RhdGljIGlubGluZSBib29sIHJlc291cmNlX292ZXJsYXBz KHN0cnVjdCByZXNvdXJjZSAqcjEsIHN0cnVjdCByZXNvdXJjZSAqcjIpCiAgICAgICAgcmV0dXJu IChyMS0+c3RhcnQgPD0gcjItPmVuZCAmJiByMS0+ZW5kID49IHIyLT5zdGFydCk7CiB9CiAKK3N0 YXRpYyBpbmxpbmUgc3RydWN0IHJlc291cmNlICpyZXNvdXJjZV9zaWJsaW5nKHN0cnVjdCByZXNv dXJjZSAqcmVzKQoreworCWlmIChyZXMtPnBhcmVudCAmJiAhbGlzdF9pc19sYXN0KCZyZXMtPnNp YmxpbmcsICZyZXMtPnBhcmVudC0+Y2hpbGQpKQorCQlyZXR1cm4gbGlzdF9uZXh0X2VudHJ5KHJl cywgc2libGluZyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHJl c291cmNlICpyZXNvdXJjZV9maXJzdF9jaGlsZChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQorewor CXJldHVybiBsaXN0X2ZpcnN0X2VudHJ5X29yX251bGwoaGVhZCwgc3RydWN0IHJlc291cmNlLCBz aWJsaW5nKTsKK30KKwogCiAjZW5kaWYgLyogX19BU1NFTUJMWV9fICovCiAjZW5kaWYJLyogX0xJ TlVYX0lPUE9SVF9IICovCmRpZmYgLS1naXQgYS9rZXJuZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9y ZXNvdXJjZS5jCmluZGV4IDVlN2M1NmQ1ZDgzOC4uZWY5YTIwYjc1MjM0IDEwMDY0NAotLS0gYS9r ZXJuZWwvcmVzb3VyY2UuYworKysgYi9rZXJuZWwvcmVzb3VyY2UuYwpAQCAtMzEsNiArMzEsOCBA QCBzdHJ1Y3QgcmVzb3VyY2UgaW9wb3J0X3Jlc291cmNlID0gewogCS5zdGFydAk9IDAsCiAJLmVu ZAk9IElPX1NQQUNFX0xJTUlULAogCS5mbGFncwk9IElPUkVTT1VSQ0VfSU8sCisJLnNpYmxpbmcg PSBMSVNUX0hFQURfSU5JVChpb3BvcnRfcmVzb3VyY2Uuc2libGluZyksCisJLmNoaWxkICA9IExJ U1RfSEVBRF9JTklUKGlvcG9ydF9yZXNvdXJjZS5jaGlsZCksCiB9OwogRVhQT1JUX1NZTUJPTChp b3BvcnRfcmVzb3VyY2UpOwogCkBAIC0zOSw2ICs0MSw4IEBAIHN0cnVjdCByZXNvdXJjZSBpb21l bV9yZXNvdXJjZSA9IHsKIAkuc3RhcnQJPSAwLAogCS5lbmQJPSAtMSwKIAkuZmxhZ3MJPSBJT1JF U09VUkNFX01FTSwKKwkuc2libGluZyA9IExJU1RfSEVBRF9JTklUKGlvbWVtX3Jlc291cmNlLnNp YmxpbmcpLAorCS5jaGlsZCAgPSBMSVNUX0hFQURfSU5JVChpb21lbV9yZXNvdXJjZS5jaGlsZCks CiB9OwogRVhQT1JUX1NZTUJPTChpb21lbV9yZXNvdXJjZSk7CiAKQEAgLTU3LDIwICs2MSwyMCBA QCBzdGF0aWMgREVGSU5FX1JXTE9DSyhyZXNvdXJjZV9sb2NrKTsKICAqIGJ5IGJvb3QgbWVtIGFm dGVyIHRoZSBzeXN0ZW0gaXMgdXAuIFNvIGZvciByZXVzaW5nIHRoZSByZXNvdXJjZSBlbnRyeQog ICogd2UgbmVlZCB0byByZW1lbWJlciB0aGUgcmVzb3VyY2UuCiAgKi8KLXN0YXRpYyBzdHJ1Y3Qg cmVzb3VyY2UgKmJvb3RtZW1fcmVzb3VyY2VfZnJlZTsKK3N0YXRpYyBzdHJ1Y3QgbGlzdF9oZWFk IGJvb3RtZW1fcmVzb3VyY2VfZnJlZSA9IExJU1RfSEVBRF9JTklUKGJvb3RtZW1fcmVzb3VyY2Vf ZnJlZSk7CiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJvb3RtZW1fcmVzb3VyY2VfbG9jayk7CiAK IHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKm5leHRfcmVzb3VyY2Uoc3RydWN0IHJlc291cmNlICpw LCBib29sIHNpYmxpbmdfb25seSkKIHsKIAkvKiBDYWxsZXIgd2FudHMgdG8gdHJhdmVyc2UgdGhy b3VnaCBzaWJsaW5ncyBvbmx5ICovCiAJaWYgKHNpYmxpbmdfb25seSkKLQkJcmV0dXJuIHAtPnNp Ymxpbmc7CisJCXJldHVybiByZXNvdXJjZV9zaWJsaW5nKHApOwogCi0JaWYgKHAtPmNoaWxkKQot CQlyZXR1cm4gcC0+Y2hpbGQ7Ci0Jd2hpbGUgKCFwLT5zaWJsaW5nICYmIHAtPnBhcmVudCkKKwlp ZiAoIWxpc3RfZW1wdHkoJnAtPmNoaWxkKSkKKwkJcmV0dXJuIHJlc291cmNlX2ZpcnN0X2NoaWxk KCZwLT5jaGlsZCk7CisJd2hpbGUgKCFyZXNvdXJjZV9zaWJsaW5nKHApICYmIHAtPnBhcmVudCkK IAkJcCA9IHAtPnBhcmVudDsKLQlyZXR1cm4gcC0+c2libGluZzsKKwlyZXR1cm4gcmVzb3VyY2Vf c2libGluZyhwKTsKIH0KIAogc3RhdGljIHZvaWQgKnJfbmV4dChzdHJ1Y3Qgc2VxX2ZpbGUgKm0s IHZvaWQgKnYsIGxvZmZfdCAqcG9zKQpAQCAtOTAsNyArOTQsNyBAQCBzdGF0aWMgdm9pZCAqcl9z dGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogCXN0cnVjdCByZXNvdXJjZSAq cCA9IFBERV9EQVRBKGZpbGVfaW5vZGUobS0+ZmlsZSkpOwogCWxvZmZfdCBsID0gMDsKIAlyZWFk X2xvY2soJnJlc291cmNlX2xvY2spOwotCWZvciAocCA9IHAtPmNoaWxkOyBwICYmIGwgPCAqcG9z OyBwID0gcl9uZXh0KG0sIHAsICZsKSkKKwlmb3IgKHAgPSByZXNvdXJjZV9maXJzdF9jaGlsZCgm cC0+Y2hpbGQpOyBwICYmIGwgPCAqcG9zOyBwID0gcl9uZXh0KG0sIHAsICZsKSkKIAkJOwogCXJl dHVybiBwOwogfQpAQCAtMTUzLDggKzE1Nyw3IEBAIHN0YXRpYyB2b2lkIGZyZWVfcmVzb3VyY2Uo c3RydWN0IHJlc291cmNlICpyZXMpCiAKIAlpZiAoIVBhZ2VTbGFiKHZpcnRfdG9faGVhZF9wYWdl KHJlcykpKSB7CiAJCXNwaW5fbG9jaygmYm9vdG1lbV9yZXNvdXJjZV9sb2NrKTsKLQkJcmVzLT5z aWJsaW5nID0gYm9vdG1lbV9yZXNvdXJjZV9mcmVlOwotCQlib290bWVtX3Jlc291cmNlX2ZyZWUg PSByZXM7CisJCWxpc3RfYWRkKCZyZXMtPnNpYmxpbmcsICZib290bWVtX3Jlc291cmNlX2ZyZWUp OwogCQlzcGluX3VubG9jaygmYm9vdG1lbV9yZXNvdXJjZV9sb2NrKTsKIAl9IGVsc2UgewogCQlr ZnJlZShyZXMpOwpAQCAtMTY2LDEwICsxNjksOSBAQCBzdGF0aWMgc3RydWN0IHJlc291cmNlICph bGxvY19yZXNvdXJjZShnZnBfdCBmbGFncykKIAlzdHJ1Y3QgcmVzb3VyY2UgKnJlcyA9IE5VTEw7 CiAKIAlzcGluX2xvY2soJmJvb3RtZW1fcmVzb3VyY2VfbG9jayk7Ci0JaWYgKGJvb3RtZW1fcmVz b3VyY2VfZnJlZSkgewotCQlyZXMgPSBib290bWVtX3Jlc291cmNlX2ZyZWU7Ci0JCWJvb3RtZW1f cmVzb3VyY2VfZnJlZSA9IHJlcy0+c2libGluZzsKLQl9CisJcmVzID0gcmVzb3VyY2VfZmlyc3Rf Y2hpbGQoJmJvb3RtZW1fcmVzb3VyY2VfZnJlZSk7CisJaWYgKHJlcykKKwkJbGlzdF9kZWwoJnJl cy0+c2libGluZyk7CiAJc3Bpbl91bmxvY2soJmJvb3RtZW1fcmVzb3VyY2VfbG9jayk7CiAKIAlp ZiAocmVzKQpAQCAtMTc3LDYgKzE3OSw4IEBAIHN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgKmFsbG9j X3Jlc291cmNlKGdmcF90IGZsYWdzKQogCWVsc2UKIAkJcmVzID0ga3phbGxvYyhzaXplb2Yoc3Ry dWN0IHJlc291cmNlKSwgZmxhZ3MpOwogCisJSU5JVF9MSVNUX0hFQUQoJnJlcy0+Y2hpbGQpOwor CUlOSVRfTElTVF9IRUFEKCZyZXMtPnNpYmxpbmcpOwogCXJldHVybiByZXM7CiB9CiAKQEAgLTE4 NSw3ICsxODksNyBAQCBzdGF0aWMgc3RydWN0IHJlc291cmNlICogX19yZXF1ZXN0X3Jlc291cmNl KHN0cnVjdCByZXNvdXJjZSAqcm9vdCwgc3RydWN0IHJlc291cgogewogCXJlc291cmNlX3NpemVf dCBzdGFydCA9IG5ldy0+c3RhcnQ7CiAJcmVzb3VyY2Vfc2l6ZV90IGVuZCA9IG5ldy0+ZW5kOwot CXN0cnVjdCByZXNvdXJjZSAqdG1wLCAqKnA7CisJc3RydWN0IHJlc291cmNlICp0bXA7CiAKIAlp ZiAoZW5kIDwgc3RhcnQpCiAJCXJldHVybiByb290OwpAQCAtMTkzLDY0ICsxOTcsNjIgQEAgc3Rh dGljIHN0cnVjdCByZXNvdXJjZSAqIF9fcmVxdWVzdF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2Ug KnJvb3QsIHN0cnVjdCByZXNvdXIKIAkJcmV0dXJuIHJvb3Q7CiAJaWYgKGVuZCA+IHJvb3QtPmVu ZCkKIAkJcmV0dXJuIHJvb3Q7Ci0JcCA9ICZyb290LT5jaGlsZDsKLQlmb3IgKDs7KSB7Ci0JCXRt cCA9ICpwOwotCQlpZiAoIXRtcCB8fCB0bXAtPnN0YXJ0ID4gZW5kKSB7Ci0JCQluZXctPnNpYmxp bmcgPSB0bXA7Ci0JCQkqcCA9IG5ldzsKKworCWlmIChsaXN0X2VtcHR5KCZyb290LT5jaGlsZCkp IHsKKwkJbGlzdF9hZGQoJm5ldy0+c2libGluZywgJnJvb3QtPmNoaWxkKTsKKwkJbmV3LT5wYXJl bnQgPSByb290OworCQlJTklUX0xJU1RfSEVBRCgmbmV3LT5jaGlsZCk7CisJCXJldHVybiBOVUxM OworCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkodG1wLCAmcm9vdC0+Y2hpbGQsIHNpYmxpbmcp IHsKKwkJaWYgKHRtcC0+c3RhcnQgPiBlbmQpIHsKKwkJCWxpc3RfYWRkKCZuZXctPnNpYmxpbmcs IHRtcC0+c2libGluZy5wcmV2KTsKIAkJCW5ldy0+cGFyZW50ID0gcm9vdDsKKwkJCUlOSVRfTElT VF9IRUFEKCZuZXctPmNoaWxkKTsKIAkJCXJldHVybiBOVUxMOwogCQl9Ci0JCXAgPSAmdG1wLT5z aWJsaW5nOwogCQlpZiAodG1wLT5lbmQgPCBzdGFydCkKIAkJCWNvbnRpbnVlOwogCQlyZXR1cm4g dG1wOwogCX0KKworCWxpc3RfYWRkX3RhaWwoJm5ldy0+c2libGluZywgJnJvb3QtPmNoaWxkKTsK KwluZXctPnBhcmVudCA9IHJvb3Q7CisJSU5JVF9MSVNUX0hFQUQoJm5ldy0+Y2hpbGQpOworCXJl dHVybiBOVUxMOwogfQogCiBzdGF0aWMgaW50IF9fcmVsZWFzZV9yZXNvdXJjZShzdHJ1Y3QgcmVz b3VyY2UgKm9sZCwgYm9vbCByZWxlYXNlX2NoaWxkKQogewotCXN0cnVjdCByZXNvdXJjZSAqdG1w LCAqKnAsICpjaGQ7CisJc3RydWN0IHJlc291cmNlICp0bXAsICpuZXh0LCAqY2hkOwogCi0JcCA9 ICZvbGQtPnBhcmVudC0+Y2hpbGQ7Ci0JZm9yICg7OykgewotCQl0bXAgPSAqcDsKLQkJaWYgKCF0 bXApCi0JCQlicmVhazsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUodG1wLCBuZXh0LCAmb2xk LT5wYXJlbnQtPmNoaWxkLCBzaWJsaW5nKSB7CiAJCWlmICh0bXAgPT0gb2xkKSB7Ci0JCQlpZiAo cmVsZWFzZV9jaGlsZCB8fCAhKHRtcC0+Y2hpbGQpKSB7Ci0JCQkJKnAgPSB0bXAtPnNpYmxpbmc7 CisJCQlpZiAocmVsZWFzZV9jaGlsZCB8fCBsaXN0X2VtcHR5KCZ0bXAtPmNoaWxkKSkgeworCQkJ CWxpc3RfZGVsKCZ0bXAtPnNpYmxpbmcpOwogCQkJfSBlbHNlIHsKLQkJCQlmb3IgKGNoZCA9IHRt cC0+Y2hpbGQ7OyBjaGQgPSBjaGQtPnNpYmxpbmcpIHsKKwkJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5 KGNoZCwgJnRtcC0+Y2hpbGQsIHNpYmxpbmcpCiAJCQkJCWNoZC0+cGFyZW50ID0gdG1wLT5wYXJl bnQ7Ci0JCQkJCWlmICghKGNoZC0+c2libGluZykpCi0JCQkJCQlicmVhazsKLQkJCQl9Ci0JCQkJ KnAgPSB0bXAtPmNoaWxkOwotCQkJCWNoZC0+c2libGluZyA9IHRtcC0+c2libGluZzsKKwkJCQls aXN0X3NwbGljZSgmdG1wLT5jaGlsZCwgdG1wLT5zaWJsaW5nLnByZXYpOworCQkJCWxpc3RfZGVs KCZ0bXAtPnNpYmxpbmcpOwogCQkJfQorCiAJCQlvbGQtPnBhcmVudCA9IE5VTEw7CiAJCQlyZXR1 cm4gMDsKIAkJfQotCQlwID0gJnRtcC0+c2libGluZzsKIAl9CiAJcmV0dXJuIC1FSU5WQUw7CiB9 CiAKIHN0YXRpYyB2b2lkIF9fcmVsZWFzZV9jaGlsZF9yZXNvdXJjZXMoc3RydWN0IHJlc291cmNl ICpyKQogewotCXN0cnVjdCByZXNvdXJjZSAqdG1wLCAqcDsKKwlzdHJ1Y3QgcmVzb3VyY2UgKnRt cCwgKm5leHQ7CiAJcmVzb3VyY2Vfc2l6ZV90IHNpemU7CiAKLQlwID0gci0+Y2hpbGQ7Ci0Jci0+ Y2hpbGQgPSBOVUxMOwotCXdoaWxlIChwKSB7Ci0JCXRtcCA9IHA7Ci0JCXAgPSBwLT5zaWJsaW5n OwotCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRtcCwgbmV4dCwgJnItPmNoaWxkLCBzaWJs aW5nKSB7CiAJCXRtcC0+cGFyZW50ID0gTlVMTDsKLQkJdG1wLT5zaWJsaW5nID0gTlVMTDsKKwkJ SU5JVF9MSVNUX0hFQUQoJnRtcC0+c2libGluZyk7CiAJCV9fcmVsZWFzZV9jaGlsZF9yZXNvdXJj ZXModG1wKTsKIAogCQlwcmludGsoS0VSTl9ERUJVRyAicmVsZWFzZSBjaGlsZCByZXNvdXJjZSAl cFJcbiIsIHRtcCk7CkBAIC0yNTksNiArMjYxLDggQEAgc3RhdGljIHZvaWQgX19yZWxlYXNlX2No aWxkX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnIpCiAJCXRtcC0+c3RhcnQgPSAwOwogCQl0 bXAtPmVuZCA9IHNpemUgLSAxOwogCX0KKworCUlOSVRfTElTVF9IRUFEKCZ0bXAtPmNoaWxkKTsK IH0KIAogdm9pZCByZWxlYXNlX2NoaWxkX3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnIpCkBA IC0zNDMsNyArMzQ3LDggQEAgc3RhdGljIGludCBmaW5kX25leHRfaW9tZW1fcmVzKHN0cnVjdCBy ZXNvdXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIGRlc2MsCiAKIAlyZWFkX2xvY2soJnJlc291cmNl X2xvY2spOwogCi0JZm9yIChwID0gaW9tZW1fcmVzb3VyY2UuY2hpbGQ7IHA7IHAgPSBuZXh0X3Jl c291cmNlKHAsIHNpYmxpbmdfb25seSkpIHsKKwlmb3IgKHAgPSByZXNvdXJjZV9maXJzdF9jaGls ZCgmaW9tZW1fcmVzb3VyY2UuY2hpbGQpOyBwOworCQkJcCA9IG5leHRfcmVzb3VyY2UocCwgc2li bGluZ19vbmx5KSkgewogCQlpZiAoKHAtPmZsYWdzICYgcmVzLT5mbGFncykgIT0gcmVzLT5mbGFn cykKIAkJCWNvbnRpbnVlOwogCQlpZiAoKGRlc2MgIT0gSU9SRVNfREVTQ19OT05FKSAmJiAoZGVz YyAhPSBwLT5kZXNjKSkKQEAgLTUzMiw3ICs1MzcsNyBAQCBpbnQgcmVnaW9uX2ludGVyc2VjdHMo cmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncywK IAlzdHJ1Y3QgcmVzb3VyY2UgKnA7CiAKIAlyZWFkX2xvY2soJnJlc291cmNlX2xvY2spOwotCWZv ciAocCA9IGlvbWVtX3Jlc291cmNlLmNoaWxkOyBwIDsgcCA9IHAtPnNpYmxpbmcpIHsKKwlsaXN0 X2Zvcl9lYWNoX2VudHJ5KHAsICZpb21lbV9yZXNvdXJjZS5jaGlsZCwgc2libGluZykgewogCQli b29sIGlzX3R5cGUgPSAoKChwLT5mbGFncyAmIGZsYWdzKSA9PSBmbGFncykgJiYKIAkJCQkoKGRl c2MgPT0gSU9SRVNfREVTQ19OT05FKSB8fAogCQkJCSAoZGVzYyA9PSBwLT5kZXNjKSkpOwpAQCAt NTg2LDcgKzU5MSw3IEBAIHN0YXRpYyBpbnQgX19maW5kX3Jlc291cmNlKHN0cnVjdCByZXNvdXJj ZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpvbGQsCiAJCQkgcmVzb3VyY2Vfc2l6ZV90ICBzaXpl LAogCQkJIHN0cnVjdCByZXNvdXJjZV9jb25zdHJhaW50ICpjb25zdHJhaW50KQogewotCXN0cnVj dCByZXNvdXJjZSAqdGhpcyA9IHJvb3QtPmNoaWxkOworCXN0cnVjdCByZXNvdXJjZSAqdGhpcyA9 IHJlc291cmNlX2ZpcnN0X2NoaWxkKCZyb290LT5jaGlsZCk7CiAJc3RydWN0IHJlc291cmNlIHRt cCA9ICpuZXcsIGF2YWlsLCBhbGxvYzsKIAogCXRtcC5zdGFydCA9IHJvb3QtPnN0YXJ0OwpAQCAt NTk2LDcgKzYwMSw3IEBAIHN0YXRpYyBpbnQgX19maW5kX3Jlc291cmNlKHN0cnVjdCByZXNvdXJj ZSAqcm9vdCwgc3RydWN0IHJlc291cmNlICpvbGQsCiAJICovCiAJaWYgKHRoaXMgJiYgdGhpcy0+ c3RhcnQgPT0gcm9vdC0+c3RhcnQpIHsKIAkJdG1wLnN0YXJ0ID0gKHRoaXMgPT0gb2xkKSA/IG9s ZC0+c3RhcnQgOiB0aGlzLT5lbmQgKyAxOwotCQl0aGlzID0gdGhpcy0+c2libGluZzsKKwkJdGhp cyA9IHJlc291cmNlX3NpYmxpbmcodGhpcyk7CiAJfQogCWZvcig7OykgewogCQlpZiAodGhpcykK QEAgLTYzMiw3ICs2MzcsNyBAQCBuZXh0OgkJaWYgKCF0aGlzIHx8IHRoaXMtPmVuZCA9PSByb290 LT5lbmQpCiAKIAkJaWYgKHRoaXMgIT0gb2xkKQogCQkJdG1wLnN0YXJ0ID0gdGhpcy0+ZW5kICsg MTsKLQkJdGhpcyA9IHRoaXMtPnNpYmxpbmc7CisJCXRoaXMgPSByZXNvdXJjZV9zaWJsaW5nKHRo aXMpOwogCX0KIAlyZXR1cm4gLUVCVVNZOwogfQpAQCAtNjc2LDcgKzY4MSw3IEBAIHN0YXRpYyBp bnQgcmVhbGxvY2F0ZV9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnJvb3QsIHN0cnVjdCByZXNv dXJjZSAqb2xkLAogCQlnb3RvIG91dDsKIAl9CiAKLQlpZiAob2xkLT5jaGlsZCkgeworCWlmICgh bGlzdF9lbXB0eSgmb2xkLT5jaGlsZCkpIHsKIAkJZXJyID0gLUVCVVNZOwogCQlnb3RvIG91dDsK IAl9CkBAIC03NTcsNyArNzYyLDcgQEAgc3RydWN0IHJlc291cmNlICpsb29rdXBfcmVzb3VyY2Uo c3RydWN0IHJlc291cmNlICpyb290LCByZXNvdXJjZV9zaXplX3Qgc3RhcnQpCiAJc3RydWN0IHJl c291cmNlICpyZXM7CiAKIAlyZWFkX2xvY2soJnJlc291cmNlX2xvY2spOwotCWZvciAocmVzID0g cm9vdC0+Y2hpbGQ7IHJlczsgcmVzID0gcmVzLT5zaWJsaW5nKSB7CisJbGlzdF9mb3JfZWFjaF9l bnRyeShyZXMsICZyb290LT5jaGlsZCwgc2libGluZykgewogCQlpZiAocmVzLT5zdGFydCA9PSBz dGFydCkKIAkJCWJyZWFrOwogCX0KQEAgLTc5MCwzMiArNzk1LDI3IEBAIHN0YXRpYyBzdHJ1Y3Qg cmVzb3VyY2UgKiBfX2luc2VydF9yZXNvdXJjZShzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwgc3Ry dWN0IHJlc291CiAJCQlicmVhazsKIAl9CiAKLQlmb3IgKG5leHQgPSBmaXJzdDsgOyBuZXh0ID0g bmV4dC0+c2libGluZykgeworCWZvciAobmV4dCA9IGZpcnN0OyA7IG5leHQgPSByZXNvdXJjZV9z aWJsaW5nKG5leHQpKSB7CiAJCS8qIFBhcnRpYWwgb3ZlcmxhcD8gQmFkLCBhbmQgdW5maXhhYmxl ICovCiAJCWlmIChuZXh0LT5zdGFydCA8IG5ldy0+c3RhcnQgfHwgbmV4dC0+ZW5kID4gbmV3LT5l bmQpCiAJCQlyZXR1cm4gbmV4dDsKLQkJaWYgKCFuZXh0LT5zaWJsaW5nKQorCQlpZiAoIXJlc291 cmNlX3NpYmxpbmcobmV4dCkpCiAJCQlicmVhazsKLQkJaWYgKG5leHQtPnNpYmxpbmctPnN0YXJ0 ID4gbmV3LT5lbmQpCisJCWlmIChyZXNvdXJjZV9zaWJsaW5nKG5leHQpLT5zdGFydCA+IG5ldy0+ ZW5kKQogCQkJYnJlYWs7CiAJfQotCiAJbmV3LT5wYXJlbnQgPSBwYXJlbnQ7Ci0JbmV3LT5zaWJs aW5nID0gbmV4dC0+c2libGluZzsKLQluZXctPmNoaWxkID0gZmlyc3Q7CisJbGlzdF9hZGQoJm5l dy0+c2libGluZywgJm5leHQtPnNpYmxpbmcpOworCUlOSVRfTElTVF9IRUFEKCZuZXctPmNoaWxk KTsKIAotCW5leHQtPnNpYmxpbmcgPSBOVUxMOwotCWZvciAobmV4dCA9IGZpcnN0OyBuZXh0OyBu ZXh0ID0gbmV4dC0+c2libGluZykKKwkvKgorCSAqIEZyb20gZmlyc3QgdG8gbmV4dCwgdGhleSBh bGwgZmFsbCBpbnRvIG5ldydzIHJlZ2lvbiwgc28gY2hhbmdlIHRoZW0KKwkgKiBhcyBuZXcncyBj aGlsZHJlbi4KKwkgKi8KKwlsaXN0X2N1dF9wb3NpdGlvbigmbmV3LT5jaGlsZCwgZmlyc3QtPnNp YmxpbmcucHJldiwgJm5leHQtPnNpYmxpbmcpOworCWxpc3RfZm9yX2VhY2hfZW50cnkobmV4dCwg Jm5ldy0+Y2hpbGQsIHNpYmxpbmcpCiAJCW5leHQtPnBhcmVudCA9IG5ldzsKIAotCWlmIChwYXJl bnQtPmNoaWxkID09IGZpcnN0KSB7Ci0JCXBhcmVudC0+Y2hpbGQgPSBuZXc7Ci0JfSBlbHNlIHsK LQkJbmV4dCA9IHBhcmVudC0+Y2hpbGQ7Ci0JCXdoaWxlIChuZXh0LT5zaWJsaW5nICE9IGZpcnN0 KQotCQkJbmV4dCA9IG5leHQtPnNpYmxpbmc7Ci0JCW5leHQtPnNpYmxpbmcgPSBuZXc7Ci0JfQog CXJldHVybiBOVUxMOwogfQogCkBAIC05MzcsMTkgKzkzNywxNyBAQCBzdGF0aWMgaW50IF9fYWRq dXN0X3Jlc291cmNlKHN0cnVjdCByZXNvdXJjZSAqcmVzLCByZXNvdXJjZV9zaXplX3Qgc3RhcnQs CiAJaWYgKChzdGFydCA8IHBhcmVudC0+c3RhcnQpIHx8IChlbmQgPiBwYXJlbnQtPmVuZCkpCiAJ CWdvdG8gb3V0OwogCi0JaWYgKHJlcy0+c2libGluZyAmJiAocmVzLT5zaWJsaW5nLT5zdGFydCA8 PSBlbmQpKQorCWlmIChyZXNvdXJjZV9zaWJsaW5nKHJlcykgJiYgKHJlc291cmNlX3NpYmxpbmco cmVzKS0+c3RhcnQgPD0gZW5kKSkKIAkJZ290byBvdXQ7CiAKLQl0bXAgPSBwYXJlbnQtPmNoaWxk OwotCWlmICh0bXAgIT0gcmVzKSB7Ci0JCXdoaWxlICh0bXAtPnNpYmxpbmcgIT0gcmVzKQotCQkJ dG1wID0gdG1wLT5zaWJsaW5nOworCWlmIChyZXMtPnNpYmxpbmcucHJldiAhPSAmcGFyZW50LT5j aGlsZCkgeworCQl0bXAgPSBsaXN0X3ByZXZfZW50cnkocmVzLCBzaWJsaW5nKTsKIAkJaWYgKHN0 YXJ0IDw9IHRtcC0+ZW5kKQogCQkJZ290byBvdXQ7CiAJfQogCiBza2lwOgotCWZvciAodG1wID0g cmVzLT5jaGlsZDsgdG1wOyB0bXAgPSB0bXAtPnNpYmxpbmcpCisJbGlzdF9mb3JfZWFjaF9lbnRy eSh0bXAsICZyZXMtPmNoaWxkLCBzaWJsaW5nKQogCQlpZiAoKHRtcC0+c3RhcnQgPCBzdGFydCkg fHwgKHRtcC0+ZW5kID4gZW5kKSkKIAkJCWdvdG8gb3V0OwogCkBAIC05ODcsMzEgKzk4NSwzMyBA QCBFWFBPUlRfU1lNQk9MKGFkanVzdF9yZXNvdXJjZSk7CiAgKiBSZXBhcmVudCByZXNvdXJjZSBj aGlsZHJlbiBvZiBwciB0aGF0IGNvbmZsaWN0IHdpdGggcmVzCiAgKiB1bmRlciByZXMsIGFuZCBt YWtlIHJlcyByZXBsYWNlIHRob3NlIGNoaWxkcmVuLgogICovCi1zdGF0aWMgaW50IHJlcGFyZW50 X3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwKLQkJCQkgICAgIHN0cnVjdCByZXNv dXJjZSAqcmVzKQoraW50IHJlcGFyZW50X3Jlc291cmNlcyhzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVu dCwgc3RydWN0IHJlc291cmNlICpyZXMpCiB7Ci0Jc3RydWN0IHJlc291cmNlICpwLCAqKnBwOwot CXN0cnVjdCByZXNvdXJjZSAqKmZpcnN0cHAgPSBOVUxMOworCXN0cnVjdCByZXNvdXJjZSAqcCwg KmZpcnN0ID0gTlVMTDsKIAotCWZvciAocHAgPSAmcGFyZW50LT5jaGlsZDsgKHAgPSAqcHApICE9 IE5VTEw7IHBwID0gJnAtPnNpYmxpbmcpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHAsICZwYXJl bnQtPmNoaWxkLCBzaWJsaW5nKSB7CiAJCWlmIChwLT5lbmQgPCByZXMtPnN0YXJ0KQogCQkJY29u dGludWU7CiAJCWlmIChyZXMtPmVuZCA8IHAtPnN0YXJ0KQogCQkJYnJlYWs7CiAJCWlmIChwLT5z dGFydCA8IHJlcy0+c3RhcnQgfHwgcC0+ZW5kID4gcmVzLT5lbmQpCiAJCQlyZXR1cm4gLTE7CS8q IG5vdCBjb21wbGV0ZWx5IGNvbnRhaW5lZCAqLwotCQlpZiAoZmlyc3RwcCA9PSBOVUxMKQotCQkJ Zmlyc3RwcCA9IHBwOworCQlpZiAoZmlyc3QgPT0gTlVMTCkKKwkJCWZpcnN0ID0gcDsKIAl9Ci0J aWYgKGZpcnN0cHAgPT0gTlVMTCkKKwlpZiAoZmlyc3QgPT0gTlVMTCkKIAkJcmV0dXJuIC0xOwkv KiBkaWRuJ3QgZmluZCBhbnkgY29uZmxpY3RpbmcgZW50cmllcz8gKi8KIAlyZXMtPnBhcmVudCA9 IHBhcmVudDsKLQlyZXMtPmNoaWxkID0gKmZpcnN0cHA7Ci0JcmVzLT5zaWJsaW5nID0gKnBwOwot CSpmaXJzdHBwID0gcmVzOwotCSpwcCA9IE5VTEw7Ci0JZm9yIChwID0gcmVzLT5jaGlsZDsgcCAh PSBOVUxMOyBwID0gcC0+c2libGluZykgewotCQlwLT5wYXJlbnQgPSByZXM7CisJbGlzdF9hZGQo JnJlcy0+c2libGluZywgJnAtPnNpYmxpbmcucHJldik7CisJSU5JVF9MSVNUX0hFQUQoJnJlcy0+ Y2hpbGQpOworCisJLyoKKwkgKiBGcm9tIGZpcnN0IHRvIHAncyBwcmV2aW91cyBzaWJsaW5nLCB0 aGV5IGFsbCBmYWxsIGludG8KKwkgKiByZXMncyByZWdpb24sIGNoYW5nZSB0aGVtIGFzIHJlcydz IGNoaWxkcmVuLgorCSAqLworCWxpc3RfY3V0X3Bvc2l0aW9uKCZyZXMtPmNoaWxkLCBmaXJzdC0+ c2libGluZy5wcmV2LCByZXMtPnNpYmxpbmcucHJldik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShw LCAmbmV3LT5jaGlsZCwgc2libGluZykgeworICAgICAgICAgICAgICAgIHAtPnBhcmVudCA9IG5l dzsKIAkJcHJfZGVidWcoIlBDSTogUmVwYXJlbnRlZCAlcyAlcFIgdW5kZXIgJXNcbiIsCiAJCQkg cC0+bmFtZSwgcCwgcmVzLT5uYW1lKTsKIAl9CkBAIC0xMjEwLDM0ICsxMjEwLDMyIEBAIEVYUE9S VF9TWU1CT0woX19yZXF1ZXN0X3JlZ2lvbik7CiB2b2lkIF9fcmVsZWFzZV9yZWdpb24oc3RydWN0 IHJlc291cmNlICpwYXJlbnQsIHJlc291cmNlX3NpemVfdCBzdGFydCwKIAkJCXJlc291cmNlX3Np emVfdCBuKQogewotCXN0cnVjdCByZXNvdXJjZSAqKnA7CisJc3RydWN0IHJlc291cmNlICpyZXM7 CiAJcmVzb3VyY2Vfc2l6ZV90IGVuZDsKIAotCXAgPSAmcGFyZW50LT5jaGlsZDsKKwlyZXMgPSBy ZXNvdXJjZV9maXJzdF9jaGlsZCgmcGFyZW50LT5jaGlsZCk7CiAJZW5kID0gc3RhcnQgKyBuIC0g MTsKIAogCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwogCiAJZm9yICg7OykgewotCQlzdHJ1 Y3QgcmVzb3VyY2UgKnJlcyA9ICpwOwotCiAJCWlmICghcmVzKQogCQkJYnJlYWs7CiAJCWlmIChy ZXMtPnN0YXJ0IDw9IHN0YXJ0ICYmIHJlcy0+ZW5kID49IGVuZCkgewogCQkJaWYgKCEocmVzLT5m bGFncyAmIElPUkVTT1VSQ0VfQlVTWSkpIHsKLQkJCQlwID0gJnJlcy0+Y2hpbGQ7CisJCQkJcmVz ID0gcmVzb3VyY2VfZmlyc3RfY2hpbGQoJnJlcy0+Y2hpbGQpOwogCQkJCWNvbnRpbnVlOwogCQkJ fQogCQkJaWYgKHJlcy0+c3RhcnQgIT0gc3RhcnQgfHwgcmVzLT5lbmQgIT0gZW5kKQogCQkJCWJy ZWFrOwotCQkJKnAgPSByZXMtPnNpYmxpbmc7CisJCQlsaXN0X2RlbCgmcmVzLT5zaWJsaW5nKTsK IAkJCXdyaXRlX3VubG9jaygmcmVzb3VyY2VfbG9jayk7CiAJCQlpZiAocmVzLT5mbGFncyAmIElP UkVTT1VSQ0VfTVVYRUQpCiAJCQkJd2FrZV91cCgmbXV4ZWRfcmVzb3VyY2Vfd2FpdCk7CiAJCQlm cmVlX3Jlc291cmNlKHJlcyk7CiAJCQlyZXR1cm47CiAJCX0KLQkJcCA9ICZyZXMtPnNpYmxpbmc7 CisJCXJlcyA9IHJlc291cmNlX3NpYmxpbmcocmVzKTsKIAl9CiAKIAl3cml0ZV91bmxvY2soJnJl c291cmNlX2xvY2spOwpAQCAtMTI3Miw5ICsxMjcwLDcgQEAgRVhQT1JUX1NZTUJPTChfX3JlbGVh c2VfcmVnaW9uKTsKIGludCByZWxlYXNlX21lbV9yZWdpb25fYWRqdXN0YWJsZShzdHJ1Y3QgcmVz b3VyY2UgKnBhcmVudCwKIAkJCXJlc291cmNlX3NpemVfdCBzdGFydCwgcmVzb3VyY2Vfc2l6ZV90 IHNpemUpCiB7Ci0Jc3RydWN0IHJlc291cmNlICoqcDsKLQlzdHJ1Y3QgcmVzb3VyY2UgKnJlczsK LQlzdHJ1Y3QgcmVzb3VyY2UgKm5ld19yZXM7CisJc3RydWN0IHJlc291cmNlICpyZXMsICpuZXdf cmVzOwogCXJlc291cmNlX3NpemVfdCBlbmQ7CiAJaW50IHJldCA9IC1FSU5WQUw7CiAKQEAgLTEy ODUsMTYgKzEyODEsMTYgQEAgaW50IHJlbGVhc2VfbWVtX3JlZ2lvbl9hZGp1c3RhYmxlKHN0cnVj dCByZXNvdXJjZSAqcGFyZW50LAogCS8qIFRoZSBhbGxvY19yZXNvdXJjZSgpIHJlc3VsdCBnZXRz IGNoZWNrZWQgbGF0ZXIgKi8KIAluZXdfcmVzID0gYWxsb2NfcmVzb3VyY2UoR0ZQX0tFUk5FTCk7 CiAKLQlwID0gJnBhcmVudC0+Y2hpbGQ7CisJcmVzID0gcmVzb3VyY2VfZmlyc3RfY2hpbGQoJnBh cmVudC0+Y2hpbGQpOwogCXdyaXRlX2xvY2soJnJlc291cmNlX2xvY2spOwogCi0Jd2hpbGUgKChy ZXMgPSAqcCkpIHsKKwl3aGlsZSAoKHJlcykpIHsKIAkJaWYgKHJlcy0+c3RhcnQgPj0gZW5kKQog CQkJYnJlYWs7CiAKIAkJLyogbG9vayBmb3IgdGhlIG5leHQgcmVzb3VyY2UgaWYgaXQgZG9lcyBu b3QgZml0IGludG8gKi8KIAkJaWYgKHJlcy0+c3RhcnQgPiBzdGFydCB8fCByZXMtPmVuZCA8IGVu ZCkgewotCQkJcCA9ICZyZXMtPnNpYmxpbmc7CisJCQlyZXMgPSByZXNvdXJjZV9zaWJsaW5nKHJl cyk7CiAJCQljb250aW51ZTsKIAkJfQogCkBAIC0xMzAyLDE0ICsxMjk4LDE0IEBAIGludCByZWxl YXNlX21lbV9yZWdpb25fYWRqdXN0YWJsZShzdHJ1Y3QgcmVzb3VyY2UgKnBhcmVudCwKIAkJCWJy ZWFrOwogCiAJCWlmICghKHJlcy0+ZmxhZ3MgJiBJT1JFU09VUkNFX0JVU1kpKSB7Ci0JCQlwID0g JnJlcy0+Y2hpbGQ7CisJCQlyZXMgPSByZXNvdXJjZV9maXJzdF9jaGlsZCgmcmVzLT5jaGlsZCk7 CiAJCQljb250aW51ZTsKIAkJfQogCiAJCS8qIGZvdW5kIHRoZSB0YXJnZXQgcmVzb3VyY2U7IGxl dCdzIGFkanVzdCBhY2NvcmRpbmdseSAqLwogCQlpZiAocmVzLT5zdGFydCA9PSBzdGFydCAmJiBy ZXMtPmVuZCA9PSBlbmQpIHsKIAkJCS8qIGZyZWUgdGhlIHdob2xlIGVudHJ5ICovCi0JCQkqcCA9 IHJlcy0+c2libGluZzsKKwkJCWxpc3RfZGVsKCZyZXMtPnNpYmxpbmcpOwogCQkJZnJlZV9yZXNv dXJjZShyZXMpOwogCQkJcmV0ID0gMDsKIAkJfSBlbHNlIGlmIChyZXMtPnN0YXJ0ID09IHN0YXJ0 ICYmIHJlcy0+ZW5kICE9IGVuZCkgewpAQCAtMTMzMiwxNCArMTMyOCwxMyBAQCBpbnQgcmVsZWFz ZV9tZW1fcmVnaW9uX2FkanVzdGFibGUoc3RydWN0IHJlc291cmNlICpwYXJlbnQsCiAJCQluZXdf cmVzLT5mbGFncyA9IHJlcy0+ZmxhZ3M7CiAJCQluZXdfcmVzLT5kZXNjID0gcmVzLT5kZXNjOwog CQkJbmV3X3Jlcy0+cGFyZW50ID0gcmVzLT5wYXJlbnQ7Ci0JCQluZXdfcmVzLT5zaWJsaW5nID0g cmVzLT5zaWJsaW5nOwotCQkJbmV3X3Jlcy0+Y2hpbGQgPSBOVUxMOworCQkJSU5JVF9MSVNUX0hF QUQoJm5ld19yZXMtPmNoaWxkKTsKIAogCQkJcmV0ID0gX19hZGp1c3RfcmVzb3VyY2UocmVzLCBy ZXMtPnN0YXJ0LAogCQkJCQkJc3RhcnQgLSByZXMtPnN0YXJ0KTsKIAkJCWlmIChyZXQpCiAJCQkJ YnJlYWs7Ci0JCQlyZXMtPnNpYmxpbmcgPSBuZXdfcmVzOworCQkJbGlzdF9hZGQoJm5ld19yZXMt PnNpYmxpbmcsICZyZXMtPnNpYmxpbmcpOwogCQkJbmV3X3JlcyA9IE5VTEw7CiAJCX0KIApAQCAt MTUyMCw3ICsxNTE1LDcgQEAgc3RhdGljIGludCBfX2luaXQgcmVzZXJ2ZV9zZXR1cChjaGFyICpz dHIpCiAJCQlyZXMtPmVuZCA9IGlvX3N0YXJ0ICsgaW9fbnVtIC0gMTsKIAkJCXJlcy0+ZmxhZ3Mg fD0gSU9SRVNPVVJDRV9CVVNZOwogCQkJcmVzLT5kZXNjID0gSU9SRVNfREVTQ19OT05FOwotCQkJ cmVzLT5jaGlsZCA9IE5VTEw7CisJCQlJTklUX0xJU1RfSEVBRCgmcmVzLT5jaGlsZCk7CiAJCQlp ZiAocmVxdWVzdF9yZXNvdXJjZShwYXJlbnQsIHJlcykgPT0gMCkKIAkJCQlyZXNlcnZlZCA9IHgr MTsKIAkJfQpAQCAtMTU0MCw3ICsxNTM1LDcgQEAgaW50IGlvbWVtX21hcF9zYW5pdHlfY2hlY2so cmVzb3VyY2Vfc2l6ZV90IGFkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKIAlsb2ZmX3QgbDsKIAog CXJlYWRfbG9jaygmcmVzb3VyY2VfbG9jayk7Ci0JZm9yIChwID0gcC0+Y2hpbGQ7IHAgOyBwID0g cl9uZXh0KE5VTEwsIHAsICZsKSkgeworCWZvciAocCA9IHJlc291cmNlX2ZpcnN0X2NoaWxkKCZw LT5jaGlsZCk7IHA7IHAgPSByX25leHQoTlVMTCwgcCwgJmwpKSB7CiAJCS8qCiAJCSAqIFdlIGNh biBwcm9iYWJseSBza2lwIHRoZSByZXNvdXJjZXMgd2l0aG91dAogCQkgKiBJT1JFU09VUkNFX0lP IGF0dHJpYnV0ZT8KQEAgLTE1OTYsNyArMTU5MSw3IEBAIGJvb2wgaW9tZW1faXNfZXhjbHVzaXZl KHU2NCBhZGRyKQogCWFkZHIgPSBhZGRyICYgUEFHRV9NQVNLOwogCiAJcmVhZF9sb2NrKCZyZXNv dXJjZV9sb2NrKTsKLQlmb3IgKHAgPSBwLT5jaGlsZDsgcCA7IHAgPSByX25leHQoTlVMTCwgcCwg JmwpKSB7CisJZm9yIChwID0gcmVzb3VyY2VfZmlyc3RfY2hpbGQoJnAtPmNoaWxkKTsgcDsgcCA9 IHJfbmV4dChOVUxMLCBwLCAmbCkpIHsKIAkJLyoKIAkJICogV2UgY2FuIHByb2JhYmx5IHNraXAg dGhlIHJlc291cmNlcyB3aXRob3V0CiAJCSAqIElPUkVTT1VSQ0VfSU8gYXR0cmlidXRlPwotLSAK Mi4xMy42CgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpM aW51eC1udmRpbW0gbWFpbGluZyBsaXN0CkxpbnV4LW52ZGltbUBsaXN0cy4wMS5vcmcKaHR0cHM6 Ly9saXN0cy4wMS5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1udmRpbW0K ^ permalink raw reply [flat|nested] 81+ messages in thread
* [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem The struct resource uses singly linked list to link siblings, implemented by pointer operation. Replace it with list_head for better code readability. Based on this list_head replacement, it will be very easy to do reverse iteration on iomem_resource's sibling list in later patch. Besides, type of member variables of struct resource, sibling and child, are changed from 'struct resource *' to 'struct list_head'. This brings two pointers of size increase. Suggested-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Cc: David Airlie <airlied@linux.ie> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Rob Herring <robh+dt@kernel.org> Cc: Frank Rowand <frowand.list@gmail.com> Cc: Keith Busch <keith.busch@intel.com> Cc: Jonathan Derrick <jonathan.derrick@intel.com> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: devel@linuxdriverproject.org Cc: linux-input@vger.kernel.org Cc: linux-nvdimm@lists.01.org Cc: devicetree@vger.kernel.org Cc: linux-pci@vger.kernel.org --- arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 4 +- arch/powerpc/kernel/pci-common.c | 4 +- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++---- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 17 ++- kernel/resource.c | 211 ++++++++++++++-------------- 19 files changed, 176 insertions(+), 169 deletions(-) diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c index cd2c02c68bc3..5494355b1c49 100644 --- a/arch/arm/plat-samsung/pm-check.c +++ b/arch/arm/plat-samsung/pm-check.c @@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg); static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) { while (ptr != NULL) { - if (ptr->child != NULL) - s3c_pm_run_res(ptr->child, fn, arg); + if (!list_empty(&ptr->child)) + s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg); if ((ptr->flags & IORESOURCE_SYSTEM_RAM) == IORESOURCE_SYSTEM_RAM) { @@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) arg = (fn)(ptr, arg); } - ptr = ptr->sibling; + ptr = resource_sibling(ptr); } } diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 7899bafab064..2bf73e27e231 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 926035bb378d..28fbe83c9daf 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } } diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index cca9134cfa7d..99efe4e98b16 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v) struct resource *root = m->private, *r; const char *nm; - for (r = root->child; r != NULL; r = r->sibling) { + list_for_each_entry(r, &root->child, sibling) { if ((nm = r->name) == NULL) nm = "???"; seq_printf(m, "%016llx-%016llx: %s\n", (unsigned long long)r->start, diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h index 0b68c76ec1e6..f487b06817df 100644 --- a/arch/xtensa/include/asm/pci-bridge.h +++ b/arch/xtensa/include/asm/pci-bridge.h @@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res, res->flags = flags; res->name = name; res->parent = NULL; - res->sibling = NULL; - res->child = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c index 1e8062f6dbfc..dba78f75fd06 100644 --- a/drivers/eisa/eisa-bus.c +++ b/drivers/eisa/eisa-bus.c @@ -408,6 +408,8 @@ static struct resource eisa_root_res = { .start = 0, .end = 0xffffffff, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(eisa_root_res.sibling), + .child = LIST_HEAD_INIT(eisa_root_res.child), }; static int eisa_bus_count; diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c index 3c54044214db..53e300a993dc 100644 --- a/drivers/gpu/drm/drm_memory.c +++ b/drivers/gpu/drm/drm_memory.c @@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void) struct resource *tmp; resource_size_t max_iomem = 0; - for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) { + list_for_each_entry(tmp, &iomem_resource.child, sibling) max_iomem = max(max_iomem, tmp->end); - } return max_iomem; } diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 3949b0990916..addd3bc009af 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c @@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume) int psb_gtt_restore(struct drm_device *dev) { struct drm_psb_private *dev_priv = dev->dev_private; - struct resource *r = dev_priv->gtt_mem->child; + struct resource *r; struct gtt_range *range; unsigned int restored = 0, total = 0, size = 0; @@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev) mutex_lock(&dev_priv->gtt_mutex); psb_gtt_init(dev, 1); - while (r != NULL) { + list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) { range = container_of(r, struct gtt_range, resource); if (range->pages) { psb_gtt_insert(dev, range, 1); size += range->resource.end - range->resource.start; restored++; } - r = r->sibling; total++; } mutex_unlock(&dev_priv->gtt_mutex); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index b10fe26c4891..d87ec5a1bc4c 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) { resource_size_t start = 0; resource_size_t end = 0; - struct resource *new_res; + struct resource *new_res, *tmp; struct resource **old_res = &hyperv_mmio; - struct resource **prev_res = NULL; switch (res->type) { @@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) /* * If two ranges are adjacent, merge them. */ - do { - if (!*old_res) { - *old_res = new_res; - break; - } - - if (((*old_res)->end + 1) == new_res->start) { - (*old_res)->end = new_res->end; + if (!*old_res) { + *old_res = new_res; + return AE_OK; + } + tmp = *old_res; + list_for_each_entry_from(tmp, &tmp->parent->child, sibling) { + if ((tmp->end + 1) == new_res->start) { + tmp->end = new_res->end; kfree(new_res); break; } - if ((*old_res)->start == new_res->end + 1) { - (*old_res)->start = new_res->start; + if (tmp->start == new_res->end + 1) { + tmp->start = new_res->start; kfree(new_res); break; } - if ((*old_res)->start > new_res->end) { - new_res->sibling = *old_res; - if (prev_res) - (*prev_res)->sibling = new_res; - *old_res = new_res; + if (tmp->start > new_res->end) { + list_add(&new_res->sibling, tmp->sibling.prev); break; } - - prev_res = old_res; - old_res = &(*old_res)->sibling; - - } while (1); + } return AE_OK; } static int vmbus_acpi_remove(struct acpi_device *device) { - struct resource *cur_res; - struct resource *next_res; + struct resource *res; if (hyperv_mmio) { if (fb_mmio) { @@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device) fb_mmio = NULL; } - for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) { - next_res = cur_res->sibling; - kfree(cur_res); - } + res = hyperv_mmio; + list_for_each_entry_from(res, &res->parent->child, sibling) + kfree(res); } return 0; @@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj, } } - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= max) || (iter->end <= min)) continue; @@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size) struct resource *iter; down(&hyperv_mmio_lock); - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= start + size) || (iter->end <= start)) continue; diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index daeeb4c7e3b0..5c0be27b33ff 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c @@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce) iforce->device_memory.end = 200; iforce->device_memory.flags = IORESOURCE_MEM; iforce->device_memory.parent = NULL; - iforce->device_memory.child = NULL; - iforce->device_memory.sibling = NULL; + INIT_LIST_HEAD(&iforce->device_memory.child); + INIT_LIST_HEAD(&iforce->device_memory.sibling); /* * Wait until device ready - until it sends its first response. diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c index 28afdd668905..f53d410d9981 100644 --- a/drivers/nvdimm/namespace_devs.c +++ b/drivers/nvdimm/namespace_devs.c @@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, retry: first = 0; for_each_dpa_resource(ndd, res) { - struct resource *next = res->sibling, *new_res = NULL; + struct resource *next = resource_sibling(res), *new_res = NULL; resource_size_t allocate, available = 0; enum alloc_loc loc = ALLOC_ERR; const char *action; @@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, * an initial "pmem-reserve pass". Only do an initial BLK allocation * when none of the DPA space is reserved. */ - if ((is_pmem || !ndd->dpa.child) && n == to_allocate) + if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate) return init_dpa_allocation(label_id, nd_region, nd_mapping, n); return n; } @@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region, retry: for_each_dpa_resource(ndd, res) { int rc; - struct resource *next = res->sibling; + struct resource *next = resource_sibling(res); resource_size_t end = res->start + resource_size(res); if (!next || strcmp(res->name, label_id->id) != 0 diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 32e0364b48b9..da7da15e03e7 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h @@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd); (unsigned long long) (res ? res->start : 0), ##arg) #define for_each_dpa_resource(ndd, res) \ - for (res = (ndd)->dpa.child; res; res = res->sibling) + list_for_each_entry(res, &(ndd)->dpa.child, sibling) #define for_each_dpa_resource_safe(ndd, res, next) \ - for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \ - res; res = next, next = next ? next->sibling : NULL) + list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling) struct nd_percpu_lane { int count; diff --git a/drivers/of/address.c b/drivers/of/address.c index 53349912ac75..e2e25719ab52 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range, { int err; res->flags = range->flags; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); res->name = np->full_name; if (res->flags & IORESOURCE_IO) { diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 69bd98421eb1..7482bdfd1959 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d) for (i = d; i ; --i) printk(" "); printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, (long)r->start, (long)r->end, r->flags); - lba_dump_res(r->child, d+2); - lba_dump_res(r->sibling, d); + lba_dump_res(resource_first_child(&r->child), d+2); + lba_dump_res(resource_sibling(r), d); } diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c index 942b64fc7f1f..e3ace20345c7 100644 --- a/drivers/pci/host/vmd.c +++ b/drivers/pci/host/vmd.c @@ -542,14 +542,14 @@ static struct pci_ops vmd_ops = { static void vmd_attach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1]; - vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2]; + list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child); + list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child); } static void vmd_detach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = NULL; - vmd->dev->resource[VMD_MEMBAR2].child = NULL; + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child); + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child); } /* diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ac876e32de4b..9624dd1dfd49 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr) r->res.start = 0; r->res.end = 0xff; r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED; + INIT_LIST_HEAD(&r->res.child); + INIT_LIST_HEAD(&r->res.sibling); list_add_tail(&r->list, &pci_domain_busn_res_list); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 79b1824e83b4..8e685af8938d 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type) continue; /* Ignore BARs which are still in use */ - if (res->child) + if (!list_empty(&res->child)) continue; ret = add_to_list(&saved, bridge, res, 0, 0); diff --git a/include/linux/ioport.h b/include/linux/ioport.h index dfdcd0bfe54e..b7456ae889dd 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -12,6 +12,7 @@ #ifndef __ASSEMBLY__ #include <linux/compiler.h> #include <linux/types.h> +#include <linux/list.h> /* * Resources are tree-like, allowing * nesting etc.. @@ -22,7 +23,8 @@ struct resource { const char *name; unsigned long flags; unsigned long desc; - struct resource *parent, *sibling, *child; + struct list_head child, sibling; + struct resource *parent; }; /* @@ -216,7 +218,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2) return r1->start <= r2->start && r1->end >= r2->end; } - /* Convenience shorthand with allocation */ #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0) #define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED) @@ -287,6 +288,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2) return (r1->start <= r2->end && r1->end >= r2->start); } +static inline struct resource *resource_sibling(struct resource *res) +{ + if (res->parent && !list_is_last(&res->sibling, &res->parent->child)) + return list_next_entry(res, sibling); + return NULL; +} + +static inline struct resource *resource_first_child(struct list_head *head) +{ + return list_first_entry_or_null(head, struct resource, sibling); +} + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_IOPORT_H */ diff --git a/kernel/resource.c b/kernel/resource.c index 5e7c56d5d838..ef9a20b75234 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -31,6 +31,8 @@ struct resource ioport_resource = { .start = 0, .end = IO_SPACE_LIMIT, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(ioport_resource.sibling), + .child = LIST_HEAD_INIT(ioport_resource.child), }; EXPORT_SYMBOL(ioport_resource); @@ -39,6 +41,8 @@ struct resource iomem_resource = { .start = 0, .end = -1, .flags = IORESOURCE_MEM, + .sibling = LIST_HEAD_INIT(iomem_resource.sibling), + .child = LIST_HEAD_INIT(iomem_resource.child), }; EXPORT_SYMBOL(iomem_resource); @@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock); * by boot mem after the system is up. So for reusing the resource entry * we need to remember the resource. */ -static struct resource *bootmem_resource_free; +static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free); static DEFINE_SPINLOCK(bootmem_resource_lock); static struct resource *next_resource(struct resource *p, bool sibling_only) { /* Caller wants to traverse through siblings only */ if (sibling_only) - return p->sibling; + return resource_sibling(p); - if (p->child) - return p->child; - while (!p->sibling && p->parent) + if (!list_empty(&p->child)) + return resource_first_child(&p->child); + while (!resource_sibling(p) && p->parent) p = p->parent; - return p->sibling; + return resource_sibling(p); } static void *r_next(struct seq_file *m, void *v, loff_t *pos) @@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos) struct resource *p = PDE_DATA(file_inode(m->file)); loff_t l = 0; read_lock(&resource_lock); - for (p = p->child; p && l < *pos; p = r_next(m, p, &l)) + for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l)) ; return p; } @@ -153,8 +157,7 @@ static void free_resource(struct resource *res) if (!PageSlab(virt_to_head_page(res))) { spin_lock(&bootmem_resource_lock); - res->sibling = bootmem_resource_free; - bootmem_resource_free = res; + list_add(&res->sibling, &bootmem_resource_free); spin_unlock(&bootmem_resource_lock); } else { kfree(res); @@ -166,10 +169,9 @@ static struct resource *alloc_resource(gfp_t flags) struct resource *res = NULL; spin_lock(&bootmem_resource_lock); - if (bootmem_resource_free) { - res = bootmem_resource_free; - bootmem_resource_free = res->sibling; - } + res = resource_first_child(&bootmem_resource_free); + if (res) + list_del(&res->sibling); spin_unlock(&bootmem_resource_lock); if (res) @@ -177,6 +179,8 @@ static struct resource *alloc_resource(gfp_t flags) else res = kzalloc(sizeof(struct resource), flags); + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); return res; } @@ -185,7 +189,7 @@ static struct resource * __request_resource(struct resource *root, struct resour { resource_size_t start = new->start; resource_size_t end = new->end; - struct resource *tmp, **p; + struct resource *tmp; if (end < start) return root; @@ -193,64 +197,62 @@ static struct resource * __request_resource(struct resource *root, struct resour return root; if (end > root->end) return root; - p = &root->child; - for (;;) { - tmp = *p; - if (!tmp || tmp->start > end) { - new->sibling = tmp; - *p = new; + + if (list_empty(&root->child)) { + list_add(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; + } + + list_for_each_entry(tmp, &root->child, sibling) { + if (tmp->start > end) { + list_add(&new->sibling, tmp->sibling.prev); new->parent = root; + INIT_LIST_HEAD(&new->child); return NULL; } - p = &tmp->sibling; if (tmp->end < start) continue; return tmp; } + + list_add_tail(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; } static int __release_resource(struct resource *old, bool release_child) { - struct resource *tmp, **p, *chd; + struct resource *tmp, *next, *chd; - p = &old->parent->child; - for (;;) { - tmp = *p; - if (!tmp) - break; + list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) { if (tmp == old) { - if (release_child || !(tmp->child)) { - *p = tmp->sibling; + if (release_child || list_empty(&tmp->child)) { + list_del(&tmp->sibling); } else { - for (chd = tmp->child;; chd = chd->sibling) { + list_for_each_entry(chd, &tmp->child, sibling) chd->parent = tmp->parent; - if (!(chd->sibling)) - break; - } - *p = tmp->child; - chd->sibling = tmp->sibling; + list_splice(&tmp->child, tmp->sibling.prev); + list_del(&tmp->sibling); } + old->parent = NULL; return 0; } - p = &tmp->sibling; } return -EINVAL; } static void __release_child_resources(struct resource *r) { - struct resource *tmp, *p; + struct resource *tmp, *next; resource_size_t size; - p = r->child; - r->child = NULL; - while (p) { - tmp = p; - p = p->sibling; - + list_for_each_entry_safe(tmp, next, &r->child, sibling) { tmp->parent = NULL; - tmp->sibling = NULL; + INIT_LIST_HEAD(&tmp->sibling); __release_child_resources(tmp); printk(KERN_DEBUG "release child resource %pR\n", tmp); @@ -259,6 +261,8 @@ static void __release_child_resources(struct resource *r) tmp->start = 0; tmp->end = size - 1; } + + INIT_LIST_HEAD(&tmp->child); } void release_child_resources(struct resource *r) @@ -343,7 +347,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, read_lock(&resource_lock); - for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { + for (p = resource_first_child(&iomem_resource.child); p; + p = next_resource(p, sibling_only)) { if ((p->flags & res->flags) != res->flags) continue; if ((desc != IORES_DESC_NONE) && (desc != p->desc)) @@ -532,7 +537,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags, struct resource *p; read_lock(&resource_lock); - for (p = iomem_resource.child; p ; p = p->sibling) { + list_for_each_entry(p, &iomem_resource.child, sibling) { bool is_type = (((p->flags & flags) == flags) && ((desc == IORES_DESC_NONE) || (desc == p->desc))); @@ -586,7 +591,7 @@ static int __find_resource(struct resource *root, struct resource *old, resource_size_t size, struct resource_constraint *constraint) { - struct resource *this = root->child; + struct resource *this = resource_first_child(&root->child); struct resource tmp = *new, avail, alloc; tmp.start = root->start; @@ -596,7 +601,7 @@ static int __find_resource(struct resource *root, struct resource *old, */ if (this && this->start == root->start) { tmp.start = (this == old) ? old->start : this->end + 1; - this = this->sibling; + this = resource_sibling(this); } for(;;) { if (this) @@ -632,7 +637,7 @@ next: if (!this || this->end == root->end) if (this != old) tmp.start = this->end + 1; - this = this->sibling; + this = resource_sibling(this); } return -EBUSY; } @@ -676,7 +681,7 @@ static int reallocate_resource(struct resource *root, struct resource *old, goto out; } - if (old->child) { + if (!list_empty(&old->child)) { err = -EBUSY; goto out; } @@ -757,7 +762,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start) struct resource *res; read_lock(&resource_lock); - for (res = root->child; res; res = res->sibling) { + list_for_each_entry(res, &root->child, sibling) { if (res->start == start) break; } @@ -790,32 +795,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou break; } - for (next = first; ; next = next->sibling) { + for (next = first; ; next = resource_sibling(next)) { /* Partial overlap? Bad, and unfixable */ if (next->start < new->start || next->end > new->end) return next; - if (!next->sibling) + if (!resource_sibling(next)) break; - if (next->sibling->start > new->end) + if (resource_sibling(next)->start > new->end) break; } - new->parent = parent; - new->sibling = next->sibling; - new->child = first; + list_add(&new->sibling, &next->sibling); + INIT_LIST_HEAD(&new->child); - next->sibling = NULL; - for (next = first; next; next = next->sibling) + /* + * From first to next, they all fall into new's region, so change them + * as new's children. + */ + list_cut_position(&new->child, first->sibling.prev, &next->sibling); + list_for_each_entry(next, &new->child, sibling) next->parent = new; - if (parent->child == first) { - parent->child = new; - } else { - next = parent->child; - while (next->sibling != first) - next = next->sibling; - next->sibling = new; - } return NULL; } @@ -937,19 +937,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start, if ((start < parent->start) || (end > parent->end)) goto out; - if (res->sibling && (res->sibling->start <= end)) + if (resource_sibling(res) && (resource_sibling(res)->start <= end)) goto out; - tmp = parent->child; - if (tmp != res) { - while (tmp->sibling != res) - tmp = tmp->sibling; + if (res->sibling.prev != &parent->child) { + tmp = list_prev_entry(res, sibling); if (start <= tmp->end) goto out; } skip: - for (tmp = res->child; tmp; tmp = tmp->sibling) + list_for_each_entry(tmp, &res->child, sibling) if ((tmp->start < start) || (tmp->end > end)) goto out; @@ -987,31 +985,33 @@ EXPORT_SYMBOL(adjust_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) +int reparent_resources(struct resource *parent, struct resource *res) { - struct resource *p, **pp; - struct resource **firstpp = NULL; + struct resource *p, *first = NULL; - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { + list_for_each_entry(p, &parent->child, 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 (first == NULL) + first = p; } - if (firstpp == NULL) + if (first == 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; + list_add(&res->sibling, &p->sibling.prev); + INIT_LIST_HEAD(&res->child); + + /* + * From first to p's previous sibling, they all fall into + * res's region, change them as res's children. + */ + list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); + list_for_each_entry(p, &new->child, sibling) { + p->parent = new; pr_debug("PCI: Reparented %s %pR under %s\n", p->name, p, res->name); } @@ -1210,34 +1210,32 @@ EXPORT_SYMBOL(__request_region); void __release_region(struct resource *parent, resource_size_t start, resource_size_t n) { - struct resource **p; + struct resource *res; resource_size_t end; - p = &parent->child; + res = resource_first_child(&parent->child); end = start + n - 1; write_lock(&resource_lock); for (;;) { - struct resource *res = *p; - if (!res) break; if (res->start <= start && res->end >= end) { if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } if (res->start != start || res->end != end) break; - *p = res->sibling; + list_del(&res->sibling); write_unlock(&resource_lock); if (res->flags & IORESOURCE_MUXED) wake_up(&muxed_resource_wait); free_resource(res); return; } - p = &res->sibling; + res = resource_sibling(res); } write_unlock(&resource_lock); @@ -1272,9 +1270,7 @@ EXPORT_SYMBOL(__release_region); int release_mem_region_adjustable(struct resource *parent, resource_size_t start, resource_size_t size) { - struct resource **p; - struct resource *res; - struct resource *new_res; + struct resource *res, *new_res; resource_size_t end; int ret = -EINVAL; @@ -1285,16 +1281,16 @@ int release_mem_region_adjustable(struct resource *parent, /* The alloc_resource() result gets checked later */ new_res = alloc_resource(GFP_KERNEL); - p = &parent->child; + res = resource_first_child(&parent->child); write_lock(&resource_lock); - while ((res = *p)) { + while ((res)) { if (res->start >= end) break; /* look for the next resource if it does not fit into */ if (res->start > start || res->end < end) { - p = &res->sibling; + res = resource_sibling(res); continue; } @@ -1302,14 +1298,14 @@ int release_mem_region_adjustable(struct resource *parent, break; if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } /* found the target resource; let's adjust accordingly */ if (res->start == start && res->end == end) { /* free the whole entry */ - *p = res->sibling; + list_del(&res->sibling); free_resource(res); ret = 0; } else if (res->start == start && res->end != end) { @@ -1332,14 +1328,13 @@ int release_mem_region_adjustable(struct resource *parent, new_res->flags = res->flags; new_res->desc = res->desc; new_res->parent = res->parent; - new_res->sibling = res->sibling; - new_res->child = NULL; + INIT_LIST_HEAD(&new_res->child); ret = __adjust_resource(res, res->start, start - res->start); if (ret) break; - res->sibling = new_res; + list_add(&new_res->sibling, &res->sibling); new_res = NULL; } @@ -1520,7 +1515,7 @@ static int __init reserve_setup(char *str) res->end = io_start + io_num - 1; res->flags |= IORESOURCE_BUSY; res->desc = IORES_DESC_NONE; - res->child = NULL; + INIT_LIST_HEAD(&res->child); if (request_resource(parent, res) == 0) reserved = x+1; } @@ -1540,7 +1535,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size) loff_t l; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? @@ -1596,7 +1591,7 @@ bool iomem_is_exclusive(u64 addr) addr = addr & PAGE_MASK; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? -- 2.13.6 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devel-tBiZLqfeLfOHmIFyCCdPziST3g8Odh+X, linuxppc-dev The struct resource uses singly linked list to link siblings, implemented by pointer operation. Replace it with list_head for better code readability. Based on this list_head replacement, it will be very easy to do reverse iteration on iomem_resource's sibling list in later patch. Besides, type of member variables of struct resource, sibling and child, are changed from 'struct resource *' to 'struct list_head'. This brings two pointers of size increase. Suggested-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Patrik Jakobsson <patrik.r.jakobsson@gmail.com> Cc: David Airlie <airlied@linux.ie> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Haiyang Zhang <haiyangz@microsoft.com> Cc: Stephen Hemminger <sthemmin@microsoft.com> Cc: Dmitry Torokhov <dmitry.torokhov@gmail.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Rob Herring <robh+dt@kernel.org> Cc: Frank Rowand <frowand.list@gmail.com> Cc: Keith Busch <keith.busch@intel.com> Cc: Jonathan Derrick <jonathan.derrick@intel.com> Cc: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Cc: Bjorn Helgaas <bhelgaas@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Cc: Yaowei Bai <baiyaowei@cmss.chinamobile.com> Cc: Wei Yang <richard.weiyang@gmail.com> Cc: devel@linuxdriverproject.org Cc: linux-input@vger.kernel.org Cc: linux-nvdimm@lists.01.org Cc: devicetree@vger.kernel.org Cc: linux-pci@vger.kernel.org --- arch/arm/plat-samsung/pm-check.c | 6 +- arch/microblaze/pci/pci-common.c | 4 +- arch/powerpc/kernel/pci-common.c | 4 +- arch/sparc/kernel/ioport.c | 2 +- arch/xtensa/include/asm/pci-bridge.h | 4 +- drivers/eisa/eisa-bus.c | 2 + drivers/gpu/drm/drm_memory.c | 3 +- drivers/gpu/drm/gma500/gtt.c | 5 +- drivers/hv/vmbus_drv.c | 52 +++---- drivers/input/joystick/iforce/iforce-main.c | 4 +- drivers/nvdimm/namespace_devs.c | 6 +- drivers/nvdimm/nd.h | 5 +- drivers/of/address.c | 4 +- drivers/parisc/lba_pci.c | 4 +- drivers/pci/host/vmd.c | 8 +- drivers/pci/probe.c | 2 + drivers/pci/setup-bus.c | 2 +- include/linux/ioport.h | 17 ++- kernel/resource.c | 211 ++++++++++++++-------------- 19 files changed, 176 insertions(+), 169 deletions(-) diff --git a/arch/arm/plat-samsung/pm-check.c b/arch/arm/plat-samsung/pm-check.c index cd2c02c68bc3..5494355b1c49 100644 --- a/arch/arm/plat-samsung/pm-check.c +++ b/arch/arm/plat-samsung/pm-check.c @@ -46,8 +46,8 @@ typedef u32 *(run_fn_t)(struct resource *ptr, u32 *arg); static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) { while (ptr != NULL) { - if (ptr->child != NULL) - s3c_pm_run_res(ptr->child, fn, arg); + if (!list_empty(&ptr->child)) + s3c_pm_run_res(resource_first_child(&ptr->child), fn, arg); if ((ptr->flags & IORESOURCE_SYSTEM_RAM) == IORESOURCE_SYSTEM_RAM) { @@ -57,7 +57,7 @@ static void s3c_pm_run_res(struct resource *ptr, run_fn_t fn, u32 *arg) arg = (fn)(ptr, arg); } - ptr = ptr->sibling; + ptr = resource_sibling(ptr); } } diff --git a/arch/microblaze/pci/pci-common.c b/arch/microblaze/pci/pci-common.c index 7899bafab064..2bf73e27e231 100644 --- a/arch/microblaze/pci/pci-common.c +++ b/arch/microblaze/pci/pci-common.c @@ -533,7 +533,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 926035bb378d..28fbe83c9daf 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c @@ -761,7 +761,9 @@ void pci_process_bridge_OF_ranges(struct pci_controller *hose, res->flags = range.flags; res->start = range.cpu_addr; res->end = range.cpu_addr + range.size - 1; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } } } diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c index cca9134cfa7d..99efe4e98b16 100644 --- a/arch/sparc/kernel/ioport.c +++ b/arch/sparc/kernel/ioport.c @@ -669,7 +669,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v) struct resource *root = m->private, *r; const char *nm; - for (r = root->child; r != NULL; r = r->sibling) { + list_for_each_entry(r, &root->child, sibling) { if ((nm = r->name) == NULL) nm = "???"; seq_printf(m, "%016llx-%016llx: %s\n", (unsigned long long)r->start, diff --git a/arch/xtensa/include/asm/pci-bridge.h b/arch/xtensa/include/asm/pci-bridge.h index 0b68c76ec1e6..f487b06817df 100644 --- a/arch/xtensa/include/asm/pci-bridge.h +++ b/arch/xtensa/include/asm/pci-bridge.h @@ -71,8 +71,8 @@ static inline void pcibios_init_resource(struct resource *res, res->flags = flags; res->name = name; res->parent = NULL; - res->sibling = NULL; - res->child = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); } diff --git a/drivers/eisa/eisa-bus.c b/drivers/eisa/eisa-bus.c index 1e8062f6dbfc..dba78f75fd06 100644 --- a/drivers/eisa/eisa-bus.c +++ b/drivers/eisa/eisa-bus.c @@ -408,6 +408,8 @@ static struct resource eisa_root_res = { .start = 0, .end = 0xffffffff, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(eisa_root_res.sibling), + .child = LIST_HEAD_INIT(eisa_root_res.child), }; static int eisa_bus_count; diff --git a/drivers/gpu/drm/drm_memory.c b/drivers/gpu/drm/drm_memory.c index 3c54044214db..53e300a993dc 100644 --- a/drivers/gpu/drm/drm_memory.c +++ b/drivers/gpu/drm/drm_memory.c @@ -155,9 +155,8 @@ u64 drm_get_max_iomem(void) struct resource *tmp; resource_size_t max_iomem = 0; - for (tmp = iomem_resource.child; tmp; tmp = tmp->sibling) { + list_for_each_entry(tmp, &iomem_resource.child, sibling) max_iomem = max(max_iomem, tmp->end); - } return max_iomem; } diff --git a/drivers/gpu/drm/gma500/gtt.c b/drivers/gpu/drm/gma500/gtt.c index 3949b0990916..addd3bc009af 100644 --- a/drivers/gpu/drm/gma500/gtt.c +++ b/drivers/gpu/drm/gma500/gtt.c @@ -565,7 +565,7 @@ int psb_gtt_init(struct drm_device *dev, int resume) int psb_gtt_restore(struct drm_device *dev) { struct drm_psb_private *dev_priv = dev->dev_private; - struct resource *r = dev_priv->gtt_mem->child; + struct resource *r; struct gtt_range *range; unsigned int restored = 0, total = 0, size = 0; @@ -573,14 +573,13 @@ int psb_gtt_restore(struct drm_device *dev) mutex_lock(&dev_priv->gtt_mutex); psb_gtt_init(dev, 1); - while (r != NULL) { + list_for_each_entry(r, &dev_priv->gtt_mem->child, sibling) { range = container_of(r, struct gtt_range, resource); if (range->pages) { psb_gtt_insert(dev, range, 1); size += range->resource.end - range->resource.start; restored++; } - r = r->sibling; total++; } mutex_unlock(&dev_priv->gtt_mutex); diff --git a/drivers/hv/vmbus_drv.c b/drivers/hv/vmbus_drv.c index b10fe26c4891..d87ec5a1bc4c 100644 --- a/drivers/hv/vmbus_drv.c +++ b/drivers/hv/vmbus_drv.c @@ -1412,9 +1412,8 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) { resource_size_t start = 0; resource_size_t end = 0; - struct resource *new_res; + struct resource *new_res, *tmp; struct resource **old_res = &hyperv_mmio; - struct resource **prev_res = NULL; switch (res->type) { @@ -1461,44 +1460,36 @@ static acpi_status vmbus_walk_resources(struct acpi_resource *res, void *ctx) /* * If two ranges are adjacent, merge them. */ - do { - if (!*old_res) { - *old_res = new_res; - break; - } - - if (((*old_res)->end + 1) == new_res->start) { - (*old_res)->end = new_res->end; + if (!*old_res) { + *old_res = new_res; + return AE_OK; + } + tmp = *old_res; + list_for_each_entry_from(tmp, &tmp->parent->child, sibling) { + if ((tmp->end + 1) == new_res->start) { + tmp->end = new_res->end; kfree(new_res); break; } - if ((*old_res)->start == new_res->end + 1) { - (*old_res)->start = new_res->start; + if (tmp->start == new_res->end + 1) { + tmp->start = new_res->start; kfree(new_res); break; } - if ((*old_res)->start > new_res->end) { - new_res->sibling = *old_res; - if (prev_res) - (*prev_res)->sibling = new_res; - *old_res = new_res; + if (tmp->start > new_res->end) { + list_add(&new_res->sibling, tmp->sibling.prev); break; } - - prev_res = old_res; - old_res = &(*old_res)->sibling; - - } while (1); + } return AE_OK; } static int vmbus_acpi_remove(struct acpi_device *device) { - struct resource *cur_res; - struct resource *next_res; + struct resource *res; if (hyperv_mmio) { if (fb_mmio) { @@ -1507,10 +1498,9 @@ static int vmbus_acpi_remove(struct acpi_device *device) fb_mmio = NULL; } - for (cur_res = hyperv_mmio; cur_res; cur_res = next_res) { - next_res = cur_res->sibling; - kfree(cur_res); - } + res = hyperv_mmio; + list_for_each_entry_from(res, &res->parent->child, sibling) + kfree(res); } return 0; @@ -1596,7 +1586,8 @@ int vmbus_allocate_mmio(struct resource **new, struct hv_device *device_obj, } } - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= max) || (iter->end <= min)) continue; @@ -1639,7 +1630,8 @@ void vmbus_free_mmio(resource_size_t start, resource_size_t size) struct resource *iter; down(&hyperv_mmio_lock); - for (iter = hyperv_mmio; iter; iter = iter->sibling) { + iter = hyperv_mmio; + list_for_each_entry_from(iter, &iter->parent->child, sibling) { if ((iter->start >= start + size) || (iter->end <= start)) continue; diff --git a/drivers/input/joystick/iforce/iforce-main.c b/drivers/input/joystick/iforce/iforce-main.c index daeeb4c7e3b0..5c0be27b33ff 100644 --- a/drivers/input/joystick/iforce/iforce-main.c +++ b/drivers/input/joystick/iforce/iforce-main.c @@ -305,8 +305,8 @@ int iforce_init_device(struct iforce *iforce) iforce->device_memory.end = 200; iforce->device_memory.flags = IORESOURCE_MEM; iforce->device_memory.parent = NULL; - iforce->device_memory.child = NULL; - iforce->device_memory.sibling = NULL; + INIT_LIST_HEAD(&iforce->device_memory.child); + INIT_LIST_HEAD(&iforce->device_memory.sibling); /* * Wait until device ready - until it sends its first response. diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c index 28afdd668905..f53d410d9981 100644 --- a/drivers/nvdimm/namespace_devs.c +++ b/drivers/nvdimm/namespace_devs.c @@ -637,7 +637,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, retry: first = 0; for_each_dpa_resource(ndd, res) { - struct resource *next = res->sibling, *new_res = NULL; + struct resource *next = resource_sibling(res), *new_res = NULL; resource_size_t allocate, available = 0; enum alloc_loc loc = ALLOC_ERR; const char *action; @@ -763,7 +763,7 @@ static resource_size_t scan_allocate(struct nd_region *nd_region, * an initial "pmem-reserve pass". Only do an initial BLK allocation * when none of the DPA space is reserved. */ - if ((is_pmem || !ndd->dpa.child) && n == to_allocate) + if ((is_pmem || list_empty(&ndd->dpa.child)) && n == to_allocate) return init_dpa_allocation(label_id, nd_region, nd_mapping, n); return n; } @@ -779,7 +779,7 @@ static int merge_dpa(struct nd_region *nd_region, retry: for_each_dpa_resource(ndd, res) { int rc; - struct resource *next = res->sibling; + struct resource *next = resource_sibling(res); resource_size_t end = res->start + resource_size(res); if (!next || strcmp(res->name, label_id->id) != 0 diff --git a/drivers/nvdimm/nd.h b/drivers/nvdimm/nd.h index 32e0364b48b9..da7da15e03e7 100644 --- a/drivers/nvdimm/nd.h +++ b/drivers/nvdimm/nd.h @@ -102,11 +102,10 @@ unsigned sizeof_namespace_label(struct nvdimm_drvdata *ndd); (unsigned long long) (res ? res->start : 0), ##arg) #define for_each_dpa_resource(ndd, res) \ - for (res = (ndd)->dpa.child; res; res = res->sibling) + list_for_each_entry(res, &(ndd)->dpa.child, sibling) #define for_each_dpa_resource_safe(ndd, res, next) \ - for (res = (ndd)->dpa.child, next = res ? res->sibling : NULL; \ - res; res = next, next = next ? next->sibling : NULL) + list_for_each_entry_safe(res, next, &(ndd)->dpa.child, sibling) struct nd_percpu_lane { int count; diff --git a/drivers/of/address.c b/drivers/of/address.c index 53349912ac75..e2e25719ab52 100644 --- a/drivers/of/address.c +++ b/drivers/of/address.c @@ -330,7 +330,9 @@ int of_pci_range_to_resource(struct of_pci_range *range, { int err; res->flags = range->flags; - res->parent = res->child = res->sibling = NULL; + res->parent = NULL; + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); res->name = np->full_name; if (res->flags & IORESOURCE_IO) { diff --git a/drivers/parisc/lba_pci.c b/drivers/parisc/lba_pci.c index 69bd98421eb1..7482bdfd1959 100644 --- a/drivers/parisc/lba_pci.c +++ b/drivers/parisc/lba_pci.c @@ -170,8 +170,8 @@ lba_dump_res(struct resource *r, int d) for (i = d; i ; --i) printk(" "); printk(KERN_DEBUG "%p [%lx,%lx]/%lx\n", r, (long)r->start, (long)r->end, r->flags); - lba_dump_res(r->child, d+2); - lba_dump_res(r->sibling, d); + lba_dump_res(resource_first_child(&r->child), d+2); + lba_dump_res(resource_sibling(r), d); } diff --git a/drivers/pci/host/vmd.c b/drivers/pci/host/vmd.c index 942b64fc7f1f..e3ace20345c7 100644 --- a/drivers/pci/host/vmd.c +++ b/drivers/pci/host/vmd.c @@ -542,14 +542,14 @@ static struct pci_ops vmd_ops = { static void vmd_attach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = &vmd->resources[1]; - vmd->dev->resource[VMD_MEMBAR2].child = &vmd->resources[2]; + list_add(&vmd->resources[1].sibling, &vmd->dev->resource[VMD_MEMBAR1].child); + list_add(&vmd->resources[2].sibling, &vmd->dev->resource[VMD_MEMBAR2].child); } static void vmd_detach_resources(struct vmd_dev *vmd) { - vmd->dev->resource[VMD_MEMBAR1].child = NULL; - vmd->dev->resource[VMD_MEMBAR2].child = NULL; + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR1].child); + INIT_LIST_HEAD(&vmd->dev->resource[VMD_MEMBAR2].child); } /* diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index ac876e32de4b..9624dd1dfd49 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c @@ -59,6 +59,8 @@ static struct resource *get_pci_domain_busn_res(int domain_nr) r->res.start = 0; r->res.end = 0xff; r->res.flags = IORESOURCE_BUS | IORESOURCE_PCI_FIXED; + INIT_LIST_HEAD(&r->res.child); + INIT_LIST_HEAD(&r->res.sibling); list_add_tail(&r->list, &pci_domain_busn_res_list); diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c index 79b1824e83b4..8e685af8938d 100644 --- a/drivers/pci/setup-bus.c +++ b/drivers/pci/setup-bus.c @@ -2107,7 +2107,7 @@ int pci_reassign_bridge_resources(struct pci_dev *bridge, unsigned long type) continue; /* Ignore BARs which are still in use */ - if (res->child) + if (!list_empty(&res->child)) continue; ret = add_to_list(&saved, bridge, res, 0, 0); diff --git a/include/linux/ioport.h b/include/linux/ioport.h index dfdcd0bfe54e..b7456ae889dd 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -12,6 +12,7 @@ #ifndef __ASSEMBLY__ #include <linux/compiler.h> #include <linux/types.h> +#include <linux/list.h> /* * Resources are tree-like, allowing * nesting etc.. @@ -22,7 +23,8 @@ struct resource { const char *name; unsigned long flags; unsigned long desc; - struct resource *parent, *sibling, *child; + struct list_head child, sibling; + struct resource *parent; }; /* @@ -216,7 +218,6 @@ static inline bool resource_contains(struct resource *r1, struct resource *r2) return r1->start <= r2->start && r1->end >= r2->end; } - /* Convenience shorthand with allocation */ #define request_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), 0) #define request_muxed_region(start,n,name) __request_region(&ioport_resource, (start), (n), (name), IORESOURCE_MUXED) @@ -287,6 +288,18 @@ static inline bool resource_overlaps(struct resource *r1, struct resource *r2) return (r1->start <= r2->end && r1->end >= r2->start); } +static inline struct resource *resource_sibling(struct resource *res) +{ + if (res->parent && !list_is_last(&res->sibling, &res->parent->child)) + return list_next_entry(res, sibling); + return NULL; +} + +static inline struct resource *resource_first_child(struct list_head *head) +{ + return list_first_entry_or_null(head, struct resource, sibling); +} + #endif /* __ASSEMBLY__ */ #endif /* _LINUX_IOPORT_H */ diff --git a/kernel/resource.c b/kernel/resource.c index 5e7c56d5d838..ef9a20b75234 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -31,6 +31,8 @@ struct resource ioport_resource = { .start = 0, .end = IO_SPACE_LIMIT, .flags = IORESOURCE_IO, + .sibling = LIST_HEAD_INIT(ioport_resource.sibling), + .child = LIST_HEAD_INIT(ioport_resource.child), }; EXPORT_SYMBOL(ioport_resource); @@ -39,6 +41,8 @@ struct resource iomem_resource = { .start = 0, .end = -1, .flags = IORESOURCE_MEM, + .sibling = LIST_HEAD_INIT(iomem_resource.sibling), + .child = LIST_HEAD_INIT(iomem_resource.child), }; EXPORT_SYMBOL(iomem_resource); @@ -57,20 +61,20 @@ static DEFINE_RWLOCK(resource_lock); * by boot mem after the system is up. So for reusing the resource entry * we need to remember the resource. */ -static struct resource *bootmem_resource_free; +static struct list_head bootmem_resource_free = LIST_HEAD_INIT(bootmem_resource_free); static DEFINE_SPINLOCK(bootmem_resource_lock); static struct resource *next_resource(struct resource *p, bool sibling_only) { /* Caller wants to traverse through siblings only */ if (sibling_only) - return p->sibling; + return resource_sibling(p); - if (p->child) - return p->child; - while (!p->sibling && p->parent) + if (!list_empty(&p->child)) + return resource_first_child(&p->child); + while (!resource_sibling(p) && p->parent) p = p->parent; - return p->sibling; + return resource_sibling(p); } static void *r_next(struct seq_file *m, void *v, loff_t *pos) @@ -90,7 +94,7 @@ static void *r_start(struct seq_file *m, loff_t *pos) struct resource *p = PDE_DATA(file_inode(m->file)); loff_t l = 0; read_lock(&resource_lock); - for (p = p->child; p && l < *pos; p = r_next(m, p, &l)) + for (p = resource_first_child(&p->child); p && l < *pos; p = r_next(m, p, &l)) ; return p; } @@ -153,8 +157,7 @@ static void free_resource(struct resource *res) if (!PageSlab(virt_to_head_page(res))) { spin_lock(&bootmem_resource_lock); - res->sibling = bootmem_resource_free; - bootmem_resource_free = res; + list_add(&res->sibling, &bootmem_resource_free); spin_unlock(&bootmem_resource_lock); } else { kfree(res); @@ -166,10 +169,9 @@ static struct resource *alloc_resource(gfp_t flags) struct resource *res = NULL; spin_lock(&bootmem_resource_lock); - if (bootmem_resource_free) { - res = bootmem_resource_free; - bootmem_resource_free = res->sibling; - } + res = resource_first_child(&bootmem_resource_free); + if (res) + list_del(&res->sibling); spin_unlock(&bootmem_resource_lock); if (res) @@ -177,6 +179,8 @@ static struct resource *alloc_resource(gfp_t flags) else res = kzalloc(sizeof(struct resource), flags); + INIT_LIST_HEAD(&res->child); + INIT_LIST_HEAD(&res->sibling); return res; } @@ -185,7 +189,7 @@ static struct resource * __request_resource(struct resource *root, struct resour { resource_size_t start = new->start; resource_size_t end = new->end; - struct resource *tmp, **p; + struct resource *tmp; if (end < start) return root; @@ -193,64 +197,62 @@ static struct resource * __request_resource(struct resource *root, struct resour return root; if (end > root->end) return root; - p = &root->child; - for (;;) { - tmp = *p; - if (!tmp || tmp->start > end) { - new->sibling = tmp; - *p = new; + + if (list_empty(&root->child)) { + list_add(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; + } + + list_for_each_entry(tmp, &root->child, sibling) { + if (tmp->start > end) { + list_add(&new->sibling, tmp->sibling.prev); new->parent = root; + INIT_LIST_HEAD(&new->child); return NULL; } - p = &tmp->sibling; if (tmp->end < start) continue; return tmp; } + + list_add_tail(&new->sibling, &root->child); + new->parent = root; + INIT_LIST_HEAD(&new->child); + return NULL; } static int __release_resource(struct resource *old, bool release_child) { - struct resource *tmp, **p, *chd; + struct resource *tmp, *next, *chd; - p = &old->parent->child; - for (;;) { - tmp = *p; - if (!tmp) - break; + list_for_each_entry_safe(tmp, next, &old->parent->child, sibling) { if (tmp == old) { - if (release_child || !(tmp->child)) { - *p = tmp->sibling; + if (release_child || list_empty(&tmp->child)) { + list_del(&tmp->sibling); } else { - for (chd = tmp->child;; chd = chd->sibling) { + list_for_each_entry(chd, &tmp->child, sibling) chd->parent = tmp->parent; - if (!(chd->sibling)) - break; - } - *p = tmp->child; - chd->sibling = tmp->sibling; + list_splice(&tmp->child, tmp->sibling.prev); + list_del(&tmp->sibling); } + old->parent = NULL; return 0; } - p = &tmp->sibling; } return -EINVAL; } static void __release_child_resources(struct resource *r) { - struct resource *tmp, *p; + struct resource *tmp, *next; resource_size_t size; - p = r->child; - r->child = NULL; - while (p) { - tmp = p; - p = p->sibling; - + list_for_each_entry_safe(tmp, next, &r->child, sibling) { tmp->parent = NULL; - tmp->sibling = NULL; + INIT_LIST_HEAD(&tmp->sibling); __release_child_resources(tmp); printk(KERN_DEBUG "release child resource %pR\n", tmp); @@ -259,6 +261,8 @@ static void __release_child_resources(struct resource *r) tmp->start = 0; tmp->end = size - 1; } + + INIT_LIST_HEAD(&tmp->child); } void release_child_resources(struct resource *r) @@ -343,7 +347,8 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, read_lock(&resource_lock); - for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { + for (p = resource_first_child(&iomem_resource.child); p; + p = next_resource(p, sibling_only)) { if ((p->flags & res->flags) != res->flags) continue; if ((desc != IORES_DESC_NONE) && (desc != p->desc)) @@ -532,7 +537,7 @@ int region_intersects(resource_size_t start, size_t size, unsigned long flags, struct resource *p; read_lock(&resource_lock); - for (p = iomem_resource.child; p ; p = p->sibling) { + list_for_each_entry(p, &iomem_resource.child, sibling) { bool is_type = (((p->flags & flags) == flags) && ((desc == IORES_DESC_NONE) || (desc == p->desc))); @@ -586,7 +591,7 @@ static int __find_resource(struct resource *root, struct resource *old, resource_size_t size, struct resource_constraint *constraint) { - struct resource *this = root->child; + struct resource *this = resource_first_child(&root->child); struct resource tmp = *new, avail, alloc; tmp.start = root->start; @@ -596,7 +601,7 @@ static int __find_resource(struct resource *root, struct resource *old, */ if (this && this->start == root->start) { tmp.start = (this == old) ? old->start : this->end + 1; - this = this->sibling; + this = resource_sibling(this); } for(;;) { if (this) @@ -632,7 +637,7 @@ next: if (!this || this->end == root->end) if (this != old) tmp.start = this->end + 1; - this = this->sibling; + this = resource_sibling(this); } return -EBUSY; } @@ -676,7 +681,7 @@ static int reallocate_resource(struct resource *root, struct resource *old, goto out; } - if (old->child) { + if (!list_empty(&old->child)) { err = -EBUSY; goto out; } @@ -757,7 +762,7 @@ struct resource *lookup_resource(struct resource *root, resource_size_t start) struct resource *res; read_lock(&resource_lock); - for (res = root->child; res; res = res->sibling) { + list_for_each_entry(res, &root->child, sibling) { if (res->start == start) break; } @@ -790,32 +795,27 @@ static struct resource * __insert_resource(struct resource *parent, struct resou break; } - for (next = first; ; next = next->sibling) { + for (next = first; ; next = resource_sibling(next)) { /* Partial overlap? Bad, and unfixable */ if (next->start < new->start || next->end > new->end) return next; - if (!next->sibling) + if (!resource_sibling(next)) break; - if (next->sibling->start > new->end) + if (resource_sibling(next)->start > new->end) break; } - new->parent = parent; - new->sibling = next->sibling; - new->child = first; + list_add(&new->sibling, &next->sibling); + INIT_LIST_HEAD(&new->child); - next->sibling = NULL; - for (next = first; next; next = next->sibling) + /* + * From first to next, they all fall into new's region, so change them + * as new's children. + */ + list_cut_position(&new->child, first->sibling.prev, &next->sibling); + list_for_each_entry(next, &new->child, sibling) next->parent = new; - if (parent->child == first) { - parent->child = new; - } else { - next = parent->child; - while (next->sibling != first) - next = next->sibling; - next->sibling = new; - } return NULL; } @@ -937,19 +937,17 @@ static int __adjust_resource(struct resource *res, resource_size_t start, if ((start < parent->start) || (end > parent->end)) goto out; - if (res->sibling && (res->sibling->start <= end)) + if (resource_sibling(res) && (resource_sibling(res)->start <= end)) goto out; - tmp = parent->child; - if (tmp != res) { - while (tmp->sibling != res) - tmp = tmp->sibling; + if (res->sibling.prev != &parent->child) { + tmp = list_prev_entry(res, sibling); if (start <= tmp->end) goto out; } skip: - for (tmp = res->child; tmp; tmp = tmp->sibling) + list_for_each_entry(tmp, &res->child, sibling) if ((tmp->start < start) || (tmp->end > end)) goto out; @@ -987,31 +985,33 @@ EXPORT_SYMBOL(adjust_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) +int reparent_resources(struct resource *parent, struct resource *res) { - struct resource *p, **pp; - struct resource **firstpp = NULL; + struct resource *p, *first = NULL; - for (pp = &parent->child; (p = *pp) != NULL; pp = &p->sibling) { + list_for_each_entry(p, &parent->child, 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 (first == NULL) + first = p; } - if (firstpp == NULL) + if (first == 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; + list_add(&res->sibling, &p->sibling.prev); + INIT_LIST_HEAD(&res->child); + + /* + * From first to p's previous sibling, they all fall into + * res's region, change them as res's children. + */ + list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); + list_for_each_entry(p, &new->child, sibling) { + p->parent = new; pr_debug("PCI: Reparented %s %pR under %s\n", p->name, p, res->name); } @@ -1210,34 +1210,32 @@ EXPORT_SYMBOL(__request_region); void __release_region(struct resource *parent, resource_size_t start, resource_size_t n) { - struct resource **p; + struct resource *res; resource_size_t end; - p = &parent->child; + res = resource_first_child(&parent->child); end = start + n - 1; write_lock(&resource_lock); for (;;) { - struct resource *res = *p; - if (!res) break; if (res->start <= start && res->end >= end) { if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } if (res->start != start || res->end != end) break; - *p = res->sibling; + list_del(&res->sibling); write_unlock(&resource_lock); if (res->flags & IORESOURCE_MUXED) wake_up(&muxed_resource_wait); free_resource(res); return; } - p = &res->sibling; + res = resource_sibling(res); } write_unlock(&resource_lock); @@ -1272,9 +1270,7 @@ EXPORT_SYMBOL(__release_region); int release_mem_region_adjustable(struct resource *parent, resource_size_t start, resource_size_t size) { - struct resource **p; - struct resource *res; - struct resource *new_res; + struct resource *res, *new_res; resource_size_t end; int ret = -EINVAL; @@ -1285,16 +1281,16 @@ int release_mem_region_adjustable(struct resource *parent, /* The alloc_resource() result gets checked later */ new_res = alloc_resource(GFP_KERNEL); - p = &parent->child; + res = resource_first_child(&parent->child); write_lock(&resource_lock); - while ((res = *p)) { + while ((res)) { if (res->start >= end) break; /* look for the next resource if it does not fit into */ if (res->start > start || res->end < end) { - p = &res->sibling; + res = resource_sibling(res); continue; } @@ -1302,14 +1298,14 @@ int release_mem_region_adjustable(struct resource *parent, break; if (!(res->flags & IORESOURCE_BUSY)) { - p = &res->child; + res = resource_first_child(&res->child); continue; } /* found the target resource; let's adjust accordingly */ if (res->start == start && res->end == end) { /* free the whole entry */ - *p = res->sibling; + list_del(&res->sibling); free_resource(res); ret = 0; } else if (res->start == start && res->end != end) { @@ -1332,14 +1328,13 @@ int release_mem_region_adjustable(struct resource *parent, new_res->flags = res->flags; new_res->desc = res->desc; new_res->parent = res->parent; - new_res->sibling = res->sibling; - new_res->child = NULL; + INIT_LIST_HEAD(&new_res->child); ret = __adjust_resource(res, res->start, start - res->start); if (ret) break; - res->sibling = new_res; + list_add(&new_res->sibling, &res->sibling); new_res = NULL; } @@ -1520,7 +1515,7 @@ static int __init reserve_setup(char *str) res->end = io_start + io_num - 1; res->flags |= IORESOURCE_BUSY; res->desc = IORES_DESC_NONE; - res->child = NULL; + INIT_LIST_HEAD(&res->child); if (request_resource(parent, res) == 0) reserved = x+1; } @@ -1540,7 +1535,7 @@ int iomem_map_sanity_check(resource_size_t addr, unsigned long size) loff_t l; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? @@ -1596,7 +1591,7 @@ bool iomem_is_exclusive(u64 addr) addr = addr & PAGE_MASK; read_lock(&resource_lock); - for (p = p->child; p ; p = r_next(NULL, p, &l)) { + for (p = resource_first_child(&p->child); p; p = r_next(NULL, p, &l)) { /* * We can probably skip the resources without * IORESOURCE_IO attribute? -- 2.13.6 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply related [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:37 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:37 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre, brijesh.singh, thomas.lendacky, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list, tglx, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, vgoyal, ebiederm, devicetree, haiyangz, maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas, dan.j.williams, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel, akpm, fengguang.wu, linuxppc-dev, davem [-- Attachment #1: Type: text/plain, Size: 4534 bytes --] 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 All errors (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': >> kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: >> kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_add +1005 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; > 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 6347 bytes --] [-- Attachment #3: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:37 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:37 UTC (permalink / raw) To: Baoquan He Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp, brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem [-- Attachment #1: Type: text/plain, Size: 4534 bytes --] 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 All errors (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': >> kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: >> kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_add +1005 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; > 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 6347 bytes --] ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:37 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:37 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo, thomas.lendacky-5C7GfCeVMHo, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, tglx-hfZtesqFncYOwBW4kG4KsQ, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM, dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWMP3drIcvDWNA 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 All errors (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': >> kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: >> kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_add +1005 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; > 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:37 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:37 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre, brijesh.singh, thomas.lendacky, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list, tglx, lorenzo.pieralisi, sthemmin, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm, devicetree, haiyangz, maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel, akpm, fengguang.wu, linuxppc-dev, davem 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 All errors (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': >> kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: >> kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_add +1005 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; > 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:37 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:37 UTC (permalink / raw) Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo, thomas.lendacky-5C7GfCeVMHo, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, tglx-hfZtesqFncYOwBW4kG4KsQ, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM, dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWMP3drIcvDWNA 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 All errors (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': >> kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: >> kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_add +1005 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; > 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:49 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:49 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre, brijesh.singh, thomas.lendacky, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list, tglx, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, vgoyal, ebiederm, devicetree, haiyangz, maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas, dan.j.williams, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel, akpm, fengguang.wu, linuxppc-dev, davem [-- Attachment #1: Type: text/plain, Size: 4571 bytes --] Hi Baoquan, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING 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: x86_64-randconfig-x011-201823 (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=x86_64 All warnings (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_for_each_entry +1013 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 20640 bytes --] [-- Attachment #3: Type: text/plain, Size: 143 bytes --] _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:49 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:49 UTC (permalink / raw) To: Baoquan He Cc: kbuild-all, linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp, brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem [-- Attachment #1: Type: text/plain, Size: 4571 bytes --] Hi Baoquan, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING 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: x86_64-randconfig-x011-201823 (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=x86_64 All warnings (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_for_each_entry +1013 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation [-- Attachment #2: .config.gz --] [-- Type: application/gzip, Size: 20640 bytes --] ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:49 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:49 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo, thomas.lendacky-5C7GfCeVMHo, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, tglx-hfZtesqFncYOwBW4kG4KsQ, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM, dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWMP3drIcvDWNA Hi Baoquan, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING 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: x86_64-randconfig-x011-201823 (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=x86_64 All warnings (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_for_each_entry +1013 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:49 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:49 UTC (permalink / raw) To: Baoquan He Cc: nicolas.pitre, brijesh.singh, thomas.lendacky, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, frowand.list, tglx, lorenzo.pieralisi, sthemmin, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, bp, dyoung, ebiederm, devicetree, haiyangz, maarten.lankhorst, josh, jglisse, robh+dt, seanpaul, bhelgaas, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, linux-kernel, kbuild-all, devel, akpm, fengguang.wu, linuxppc-dev, davem Hi Baoquan, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING 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: x86_64-randconfig-x011-201823 (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=x86_64 All warnings (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_for_each_entry +1013 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply [flat|nested] 81+ messages in thread
* Re: [PATCH v5 2/4] resource: Use list_head to link sibling resource @ 2018-06-12 4:49 ` kbuild test robot 0 siblings, 0 replies; 81+ messages in thread From: kbuild test robot @ 2018-06-12 4:49 UTC (permalink / raw) Cc: nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, brijesh.singh-5C7GfCeVMHo, thomas.lendacky-5C7GfCeVMHo, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, tglx-hfZtesqFncYOwBW4kG4KsQ, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, bp-l3A5Bk7waGM, dyoung-H+wXaHxf7aLQT0dZR+AlfA, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devicetree-u79uwXL29TY76Z2rM5mHXA, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, josh-iaAMLnmF4UmaiuxdJuQwMA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWMP3drIcvDWNA Hi Baoquan, I love your patch! Perhaps something to improve: [auto build test WARNING on linus/master] [also build test WARNING 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: x86_64-randconfig-x011-201823 (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=x86_64 All warnings (new ones prefixed by >>): kernel/resource.c: In function 'reparent_resources': kernel/resource.c:1005:26: error: passing argument 2 of 'list_add' from incompatible pointer type [-Werror=incompatible-pointer-types] list_add(&res->sibling, &p->sibling.prev); ^ In file included from include/linux/ioport.h:15:0, from kernel/resource.c:14: include/linux/list.h:77:20: note: expected 'struct list_head *' but argument is of type 'struct list_head **' static inline void list_add(struct list_head *new, struct list_head *head) ^~~~~~~~ In file included from include/linux/list.h:9:0, from include/linux/ioport.h:15, from kernel/resource.c:14: kernel/resource.c:1013:26: error: 'new' undeclared (first use in this function); did you mean 'net'? list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ kernel/resource.c:1013:26: note: each undeclared identifier is reported only once for each function it appears in list_for_each_entry(p, &new->child, sibling) { ^ include/linux/kernel.h:963:26: note: in definition of macro 'container_of' void *__mptr = (void *)(ptr); \ ^~~ include/linux/list.h:377:2: note: in expansion of macro 'list_entry' list_entry((ptr)->next, type, member) ^~~~~~~~~~ include/linux/list.h:464:13: note: in expansion of macro 'list_first_entry' for (pos = list_first_entry(head, typeof(*pos), member); \ ^~~~~~~~~~~~~~~~ >> kernel/resource.c:1013:2: note: in expansion of macro 'list_for_each_entry' list_for_each_entry(p, &new->child, sibling) { ^~~~~~~~~~~~~~~~~~~ cc1: some warnings being treated as errors vim +/list_for_each_entry +1013 kernel/resource.c 983 984 /* 985 * Reparent resource children of pr that conflict with res 986 * under res, and make res replace those children. 987 */ 988 int reparent_resources(struct resource *parent, struct resource *res) 989 { 990 struct resource *p, *first = NULL; 991 992 list_for_each_entry(p, &parent->child, sibling) { 993 if (p->end < res->start) 994 continue; 995 if (res->end < p->start) 996 break; 997 if (p->start < res->start || p->end > res->end) 998 return -1; /* not completely contained */ 999 if (first == NULL) 1000 first = p; 1001 } 1002 if (first == NULL) 1003 return -1; /* didn't find any conflicting entries? */ 1004 res->parent = parent; 1005 list_add(&res->sibling, &p->sibling.prev); 1006 INIT_LIST_HEAD(&res->child); 1007 1008 /* 1009 * From first to p's previous sibling, they all fall into 1010 * res's region, change them as res's children. 1011 */ 1012 list_cut_position(&res->child, first->sibling.prev, res->sibling.prev); > 1013 list_for_each_entry(p, &new->child, sibling) { 1014 p->parent = new; 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 infrastructure Open Source Technology Center https://lists.01.org/pipermail/kbuild-all Intel Corporation ^ permalink raw reply [flat|nested] 81+ messages in thread
* [PATCH v5 3/4] resource: add walk_system_ram_res_rev() 2018-06-12 3:28 ` Baoquan He (?) (?) @ 2018-06-12 3:28 ` Baoquan He -1 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem This function, being a variant of walk_system_ram_res() introduced in commit 8c86e70acead ("resource: provide new functions to walk through resources"), walks through a list of all the resources of System RAM in reversed order, i.e., from higher to lower. It will be used in kexec_file code. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Wei Yang <richard.weiyang@gmail.com> --- include/linux/ioport.h | 3 +++ kernel/resource.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b7456ae889dd..066cc263e2cc 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -279,6 +279,9 @@ extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); extern int +walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)); +extern int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); diff --git a/kernel/resource.c b/kernel/resource.c index ef9a20b75234..3128ac938f38 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -23,6 +23,8 @@ #include <linux/pfn.h> #include <linux/mm.h> #include <linux/resource_ext.h> +#include <linux/string.h> +#include <linux/vmalloc.h> #include <asm/io.h> @@ -443,6 +445,44 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, } /* + * This function, being a variant of walk_system_ram_res(), calls the @func + * callback against all memory ranges of type System RAM which are marked as + * IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY in reversed order, i.e., from + * higher to lower. + */ +int walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)) +{ + unsigned long flags; + struct resource *res; + int ret = -1; + + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; + + read_lock(&resource_lock); + list_for_each_entry_reverse(res, &iomem_resource.child, sibling) { + if (start >= end) + break; + if ((res->flags & flags) != flags) + continue; + if (res->desc != IORES_DESC_NONE) + continue; + if (res->end < start) + break; + + if ((res->end >= start) && (res->start < end)) { + ret = (*func)(res, arg); + if (ret) + break; + } + end = res->start - 1; + + } + read_unlock(&resource_lock); + return ret; +} + +/* * This function calls the @func callback against all memory ranges, which * are ranges marked as IORESOURCE_MEM and IORESOUCE_BUSY. */ -- 2.13.6 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 3/4] resource: add walk_system_ram_res_rev() @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Baoquan He This function, being a variant of walk_system_ram_res() introduced in commit 8c86e70acead ("resource: provide new functions to walk through resources"), walks through a list of all the resources of System RAM in reversed order, i.e., from higher to lower. It will be used in kexec_file code. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Wei Yang <richard.weiyang@gmail.com> --- include/linux/ioport.h | 3 +++ kernel/resource.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b7456ae889dd..066cc263e2cc 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -279,6 +279,9 @@ extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); extern int +walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)); +extern int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); diff --git a/kernel/resource.c b/kernel/resource.c index ef9a20b75234..3128ac938f38 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -23,6 +23,8 @@ #include <linux/pfn.h> #include <linux/mm.h> #include <linux/resource_ext.h> +#include <linux/string.h> +#include <linux/vmalloc.h> #include <asm/io.h> @@ -443,6 +445,44 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, } /* + * This function, being a variant of walk_system_ram_res(), calls the @func + * callback against all memory ranges of type System RAM which are marked as + * IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY in reversed order, i.e., from + * higher to lower. + */ +int walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)) +{ + unsigned long flags; + struct resource *res; + int ret = -1; + + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; + + read_lock(&resource_lock); + list_for_each_entry_reverse(res, &iomem_resource.child, sibling) { + if (start >= end) + break; + if ((res->flags & flags) != flags) + continue; + if (res->desc != IORES_DESC_NONE) + continue; + if (res->end < start) + break; + + if ((res->end >= start) && (res->start < end)) { + ret = (*func)(res, arg); + if (ret) + break; + } + end = res->start - 1; + + } + read_unlock(&resource_lock); + return ret; +} + +/* * This function calls the @func callback against all memory ranges, which * are ranges marked as IORESOURCE_MEM and IORESOUCE_BUSY. */ -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 3/4] resource: add walk_system_ram_res_rev() @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem This function, being a variant of walk_system_ram_res() introduced in commit 8c86e70acead ("resource: provide new functions to walk through resources"), walks through a list of all the resources of System RAM in reversed order, i.e., from higher to lower. It will be used in kexec_file code. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Wei Yang <richard.weiyang@gmail.com> --- include/linux/ioport.h | 3 +++ kernel/resource.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b7456ae889dd..066cc263e2cc 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -279,6 +279,9 @@ extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); extern int +walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)); +extern int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); diff --git a/kernel/resource.c b/kernel/resource.c index ef9a20b75234..3128ac938f38 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -23,6 +23,8 @@ #include <linux/pfn.h> #include <linux/mm.h> #include <linux/resource_ext.h> +#include <linux/string.h> +#include <linux/vmalloc.h> #include <asm/io.h> @@ -443,6 +445,44 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, } /* + * This function, being a variant of walk_system_ram_res(), calls the @func + * callback against all memory ranges of type System RAM which are marked as + * IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY in reversed order, i.e., from + * higher to lower. + */ +int walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)) +{ + unsigned long flags; + struct resource *res; + int ret = -1; + + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; + + read_lock(&resource_lock); + list_for_each_entry_reverse(res, &iomem_resource.child, sibling) { + if (start >= end) + break; + if ((res->flags & flags) != flags) + continue; + if (res->desc != IORES_DESC_NONE) + continue; + if (res->end < start) + break; + + if ((res->end >= start) && (res->start < end)) { + ret = (*func)(res, arg); + if (ret) + break; + } + end = res->start - 1; + + } + read_unlock(&resource_lock); + return ret; +} + +/* * This function calls the @func callback against all memory ranges, which * are ranges marked as IORESOURCE_MEM and IORESOUCE_BUSY. */ -- 2.13.6 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 3/4] resource: add walk_system_ram_res_rev() @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maart This function, being a variant of walk_system_ram_res() introduced in commit 8c86e70acead ("resource: provide new functions to walk through resources"), walks through a list of all the resources of System RAM in reversed order, i.e., from higher to lower. It will be used in kexec_file code. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Brijesh Singh <brijesh.singh@amd.com> Cc: "Jérôme Glisse" <jglisse@redhat.com> Cc: Borislav Petkov <bp@suse.de> Cc: Tom Lendacky <thomas.lendacky@amd.com> Cc: Wei Yang <richard.weiyang@gmail.com> --- include/linux/ioport.h | 3 +++ kernel/resource.c | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+) diff --git a/include/linux/ioport.h b/include/linux/ioport.h index b7456ae889dd..066cc263e2cc 100644 --- a/include/linux/ioport.h +++ b/include/linux/ioport.h @@ -279,6 +279,9 @@ extern int walk_system_ram_res(u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); extern int +walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)); +extern int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, u64 end, void *arg, int (*func)(struct resource *, void *)); diff --git a/kernel/resource.c b/kernel/resource.c index ef9a20b75234..3128ac938f38 100644 --- a/kernel/resource.c +++ b/kernel/resource.c @@ -23,6 +23,8 @@ #include <linux/pfn.h> #include <linux/mm.h> #include <linux/resource_ext.h> +#include <linux/string.h> +#include <linux/vmalloc.h> #include <asm/io.h> @@ -443,6 +445,44 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, } /* + * This function, being a variant of walk_system_ram_res(), calls the @func + * callback against all memory ranges of type System RAM which are marked as + * IORESOURCE_SYSTEM_RAM and IORESOUCE_BUSY in reversed order, i.e., from + * higher to lower. + */ +int walk_system_ram_res_rev(u64 start, u64 end, void *arg, + int (*func)(struct resource *, void *)) +{ + unsigned long flags; + struct resource *res; + int ret = -1; + + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; + + read_lock(&resource_lock); + list_for_each_entry_reverse(res, &iomem_resource.child, sibling) { + if (start >= end) + break; + if ((res->flags & flags) != flags) + continue; + if (res->desc != IORES_DESC_NONE) + continue; + if (res->end < start) + break; + + if ((res->end >= start) && (res->start < end)) { + ret = (*func)(res, arg); + if (ret) + break; + } + end = res->start - 1; + + } + read_unlock(&resource_lock); + return ret; +} + +/* * This function calls the @func callback against all memory ranges, which * are ranges marked as IORESOURCE_MEM and IORESOUCE_BUSY. */ -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 4/4] kexec_file: Load kernel at top of system RAM if required @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, vgoyal, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem For kexec_file loading, if kexec_buf.top_down is 'true', the memory which is used to load kernel/initrd/purgatory is supposed to be allocated from top to down. This is what we have been doing all along in the old kexec loading interface and the kexec loading is still default setting in some distributions. However, the current kexec_file loading interface doesn't do likt this. The function arch_kexec_walk_mem() it calls ignores checking kexec_buf.top_down, but calls walk_system_ram_res() directly to go through all resources of System RAM from bottom to up, to try to find memory region which can contain the specific kexec buffer, then call locate_mem_hole_callback() to allocate memory in that found memory region from top to down. This brings confusion especially when KASLR is widely supported , users have to make clear why kexec/kdump kernel loading position is different between these two interfaces in order to exclude unnecessary noises. Hence these two interfaces need be unified on behaviour. Here add checking if kexec_buf.top_down is 'true' in arch_kexec_walk_mem(), if yes, call the newly added walk_system_ram_res_rev() to find memory region from top to down to load kernel. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: Vivek Goyal <vgoyal@redhat.com> Cc: Dave Young <dyoung@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Yinghai Lu <yinghai@kernel.org> Cc: kexec@lists.infradead.org --- kernel/kexec_file.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 75d8e7cf040e..7a66d9d5a534 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -518,6 +518,8 @@ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, crashk_res.start, crashk_res.end, kbuf, func); + else if (kbuf->top_down) + return walk_system_ram_res_rev(0, ULONG_MAX, kbuf, func); else return walk_system_ram_res(0, ULONG_MAX, kbuf, func); } -- 2.13.6 _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 4/4] kexec_file: Load kernel at top of system RAM if required @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: patrik.r.jakobsson, airlied, kys, haiyangz, sthemmin, dmitry.torokhov, frowand.list, keith.busch, jonathan.derrick, lorenzo.pieralisi, bhelgaas, tglx, brijesh.singh, jglisse, thomas.lendacky, gregkh, baiyaowei, richard.weiyang, devel, linux-input, linux-nvdimm, devicetree, linux-pci, ebiederm, vgoyal, dyoung, yinghai, kexec, monstr, davem, chris, jcmvbkbc, gustavo, maarten.lankhorst, seanpaul, linux-parisc, linuxppc-dev, Baoquan He For kexec_file loading, if kexec_buf.top_down is 'true', the memory which is used to load kernel/initrd/purgatory is supposed to be allocated from top to down. This is what we have been doing all along in the old kexec loading interface and the kexec loading is still default setting in some distributions. However, the current kexec_file loading interface doesn't do likt this. The function arch_kexec_walk_mem() it calls ignores checking kexec_buf.top_down, but calls walk_system_ram_res() directly to go through all resources of System RAM from bottom to up, to try to find memory region which can contain the specific kexec buffer, then call locate_mem_hole_callback() to allocate memory in that found memory region from top to down. This brings confusion especially when KASLR is widely supported , users have to make clear why kexec/kdump kernel loading position is different between these two interfaces in order to exclude unnecessary noises. Hence these two interfaces need be unified on behaviour. Here add checking if kexec_buf.top_down is 'true' in arch_kexec_walk_mem(), if yes, call the newly added walk_system_ram_res_rev() to find memory region from top to down to load kernel. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: Vivek Goyal <vgoyal@redhat.com> Cc: Dave Young <dyoung@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Yinghai Lu <yinghai@kernel.org> Cc: kexec@lists.infradead.org --- kernel/kexec_file.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 75d8e7cf040e..7a66d9d5a534 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -518,6 +518,8 @@ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, crashk_res.start, crashk_res.end, kbuf, func); + else if (kbuf->top_down) + return walk_system_ram_res_rev(0, ULONG_MAX, kbuf, func); else return walk_system_ram_res(0, ULONG_MAX, kbuf, func); } -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 4/4] kexec_file: Load kernel at top of system RAM if required @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel, akpm, robh+dt, dan.j.williams, nicolas.pitre, josh, fengguang.wu, bp Cc: brijesh.singh, devicetree, airlied, linux-pci, richard.weiyang, keith.busch, jcmvbkbc, baiyaowei, kys, frowand.list, lorenzo.pieralisi, sthemmin, Baoquan He, linux-nvdimm, patrik.r.jakobsson, linux-input, gustavo, dyoung, thomas.lendacky, haiyangz, maarten.lankhorst, jglisse, seanpaul, bhelgaas, tglx, yinghai, jonathan.derrick, chris, monstr, linux-parisc, gregkh, dmitry.torokhov, kexec, ebiederm, devel, linuxppc-dev, davem For kexec_file loading, if kexec_buf.top_down is 'true', the memory which is used to load kernel/initrd/purgatory is supposed to be allocated from top to down. This is what we have been doing all along in the old kexec loading interface and the kexec loading is still default setting in some distributions. However, the current kexec_file loading interface doesn't do likt this. The function arch_kexec_walk_mem() it calls ignores checking kexec_buf.top_down, but calls walk_system_ram_res() directly to go through all resources of System RAM from bottom to up, to try to find memory region which can contain the specific kexec buffer, then call locate_mem_hole_callback() to allocate memory in that found memory region from top to down. This brings confusion especially when KASLR is widely supported , users have to make clear why kexec/kdump kernel loading position is different between these two interfaces in order to exclude unnecessary noises. Hence these two interfaces need be unified on behaviour. Here add checking if kexec_buf.top_down is 'true' in arch_kexec_walk_mem(), if yes, call the newly added walk_system_ram_res_rev() to find memory region from top to down to load kernel. Signed-off-by: Baoquan He <bhe@redhat.com> Cc: Eric Biederman <ebiederm@xmission.com> Cc: Vivek Goyal <vgoyal@redhat.com> Cc: Dave Young <dyoung@redhat.com> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Yinghai Lu <yinghai@kernel.org> Cc: kexec@lists.infradead.org --- kernel/kexec_file.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 75d8e7cf040e..7a66d9d5a534 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -518,6 +518,8 @@ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, crashk_res.start, crashk_res.end, kbuf, func); + else if (kbuf->top_down) + return walk_system_ram_res_rev(0, ULONG_MAX, kbuf, func); else return walk_system_ram_res(0, ULONG_MAX, kbuf, func); } -- 2.13.6 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm ^ permalink raw reply related [flat|nested] 81+ messages in thread
* [PATCH v5 4/4] kexec_file: Load kernel at top of system RAM if required @ 2018-06-12 3:28 ` Baoquan He 0 siblings, 0 replies; 81+ messages in thread From: Baoquan He @ 2018-06-12 3:28 UTC (permalink / raw) To: linux-kernel-u79uwXL29TY76Z2rM5mHXA, akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b, robh+dt-DgEjT+Ai2ygdnm+yROfE0A, dan.j.williams-ral2JQCrhuEAvxtiuMwx3w, nicolas.pitre-QSEj5FYQhm4dnm+yROfE0A, josh-iaAMLnmF4UmaiuxdJuQwMA, fengguang.wu-ral2JQCrhuEAvxtiuMwx3w, bp-l3A5Bk7waGM Cc: brijesh.singh-5C7GfCeVMHo, devicetree-u79uwXL29TY76Z2rM5mHXA, airlied-cv59FeDIM0c, linux-pci-u79uwXL29TY76Z2rM5mHXA, richard.weiyang-Re5JQEeQqe8AvxtiuMwx3w, keith.busch-ral2JQCrhuEAvxtiuMwx3w, jcmvbkbc-Re5JQEeQqe8AvxtiuMwx3w, baiyaowei-0p4V/sDNsUmm0O/7XYngnFaTQe2KTcn/, kys-0li6OtcxBFHby3iVrkZq2A, frowand.list-Re5JQEeQqe8AvxtiuMwx3w, lorenzo.pieralisi-5wv7dgnIgG8, sthemmin-0li6OtcxBFHby3iVrkZq2A, Baoquan He, linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw, patrik.r.jakobsson-Re5JQEeQqe8AvxtiuMwx3w, linux-input-u79uwXL29TY76Z2rM5mHXA, gustavo-THi1TnShQwVAfugRpC6u6w, dyoung-H+wXaHxf7aLQT0dZR+AlfA, thomas.lendacky-5C7GfCeVMHo, haiyangz-0li6OtcxBFHby3iVrkZq2A, maarten.lankhorst-VuQAYsv1563Yd54FQh9/CA, jglisse-H+wXaHxf7aLQT0dZR+AlfA, seanpaul-F7+t8E8rja9g9hUCZPvPmw, bhelgaas-hpIqsD4AKlfQT0dZR+AlfA, tglx-hfZtesqFncYOwBW4kG4KsQ, yinghai-DgEjT+Ai2ygdnm+yROfE0A, jonathan.derrick-ral2JQCrhuEAvxtiuMwx3w, chris-YvXeqwSYzG2sTnJN9+BGXg, monstr-pSz03upnqPeHXe+LvDLADg, linux-parisc-u79uwXL29TY76Z2rM5mHXA, gregkh-hQyY1W1yCW8ekmWlsbkhG0B+6BGkLq7r, dmitry.torokhov-Re5JQEeQqe8AvxtiuMwx3w, kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, ebiederm-aS9lmoZGLiVWk0Htik3J/w, devel-tBiZLqfeLfOHmIFyCCdPziST3g8Odh+X, linuxppc-dev For kexec_file loading, if kexec_buf.top_down is 'true', the memory which is used to load kernel/initrd/purgatory is supposed to be allocated from top to down. This is what we have been doing all along in the old kexec loading interface and the kexec loading is still default setting in some distributions. However, the current kexec_file loading interface doesn't do likt this. The function arch_kexec_walk_mem() it calls ignores checking kexec_buf.top_down, but calls walk_system_ram_res() directly to go through all resources of System RAM from bottom to up, to try to find memory region which can contain the specific kexec buffer, then call locate_mem_hole_callback() to allocate memory in that found memory region from top to down. This brings confusion especially when KASLR is widely supported , users have to make clear why kexec/kdump kernel loading position is different between these two interfaces in order to exclude unnecessary noises. Hence these two interfaces need be unified on behaviour. Here add checking if kexec_buf.top_down is 'true' in arch_kexec_walk_mem(), if yes, call the newly added walk_system_ram_res_rev() to find memory region from top to down to load kernel. Signed-off-by: Baoquan He <bhe-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Eric Biederman <ebiederm-aS9lmoZGLiVWk0Htik3J/w@public.gmane.org> Cc: Vivek Goyal <vgoyal-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Dave Young <dyoung-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> Cc: Andrew Morton <akpm-de/tnXTf+JLsfHDXvbKv3WD2FQJk+8+b@public.gmane.org> Cc: Yinghai Lu <yinghai-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org> Cc: kexec-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org --- kernel/kexec_file.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/kernel/kexec_file.c b/kernel/kexec_file.c index 75d8e7cf040e..7a66d9d5a534 100644 --- a/kernel/kexec_file.c +++ b/kernel/kexec_file.c @@ -518,6 +518,8 @@ int __weak arch_kexec_walk_mem(struct kexec_buf *kbuf, IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY, crashk_res.start, crashk_res.end, kbuf, func); + else if (kbuf->top_down) + return walk_system_ram_res_rev(0, ULONG_MAX, kbuf, func); else return walk_system_ram_res(0, ULONG_MAX, kbuf, func); } -- 2.13.6 ^ permalink raw reply related [flat|nested] 81+ messages in thread
end of thread, other threads:[~2018-07-04 4:18 UTC | newest] Thread overview: 81+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2018-06-12 3:28 [PATCH v5 0/4] resource: Use list_head to link sibling resource Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` [PATCH v5 1/4] resource: Move reparent_resources() to kernel/resource.c and make it public Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:34 ` Baoquan He 2018-06-12 3:34 ` Baoquan He 2018-06-12 3:34 ` Baoquan He 2018-06-12 3:34 ` Baoquan He 2018-06-12 3:34 ` Baoquan He 2018-06-12 3:55 ` kbuild test robot 2018-06-12 3:55 ` kbuild test robot 2018-06-12 3:55 ` kbuild test robot 2018-06-12 3:55 ` kbuild test robot 2018-06-12 3:55 ` kbuild test robot 2018-06-12 8:29 ` Andy Shevchenko 2018-06-12 8:29 ` Andy Shevchenko 2018-06-12 8:29 ` Andy Shevchenko 2018-06-12 8:29 ` Andy Shevchenko 2018-06-12 8:29 ` Andy Shevchenko 2018-06-12 9:38 ` Baoquan He 2018-06-12 9:38 ` Baoquan He 2018-06-12 9:38 ` Baoquan He 2018-06-12 9:38 ` Baoquan He 2018-06-12 9:38 ` Baoquan He 2018-06-12 14:20 ` Andy Shevchenko 2018-06-12 14:20 ` Andy Shevchenko 2018-06-12 14:20 ` Andy Shevchenko 2018-06-12 14:20 ` Andy Shevchenko 2018-06-12 14:20 ` Andy Shevchenko 2018-06-12 14:24 ` Andy Shevchenko 2018-06-12 14:24 ` Andy Shevchenko 2018-06-12 14:24 ` Andy Shevchenko 2018-06-12 14:24 ` Andy Shevchenko 2018-06-12 14:24 ` Andy Shevchenko 2018-07-03 14:55 ` Baoquan He 2018-07-03 14:55 ` Baoquan He 2018-07-03 14:55 ` Baoquan He 2018-07-03 14:55 ` Baoquan He 2018-07-03 14:55 ` Baoquan He 2018-07-03 20:57 ` Andy Shevchenko 2018-07-03 20:57 ` Andy Shevchenko 2018-07-03 20:57 ` Andy Shevchenko 2018-07-03 20:57 ` Andy Shevchenko 2018-07-04 4:18 ` Baoquan He 2018-07-04 4:18 ` Baoquan He 2018-07-04 4:18 ` Baoquan He 2018-07-04 4:18 ` Baoquan He 2018-07-04 4:18 ` Baoquan He 2018-06-12 9:49 ` Baoquan He 2018-06-12 9:49 ` Baoquan He 2018-06-12 9:49 ` Baoquan He 2018-06-12 9:49 ` Baoquan He 2018-06-12 9:49 ` Baoquan He 2018-06-12 3:28 ` [PATCH v5 2/4] resource: Use list_head to link sibling resource Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 4:37 ` kbuild test robot 2018-06-12 4:37 ` kbuild test robot 2018-06-12 4:37 ` kbuild test robot 2018-06-12 4:37 ` kbuild test robot 2018-06-12 4:37 ` kbuild test robot 2018-06-12 4:49 ` kbuild test robot 2018-06-12 4:49 ` kbuild test robot 2018-06-12 4:49 ` kbuild test robot 2018-06-12 4:49 ` kbuild test robot 2018-06-12 4:49 ` kbuild test robot 2018-06-12 3:28 ` [PATCH v5 3/4] resource: add walk_system_ram_res_rev() Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` [PATCH v5 4/4] kexec_file: Load kernel at top of system RAM if required Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He 2018-06-12 3:28 ` Baoquan He
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.