diff options
author | Sean Hefty <sean.hefty@intel.com> | 2007-08-08 18:51:13 -0400 |
---|---|---|
committer | Roland Dreier <rolandd@cisco.com> | 2007-10-09 22:59:12 -0400 |
commit | 7ce86409adcd2fda652b628173a66e905950ece1 (patch) | |
tree | 37ec32b859f358c77267c465a6e04a642d7c5ff3 /drivers/infiniband | |
parent | a81c994d5eef87ed77cb30d8343d6be296528b3f (diff) |
RDMA/ucma: Allow user space to set service type
Export the ability to set the type of service to user space. Model
the interface after setsockopt.
Signed-off-by: Sean Hefty <sean.hefty@intel.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
Diffstat (limited to 'drivers/infiniband')
-rw-r--r-- | drivers/infiniband/core/ucma.c | 74 |
1 files changed, 73 insertions, 1 deletions
diff --git a/drivers/infiniband/core/ucma.c b/drivers/infiniband/core/ucma.c index 53b4c94a7eb5..90d675ad9ec8 100644 --- a/drivers/infiniband/core/ucma.c +++ b/drivers/infiniband/core/ucma.c | |||
@@ -792,6 +792,78 @@ out: | |||
792 | return ret; | 792 | return ret; |
793 | } | 793 | } |
794 | 794 | ||
795 | static int ucma_set_option_id(struct ucma_context *ctx, int optname, | ||
796 | void *optval, size_t optlen) | ||
797 | { | ||
798 | int ret = 0; | ||
799 | |||
800 | switch (optname) { | ||
801 | case RDMA_OPTION_ID_TOS: | ||
802 | if (optlen != sizeof(u8)) { | ||
803 | ret = -EINVAL; | ||
804 | break; | ||
805 | } | ||
806 | rdma_set_service_type(ctx->cm_id, *((u8 *) optval)); | ||
807 | break; | ||
808 | default: | ||
809 | ret = -ENOSYS; | ||
810 | } | ||
811 | |||
812 | return ret; | ||
813 | } | ||
814 | |||
815 | static int ucma_set_option_level(struct ucma_context *ctx, int level, | ||
816 | int optname, void *optval, size_t optlen) | ||
817 | { | ||
818 | int ret; | ||
819 | |||
820 | switch (level) { | ||
821 | case RDMA_OPTION_ID: | ||
822 | ret = ucma_set_option_id(ctx, optname, optval, optlen); | ||
823 | break; | ||
824 | default: | ||
825 | ret = -ENOSYS; | ||
826 | } | ||
827 | |||
828 | return ret; | ||
829 | } | ||
830 | |||
831 | static ssize_t ucma_set_option(struct ucma_file *file, const char __user *inbuf, | ||
832 | int in_len, int out_len) | ||
833 | { | ||
834 | struct rdma_ucm_set_option cmd; | ||
835 | struct ucma_context *ctx; | ||
836 | void *optval; | ||
837 | int ret; | ||
838 | |||
839 | if (copy_from_user(&cmd, inbuf, sizeof(cmd))) | ||
840 | return -EFAULT; | ||
841 | |||
842 | ctx = ucma_get_ctx(file, cmd.id); | ||
843 | if (IS_ERR(ctx)) | ||
844 | return PTR_ERR(ctx); | ||
845 | |||
846 | optval = kmalloc(cmd.optlen, GFP_KERNEL); | ||
847 | if (!optval) { | ||
848 | ret = -ENOMEM; | ||
849 | goto out1; | ||
850 | } | ||
851 | |||
852 | if (copy_from_user(optval, (void __user *) (unsigned long) cmd.optval, | ||
853 | cmd.optlen)) { | ||
854 | ret = -EFAULT; | ||
855 | goto out2; | ||
856 | } | ||
857 | |||
858 | ret = ucma_set_option_level(ctx, cmd.level, cmd.optname, optval, | ||
859 | cmd.optlen); | ||
860 | out2: | ||
861 | kfree(optval); | ||
862 | out1: | ||
863 | ucma_put_ctx(ctx); | ||
864 | return ret; | ||
865 | } | ||
866 | |||
795 | static ssize_t ucma_notify(struct ucma_file *file, const char __user *inbuf, | 867 | static ssize_t ucma_notify(struct ucma_file *file, const char __user *inbuf, |
796 | int in_len, int out_len) | 868 | int in_len, int out_len) |
797 | { | 869 | { |
@@ -936,7 +1008,7 @@ static ssize_t (*ucma_cmd_table[])(struct ucma_file *file, | |||
936 | [RDMA_USER_CM_CMD_INIT_QP_ATTR] = ucma_init_qp_attr, | 1008 | [RDMA_USER_CM_CMD_INIT_QP_ATTR] = ucma_init_qp_attr, |
937 | [RDMA_USER_CM_CMD_GET_EVENT] = ucma_get_event, | 1009 | [RDMA_USER_CM_CMD_GET_EVENT] = ucma_get_event, |
938 | [RDMA_USER_CM_CMD_GET_OPTION] = NULL, | 1010 | [RDMA_USER_CM_CMD_GET_OPTION] = NULL, |
939 | [RDMA_USER_CM_CMD_SET_OPTION] = NULL, | 1011 | [RDMA_USER_CM_CMD_SET_OPTION] = ucma_set_option, |
940 | [RDMA_USER_CM_CMD_NOTIFY] = ucma_notify, | 1012 | [RDMA_USER_CM_CMD_NOTIFY] = ucma_notify, |
941 | [RDMA_USER_CM_CMD_JOIN_MCAST] = ucma_join_multicast, | 1013 | [RDMA_USER_CM_CMD_JOIN_MCAST] = ucma_join_multicast, |
942 | [RDMA_USER_CM_CMD_LEAVE_MCAST] = ucma_leave_multicast, | 1014 | [RDMA_USER_CM_CMD_LEAVE_MCAST] = ucma_leave_multicast, |