Date: Tue, 25 Jan 2011 17:32:11 +0100 From: Attilio Rao <attilio@freebsd.org> To: John Baldwin <jhb@freebsd.org> Cc: svn-src-projects@freebsd.org, Alexander Motin <mav@freebsd.org>, src-committers@freebsd.org Subject: Re: svn commit: r217828 - projects/graid/head/sys/geom/raid Message-ID: <AANLkTinwLOqrLjwZOQ-y3__KUy_TMq=3LJw2Nh=Zu7fC@mail.gmail.com> In-Reply-To: <201101251117.49069.jhb@freebsd.org> References: <201101251534.p0PFY7cF039182@svn.freebsd.org> <201101251117.49069.jhb@freebsd.org>
index | next in thread | previous in thread | raw e-mail
2011/1/25 John Baldwin <jhb@freebsd.org>: > On Tuesday, January 25, 2011 10:34:07 am Alexander Motin wrote: >> Author: mav >> Date: Tue Jan 25 15:34:07 2011 >> New Revision: 217828 >> URL: http://svn.freebsd.org/changeset/base/217828 >> >> Log: >> Implement kernel dumping to geom_raid volumes. Dumping mechanism supports >> any RAID levels without any additional magic. Dumping to RAID0 and RAID1 >> verified to work right now. >> >> Modified: >> projects/graid/head/sys/geom/raid/g_raid.c >> projects/graid/head/sys/geom/raid/g_raid.h >> projects/graid/head/sys/geom/raid/md_intel.c >> >> Modified: projects/graid/head/sys/geom/raid/g_raid.c >> > ============================================================================== >> --- projects/graid/head/sys/geom/raid/g_raid.c Tue Jan 25 15:18:10 2011 > (r217827) >> +++ projects/graid/head/sys/geom/raid/g_raid.c Tue Jan 25 15:34:07 2011 > (r217828) >> @@ -116,8 +116,10 @@ static int g_raid_update_subdisk(struct >> static int g_raid_update_volume(struct g_raid_volume *vol, u_int state); >> static void g_raid_dumpconf(struct sbuf *sb, const char *indent, >> struct g_geom *gp, struct g_consumer *cp, struct g_provider *pp); >> +static void g_raid_start(struct bio *bp); >> static void g_raid_start_request(struct bio *bp); >> static void g_raid_disk_done(struct bio *bp); >> +static void g_raid_poll(struct g_raid_softc *sc); >> >> static const char * >> g_raid_disk_state2str(int state) >> @@ -714,6 +716,73 @@ g_raid_unidle(struct g_raid_volume *vol) >> } >> >> static void >> +g_raid_dumpdone(struct bio *bp) >> +{ >> + >> + bp->bio_flags |= BIO_DONE; >> +} >> + >> +static int >> +g_raid_dump(void *arg, >> + void *virtual, vm_offset_t physical, off_t offset, size_t length) >> +{ >> + struct g_raid_softc *sc; >> + struct g_raid_volume *vol; >> + struct bio *bp; >> + >> + vol = (struct g_raid_volume *)arg; >> + sc = vol->v_softc; >> + G_RAID_DEBUG(3, "Dumping at off %llu len %llu.", >> + (long long unsigned)offset, (long long unsigned)length); >> + >> + bp = g_alloc_bio(); >> + bp->bio_cmd = BIO_WRITE; >> + bp->bio_done = g_raid_dumpdone; >> + bp->bio_attribute = NULL; >> + bp->bio_offset = offset; >> + bp->bio_length = length; >> + bp->bio_data = virtual; >> + bp->bio_to = vol->v_provider; >> + >> + g_raid_start(bp); >> + >> + while (!(bp->bio_flags & BIO_DONE)) { >> + G_RAID_DEBUG(4, "Poll..."); >> + g_raid_poll(sc); >> + DELAY(10); >> + } >> + >> + G_RAID_DEBUG(3, "Dumping at off %llu len %llu done.", >> + (long long unsigned)offset, (long long unsigned)length); >> + >> + g_destroy_bio(bp); >> + return (0); >> +} > > Hmm, so this allocates bio's to make the dump work. I believer other dump > routines in other drivers do not do this, but instead use pre-allocated > commands to schedule dump I/O requests. Would it be possible to pre-allocate > the bio that is used here when dumping is enabled and reuse it for each > g_raid_dump() call without free'ing it when the I/O is finished? Yes, I'd really support this as well. Having BIOs allocation in progress makes the dumping less robust than it should be (yeah, the discussion is much longer than that, but anyway...). Attilio -- Peace can only be achieved by understanding - A. Einsteinhelp
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?AANLkTinwLOqrLjwZOQ-y3__KUy_TMq=3LJw2Nh=Zu7fC>
