Skip to content

Commit d70fa73

Browse files
authored
Merge pull request ceph#59862 from jamiepryde/isa-xor-handle-misaligned-buffers
erasure-code/isa: Handle case where data and coding buffers are not 3… Reviewed-by: Jose J Palacios-Perez <[email protected]>
2 parents 9b089ef + 524dabc commit d70fa73

File tree

2 files changed

+50
-11
lines changed

2 files changed

+50
-11
lines changed

src/erasure-code/isa/ErasureCodeIsa.cc

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -116,17 +116,49 @@ int ErasureCodeIsa::decode_chunks(const set<int> &want_to_read,
116116

117117
// -----------------------------------------------------------------------------
118118

119+
void
120+
ErasureCodeIsa::isa_xor(char **data, char **coding, int blocksize)
121+
{
122+
// If addresses are aligned to 32 bytes, then we can use xor_gen()
123+
// Otherwise, use byte_xor()
124+
int i;
125+
bool src_aligned = true;
126+
127+
for (i = 0; i < k; i++) {
128+
src_aligned &= is_aligned(data[i], EC_ISA_ADDRESS_ALIGNMENT);
129+
}
130+
131+
if (src_aligned && is_aligned(coding[0], EC_ISA_ADDRESS_ALIGNMENT)) {
132+
xor_gen(k+1, blocksize, (void**) data);
133+
}
134+
else {
135+
memcpy(coding[0], data[0], blocksize);
136+
for (i = 1; i < k; i++) {
137+
byte_xor(data[i], coding[0], data[i]+blocksize);
138+
}
139+
}
140+
}
141+
142+
void
143+
ErasureCodeIsa::byte_xor(char *data, char *coding, char *data_end)
144+
{
145+
while (data < data_end)
146+
*coding++ ^= *data++;
147+
}
148+
149+
// -----------------------------------------------------------------------------
150+
119151
void
120152
ErasureCodeIsaDefault::isa_encode(char **data,
121153
char **coding,
122154
int blocksize)
123155
{
124-
if (m == 1)
125-
// single parity stripe
126-
xor_gen(k+m, blocksize, (void**) data);
127-
else
156+
if (m == 1) {
157+
isa_xor(data, coding, blocksize);
158+
} else {
128159
ec_encode_data(blocksize, k, m, encode_tbls,
129160
(unsigned char**) data, (unsigned char**) coding);
161+
}
130162
}
131163

132164
// -----------------------------------------------------------------------------
@@ -158,7 +190,7 @@ ErasureCodeIsaDefault::isa_decode(int *erasures,
158190

159191
unsigned char *recover_source[k];
160192
unsigned char *recover_target[m];
161-
unsigned char *recover_buf[k+1];
193+
char *recover_buf[k+1];
162194

163195
// count the errors
164196
for (int l = 0; erasures[l] != -1; l++) {
@@ -181,18 +213,18 @@ ErasureCodeIsaDefault::isa_decode(int *erasures,
181213
for (i = 0; i < (k + 1); i++) {
182214
if (erasure_contains(erasures, i)) {
183215
if (i < k) {
184-
recover_buf[i] = (unsigned char*) coding[0];
185-
recover_buf[k] = (unsigned char*) data[i];
216+
recover_buf[i] = coding[0];
217+
recover_buf[k] = data[i];
186218
parity_set = true;
187219
} else {
188-
recover_buf[i] = (unsigned char*) coding[0];
220+
recover_buf[i] = coding[0];
189221
}
190222
} else {
191223
if (i < k) {
192-
recover_buf[i] = (unsigned char*) data[i];
224+
recover_buf[i] = data[i];
193225
} else {
194226
if (!parity_set) {
195-
recover_buf[i] = (unsigned char*) coding[0];
227+
recover_buf[i] = coding[0];
196228
}
197229
}
198230
}
@@ -230,7 +262,7 @@ ErasureCodeIsaDefault::isa_decode(int *erasures,
230262
((matrixtype == kVandermonde) && (nerrs == 1) && (erasures[0] < (k + 1)))) {
231263
// single parity decoding
232264
dout(20) << "isa_decode: reconstruct using xor_gen [" << erasures[0] << "]" << dendl;
233-
xor_gen(k+1, blocksize, (void **) recover_buf);
265+
isa_xor(recover_buf, &recover_buf[k], blocksize);
234266
return 0;
235267
}
236268

src/erasure-code/isa/ErasureCodeIsa.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,9 @@
3232

3333
#define EC_ISA_ADDRESS_ALIGNMENT 32u
3434

35+
#define is_aligned(POINTER, BYTE_COUNT) \
36+
(((uintptr_t)(const void *)(POINTER)) % (BYTE_COUNT) == 0)
37+
3538
class ErasureCodeIsa : public ceph::ErasureCode {
3639
public:
3740

@@ -84,6 +87,10 @@ class ErasureCodeIsa : public ceph::ErasureCode {
8487

8588
int init(ceph::ErasureCodeProfile &profile, std::ostream *ss) override;
8689

90+
void isa_xor(char **data, char **coding, int blocksize);
91+
92+
void byte_xor(char *data, char *coding, char *data_end);
93+
8794
virtual void isa_encode(char **data,
8895
char **coding,
8996
int blocksize) = 0;

0 commit comments

Comments
 (0)