[PATCH] [SRU] [B/master][C/master] Fix reserve_memblock_reserved_regions() upon boot

classic Classic list List threaded Threaded
6 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH] [SRU] [B/master][C/master] Fix reserve_memblock_reserved_regions() upon boot

Paolo Pisati-5
Impact:

During boot on a dragonboard410c using a recent Bionic or Cosmic kernel:

...
[ 0.049776] WARNING: CPU: 0 PID: 1 at arch/arm64/kernel/setup.c:271 reserve_memblock_reserved_regions+0xe0/0x148
[ 0.049783] Modules linked in:
[ 0.049797] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.18.0-8-snapdragon #9
[ 0.049803] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
[ 0.049813] pstate: 80400005 (Nzcv daif +PAN -UAO)
[ 0.049821] pc : reserve_memblock_reserved_regions+0xe0/0x148
[ 0.049829] lr : reserve_memblock_reserved_regions+0xd8/0x148
[ 0.049836] sp : ffff000008033d40
[ 0.049841] x29: ffff000008033d40 x28: 0000000000000000
[ 0.049852] x27: ffff000009410584 x26: ffff000009577018
[ 0.049863] x25: 0000000000000000 x24: 0000000000488020
[ 0.049874] x23: 00000000bfffffff x22: ffff0000090e8928
[ 0.049885] x21: ffff000008ffb578 x20: ffff000009a48708
[ 0.049896] x19: ffff80003a409280 x18: 0000000000000000
[ 0.049906] x17: 0000000000000000 x16: 0000000000000000
[ 0.049917] x15: ffffffffffffffff x14: ffff000009a48708
[ 0.049927] x13: 0000000000000000 x12: 0000000000000028
[ 0.049938] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f
[ 0.049949] x9 : 0000000000000000 x8 : ffff80003a409300
[ 0.049959] x7 : 0000000000000000 x6 : 000000000000003f
[ 0.049969] x5 : 0000000000000040 x4 : ffff80003d9ffc70
[ 0.049980] x3 : 00000000bd9fffff x2 : ffff000009c241b0
[ 0.049990] x1 : 0000000000000000 x0 : 0000000000000000
[ 0.050001] Call trace:
[ 0.050010] reserve_memblock_reserved_regions+0xe0/0x148
[ 0.050021] do_one_initcall+0x54/0x1e0
[ 0.050031] kernel_init_freeable+0x254/0x2f8
[ 0.050043] kernel_init+0x18/0x110
[ 0.050052] ret_from_fork+0x10/0x18
[ 0.050063] ---[ end trace dc768b294fafe4aa ]---
...

commit 50d7ba36b916 upstream ("arm64: export memblock_reserve()d regions via
/proc/iomem"), backported in commit 62289841 in bionic/master, wrongly assumed
that memblock_reserve() would not be used to reserve regions that aren't
memory. It turns out, this is exactly what early_init_dt_reserve_memory_arch()
will do if it finds a reservation that was also carved out of the memory node.

Fix:

Apply the attached patch and recompile

The fix was discussed here: https://www.spinics.net/lists/arm-kernel/msg675580.html

How to test:

Boot the patched kernel and check for the above WARNING in dmesg

Regression potential:

The patch didn't make it upstream yet, but the fix is very small and was tested on the lkml.

Proposing for Bionic and Cosmic.

James Morse (1):
  arm64: Fix /proc/iomem for reserved but not memory regions

 arch/arm64/kernel/setup.c | 50 +++++++++++++++++++++++++++++------------------
 1 file changed, 31 insertions(+), 19 deletions(-)

--
2.7.4


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

[PATCH] arm64: Fix /proc/iomem for reserved but not memory regions

Paolo Pisati-5
From: James Morse <[hidden email]>

BugLink: https://bugs.launchpad.net/bugs/1797139

commit 50d7ba36b916 ("arm64: export memblock_reserve()d regions via
/proc/iomem") wrongly assumed that memblock_reserve() would not be used to
reserve regions that aren't memory. It turns out, this is exactly what
early_init_dt_reserve_memory_arch() will do if it finds a reservation
that was also carved out of the memory node.

reserve_memblock_reserved_regions() now needs to cope with reserved regions
that aren't memory, which means we must walk two lists at once.

We can't use walk_system_ram_res() and reserve_region_with_split()
together, as the former hands its callback a copied resource on
the stack, where as the latter expects the in-tree resource to be
provided.

Allocate an array of struct resources during request_standard_resources()
so that we have all the 'System RAM' regions on hand.

Increasing the mem_idx cursor is optional as multiple memblock_reserved()
regions may exist in one System RAM region.
Because adjacent memblock_reserved() regions will be merged, we also need
to consider multiple System RAM regions for one span of memblock_reserved()
address space.

Fixes: 50d7ba36b916 ("arm64: export memblock_reserve()d regions via /proc/iomem")
Reported-by: John Stultz <[hidden email]>
CC: Akashi Takahiro <[hidden email]>
CC: Ard Biesheuvel <[hidden email]>
Signed-off-by: James Morse <[hidden email]>
Tested-by: John Stultz <[hidden email]>
Signed-off-by: Paolo Pisati <[hidden email]>
---
 arch/arm64/kernel/setup.c | 50 +++++++++++++++++++++++++++++------------------
 1 file changed, 31 insertions(+), 19 deletions(-)

diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
index 5b4fac4..952c2b1 100644
--- a/arch/arm64/kernel/setup.c
+++ b/arch/arm64/kernel/setup.c
@@ -64,6 +64,9 @@
 #include <asm/xen/hypervisor.h>
 #include <asm/mmu_context.h>
 
+static int num_standard_resources;
+static struct resource *standard_resources;
+
 phys_addr_t __fdt_pointer __initdata;
 
 /*
@@ -206,14 +209,19 @@ static void __init request_standard_resources(void)
 {
  struct memblock_region *region;
  struct resource *res;
+ unsigned long i = 0;
 
  kernel_code.start   = __pa_symbol(_text);
  kernel_code.end     = __pa_symbol(__init_begin - 1);
  kernel_data.start   = __pa_symbol(_sdata);
  kernel_data.end     = __pa_symbol(_end - 1);
 
+ num_standard_resources = memblock.memory.cnt;
+ standard_resources = alloc_bootmem_low(num_standard_resources *
+       sizeof(*standard_resources));
+
  for_each_memblock(memory, region) {
- res = alloc_bootmem_low(sizeof(*res));
+ res = &standard_resources[i++];
  if (memblock_is_nomap(region)) {
  res->name  = "reserved";
  res->flags = IORESOURCE_MEM;
@@ -244,8 +252,11 @@ static void __init request_standard_resources(void)
 static int __init reserve_memblock_reserved_regions(void)
 {
  phys_addr_t start, end, roundup_end = 0;
- struct resource *mem, *res;
- u64 i;
+ struct resource *mem;
+ u64 i, mem_idx = 0;
+
+ if (!standard_resources)
+ return 0;
 
  for_each_reserved_mem_region(i, &start, &end) {
  if (end <= roundup_end)
@@ -255,24 +266,25 @@ static int __init reserve_memblock_reserved_regions(void)
  end = __pfn_to_phys(PFN_UP(end)) - 1;
  roundup_end = end;
 
- res = kzalloc(sizeof(*res), GFP_ATOMIC);
- if (WARN_ON(!res))
- return -ENOMEM;
- res->start = start;
- res->end = end;
- res->name  = "reserved";
- res->flags = IORESOURCE_MEM;
+ while (start > standard_resources[mem_idx].end) {
+ mem_idx++;
+ if (mem_idx >= num_standard_resources)
+ return 0; /* no more 'System RAM' */
+ }
+ do {
+ mem = &standard_resources[mem_idx];
 
- mem = request_resource_conflict(&iomem_resource, res);
- /*
- * We expected memblock_reserve() regions to conflict with
- * memory created by request_standard_resources().
- */
- if (WARN_ON_ONCE(!mem))
- continue;
- kfree(res);
+ if (mem->start > end)
+ continue; /* doesn't overlap with memory */
+
+ start = max(start, mem->start);
+ reserve_region_with_split(mem, start,
+  min(end, mem->end),
+  "reserved");
 
- reserve_region_with_split(mem, start, end, "reserved");
+ if (mem->end < end)
+ mem_idx++;
+ } while (mem->end < end && mem_idx < num_standard_resources);
  }
 
  return 0;
--
2.7.4


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK/cmt: [PATCH] arm64: Fix /proc/iomem for reserved but not memory regions

Colin Ian King-2
On 10/10/18 15:30, Paolo Pisati wrote:

> From: James Morse <[hidden email]>
>
> BugLink: https://bugs.launchpad.net/bugs/1797139
>
> commit 50d7ba36b916 ("arm64: export memblock_reserve()d regions via
> /proc/iomem") wrongly assumed that memblock_reserve() would not be used to
> reserve regions that aren't memory. It turns out, this is exactly what
> early_init_dt_reserve_memory_arch() will do if it finds a reservation
> that was also carved out of the memory node.
>
> reserve_memblock_reserved_regions() now needs to cope with reserved regions
> that aren't memory, which means we must walk two lists at once.
>
> We can't use walk_system_ram_res() and reserve_region_with_split()
> together, as the former hands its callback a copied resource on
> the stack, where as the latter expects the in-tree resource to be
> provided.
>
> Allocate an array of struct resources during request_standard_resources()
> so that we have all the 'System RAM' regions on hand.
>
> Increasing the mem_idx cursor is optional as multiple memblock_reserved()
> regions may exist in one System RAM region.
> Because adjacent memblock_reserved() regions will be merged, we also need
> to consider multiple System RAM regions for one span of memblock_reserved()
> address space.
>
> Fixes: 50d7ba36b916 ("arm64: export memblock_reserve()d regions via /proc/iomem")
> Reported-by: John Stultz <[hidden email]>
> CC: Akashi Takahiro <[hidden email]>
> CC: Ard Biesheuvel <[hidden email]>
> Signed-off-by: James Morse <[hidden email]>
> Tested-by: John Stultz <[hidden email]>
> Signed-off-by: Paolo Pisati <[hidden email]>
> ---
>  arch/arm64/kernel/setup.c | 50 +++++++++++++++++++++++++++++------------------
>  1 file changed, 31 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index 5b4fac4..952c2b1 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -64,6 +64,9 @@
>  #include <asm/xen/hypervisor.h>
>  #include <asm/mmu_context.h>
>  
> +static int num_standard_resources;
> +static struct resource *standard_resources;
> +
>  phys_addr_t __fdt_pointer __initdata;
>  
>  /*
> @@ -206,14 +209,19 @@ static void __init request_standard_resources(void)
>  {
>   struct memblock_region *region;
>   struct resource *res;
> + unsigned long i = 0;
>  
>   kernel_code.start   = __pa_symbol(_text);
>   kernel_code.end     = __pa_symbol(__init_begin - 1);
>   kernel_data.start   = __pa_symbol(_sdata);
>   kernel_data.end     = __pa_symbol(_end - 1);
>  
> + num_standard_resources = memblock.memory.cnt;
> + standard_resources = alloc_bootmem_low(num_standard_resources *
> +       sizeof(*standard_resources));
> +
>   for_each_memblock(memory, region) {
> - res = alloc_bootmem_low(sizeof(*res));
> + res = &standard_resources[i++];
>   if (memblock_is_nomap(region)) {
>   res->name  = "reserved";
>   res->flags = IORESOURCE_MEM;
> @@ -244,8 +252,11 @@ static void __init request_standard_resources(void)
>  static int __init reserve_memblock_reserved_regions(void)
>  {
>   phys_addr_t start, end, roundup_end = 0;
> - struct resource *mem, *res;
> - u64 i;
> + struct resource *mem;
> + u64 i, mem_idx = 0;
> +
> + if (!standard_resources)
> + return 0;
>  
>   for_each_reserved_mem_region(i, &start, &end) {
>   if (end <= roundup_end)
> @@ -255,24 +266,25 @@ static int __init reserve_memblock_reserved_regions(void)
>   end = __pfn_to_phys(PFN_UP(end)) - 1;
>   roundup_end = end;
>  
> - res = kzalloc(sizeof(*res), GFP_ATOMIC);
> - if (WARN_ON(!res))
> - return -ENOMEM;
> - res->start = start;
> - res->end = end;
> - res->name  = "reserved";
> - res->flags = IORESOURCE_MEM;
> + while (start > standard_resources[mem_idx].end) {
> + mem_idx++;
> + if (mem_idx >= num_standard_resources)
> + return 0; /* no more 'System RAM' */
> + }
> + do {
> + mem = &standard_resources[mem_idx];
>  
> - mem = request_resource_conflict(&iomem_resource, res);
> - /*
> - * We expected memblock_reserve() regions to conflict with
> - * memory created by request_standard_resources().
> - */
> - if (WARN_ON_ONCE(!mem))
> - continue;
> - kfree(res);
> + if (mem->start > end)
> + continue; /* doesn't overlap with memory */
> +
> + start = max(start, mem->start);
> + reserve_region_with_split(mem, start,
> +  min(end, mem->end),
> +  "reserved");
>  
> - reserve_region_with_split(mem, start, end, "reserved");
> + if (mem->end < end)
> + mem_idx++;
> + } while (mem->end < end && mem_idx < num_standard_resources);
>   }
>  
>   return 0;
>

Even though this hasn't landed upstream it has been tested John Stultz
and it fixes the issue.  So, I'm happy to ACK this given the testing.

Acked-by: Colin Ian King <[hidden email]>

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

ACK/Cmnt: [PATCH] arm64: Fix /proc/iomem for reserved but not memory regions

Stefan Bader-2
In reply to this post by Paolo Pisati-5
Given, this is not upstream I would make this a "UBUNTU: SAUCE: " patch...

On 10.10.2018 16:30, Paolo Pisati wrote:

> From: James Morse <[hidden email]>
>
> BugLink: https://bugs.launchpad.net/bugs/1797139
>
> commit 50d7ba36b916 ("arm64: export memblock_reserve()d regions via
> /proc/iomem") wrongly assumed that memblock_reserve() would not be used to
> reserve regions that aren't memory. It turns out, this is exactly what
> early_init_dt_reserve_memory_arch() will do if it finds a reservation
> that was also carved out of the memory node.
>
> reserve_memblock_reserved_regions() now needs to cope with reserved regions
> that aren't memory, which means we must walk two lists at once.
>
> We can't use walk_system_ram_res() and reserve_region_with_split()
> together, as the former hands its callback a copied resource on
> the stack, where as the latter expects the in-tree resource to be
> provided.
>
> Allocate an array of struct resources during request_standard_resources()
> so that we have all the 'System RAM' regions on hand.
>
> Increasing the mem_idx cursor is optional as multiple memblock_reserved()
> regions may exist in one System RAM region.
> Because adjacent memblock_reserved() regions will be merged, we also need
> to consider multiple System RAM regions for one span of memblock_reserved()
> address space.
>
> Fixes: 50d7ba36b916 ("arm64: export memblock_reserve()d regions via /proc/iomem")
> Reported-by: John Stultz <[hidden email]>
> CC: Akashi Takahiro <[hidden email]>
> CC: Ard Biesheuvel <[hidden email]>
> Signed-off-by: James Morse <[hidden email]>
> Tested-by: John Stultz <[hidden email]>
(cherry picked from https://www.spinics.net/lists/arm-kernel/msg675580.html)
> Signed-off-by: Paolo Pisati <[hidden email]-by: Stefan Bader <[hidden email]>
> ---

Testing was good and with the slight modifications to provenance I do not see
reasons to not take this.

-Stefan

>  arch/arm64/kernel/setup.c | 50 +++++++++++++++++++++++++++++------------------
>  1 file changed, 31 insertions(+), 19 deletions(-)
>
> diff --git a/arch/arm64/kernel/setup.c b/arch/arm64/kernel/setup.c
> index 5b4fac4..952c2b1 100644
> --- a/arch/arm64/kernel/setup.c
> +++ b/arch/arm64/kernel/setup.c
> @@ -64,6 +64,9 @@
>  #include <asm/xen/hypervisor.h>
>  #include <asm/mmu_context.h>
>  
> +static int num_standard_resources;
> +static struct resource *standard_resources;
> +
>  phys_addr_t __fdt_pointer __initdata;
>  
>  /*
> @@ -206,14 +209,19 @@ static void __init request_standard_resources(void)
>  {
>   struct memblock_region *region;
>   struct resource *res;
> + unsigned long i = 0;
>  
>   kernel_code.start   = __pa_symbol(_text);
>   kernel_code.end     = __pa_symbol(__init_begin - 1);
>   kernel_data.start   = __pa_symbol(_sdata);
>   kernel_data.end     = __pa_symbol(_end - 1);
>  
> + num_standard_resources = memblock.memory.cnt;
> + standard_resources = alloc_bootmem_low(num_standard_resources *
> +       sizeof(*standard_resources));
> +
>   for_each_memblock(memory, region) {
> - res = alloc_bootmem_low(sizeof(*res));
> + res = &standard_resources[i++];
>   if (memblock_is_nomap(region)) {
>   res->name  = "reserved";
>   res->flags = IORESOURCE_MEM;
> @@ -244,8 +252,11 @@ static void __init request_standard_resources(void)
>  static int __init reserve_memblock_reserved_regions(void)
>  {
>   phys_addr_t start, end, roundup_end = 0;
> - struct resource *mem, *res;
> - u64 i;
> + struct resource *mem;
> + u64 i, mem_idx = 0;
> +
> + if (!standard_resources)
> + return 0;
>  
>   for_each_reserved_mem_region(i, &start, &end) {
>   if (end <= roundup_end)
> @@ -255,24 +266,25 @@ static int __init reserve_memblock_reserved_regions(void)
>   end = __pfn_to_phys(PFN_UP(end)) - 1;
>   roundup_end = end;
>  
> - res = kzalloc(sizeof(*res), GFP_ATOMIC);
> - if (WARN_ON(!res))
> - return -ENOMEM;
> - res->start = start;
> - res->end = end;
> - res->name  = "reserved";
> - res->flags = IORESOURCE_MEM;
> + while (start > standard_resources[mem_idx].end) {
> + mem_idx++;
> + if (mem_idx >= num_standard_resources)
> + return 0; /* no more 'System RAM' */
> + }
> + do {
> + mem = &standard_resources[mem_idx];
>  
> - mem = request_resource_conflict(&iomem_resource, res);
> - /*
> - * We expected memblock_reserve() regions to conflict with
> - * memory created by request_standard_resources().
> - */
> - if (WARN_ON_ONCE(!mem))
> - continue;
> - kfree(res);
> + if (mem->start > end)
> + continue; /* doesn't overlap with memory */
> +
> + start = max(start, mem->start);
> + reserve_region_with_split(mem, start,
> +  min(end, mem->end),
> +  "reserved");
>  
> - reserve_region_with_split(mem, start, end, "reserved");
> + if (mem->end < end)
> + mem_idx++;
> + } while (mem->end < end && mem_idx < num_standard_resources);
>   }
>  
>   return 0;
>


--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team

signature.asc (836 bytes) Download Attachment
Reply | Threaded
Open this post in threaded view
|

Re: ACK/Cmnt: [PATCH] arm64: Fix /proc/iomem for reserved but not memory regions

Paolo Pisati-5
On Thu, Oct 11, 2018 at 10:38:40AM +0200, Stefan Bader wrote:
> Given, this is not upstream I would make this a "UBUNTU: SAUCE: " patch...

Can you make the change before applying or i do i have to resend?
--
bye,
p.

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team
Reply | Threaded
Open this post in threaded view
|

APPLIED(cmnt): [PATCH] [SRU] [B/master][C/master] Fix reserve_memblock_reserved_regions() upon boot

Khaled Elmously
In reply to this post by Paolo Pisati-5
Added "UBUNTU: SAUCE: " also


On 2018-10-10 16:30:33 , Paolo Pisati wrote:

> Impact:
>
> During boot on a dragonboard410c using a recent Bionic or Cosmic kernel:
>
> ...
> [ 0.049776] WARNING: CPU: 0 PID: 1 at arch/arm64/kernel/setup.c:271 reserve_memblock_reserved_regions+0xe0/0x148
> [ 0.049783] Modules linked in:
> [ 0.049797] CPU: 0 PID: 1 Comm: swapper/0 Not tainted 4.18.0-8-snapdragon #9
> [ 0.049803] Hardware name: Qualcomm Technologies, Inc. APQ 8016 SBC (DT)
> [ 0.049813] pstate: 80400005 (Nzcv daif +PAN -UAO)
> [ 0.049821] pc : reserve_memblock_reserved_regions+0xe0/0x148
> [ 0.049829] lr : reserve_memblock_reserved_regions+0xd8/0x148
> [ 0.049836] sp : ffff000008033d40
> [ 0.049841] x29: ffff000008033d40 x28: 0000000000000000
> [ 0.049852] x27: ffff000009410584 x26: ffff000009577018
> [ 0.049863] x25: 0000000000000000 x24: 0000000000488020
> [ 0.049874] x23: 00000000bfffffff x22: ffff0000090e8928
> [ 0.049885] x21: ffff000008ffb578 x20: ffff000009a48708
> [ 0.049896] x19: ffff80003a409280 x18: 0000000000000000
> [ 0.049906] x17: 0000000000000000 x16: 0000000000000000
> [ 0.049917] x15: ffffffffffffffff x14: ffff000009a48708
> [ 0.049927] x13: 0000000000000000 x12: 0000000000000028
> [ 0.049938] x11: 0101010101010101 x10: 7f7f7f7f7f7f7f7f
> [ 0.049949] x9 : 0000000000000000 x8 : ffff80003a409300
> [ 0.049959] x7 : 0000000000000000 x6 : 000000000000003f
> [ 0.049969] x5 : 0000000000000040 x4 : ffff80003d9ffc70
> [ 0.049980] x3 : 00000000bd9fffff x2 : ffff000009c241b0
> [ 0.049990] x1 : 0000000000000000 x0 : 0000000000000000
> [ 0.050001] Call trace:
> [ 0.050010] reserve_memblock_reserved_regions+0xe0/0x148
> [ 0.050021] do_one_initcall+0x54/0x1e0
> [ 0.050031] kernel_init_freeable+0x254/0x2f8
> [ 0.050043] kernel_init+0x18/0x110
> [ 0.050052] ret_from_fork+0x10/0x18
> [ 0.050063] ---[ end trace dc768b294fafe4aa ]---
> ...
>
> commit 50d7ba36b916 upstream ("arm64: export memblock_reserve()d regions via
> /proc/iomem"), backported in commit 62289841 in bionic/master, wrongly assumed
> that memblock_reserve() would not be used to reserve regions that aren't
> memory. It turns out, this is exactly what early_init_dt_reserve_memory_arch()
> will do if it finds a reservation that was also carved out of the memory node.
>
> Fix:
>
> Apply the attached patch and recompile
>
> The fix was discussed here: https://www.spinics.net/lists/arm-kernel/msg675580.html
>
> How to test:
>
> Boot the patched kernel and check for the above WARNING in dmesg
>
> Regression potential:
>
> The patch didn't make it upstream yet, but the fix is very small and was tested on the lkml.
>
> Proposing for Bionic and Cosmic.
>
> James Morse (1):
>   arm64: Fix /proc/iomem for reserved but not memory regions
>
>  arch/arm64/kernel/setup.c | 50 +++++++++++++++++++++++++++++------------------
>  1 file changed, 31 insertions(+), 19 deletions(-)
>
> --
> 2.7.4
>
>
> --
> kernel-team mailing list
> [hidden email]
> https://lists.ubuntu.com/mailman/listinfo/kernel-team

--
kernel-team mailing list
[hidden email]
https://lists.ubuntu.com/mailman/listinfo/kernel-team