Dropped the q-bit (previous-perturb) from cksum tags
Now that we perturb commit cksums with the odd-parity zero, the q-bit no
longer serves a purpose other than extra debug info. But this is a
double-edged sword, because redundant info just means another thing that
can go wrong.
For example, should we assert? If the q-bit doesn't reflect the
previous-perturb state it's a bug, but the only thing that would break
would be the q-bit itself. And if we don't assert what's the point of
keeping the q-bit around?
Dropping the q-bit avoids answering this question and saves a bit of
code:
code stack ctx
before: 37772 2608 620
after: 37768 (-0.0%) 2608 (+0.0%) 620 (+0.0%)
This commit is contained in:
@@ -1157,7 +1157,6 @@ enum lfsr_tag {
|
|||||||
// checksum tags
|
// checksum tags
|
||||||
LFSR_TAG_CKSUM = 0x3000,
|
LFSR_TAG_CKSUM = 0x3000,
|
||||||
LFSR_TAG_P = 0x0001,
|
LFSR_TAG_P = 0x0001,
|
||||||
LFSR_TAG_Q = 0x0002,
|
|
||||||
LFSR_TAG_NOTE = 0x3100,
|
LFSR_TAG_NOTE = 0x3100,
|
||||||
LFSR_TAG_ECKSUM = 0x3200,
|
LFSR_TAG_ECKSUM = 0x3200,
|
||||||
|
|
||||||
@@ -1229,10 +1228,6 @@ static inline bool lfsr_tag_p(lfsr_tag_t tag) {
|
|||||||
return tag & LFSR_TAG_P;
|
return tag & LFSR_TAG_P;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline bool lfsr_tag_q(lfsr_tag_t tag) {
|
|
||||||
return tag & LFSR_TAG_Q;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline bool lfsr_tag_isinternal(lfsr_tag_t tag) {
|
static inline bool lfsr_tag_isinternal(lfsr_tag_t tag) {
|
||||||
return tag & LFSR_TAG_INTERNAL;
|
return tag & LFSR_TAG_INTERNAL;
|
||||||
}
|
}
|
||||||
@@ -2821,9 +2816,6 @@ static int lfsr_rbyd_fetch(lfs_t *lfs, lfsr_rbyd_t *rbyd,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
// if checksums match, perturb bits should also match
|
|
||||||
LFS_ASSERT(lfsr_tag_q(tag) == lfsr_rbyd_isperturb(rbyd));
|
|
||||||
|
|
||||||
// save what we've found so far
|
// save what we've found so far
|
||||||
rbyd->eoff
|
rbyd->eoff
|
||||||
= ((lfs_size_t)lfsr_tag_p(tag)
|
= ((lfs_size_t)lfsr_tag_p(tag)
|
||||||
@@ -4046,8 +4038,6 @@ static int lfsr_rbyd_appendcksum(lfs_t *lfs, lfsr_rbyd_t *rbyd) {
|
|||||||
// set the valid bit to the cksum parity
|
// set the valid bit to the cksum parity
|
||||||
| ((uint8_t)v << 7);
|
| ((uint8_t)v << 7);
|
||||||
cksum_buf[1] = (uint8_t)(LFSR_TAG_CKSUM >> 0)
|
cksum_buf[1] = (uint8_t)(LFSR_TAG_CKSUM >> 0)
|
||||||
// include the current perturb bit
|
|
||||||
| ((uint8_t)lfsr_rbyd_isperturb(rbyd) << 1)
|
|
||||||
// set the perturb bit so next commit is invalid
|
// set the perturb bit so next commit is invalid
|
||||||
| ((uint8_t)perturb << 0);
|
| ((uint8_t)perturb << 0);
|
||||||
cksum_buf[2] = 0;
|
cksum_buf[2] = 0;
|
||||||
@@ -4063,7 +4053,7 @@ static int lfsr_rbyd_appendcksum(lfs_t *lfs, lfsr_rbyd_t *rbyd) {
|
|||||||
// calculate the commit checksum
|
// calculate the commit checksum
|
||||||
cksum_ = lfs_crc32c(cksum_, cksum_buf, 2+1+4);
|
cksum_ = lfs_crc32c(cksum_, cksum_buf, 2+1+4);
|
||||||
// and perturb, perturbing the commit checksum avoids a perturb hole
|
// and perturb, perturbing the commit checksum avoids a perturb hole
|
||||||
// after the last valid bit without needing to manually validate q
|
// after the last valid bit
|
||||||
//
|
//
|
||||||
// note the odd-parity zero preserves our position in the crc32c
|
// note the odd-parity zero preserves our position in the crc32c
|
||||||
// ring while only changing the parity
|
// ring while only changing the parity
|
||||||
|
|||||||
+1
-2
@@ -50,9 +50,8 @@ TAG_B = 0x0000
|
|||||||
TAG_R = 0x2000
|
TAG_R = 0x2000
|
||||||
TAG_LE = 0x0000
|
TAG_LE = 0x0000
|
||||||
TAG_GT = 0x1000
|
TAG_GT = 0x1000
|
||||||
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- --qp
|
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- ---p
|
||||||
TAG_P = 0x0001
|
TAG_P = 0x0001
|
||||||
TAG_Q = 0x0002
|
|
||||||
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
||||||
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
||||||
|
|
||||||
|
|||||||
+4
-6
@@ -48,9 +48,8 @@ TAG_B = 0x0000
|
|||||||
TAG_R = 0x2000
|
TAG_R = 0x2000
|
||||||
TAG_LE = 0x0000
|
TAG_LE = 0x0000
|
||||||
TAG_GT = 0x1000
|
TAG_GT = 0x1000
|
||||||
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- --qp
|
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- ---p
|
||||||
TAG_P = 0x0001
|
TAG_P = 0x0001
|
||||||
TAG_Q = 0x0002
|
|
||||||
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
||||||
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
||||||
|
|
||||||
@@ -239,10 +238,9 @@ def tagrepr(tag, w=None, size=None, off=None):
|
|||||||
else ' -%d' % size if size
|
else ' -%d' % size if size
|
||||||
else '')
|
else '')
|
||||||
elif (tag & 0x7f00) == TAG_CKSUM:
|
elif (tag & 0x7f00) == TAG_CKSUM:
|
||||||
return 'cksum%s%s%s%s%s' % (
|
return 'cksum%s%s%s%s' % (
|
||||||
'q' if not tag & 0xfc and tag & TAG_Q else '',
|
'p' if not tag & 0xfe and tag & TAG_P else '',
|
||||||
'p' if not tag & 0xfc and tag & TAG_P else '',
|
' 0x%02x' % (tag & 0xff) if tag & 0xfe else '',
|
||||||
' 0x%02x' % (tag & 0xff) if tag & 0xfc else '',
|
|
||||||
' w%d' % w if w else '',
|
' w%d' % w if w else '',
|
||||||
' %s' % size if size is not None else '')
|
' %s' % size if size is not None else '')
|
||||||
elif (tag & 0x7f00) == TAG_NOTE:
|
elif (tag & 0x7f00) == TAG_NOTE:
|
||||||
|
|||||||
+4
-6
@@ -49,9 +49,8 @@ TAG_B = 0x0000
|
|||||||
TAG_R = 0x2000
|
TAG_R = 0x2000
|
||||||
TAG_LE = 0x0000
|
TAG_LE = 0x0000
|
||||||
TAG_GT = 0x1000
|
TAG_GT = 0x1000
|
||||||
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- --qp
|
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- ---p
|
||||||
TAG_P = 0x0001
|
TAG_P = 0x0001
|
||||||
TAG_Q = 0x0002
|
|
||||||
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
||||||
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
||||||
|
|
||||||
@@ -270,10 +269,9 @@ def tagrepr(tag, w=None, size=None, off=None):
|
|||||||
else ' -%d' % size if size
|
else ' -%d' % size if size
|
||||||
else '')
|
else '')
|
||||||
elif (tag & 0x7f00) == TAG_CKSUM:
|
elif (tag & 0x7f00) == TAG_CKSUM:
|
||||||
return 'cksum%s%s%s%s%s' % (
|
return 'cksum%s%s%s%s' % (
|
||||||
'q' if not tag & 0xfc and tag & TAG_Q else '',
|
'p' if not tag & 0xfe and tag & TAG_P else '',
|
||||||
'p' if not tag & 0xfc and tag & TAG_P else '',
|
' 0x%02x' % (tag & 0xff) if tag & 0xfe else '',
|
||||||
' 0x%02x' % (tag & 0xff) if tag & 0xfc else '',
|
|
||||||
' w%d' % w if w else '',
|
' w%d' % w if w else '',
|
||||||
' %s' % size if size is not None else '')
|
' %s' % size if size is not None else '')
|
||||||
elif (tag & 0x7f00) == TAG_NOTE:
|
elif (tag & 0x7f00) == TAG_NOTE:
|
||||||
|
|||||||
+4
-6
@@ -48,9 +48,8 @@ TAG_B = 0x0000
|
|||||||
TAG_R = 0x2000
|
TAG_R = 0x2000
|
||||||
TAG_LE = 0x0000
|
TAG_LE = 0x0000
|
||||||
TAG_GT = 0x1000
|
TAG_GT = 0x1000
|
||||||
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- --qp
|
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- ---p
|
||||||
TAG_P = 0x0001
|
TAG_P = 0x0001
|
||||||
TAG_Q = 0x0002
|
|
||||||
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
||||||
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
||||||
|
|
||||||
@@ -254,10 +253,9 @@ def tagrepr(tag, w=None, size=None, off=None):
|
|||||||
else ' -%d' % size if size
|
else ' -%d' % size if size
|
||||||
else '')
|
else '')
|
||||||
elif (tag & 0x7f00) == TAG_CKSUM:
|
elif (tag & 0x7f00) == TAG_CKSUM:
|
||||||
return 'cksum%s%s%s%s%s' % (
|
return 'cksum%s%s%s%s' % (
|
||||||
'q' if not tag & 0xfc and tag & TAG_Q else '',
|
'p' if not tag & 0xfe and tag & TAG_P else '',
|
||||||
'p' if not tag & 0xfc and tag & TAG_P else '',
|
' 0x%02x' % (tag & 0xff) if tag & 0xfe else '',
|
||||||
' 0x%02x' % (tag & 0xff) if tag & 0xfc else '',
|
|
||||||
' w%d' % w if w else '',
|
' w%d' % w if w else '',
|
||||||
' %s' % size if size is not None else '')
|
' %s' % size if size is not None else '')
|
||||||
elif (tag & 0x7f00) == TAG_NOTE:
|
elif (tag & 0x7f00) == TAG_NOTE:
|
||||||
|
|||||||
+4
-8
@@ -58,9 +58,8 @@ TAG_B = 0x0000
|
|||||||
TAG_R = 0x2000
|
TAG_R = 0x2000
|
||||||
TAG_LE = 0x0000
|
TAG_LE = 0x0000
|
||||||
TAG_GT = 0x1000
|
TAG_GT = 0x1000
|
||||||
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- --qp
|
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- ---p
|
||||||
TAG_P = 0x0001
|
TAG_P = 0x0001
|
||||||
TAG_Q = 0x0002
|
|
||||||
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
||||||
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
||||||
|
|
||||||
@@ -242,10 +241,9 @@ def tagrepr(tag, w=None, size=None, off=None):
|
|||||||
else ' -%d' % size if size
|
else ' -%d' % size if size
|
||||||
else '')
|
else '')
|
||||||
elif (tag & 0x7f00) == TAG_CKSUM:
|
elif (tag & 0x7f00) == TAG_CKSUM:
|
||||||
return 'cksum%s%s%s%s%s' % (
|
return 'cksum%s%s%s%s' % (
|
||||||
'q' if not tag & 0xfc and tag & TAG_Q else '',
|
'p' if not tag & 0xfe and tag & TAG_P else '',
|
||||||
'p' if not tag & 0xfc and tag & TAG_P else '',
|
' 0x%02x' % (tag & 0xff) if tag & 0xfe else '',
|
||||||
' 0x%02x' % (tag & 0xff) if tag & 0xfc else '',
|
|
||||||
' w%d' % w if w else '',
|
' w%d' % w if w else '',
|
||||||
' %s' % size if size is not None else '')
|
' %s' % size if size is not None else '')
|
||||||
elif (tag & 0x7f00) == TAG_NOTE:
|
elif (tag & 0x7f00) == TAG_NOTE:
|
||||||
@@ -557,8 +555,6 @@ def dbg_log(data, block_size, rev, eoff, weight, *,
|
|||||||
cksum__ = fromle32(data[j_:j_+4])
|
cksum__ = fromle32(data[j_:j_+4])
|
||||||
if cksum_ != cksum__:
|
if cksum_ != cksum__:
|
||||||
notes.append('cksum!=%08x' % cksum__)
|
notes.append('cksum!=%08x' % cksum__)
|
||||||
if perturb != bool(tag & TAG_Q):
|
|
||||||
notes.append('q!=%x' % perturb)
|
|
||||||
# update perturb bit
|
# update perturb bit
|
||||||
perturb = tag & TAG_P
|
perturb = tag & TAG_P
|
||||||
# revert to data cksum and perturb
|
# revert to data cksum and perturb
|
||||||
|
|||||||
+4
-6
@@ -46,9 +46,8 @@ TAG_B = 0x0000
|
|||||||
TAG_R = 0x2000
|
TAG_R = 0x2000
|
||||||
TAG_LE = 0x0000
|
TAG_LE = 0x0000
|
||||||
TAG_GT = 0x1000
|
TAG_GT = 0x1000
|
||||||
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- --qp
|
TAG_CKSUM = 0x3000 ## 0x3c0p v-11 cccc ---- ---p
|
||||||
TAG_P = 0x0001
|
TAG_P = 0x0001
|
||||||
TAG_Q = 0x0002
|
|
||||||
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
TAG_NOTE = 0x3100 # 0x3100 v-11 ---1 ---- ----
|
||||||
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
TAG_ECKSUM = 0x3200 # 0x3200 v-11 --1- ---- ----
|
||||||
|
|
||||||
@@ -196,10 +195,9 @@ def tagrepr(tag, w=None, size=None, off=None):
|
|||||||
else ' -%d' % size if size
|
else ' -%d' % size if size
|
||||||
else '')
|
else '')
|
||||||
elif (tag & 0x7f00) == TAG_CKSUM:
|
elif (tag & 0x7f00) == TAG_CKSUM:
|
||||||
return 'cksum%s%s%s%s%s' % (
|
return 'cksum%s%s%s%s' % (
|
||||||
'q' if not tag & 0xfc and tag & TAG_Q else '',
|
'p' if not tag & 0xfe and tag & TAG_P else '',
|
||||||
'p' if not tag & 0xfc and tag & TAG_P else '',
|
' 0x%02x' % (tag & 0xff) if tag & 0xfe else '',
|
||||||
' 0x%02x' % (tag & 0xff) if tag & 0xfc else '',
|
|
||||||
' w%d' % w if w else '',
|
' w%d' % w if w else '',
|
||||||
' %s' % size if size is not None else '')
|
' %s' % size if size is not None else '')
|
||||||
elif (tag & 0x7f00) == TAG_NOTE:
|
elif (tag & 0x7f00) == TAG_NOTE:
|
||||||
|
|||||||
Reference in New Issue
Block a user