Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 24 Feb 2010 00:59:58 +0000
From:      Brandon Gooch <jamesbrandongooch@gmail.com>
To:        John Baldwin <jhb@freebsd.org>
Cc:        freebsd-current@freebsd.org
Subject:   Re: ZFS boot problems with memory > 1MB
Message-ID:  <179b97fb1002231659h742fd72enca5cfa1d09b822f6@mail.gmail.com>
In-Reply-To: <201002231740.46478.jhb@freebsd.org>
References:  <747dc8f31002220835g481b0baeqb1d6df32a79b7da2@mail.gmail.com> <201002231603.36500.jhb@freebsd.org> <179b97fb1002231404x1b5fce88v1d76450cc70473a1@mail.gmail.com> <201002231740.46478.jhb@freebsd.org>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, Feb 23, 2010 at 10:40 PM, John Baldwin <jhb@freebsd.org> wrote:
> On Tuesday 23 February 2010 5:04:03 pm Brandon Gooch wrote:
>> On Tue, Feb 23, 2010 at 3:03 PM, John Baldwin <jhb@freebsd.org> wrote:
>> > On Tuesday 23 February 2010 3:36:19 pm Brandon Gooch wrote:
>> >> On Tue, Feb 23, 2010 at 1:01 PM, John Baldwin <jhb@freebsd.org> wrote=
:
>> >> > On Tuesday 23 February 2010 12:36:31 pm Brandon Gooch wrote:
>> >> >> On Tue, Feb 23, 2010 at 10:24 AM, John Baldwin <jhb@freebsd.org>
> wrote:
>> >> >> > On Tuesday 23 February 2010 10:28:49 am Brandon Gooch wrote:
>> >> >> >> On Tue, Feb 23, 2010 at 7:29 AM, Andriy Gapon <avg@icyb.net.ua>
> wrote:
>> >> >> >> > on 23/02/2010 13:18 Renato Botelho said the following:
>> >> >> >> >> On Mon, Feb 22, 2010 at 7:35 PM, Chris Hedley
>> >> >> >> >> <freebsd-current@chrishedley.com> wrote:
>> >> >> >> > [snip]
>> >> >> >> >>> Do you have USB legacy support enabled in your BIOS? =A0I'm=
 not
> sure
>> > if
>> >> >> >> >>> there's an option for the loader to use USB devices nativel=
y,
> but
>> > the BIOS's
>> >> >> >> >>> legacy option where it provides AT/PS2 emulation is probabl=
y
> the
>> > easiest way
>> >> >> >> >>> to get the keyboard working.
>> >> >> >> >>
>> >> >> >> >> Yes, I do, but it seems to be a regression on FreeBSD itself=
, I
> had
>> > this problem
>> >> >> >> >> in the past and I checked the same things i need to check in=
 the
>> > past again and
>> >> >> >> >> everything is fine.
>> >> >> >> >
>> >> >> >> > A more precise way to state that would be "a regression in
> FreeBSD
>> > boot/loader".
>> >> >> >> > I think that you are referring to the issue that was fixed by
>> > r189017.
>> >> >> >> > It might be worthwhile investigating what was done in that
> revision
>> > and what
>> >> >> >> > happened in sys/boot code since then.
>> >> >> >> >
>> >> >> >> > One possibility is that your BIOS uses memory above 1MB for U=
SB
>> > emulation, but
>> >> >> >> > doesn't mark that memory as used in system memory map. =A0In =
that
> case
>> > that memory
>> >> >> >> > could be overwritten by the loader. =A0If that's true then th=
e
> blame
>> > is on the BIOS.
>> >> >> >> > =A0Alternatively, our code might be parsing the system memory=
 map
>> > incorrectly.
>> >> >> >> > But I am just making wild guesses here.
>> >> >> >> >
>> >> >> >>
>> >> >> >> I don't know if it is at all related, but this commit has cause=
d
>> >> >> >> problems for me booting at least one of my machines:
>> >> >> >>
>> >> >> >>
>> >
> http://svn.freebsd.org/viewvc/base/head/sys/boot/i386/zfsboot/zfsboot.c?r=
1=3D199714&r2=3D200309
>> >> >> >>
>> >> >> >> Commit message:
>> >> >> >>
>> >> >> >> Revision 200309 - (view) (annotate) - [select for diffs]
>> >> >> >> Modified Wed Dec 9 20:36:56 2009 UTC (2 months, 2 weeks ago) by=
 jhb
>> >> >> >> File length: 24893 byte(s)
>> >> >> >> Diff to previous 199714
>> >> >> >> - Port bios_getmem() from libi386 to {gpt,}zfsboot() and use it=
 to
>> >> >> >> =A0 safely allocate a heap region above 1MB. =A0This enables
>> > {gpt,}zfsboot()
>> >> >> >> =A0 to allocate much larger buffers than before.
>> >> >> >> - Use a larger buffer (1MB instead of 128K) for temporary ZFS
> buffers.
>> > =A0This
>> >> >> >> =A0 allows more reliable reading of compressed files in a
> raidz/raidz2
>> > pool.
>> >> >> >>
>> >> >> >> Submitted by: Matt Reimer =A0mattjreimer of gmail
>> >> >> >> MFC after: =A0 =A01 week
>> >> >> >
>> >> >> > Starting a new thread, which problems are you seeing with this
> change?
>> > =A0ZFS is
>> >> >> > a good bit more memory hungry than UFS, so it really needs to us=
e
> high
>> > memory
>> >> >> > for its heap. =A0Also, I wonder if you still have problems if yo=
u use
> the
>> > older
>> >> >> > zfsboot with the newer zfsloader? =A0Finally, you need to use
> disklabel -
>> > B or
>> >> >> > some such to update the zfsboot bits for this change to take eff=
ect.
>> >> >> >
>> >> >> > --
>> >> >> > John Baldwin
>> >> >> >
>> >> >>
>> >> >> I filed a PR so it wouldn't fall through the cracks:
>> >> >>
>> >> >> http://www.freebsd.org/cgi/query-pr.cgi?pr=3D144234
>> >> >>
>> >> >> I guess I tried a combination of various revisions of bootstrap co=
de
>> >> >> and loaders when I first encountered the issue. It was when I wrot=
e a
>> >> >> recent gptzfsboot to the geom that I saw the symptoms:
>> >> >>
>> >> >> error 1 lba 48
>> >> >> error 1 lba 1
>> >> >> No ZFS pools located, can't boot
>> >> >>
>> >> >> I just wound up using sys/boot/i386/zfsboot/zfsboot.c revision 199=
714
>> >> >> to build a working gptzfsboot on another system and wrote that to =
the
>> >> >> disk to get the machine operational.
>> >> >
>> >> > Try this:
>> >> >
>> >> > Index: zfsboot.c
>> >> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
>> >> > --- zfsboot.c =A0 (revision 204207)
>> >> > +++ zfsboot.c =A0 (working copy)
>> >> > @@ -467,6 +467,7 @@
>> >> > =A0static inline void
>> >> > =A0putc(int c)
>> >> > =A0{
>> >> > + =A0 =A0v86.ctl =3D 0;
>> >> > =A0 =A0 v86.addr =3D 0x10;
>> >> > =A0 =A0 v86.eax =3D 0xe00 | (c & 0xff);
>> >> > =A0 =A0 v86.ebx =3D 0x7;
>> >> > @@ -617,6 +618,8 @@
>> >> > =A0 =A0 off_t off;
>> >> > =A0 =A0 struct dsk *dsk;
>> >> >
>> >> > + =A0 =A0dmadat =3D (void *)(roundup2(__base + (int32_t)&_end, 0x10=
000) -
>> > __base);
>> >> > +
>> >> > =A0 =A0 bios_getmem();
>> >> >
>> >> > =A0 =A0 if (high_heap_size > 0) {
>> >> > @@ -627,9 +630,6 @@
>> >> > =A0 =A0 =A0 =A0heap_end =3D (char *) PTOV(bios_basemem);
>> >> > =A0 =A0 }
>> >> >
>> >> > - =A0 =A0dmadat =3D (void *)(roundup2(__base + (int32_t)&_end, 0x10=
000) -
>> > __base);
>> >> > - =A0 =A0v86.ctl =3D V86_FLAGS;
>> >> > -
>> >> > =A0 =A0 dsk =3D malloc(sizeof(struct dsk));
>> >> > =A0 =A0 dsk->drive =3D *(uint8_t *)PTOV(ARGS);
>> >> > =A0 =A0 dsk->type =3D dsk->drive & DRV_HARD ? TYPE_AD : TYPE_FD;
>> >> > @@ -1157,6 +1157,7 @@
>> >> > =A0 =A0 =A0* when no such key is pressed in reality. As far as I ca=
n tell,
>> >> > =A0 =A0 =A0* this only happens shortly after a reboot.
>> >> > =A0 =A0 =A0*/
>> >> > + =A0 =A0v86.ctl =3D V86_FLAGS;
>> >> > =A0 =A0 v86.addr =3D 0x16;
>> >> > =A0 =A0 v86.eax =3D fn << 8;
>> >> > =A0 =A0 v86int();
>> >> >
>> >> > --
>> >> > John Baldwin
>> >> >
>> >>
>> >> It still breaks:
>> >>
>> >> error 1 lba 48
>> >> error 1 lba 1
>> >> No ZFS pools located, can't boot
>> >
>> > Ok. =A0Can you add a printf to zfsboot.c to print out dsk->start in th=
e case
>> > that you get an error? =A0error 1 means that the BIOS thinks it got a =
bad
>> > parameter, presumably in the disk packet. =A0If you wanted to be ambit=
ious,
> just
>> > print out all of the fields in the packet when it fails.
>> >
>> > --
>> > John Baldwin
>> >
>>
>> Adding printf statements to drvread():
>>
>> printf("dsk->xxx: %u\n", dsk->xxx):
>>
>> Output:
>>
>> error 1 lba 48
>> dsk->drive: 0
>> dsk->type: 0
>> dsk->unit: 0
>> dsk->slice: 0
>> dsk->part: 0
>> dsk->init: 0
>> dsk->start: 978673664
>
> This value looks a bit high, do you have a partition that starts at an of=
fset
> of about 466GB into the disk?
>
>> error 1 lba 1
>> dsk->drive: 0
>> dsk->type: 0
>> dsk->unit: 0
>> dsk->slice: 0
>> dsk->part: 0
>> dsk->init: 0
>> dsk->start: 0
>> No ZFS pools located, can't boot
>
> Sorry, I meant members of the 'packet' variable, though dsk->start is use=
ful
> to have as well.
>
> --
> John Baldwin
>

Here it is (with some crazy dsk stuff included):

error 1 lba 48
packet.len: 16
packet.seg: 8192
packet.count: 16
packet.lba: 47
packet.off: 0
dsk->drive: 4294967295
dsk->slice: 4294967295
dsk->type: 4294967295
dsk->part: 4294967295
dsk->unit: 4294967295
dsk->init: 4294967295
dsk->start: 4294967295

error 1 lba 1
packet.len: 16
packet.seg: 8704
packet.count: 1
packet.lba: 1
packet.off: 0
dsk->drive: 4294967295
dsk->slice: 4294967295
dsk->type: 4294967295
dsk->part: 4294967295
dsk->unit: 4294967295
dsk->init: 4294967295
dsk->start: 4294967295

No ZFS pools located, can't boot

-Brandon



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?179b97fb1002231659h742fd72enca5cfa1d09b822f6>