1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #include "yaksi.h"
7 #include "yaksuri_cudai.h"
8 #include <assert.h>
9 #include <string.h>
10 #include <stdlib.h>
11 
yaksuri_cudai_info_create_hook(yaksi_info_s * info)12 int yaksuri_cudai_info_create_hook(yaksi_info_s * info)
13 {
14     int rc = YAKSA_SUCCESS;
15     yaksuri_cudai_info_s *infopriv;
16 
17     infopriv = (yaksuri_cudai_info_s *) malloc(sizeof(yaksuri_cudai_info_s));
18     YAKSU_ERR_CHKANDJUMP(!infopriv, rc, YAKSA_ERR__OUT_OF_MEM, fn_fail);
19 
20     /* set default values for info keys */
21     infopriv->iov_pack_threshold = YAKSURI_CUDAI_INFO__DEFAULT_IOV_PUP_THRESHOLD;
22     infopriv->iov_unpack_threshold = YAKSURI_CUDAI_INFO__DEFAULT_IOV_PUP_THRESHOLD;
23     infopriv->inbuf.is_valid = false;
24     infopriv->outbuf.is_valid = false;
25 
26     info->backend.cuda.priv = (void *) infopriv;
27 
28   fn_exit:
29     return rc;
30   fn_fail:
31     goto fn_exit;
32 }
33 
yaksuri_cudai_info_free_hook(yaksi_info_s * info)34 int yaksuri_cudai_info_free_hook(yaksi_info_s * info)
35 {
36     free(info->backend.cuda.priv);
37 
38     return YAKSA_SUCCESS;
39 }
40 
yaksuri_cudai_info_keyval_append(yaksi_info_s * info,const char * key,const void * val,unsigned int vallen)41 int yaksuri_cudai_info_keyval_append(yaksi_info_s * info, const char *key, const void *val,
42                                      unsigned int vallen)
43 {
44     yaksuri_cudai_info_s *infopriv = (yaksuri_cudai_info_s *) info->backend.cuda.priv;
45 
46     if (!strncmp(key, "yaksa_cuda_iov_pack_threshold", YAKSA_INFO_MAX_KEYLEN)) {
47         assert(vallen == sizeof(uintptr_t));
48         infopriv->iov_pack_threshold = (uintptr_t) val;
49     } else if (!strncmp(key, "yaksa_cuda_iov_unpack_threshold", YAKSA_INFO_MAX_KEYLEN)) {
50         assert(vallen == sizeof(uintptr_t));
51         infopriv->iov_unpack_threshold = (uintptr_t) val;
52     } else if (!strncmp(key, "yaksa_cuda_inbuf_ptr_attr", YAKSA_INFO_MAX_KEYLEN)) {
53         assert(vallen == sizeof(struct cudaPointerAttributes));
54         infopriv->inbuf.is_valid = true;
55         memcpy(&infopriv->inbuf.attr, val, sizeof(struct cudaPointerAttributes));
56     } else if (!strncmp(key, "yaksa_cuda_outbuf_ptr_attr", YAKSA_INFO_MAX_KEYLEN)) {
57         assert(vallen == sizeof(struct cudaPointerAttributes));
58         infopriv->outbuf.is_valid = true;
59         memcpy(&infopriv->outbuf.attr, val, sizeof(struct cudaPointerAttributes));
60     }
61 
62     return YAKSA_SUCCESS;
63 }
64