svn commit: r212880 - stable/7/sys/geom/raid3
Alexander Motin
mav at FreeBSD.org
Sun Sep 19 20:07:41 UTC 2010
Author: mav
Date: Sun Sep 19 20:07:40 2010
New Revision: 212880
URL: http://svn.freebsd.org/changeset/base/212880
Log:
MFC r201545:
Slightly optimize XOR calculation.
Modified:
stable/7/sys/geom/raid3/g_raid3.c
Directory Properties:
stable/7/sys/ (props changed)
stable/7/sys/cddl/contrib/opensolaris/ (props changed)
stable/7/sys/contrib/dev/acpica/ (props changed)
stable/7/sys/contrib/pf/ (props changed)
Modified: stable/7/sys/geom/raid3/g_raid3.c
==============================================================================
--- stable/7/sys/geom/raid3/g_raid3.c Sun Sep 19 20:02:31 2010 (r212879)
+++ stable/7/sys/geom/raid3/g_raid3.c Sun Sep 19 20:07:40 2010 (r212880)
@@ -231,31 +231,31 @@ g_raid3_uma_dtor(void *mem, int size, vo
sz->sz_inuse--;
}
-#define g_raid3_xor(src1, src2, dst, size) \
- _g_raid3_xor((uint64_t *)(src1), (uint64_t *)(src2), \
+#define g_raid3_xor(src, dst, size) \
+ _g_raid3_xor((uint64_t *)(src), \
(uint64_t *)(dst), (size_t)size)
static void
-_g_raid3_xor(uint64_t *src1, uint64_t *src2, uint64_t *dst, size_t size)
+_g_raid3_xor(uint64_t *src, uint64_t *dst, size_t size)
{
KASSERT((size % 128) == 0, ("Invalid size: %zu.", size));
for (; size > 0; size -= 128) {
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
- *dst++ = (*src1++) ^ (*src2++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
+ *dst++ ^= (*src++);
}
}
@@ -1049,6 +1049,7 @@ g_raid3_scatter(struct bio *pbp)
struct g_raid3_disk *disk;
struct bio *bp, *cbp, *tmpbp;
off_t atom, cadd, padd, left;
+ int first;
sc = pbp->bio_to->geom->softc;
bp = NULL;
@@ -1079,12 +1080,18 @@ g_raid3_scatter(struct bio *pbp)
/*
* Calculate parity.
*/
- bzero(bp->bio_data, bp->bio_length);
+ first = 1;
G_RAID3_FOREACH_SAFE_BIO(pbp, cbp, tmpbp) {
if (cbp == bp)
continue;
- g_raid3_xor(cbp->bio_data, bp->bio_data, bp->bio_data,
- bp->bio_length);
+ if (first) {
+ bcopy(cbp->bio_data, bp->bio_data,
+ bp->bio_length);
+ first = 0;
+ } else {
+ g_raid3_xor(cbp->bio_data, bp->bio_data,
+ bp->bio_length);
+ }
if ((cbp->bio_cflags & G_RAID3_BIO_CFLAG_NODISK) != 0)
g_raid3_destroy_bio(sc, cbp);
}
@@ -1216,7 +1223,7 @@ g_raid3_gather(struct bio *pbp)
G_RAID3_FOREACH_BIO(pbp, cbp) {
if ((cbp->bio_cflags & G_RAID3_BIO_CFLAG_PARITY) != 0)
continue;
- g_raid3_xor(cbp->bio_data, xbp->bio_data, xbp->bio_data,
+ g_raid3_xor(cbp->bio_data, xbp->bio_data,
xbp->bio_length);
}
xbp->bio_cflags &= ~G_RAID3_BIO_CFLAG_PARITY;
@@ -1639,7 +1646,7 @@ g_raid3_sync_request(struct bio *bp)
bcopy(src, dst, atom);
src += atom;
for (n = 1; n < sc->sc_ndisks - 1; n++) {
- g_raid3_xor(src, dst, dst, atom);
+ g_raid3_xor(src, dst, atom);
src += atom;
}
dst += atom;
More information about the svn-src-stable-7
mailing list