On Thu, Mar 29, 2018 at 09:21:16AM +0200, Mark Kettenis wrote: > > Date: Wed, 28 Mar 2018 23:46:49 -0700 > > From: Mike Larkin <mlar...@azathoth.net> > > > > On Thu, Mar 29, 2018 at 08:40:27AM +0200, Stefan Sperling wrote: > > > On Mon, Mar 12, 2018 at 11:38:14AM +0100, Stefan Sperling wrote: > > > > I haven't had any feedback on the previous diff. However, I felt it > > > > was a bit of a hack, so I tried to come up with a cleaner solution. > > > > > > Anyone? Can this go in now? I hope to get this tested across > > > many sparc64 machines during the 6.4 release cycle. > > > > > > > Wish I could help but my T5240 has never been able to run any ldoms. > > Something > > about mismatched firmware versions. ldomctl(8) just generates interrupt > > storms. > > Even with all the fixes that stsp@ made during the 6.3 release cycle? >
It does look like some things have been fixed. I still can't launch ldoms but I believe this due to some local error, not anything in the code. All the commands work now, it's just that after reboot the ldom isn't started. I'll see if I can diagnose more this week, but that machine is a beast and really noisy. -ml > > > > The diff below opens the softraid boot chunk early on and keeps the > > > > handle open until a kernel has been loaded from the softraid volume. > > > > This means sr_strategy() does not have to worry about obtaining a > > > > handle from the firmware anymore. > > > > > > > > Also consolidate some repeated lines of code in sr_strategy(). > > > > > > > > Tested on a T5220 ldom guest (CRYPTO) and a v240 machine (RAID1). > > > > > > > > Index: boot.c > > > > =================================================================== > > > > RCS file: /cvs/src/sys/arch/sparc64/stand/ofwboot/boot.c,v > > > > retrieving revision 1.27 > > > > diff -u -p -r1.27 boot.c > > > > --- boot.c 11 Sep 2016 17:53:26 -0000 1.27 > > > > +++ boot.c 12 Mar 2018 10:26:23 -0000 > > > > @@ -248,6 +248,8 @@ loadfile(int fd, char *args) > > > > close(fd); > > > > > > > > #ifdef SOFTRAID > > > > + if (bootdev_dip) > > > > + OF_close(bootdev_dip->sr_handle); > > > > sr_clear_keys(); > > > > #endif > > > > chain(entry, args, ssym, esym); > > > > @@ -283,12 +285,11 @@ fail: > > > > } > > > > > > > > #ifdef SOFTRAID > > > > -/* Set bootdev_dip to the software boot volume, if specified. */ > > > > +/* Set bootdev_dip to the softraid boot volume, if specified. */ > > > > static int > > > > srbootdev(const char *bootline) > > > > { > > > > struct sr_boot_volume *bv; > > > > - struct diskinfo *dip; > > > > int unit; > > > > > > > > bootdev_dip = NULL; > > > > @@ -320,9 +321,23 @@ srbootdev(const char *bootline) > > > > return EPERM; > > > > > > > > if (bv->sbv_diskinfo == NULL) { > > > > + struct sr_boot_chunk *bc; > > > > + struct diskinfo *dip, *bc_dip; > > > > + int sr_handle; > > > > + > > > > + /* All reads will come from the boot chunk. */ > > > > + bc = sr_vol_boot_chunk(bv); > > > > + if (bc == NULL) > > > > + return ENXIO; > > > > + bc_dip = (struct diskinfo *)bc->sbc_diskinfo; > > > > + sr_handle = OF_open(bc_dip->path); > > > > + if (sr_handle == -1) > > > > + return EIO; > > > > + > > > > dip = alloc(sizeof(struct diskinfo)); > > > > bzero(dip, sizeof(*dip)); > > > > dip->sr_vol = bv; > > > > + dip->sr_handle = sr_handle; > > > > bv->sbv_diskinfo = dip; > > > > } > > > > > > > > @@ -331,7 +346,8 @@ srbootdev(const char *bootline) > > > > > > > > /* Attempt to read disklabel. */ > > > > bv->sbv_part = 'c'; > > > > - if (sr_getdisklabel(bv, &dip->disklabel)) { > > > > + if (sr_getdisklabel(bv, &bootdev_dip->disklabel)) { > > > > + OF_close(bootdev_dip->sr_handle); > > > > free(bv->sbv_diskinfo, sizeof(struct diskinfo)); > > > > bv->sbv_diskinfo = NULL; > > > > bootdev_dip = NULL; > > > > Index: disk.h > > > > =================================================================== > > > > RCS file: /cvs/src/sys/arch/sparc64/stand/ofwboot/disk.h,v > > > > retrieving revision 1.1 > > > > diff -u -p -r1.1 disk.h > > > > --- disk.h 26 Nov 2014 20:30:41 -0000 1.1 > > > > +++ disk.h 12 Mar 2018 10:26:23 -0000 > > > > @@ -36,7 +36,10 @@ > > > > struct diskinfo { > > > > char path[256]; > > > > struct disklabel disklabel; > > > > + > > > > + /* Used during softraid boot. */ > > > > struct sr_boot_volume *sr_vol; > > > > + int sr_handle; /* open handle for reading from boot chunk */ > > > > > > > > TAILQ_ENTRY(diskinfo) list; > > > > }; > > > > Index: ofdev.c > > > > =================================================================== > > > > RCS file: /cvs/src/sys/arch/sparc64/stand/ofwboot/ofdev.c,v > > > > retrieving revision 1.25 > > > > diff -u -p -r1.25 ofdev.c > > > > --- ofdev.c 1 Oct 2015 16:08:20 -0000 1.25 > > > > +++ ofdev.c 12 Mar 2018 10:26:23 -0000 > > > > @@ -125,8 +125,8 @@ strategy(void *devdata, int rw, daddr32_ > > > > #ifdef SOFTRAID > > > > /* Intercept strategy for softraid volumes. */ > > > > if (dev->type == OFDEV_SOFTRAID) > > > > - return sr_strategy(bootdev_dip->sr_vol, rw, > > > > - blk, size, buf, rsize); > > > > + return sr_strategy(bootdev_dip->sr_vol, > > > > bootdev_dip->sr_handle, > > > > + rw, blk, size, buf, rsize); > > > > #endif > > > > if (dev->type != OFDEV_DISK) > > > > panic("strategy"); > > > > Index: softraid_sparc64.c > > > > =================================================================== > > > > RCS file: /cvs/src/sys/arch/sparc64/stand/ofwboot/softraid_sparc64.c,v > > > > retrieving revision 1.2 > > > > diff -u -p -r1.2 softraid_sparc64.c > > > > --- softraid_sparc64.c 11 Sep 2016 17:53:26 -0000 1.2 > > > > +++ softraid_sparc64.c 12 Mar 2018 10:26:23 -0000 > > > > @@ -306,9 +306,25 @@ srprobe(void) > > > > free(md, SR_META_SIZE * DEV_BSIZE); > > > > } > > > > > > > > +struct sr_boot_chunk * > > > > +sr_vol_boot_chunk(struct sr_boot_volume *bv) > > > > +{ > > > > + struct sr_boot_chunk *bc = NULL; > > > > + > > > > + if (bv->sbv_level == 1 || bv->sbv_level == 'C' ) { /* RAID1 or > > > > CRYPTO */ > > > > + /* Select first online chunk. */ > > > > + SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link) > > > > + if (bc->sbc_state == BIOC_SDONLINE) > > > > + break; > > > > + } > > > > + > > > > + return bc; > > > > +} > > > > + > > > > + > > > > int > > > > -sr_strategy(struct sr_boot_volume *bv, int rw, daddr32_t blk, size_t > > > > size, > > > > - void *buf, size_t *rsize) > > > > +sr_strategy(struct sr_boot_volume *bv, int sr_handle, int rw, > > > > daddr32_t blk, > > > > + size_t size, void *buf, size_t *rsize) > > > > { > > > > struct diskinfo *sr_dip, *dip; > > > > struct partition *pp; > > > > @@ -320,7 +336,6 @@ sr_strategy(struct sr_boot_volume *bv, i > > > > u_char iv[8]; > > > > u_char *bp; > > > > int err; > > > > - int ihandle; > > > > > > > > /* We only support read-only softraid. */ > > > > if (rw != F_READ) > > > > @@ -331,55 +346,28 @@ sr_strategy(struct sr_boot_volume *bv, i > > > > blk += > > > > DL_GETPOFFSET(&sr_dip->disklabel.d_partitions[bv->sbv_part > > > > - 'a']); > > > > > > > > + bc = sr_vol_boot_chunk(bv); > > > > + if (bc == NULL) > > > > + return ENXIO; > > > > + > > > > + dip = (struct diskinfo *)bc->sbc_diskinfo; > > > > + pp = &dip->disklabel.d_partitions[bc->sbc_part - 'a']; > > > > + bzero(&ofdev, sizeof(ofdev)); > > > > + ofdev.handle = sr_handle; > > > > + ofdev.type = OFDEV_DISK; > > > > + ofdev.bsize = DEV_BSIZE; > > > > + ofdev.partoff = DL_GETPOFFSET(pp); > > > > + > > > > if (bv->sbv_level == 0) { > > > > return ENOTSUP; > > > > } else if (bv->sbv_level == 1) { > > > > - > > > > - /* Select first online chunk. */ > > > > - SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link) > > > > - if (bc->sbc_state == BIOC_SDONLINE) > > > > - break; > > > > - if (bc == NULL) > > > > - return EIO; > > > > - > > > > - dip = (struct diskinfo *)bc->sbc_diskinfo; > > > > - pp = &dip->disklabel.d_partitions[bc->sbc_part - 'a']; > > > > blk += bv->sbv_data_blkno; > > > > > > > > /* XXX - If I/O failed we should try another chunk... */ > > > > - ihandle = OF_open(dip->path); > > > > - if (ihandle == -1) > > > > - return EIO; > > > > - bzero(&ofdev, sizeof(ofdev)); > > > > - ofdev.handle = ihandle; > > > > - ofdev.type = OFDEV_DISK; > > > > - ofdev.bsize = DEV_BSIZE; > > > > - ofdev.partoff = DL_GETPOFFSET(pp); > > > > err = strategy(&ofdev, rw, blk, size, buf, rsize); > > > > - OF_close(ihandle); > > > > return err; > > > > > > > > } else if (bv->sbv_level == 'C') { > > > > - > > > > - /* Select first online chunk. */ > > > > - SLIST_FOREACH(bc, &bv->sbv_chunks, sbc_link) > > > > - if (bc->sbc_state == BIOC_SDONLINE) > > > > - break; > > > > - if (bc == NULL) > > > > - return EIO; > > > > - > > > > - dip = (struct diskinfo *)bc->sbc_diskinfo; > > > > - pp = &dip->disklabel.d_partitions[bc->sbc_part - 'a']; > > > > - > > > > - ihandle = OF_open(dip->path); > > > > - if (ihandle == -1) > > > > - return EIO; > > > > - bzero(&ofdev, sizeof(ofdev)); > > > > - ofdev.handle = ihandle; > > > > - ofdev.type = OFDEV_DISK; > > > > - ofdev.bsize = DEV_BSIZE; > > > > - ofdev.partoff = DL_GETPOFFSET(pp); > > > > - > > > > /* XXX - select correct key. */ > > > > aes_xts_setkey(&ctx, (u_char *)bv->sbv_keys, 64); > > > > > > > > @@ -395,7 +383,6 @@ sr_strategy(struct sr_boot_volume *bv, i > > > > printf("Read from crypto volume failed " > > > > "(read %d bytes): %s\n", *rsize, > > > > strerror(err)); > > > > - OF_close(ihandle); > > > > return err; > > > > } > > > > bcopy(&blkno, iv, sizeof(blkno)); > > > > @@ -404,7 +391,6 @@ sr_strategy(struct sr_boot_volume *bv, i > > > > aes_xts_decrypt(&ctx, bp + j); > > > > } > > > > *rsize = nsect * DEV_BSIZE; > > > > - OF_close(ihandle); > > > > return err; > > > > > > > > } else > > > > Index: softraid_sparc64.h > > > > =================================================================== > > > > RCS file: /cvs/src/sys/arch/sparc64/stand/ofwboot/softraid_sparc64.h,v > > > > retrieving revision 1.3 > > > > diff -u -p -r1.3 softraid_sparc64.h > > > > --- softraid_sparc64.h 11 Sep 2016 17:53:26 -0000 1.3 > > > > +++ softraid_sparc64.h 12 Mar 2018 10:26:23 -0000 > > > > @@ -21,8 +21,9 @@ > > > > > > > > void srprobe(void); > > > > > > > > +struct sr_boot_chunk *sr_vol_boot_chunk(struct sr_boot_volume *); > > > > const char *sr_getdisklabel(struct sr_boot_volume *, struct disklabel > > > > *); > > > > -int sr_strategy(struct sr_boot_volume *, int, daddr32_t, size_t, > > > > +int sr_strategy(struct sr_boot_volume *, int, int, daddr32_t, > > > > size_t, > > > > void *, size_t *); > > > > > > > > #endif /* _SOFTRAID_SPARC64_H */ > > > > Index: vers.c > > > > =================================================================== > > > > RCS file: /cvs/src/sys/arch/sparc64/stand/ofwboot/vers.c,v > > > > retrieving revision 1.10 > > > > diff -u -p -r1.10 vers.c > > > > --- vers.c 18 Sep 2016 16:36:09 -0000 1.10 > > > > +++ vers.c 12 Mar 2018 10:26:23 -0000 > > > > @@ -1 +1 @@ > > > > -const char version[] = "1.9"; > > > > +const char version[] = "1.10"; > > > > > > > > > > >