Date: Tue, 25 Jan 2011 11:17:48 -0500 From: John Baldwin <jhb@freebsd.org> To: Alexander Motin <mav@freebsd.org> Cc: svn-src-projects@freebsd.org, src-committers@freebsd.org Subject: Re: svn commit: r217828 - projects/graid/head/sys/geom/raid Message-ID: <201101251117.49069.jhb@freebsd.org> In-Reply-To: <201101251534.p0PFY7cF039182@svn.freebsd.org> References: <201101251534.p0PFY7cF039182@svn.freebsd.org>
next in thread | previous in thread | raw e-mail | index | archive | help
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? -- John Baldwin
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201101251117.49069.jhb>