Skip to content

Commit 548c6ed

Browse files
mbrozMikulas Patocka
authored andcommitted
dm-verity FEC: Avoid copying RS parity bytes twice.
Caching RS parity bytes is already done in fec_decode_bufs() now, no need to use yet another buffer for conversion to uint16_t. This patch removes that double copy of RS parity bytes. Signed-off-by: Milan Broz <gmazyland@gmail.com> Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
1 parent 6df90c0 commit 548c6ed

File tree

1 file changed

+10
-21
lines changed

1 file changed

+10
-21
lines changed

drivers/md/dm-verity-fec.c

Lines changed: 10 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -39,22 +39,6 @@ static inline u64 fec_interleave(struct dm_verity *v, u64 offset)
3939
return offset + mod * (v->fec->rounds << v->data_dev_block_bits);
4040
}
4141

42-
/*
43-
* Decode an RS block using Reed-Solomon.
44-
*/
45-
static int fec_decode_rs8(struct dm_verity *v, struct dm_verity_fec_io *fio,
46-
u8 *data, u8 *fec, int neras)
47-
{
48-
int i;
49-
uint16_t par[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
50-
51-
for (i = 0; i < v->fec->roots; i++)
52-
par[i] = fec[i];
53-
54-
return decode_rs8(fio->rs, data, par, v->fec->rsn, NULL, neras,
55-
fio->erasures, 0, NULL);
56-
}
57-
5842
/*
5943
* Read error-correcting codes for the requested RS block. Returns a pointer
6044
* to the data block. Caller is responsible for releasing buf.
@@ -132,8 +116,9 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
132116
{
133117
int r, corrected = 0, res;
134118
struct dm_buffer *buf;
135-
unsigned int n, i, offset, par_buf_offset = 0;
136-
u8 *par, *block, par_buf[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
119+
unsigned int n, i, j, offset, par_buf_offset = 0;
120+
uint16_t par_buf[DM_VERITY_FEC_RSM - DM_VERITY_FEC_MIN_RSN];
121+
u8 *par, *block;
137122
struct bio *bio = dm_bio_from_per_bio_data(io, v->ti->per_io_data_size);
138123

139124
par = fec_read_parity(v, rsb, block_offset, &offset,
@@ -147,8 +132,11 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
147132
*/
148133
fec_for_each_buffer_rs_block(fio, n, i) {
149134
block = fec_buffer_rs_block(v, fio, n, i);
150-
memcpy(&par_buf[par_buf_offset], &par[offset], v->fec->roots - par_buf_offset);
151-
res = fec_decode_rs8(v, fio, block, par_buf, neras);
135+
for (j = 0; j < v->fec->roots - par_buf_offset; j++)
136+
par_buf[par_buf_offset + j] = par[offset + j];
137+
/* Decode an RS block using Reed-Solomon */
138+
res = decode_rs8(fio->rs, block, par_buf, v->fec->rsn,
139+
NULL, neras, fio->erasures, 0, NULL);
152140
if (res < 0) {
153141
r = res;
154142
goto error;
@@ -166,7 +154,8 @@ static int fec_decode_bufs(struct dm_verity *v, struct dm_verity_io *io,
166154
/* Check if parity bytes are split between blocks */
167155
if (offset < v->fec->io_size && (offset + v->fec->roots) > v->fec->io_size) {
168156
par_buf_offset = v->fec->io_size - offset;
169-
memcpy(par_buf, &par[offset], par_buf_offset);
157+
for (j = 0; j < par_buf_offset; j++)
158+
par_buf[j] = par[offset + j];
170159
offset += par_buf_offset;
171160
} else
172161
par_buf_offset = 0;

0 commit comments

Comments
 (0)