...
| Code Block |
|---|
/* * lustre_lnet_udsp_str_to_action * Given a string format of the action, convert it to an enumerated type * action - string format for the action. */ enum lnet_udsp_action_type lustre_lnet_udsp_str_to_action(char *action); /* * lustre_lnet_add_udsp * Add a selection policy. * src - source NID descriptor * dst - destination NID descriptor * rte - router NID descriptor * type - action type * action - union of the action * idx - the index to delete * seq_no - sequence number of the request * err_rc - [OUT] struct cYAML tree describing the error. Freed by * caller */ int lustre_lnet_add_udsp(char *src, char *dst, char *rte, enum lnet_udsp_action_type type, union action, unsigned int idx, int seq_no, struct cYAML **err_rc); /* * lustre_lnet_del_udsp * Delete a net selection policy. * idx - the index to delete * seq_no - sequence number of the request * err_rc - [OUT] struct cYAML tree describing the error. Freed by * caller */ int lustre_lnet_del_udsp(int idx, int seq_no, struct cYAML **err_rc); /* * lustre_lnet_show_udsp * Show configured net selection policies. * seq_no - sequence number of the request * show_rc - [OUT] struct cYAML tree containing the UDSPs * err_rc - [OUT] struct cYAML tree describing the error. Freed by * caller */ int lustre_lnet_show_udsp(char *netint seq_no, struct cYAML **show_rc, struct cYAML **err_rc); |
Anchor InKernelStructures InKernelStructures
In Kernel Structures
| InKernelStructures | |
| InKernelStructures |
| Code Block |
|---|
/* lnet structure which will keep a list of UDSPs */ struct lnet { ... list_head ln_udsp_list; ... } /* each NID range is defined as net_id and an ip range */ struct lnet_ud_nid_descr { __u32 ud_net_id; list_head ud_ip_range; } /* UDSP action types */ enum lnet_udsp_action_type { EN_LNET_UDSP_ACTION_PRIORITY = 0, EN_LNET_UDSP_ACTION_NONE = 1, } /* * a UDSP rule can have up to three user defined NID descriptors * - src: defines the local NID range for the rule * - dst: defines the peer NID range for the rule * - rte: defines the router NID range for the rule * * An action union defines the action to take when the rule * is matched */ struct lnet_udsp { list_head udsp_on_list; __u32 idx; lnet_ud_nid_descr *udsp_src; lnet_ud_nid_describe *udsp_dst; lnet_ud_nid_descr *udsp_rte; enum lnet_udsp_action_type udsp_action_type; union udsp_action { __u32 udsp_priority; }; } /* The rules are flattened in the LNet structures as shown below */ struct lnet_net { ... /* defines the relative priority of this net compared to others in the system */ __u32 net_priority; ... } struct lnet_remotenet { ... /* defines the relative priority of the remote net compared to other remote nets */ __u32 lrn_priority; ... } struct lnet_ni { ... /* defines the relative priority of this NI compared to other NIs in the net */ __u32 ni_priority; ... } struct lnet_peer_ni { ... /* defines the relative peer_ni priority compared to other peer_nis in the peer */ __u32 lpni_priority; /* defines the list of local NID(s) (>=1) which should be used as the source */ union lpni_pref { lnet_nid_t nid; lnet_nid_t *nids; } /* * defines the list of router NID(s) to be used when sending to this peer NI * if the peer NI is remote */ lnet_nid_t *lpni_rte_nids; ... } /* UDSPs will be passed to the kernel via IOCTL */ #define IOC_LIBCFS_ADD_UDSP _IOWR(IOC_LIBCFS_TYPE, 106, IOCTL_CONFIG_SIZE) /* UDSP will be grabbed from the kernel via IOCTL#define IOC_LIBCFS_DEL_UDSP _IOWR(IOC_LIBCFS_TYPE, 107, IOCTL_CONFIG_SIZE) #define IOC_LIBCFS_GET_UDSP _IOWR(IOC_LIBCFS_TYPE, 108, IOCTL_CONFIG_SIZE) #define IOC_LIBCFS_GET_UDSP_SIZE _IOWR(IOC_LIBCFS_TYPE, 106108, IOCTL_CONFIG_SIZE) |
Kernel IOCTL Handling
| Code Block |
|---|
/* * api-ni.c will be modified to handle adding a UDSP */ int LNetCtl(unsigned int* cmd,All void *arg) { ... case IOC_LIBCFS_ADD_UDSP: { struct lnet_ioctl_config_udsp *config_udsp = arg; mutex_lock(&the_lnet.ln_api_mutex); /* * add and do initial flattening of the UDSP into * internal structures */ rc = lnet_add_and_flatten_udsp(config_udsp); mutex_unlock(&the_lnet.ln_api_mutex); return rc; } UDSP operations are done under mutex and exclusive spin * lock to avoid constructs changing during application of the * policies. */ int LNetCtl(unsigned int cmd, void *arg) { ... case IOC_LIBCFS_DELADD_UDSP: { struct lnet_ioctl_config_udsp *delconfig_udsp = arg; mutex_lock(&the_lnet.ln_api_mutex); /* * delete add and do initial flattening of the rule identified by indexUDSP into * internal structures. */ rc = lnet_deladd_and_flatten_udsp(delconfig_udsp->udsp_idx); mutex_unlock(&the_lnet.ln_api_mutex); return rc; } case IOC_LIBCFS_GETDEL_UDSP: { struct lnet_ioctl_config_udsp *getdel_udsp = arg; mutex_lock(&the_lnet.ln_api_mutex); /* * getdelete the rule udspidentified atby index provided. Return -ENOENT if * no more UDSPs to get */ rc = lnet_adddel_udsp(get_udsp, getdel_udsp->udsp_idx); mutex_unlock(&the_lnet.ln_api_mutex); return rc; } case IOC_LIBCFS_GET_UDSP_SIZE: { struct lnet_ioctl_config_udsp *get_udsp = arg; mutex_lock(&the_lnet.ln_api_mutex); /* * get the UDSP size specified by idx */ rc = lnet_get_udsp_num(get_udsp); mutex_unlock(&the_lnet.ln_api_mutex); return rc } case IOC_LIBCFS_GET_UDSP: { struct lnet_ioctl_config_udsp *get_udsp = arg; mutex_lock(&the_lnet.ln_api_mutex); /* * get the udsp at index provided. Return -ENOENT if * no more UDSPs to get */ rc = lnet_add_udsp(get_udsp, get_udsp->udsp_idx); mutex_unlock(&the_lnet.ln_api_mutex); return rc } ... } |
...