[SeaBIOS] [PATCH] ata: Many CPUs cause seabios not to find boot disk
Han, Huaitong
huaitong.han at intel.com
Tue Aug 4 04:11:45 CEST 2015
It's OK.
On Mon, 2015-08-03 at 20:42 -0400, Kevin O'Connor wrote:
> On Mon, Aug 03, 2015 at 03:49:14PM +0000, Han, Huaitong wrote:
> > On Mon, 2015-08-03 at 10:32 -0400, Kevin O'Connor wrote:
> > > If I understand your patch, it seems to be trying to force large
> > > mptable allocations to fail while still allowing other f-seg
> > > allocations. I think a simpler approach would be to just limit the
> > > mptable allocation and leave the malloc implementation unchanged. See
> > > patch below.
> >
> > Yes, it's a better way to solve problem.
> >
> > > u16 mpclength = ((struct mptable_config_s *)p->physaddr)->length;
> > > + if (length + mpclength > BUILD_MAX_MPTABLE_FSEG)
> >
> > it's better that warning dprintf is added before return.
>
> Good point. New patch below.
>
> -Kevin
>
>
> From 194b750f3735cb8b400ead1cba4ecd2e6e16d5ed Mon Sep 17 00:00:00 2001
> From: Kevin O'Connor <kevin at koconnor.net>
> Date: Mon, 3 Aug 2015 10:16:39 -0400
> Subject: [PATCH] mptable: Don't create mptable if it is very large
>
> Very large mptable structures can fill up the space in the f-segment
> and cause other important f-segment allocations to fail. Limit the
> maximum size of the mptable to prevent this.
>
> On QEMU, with the current maximum size of 600 bytes, the mptable will
> not be created in configurations of ~20 cpus or more. The mptable is
> rarely used in modern OSes so this should not be a problem.
>
> Reported-by: Huaitong Han <huaitong.han at intel.com>
> Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
> ---
> src/config.h | 2 ++
> src/fw/biostables.c | 5 +++++
> 2 files changed, 7 insertions(+)
>
> diff --git a/src/config.h b/src/config.h
> index 4bfebe8..6c47f16 100644
> --- a/src/config.h
> +++ b/src/config.h
> @@ -22,6 +22,8 @@
> #define BUILD_MAX_EXTDRIVE 16
> // Number of bytes the smbios may be and still live in the f-segment
> #define BUILD_MAX_SMBIOS_FSEG 600
> +// Maximum number of bytes the mptable may be and still be copied to f-segment
> +#define BUILD_MAX_MPTABLE_FSEG 600
>
> #define BUILD_MODEL_ID 0xFC
> #define BUILD_SUBMODEL_ID 0x00
> diff --git a/src/fw/biostables.c b/src/fw/biostables.c
> index 450aca2..71a1a0d 100644
> --- a/src/fw/biostables.c
> +++ b/src/fw/biostables.c
> @@ -54,6 +54,11 @@ copy_mptable(void *pos)
> return;
> u32 length = p->length * 16;
> u16 mpclength = ((struct mptable_config_s *)p->physaddr)->length;
> + if (length + mpclength > BUILD_MAX_MPTABLE_FSEG) {
> + dprintf(1, "Skipping MPTABLE copy due to large size (%d bytes)\n"
> + , length + mpclength);
> + return;
> + }
> // Allocate final memory location. (In theory the config
> // structure can go in high memory, but Linux kernels before
> // v2.6.30 crash with that.)
More information about the SeaBIOS
mailing list