svn commit: r339953 - stable/12/sys/kern
Bjoern A. Zeeb
bz at FreeBSD.org
Wed Oct 31 14:03:49 UTC 2018
Author: bz
Date: Wed Oct 31 14:03:48 2018
New Revision: 339953
URL: https://svnweb.freebsd.org/changeset/base/339953
Log:
MFC r339931,r339933:
As a follow-up to r339930 (r339951 in stable/12) and various reports
implement logging in case we fail during module load because the pcpu
or vnet module sections are full.
We did return a proper error but not leaving any indication to the
user as to what the actual problem was.
Even worse, on 12/13 currently we are seeing an unrelated error (ENOSYS
instead of ENOSPC, which gets skipped over in kern_linker.c) to be
printed which made problem diagnostics even harder.
PR: 228854
Approved by: re (kib)
Modified:
stable/12/sys/kern/link_elf.c
stable/12/sys/kern/link_elf_obj.c
Directory Properties:
stable/12/ (props changed)
Modified: stable/12/sys/kern/link_elf.c
==============================================================================
--- stable/12/sys/kern/link_elf.c Wed Oct 31 12:53:58 2018 (r339952)
+++ stable/12/sys/kern/link_elf.c Wed Oct 31 14:03:48 2018 (r339953)
@@ -637,8 +637,12 @@ parse_dpcpu(elf_file_t ef)
* all per-cpu storage from that.
*/
ef->pcpu_base = (Elf_Addr)(uintptr_t)dpcpu_alloc(size);
- if (ef->pcpu_base == 0)
+ if (ef->pcpu_base == 0) {
+ printf("%s: pcpu module space is out of space; "
+ "cannot allocate %d for %s\n",
+ __func__, size, ef->lf.pathname);
return (ENOSPC);
+ }
memcpy((void *)ef->pcpu_base, (void *)ef->pcpu_start, size);
dpcpu_copy((void *)ef->pcpu_base, size);
elf_set_add(&set_pcpu_list, ef->pcpu_start, ef->pcpu_stop,
@@ -670,8 +674,12 @@ parse_vnet(elf_file_t ef)
* all per-vnet storage from that.
*/
ef->vnet_base = (Elf_Addr)(uintptr_t)vnet_data_alloc(size);
- if (ef->vnet_base == 0)
+ if (ef->vnet_base == 0) {
+ printf("%s: vnet module space is out of space; "
+ "cannot allocate %d for %s\n",
+ __func__, size, ef->lf.pathname);
return (ENOSPC);
+ }
memcpy((void *)ef->vnet_base, (void *)ef->vnet_start, size);
vnet_data_copy((void *)ef->vnet_base, size);
elf_set_add(&set_vnet_list, ef->vnet_start, ef->vnet_stop,
Modified: stable/12/sys/kern/link_elf_obj.c
==============================================================================
--- stable/12/sys/kern/link_elf_obj.c Wed Oct 31 12:53:58 2018 (r339952)
+++ stable/12/sys/kern/link_elf_obj.c Wed Oct 31 14:03:48 2018 (r339953)
@@ -368,6 +368,11 @@ link_elf_link_preload(linker_class_t cls, const char *
dpcpu = dpcpu_alloc(shdr[i].sh_size);
if (dpcpu == NULL) {
+ printf("%s: pcpu module space is out "
+ "of space; cannot allocate %#jx "
+ "for %s\n", __func__,
+ (uintmax_t)shdr[i].sh_size,
+ filename);
error = ENOSPC;
goto out;
}
@@ -382,6 +387,11 @@ link_elf_link_preload(linker_class_t cls, const char *
vnet_data = vnet_data_alloc(shdr[i].sh_size);
if (vnet_data == NULL) {
+ printf("%s: vnet module space is out "
+ "of space; cannot allocate %#jx "
+ "for %s\n", __func__,
+ (uintmax_t)shdr[i].sh_size,
+ filename);
error = ENOSPC;
goto out;
}
@@ -847,14 +857,30 @@ link_elf_load_file(linker_class_t cls, const char *fil
else
ef->progtab[pb].name = "<<NOBITS>>";
if (ef->progtab[pb].name != NULL &&
- !strcmp(ef->progtab[pb].name, DPCPU_SETNAME))
+ !strcmp(ef->progtab[pb].name, DPCPU_SETNAME)) {
ef->progtab[pb].addr =
dpcpu_alloc(shdr[i].sh_size);
+ if (ef->progtab[pb].addr == NULL) {
+ printf("%s: pcpu module space is out "
+ "of space; cannot allocate %#jx "
+ "for %s\n", __func__,
+ (uintmax_t)shdr[i].sh_size,
+ filename);
+ }
+ }
#ifdef VIMAGE
else if (ef->progtab[pb].name != NULL &&
- !strcmp(ef->progtab[pb].name, VNET_SETNAME))
+ !strcmp(ef->progtab[pb].name, VNET_SETNAME)) {
ef->progtab[pb].addr =
vnet_data_alloc(shdr[i].sh_size);
+ if (ef->progtab[pb].addr == NULL) {
+ printf("%s: vnet module space is out "
+ "of space; cannot allocate %#jx "
+ "for %s\n", __func__,
+ (uintmax_t)shdr[i].sh_size,
+ filename);
+ }
+ }
#endif
else
ef->progtab[pb].addr =
More information about the svn-src-stable
mailing list