33 #include "erasurecode.h"
34 #include "erasurecode_backend.h"
35 #include "erasurecode_helpers.h"
36 #include "erasurecode_helpers_ext.h"
38 #define ISA_L_RS_VAND_LIB_MAJOR 2
39 #define ISA_L_RS_VAND_LIB_MINOR 13
40 #define ISA_L_RS_VAND_LIB_REV 0
41 #define ISA_L_RS_VAND_LIB_VER_STR "2.13"
42 #define ISA_L_RS_VAND_LIB_NAME "isa_l_rs_vand"
43 #if defined(__MACOS__) || defined(__MACOSX__) || defined(__OSX__) || defined(__APPLE__)
44 #define ISA_L_RS_VAND_SO_NAME "libisal.dylib"
46 #define ISA_L_RS_VAND_SO_NAME "libisal.so.2"
54 typedef void (*
ec_encode_data_func)(int, int, int,
unsigned char*,
unsigned char **,
unsigned char **);
58 typedef unsigned char (*
gf_mul_func)(
unsigned char,
unsigned char);
87 unsigned char *g_tbls = NULL;
88 int k = isa_l_desc->
k;
89 int m = isa_l_desc->
m;
92 g_tbls = malloc(
sizeof(
unsigned char) * (k * m * 32));
100 isa_l_desc->
ec_encode_data(blocksize, k, m, g_tbls, (
unsigned char**)data,
101 (
unsigned char**)parity);
108 int i = 0, j = 0, l = 0;
110 unsigned char *decode_matrix = malloc(
sizeof(
unsigned char) * k * k);
111 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs);
113 while (i < k && l < n) {
114 if (((1 << l) & missing_bm) == 0) {
115 for (j = 0; j <
k; j++) {
116 decode_matrix[(k * i) + j] = encode_matrix[(k * l) + j];
125 decode_matrix = NULL;
128 return decode_matrix;
135 while (missing_idxs[i] > -1) {
143 unsigned char *from_row,
150 for (i = 0; i < num_elems; i++) {
151 to_row[i] ^=
gf_mul(val, from_row[i]);
161 unsigned char *decode_inverse,
162 unsigned char* encode_matrix,
166 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs);
168 unsigned char *inverse_rows = (
unsigned char*)malloc(
sizeof(
unsigned
169 char*) * k * num_missing_elements);
173 if (NULL == inverse_rows) {
177 memset(inverse_rows, 0,
sizeof(
unsigned
178 char*) * k * num_missing_elements);
183 for (i = 0; i <
k; i++) {
184 if ((1 << i) & missing_bm) {
185 for (j = 0; j <
k; j++) {
186 inverse_rows[(l *
k) + j] = decode_inverse[(i * k) + j];
206 for (i = k; i < n; i++) {
208 if ((1 << i) & missing_bm) {
210 int d_idx_unavail = 0;
211 for (j = 0; j <
k; j++) {
213 if (((1 << j) & missing_bm) == 0) {
214 inverse_rows[(l *
k) + d_idx_avail] ^= encode_matrix[(i * k) + j];
218 &inverse_rows[d_idx_unavail * k],
219 encode_matrix[(i * k) + j],
232 int *missing_idxs,
int blocksize)
237 unsigned char *g_tbls = NULL;
238 unsigned char *decode_matrix = NULL;
239 unsigned char *decode_inverse = NULL;
240 unsigned char *inverse_rows = NULL;
241 unsigned char **decoded_elements = NULL;
242 unsigned char **available_fragments = NULL;
243 int k = isa_l_desc->
k;
244 int m = isa_l_desc->
m;
250 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs);
254 if (NULL == decode_matrix) {
258 decode_inverse = (
unsigned char*)malloc(
sizeof(
unsigned char) * k *
k);
260 if (NULL == decode_inverse) {
267 g_tbls = malloc(
sizeof(
unsigned char) * (k * m * 32));
268 if (NULL == g_tbls) {
274 decoded_elements = (
unsigned char**)malloc(
sizeof(
unsigned char*)*num_missing_elements);
275 if (NULL == decoded_elements) {
279 available_fragments = (
unsigned char**)malloc(
sizeof(
unsigned char*)*
k);
280 if (NULL == available_fragments) {
285 for (i = 0; i < n; i++) {
286 if (missing_bm & (1 << i)) {
293 available_fragments[j] = (
unsigned char*)data[i];
295 available_fragments[j] = (
unsigned char*)parity[i-k];
302 for (i = 0; i <
k; i++) {
303 if (missing_bm & (1 << i)) {
304 decoded_elements[j] = (
unsigned char*)data[i];
308 for (i = k; i < n; i++) {
309 if (missing_bm & (1 << i)) {
310 decoded_elements[j] = (
unsigned char*)parity[i - k];
315 isa_l_desc->
ec_init_tables(k, num_missing_elements, inverse_rows, g_tbls);
317 isa_l_desc->
ec_encode_data(blocksize, k, num_missing_elements, g_tbls, (
unsigned char**)available_fragments,
318 (
unsigned char**)decoded_elements);
325 free(decode_inverse);
327 free(decoded_elements);
328 free(available_fragments);
334 int *missing_idxs,
int destination_idx,
int blocksize)
338 unsigned char *g_tbls = NULL;
339 unsigned char *decode_matrix = NULL;
340 unsigned char *decode_inverse = NULL;
341 unsigned char *inverse_rows = NULL;
342 unsigned char *reconstruct_buf = NULL;
343 unsigned char **available_fragments = NULL;
344 int k = isa_l_desc->
k;
345 int m = isa_l_desc->
m;
349 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs);
350 int inverse_row = -1;
358 if (NULL == decode_matrix) {
362 decode_inverse = (
unsigned char*)malloc(
sizeof(
unsigned char) * k *
k);
364 if (NULL == decode_inverse) {
376 g_tbls = malloc(
sizeof(
unsigned char) * (k * m * 32));
377 if (NULL == g_tbls) {
384 available_fragments = (
unsigned char**)malloc(
sizeof(
unsigned char*)*
k);
385 if (NULL == available_fragments) {
390 for (i = 0; i < n; i++) {
391 if (missing_bm & (1 << i)) {
398 available_fragments[j] = (
unsigned char*)data[i];
400 available_fragments[j] = (
unsigned char*)parity[i-k];
409 for (i = 0; i < n; i++) {
410 if (missing_bm & (1 << i)) {
411 if (i == destination_idx) {
413 reconstruct_buf = (
unsigned char*)data[i];
415 reconstruct_buf = (
unsigned char*)parity[i-k];
427 isa_l_desc->
ec_init_tables(k, 1, &inverse_rows[inverse_row * k], g_tbls);
429 isa_l_desc->
ec_encode_data(blocksize, k, 1, g_tbls, (
unsigned char**)available_fragments,
430 (
unsigned char**)&reconstruct_buf);
436 free(decode_inverse);
438 free(available_fragments);
444 int *fragments_to_exclude,
int *fragments_needed)
449 uint64_t exclude_bm = convert_list_to_bitmap(fragments_to_exclude);
450 uint64_t missing_bm = convert_list_to_bitmap(missing_idxs) | exclude_bm;
455 for (i = 0; i < (isa_l_desc->
k + isa_l_desc->
m); i++) {
456 if (!(missing_bm & (1 << i))) {
457 fragments_needed[j] = i;
460 if (j == isa_l_desc->
k) {
462 fragments_needed[j] = -1;
472 void *backend_sohandle)
482 desc->
k = args->uargs.k;
483 desc->
m = args->uargs.m;
484 if (args->uargs.w <= 0)
486 desc->
w = args->uargs.w;
490 long long max_symbols = 1LL << desc->
w;
491 if ((desc->
k + desc->
m) > max_symbols) {
508 } func_handle = {.vptr = NULL};
511 func_handle.vptr = NULL;
512 func_handle.vptr = dlsym(backend_sohandle,
"ec_encode_data");
518 func_handle.vptr = NULL;
519 func_handle.vptr = dlsym(backend_sohandle,
"ec_init_tables");
525 func_handle.vptr = NULL;
526 func_handle.vptr = dlsym(backend_sohandle,
"gf_gen_rs_matrix");
532 func_handle.vptr = NULL;
533 func_handle.vptr = dlsym(backend_sohandle,
"gf_invert_matrix");
539 func_handle.vptr = NULL;
540 func_handle.vptr = dlsym(backend_sohandle,
"gf_mul");
541 desc->
gf_mul = func_handle.gf_mulp;
542 if (NULL == desc->
gf_mul) {
546 desc->
matrix = malloc(
sizeof(
char) * desc->
k * (desc->
k + desc->
m));
547 if (NULL == desc->
matrix) {
607 .id = EC_BACKEND_ISA_L_RS_VAND,
612 .backend_metadata_size = 0,
static unsigned char * isa_l_get_decode_matrix(int k, int m, unsigned char *encode_matrix, int *missing_idxs)
static unsigned char * get_inverse_rows(int k, int m, unsigned char *decode_inverse, unsigned char *encode_matrix, int *missing_idxs, gf_mul_func gf_mul)
static void mult_and_xor_row(unsigned char *to_row, unsigned char *from_row, unsigned char val, int num_elems, gf_mul_func gf_mul)
static int isa_l_rs_vand_decode(void *desc, char **data, char **parity, int *missing_idxs, int blocksize)
#define ISA_L_RS_VAND_LIB_MINOR
struct ec_backend_op_stubs isa_l_rs_vand_ops
static bool isa_l_rs_vand_is_compatible_with(uint32_t version)
ec_init_tables_func ec_init_tables
struct ec_backend isa_l_rs_vand
#define ISA_L_RS_VAND_LIB_VER_STR
static void * isa_l_rs_vand_init(struct ec_backend_args *args, void *backend_sohandle)
#define ISA_L_RS_VAND_LIB_NAME
#define ISA_L_RS_VAND_SO_NAME
static int get_num_missing_elements(int *missing_idxs)
static int isa_l_rs_vand_exit(void *desc)
static int isa_l_rs_vand_reconstruct(void *desc, char **data, char **parity, int *missing_idxs, int destination_idx, int blocksize)
struct ec_backend_common backend_isa_l_rs_vand
unsigned char(* gf_mul_func)(unsigned char, unsigned char)
struct ec_backend_op_stubs isa_l_rs_vand_op_stubs
static int isa_l_rs_vand_encode(void *desc, char **data, char **parity, int blocksize)
void(* ec_init_tables_func)(int, int, unsigned char *, unsigned char *)
void(* gf_gen_rs_matrix_func)(unsigned char *, int, int)
gf_gen_rs_matrix_func gf_gen_rs_matrix
ec_encode_data_func ec_encode_data
static int isa_l_rs_vand_element_size(void *desc)
Return the element-size, which is the number of bits stored on a given device, per codeword...
#define ISA_L_RS_VAND_LIB_MAJOR
int(* gf_invert_matrix_func)(unsigned char *, unsigned char *, const int)
void(* ec_encode_data_func)(int, int, int, unsigned char *, unsigned char **, unsigned char **)
gf_invert_matrix_func gf_invert_matrix
static int isa_l_rs_vand_min_fragments(void *desc, int *missing_idxs, int *fragments_to_exclude, int *fragments_needed)
#define ISA_L_RS_VAND_LIB_REV