diff options
author | Vitaly Kuznetsov <vkuznets@redhat.com> | 2015-12-14 22:02:00 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2015-12-14 22:27:30 -0500 |
commit | 667d374064b0cc48b6122101b287908d1b392bdb (patch) | |
tree | 98f9289da0d4309082a423daa430b141daa50fbc | |
parent | b5f53dde8d8e84a6ee200dbd0bd90a400a8fe1a1 (diff) |
Drivers: hv: remove code duplication between vmbus_recvpacket()/vmbus_recvpacket_raw()
vmbus_recvpacket() and vmbus_recvpacket_raw() are almost identical but
there are two discrepancies:
1) vmbus_recvpacket() doesn't propagate errors from hv_ringbuffer_read()
which looks like it is not desired.
2) There is an error message printed in packetlen > bufferlen case in
vmbus_recvpacket(). I'm removing it as it is usless for users to see
such messages and /vmbus_recvpacket_raw() doesn't have it.
Signed-off-by: Vitaly Kuznetsov <vkuznets@redhat.com>
Signed-off-by: K. Y. Srinivasan <kys@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-rw-r--r-- | drivers/hv/channel.c | 65 |
1 files changed, 22 insertions, 43 deletions
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index 2889d97c03b1..dd6de7fc442f 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c | |||
@@ -922,8 +922,10 @@ EXPORT_SYMBOL_GPL(vmbus_sendpacket_multipagebuffer); | |||
922 | * | 922 | * |
923 | * Mainly used by Hyper-V drivers. | 923 | * Mainly used by Hyper-V drivers. |
924 | */ | 924 | */ |
925 | int vmbus_recvpacket(struct vmbus_channel *channel, void *buffer, | 925 | static inline int |
926 | u32 bufferlen, u32 *buffer_actual_len, u64 *requestid) | 926 | __vmbus_recvpacket(struct vmbus_channel *channel, void *buffer, |
927 | u32 bufferlen, u32 *buffer_actual_len, u64 *requestid, | ||
928 | bool raw) | ||
927 | { | 929 | { |
928 | struct vmpacket_descriptor desc; | 930 | struct vmpacket_descriptor desc; |
929 | u32 packetlen; | 931 | u32 packetlen; |
@@ -941,27 +943,34 @@ int vmbus_recvpacket(struct vmbus_channel *channel, void *buffer, | |||
941 | return 0; | 943 | return 0; |
942 | 944 | ||
943 | packetlen = desc.len8 << 3; | 945 | packetlen = desc.len8 << 3; |
944 | userlen = packetlen - (desc.offset8 << 3); | 946 | if (!raw) |
947 | userlen = packetlen - (desc.offset8 << 3); | ||
948 | else | ||
949 | userlen = packetlen; | ||
945 | 950 | ||
946 | *buffer_actual_len = userlen; | 951 | *buffer_actual_len = userlen; |
947 | 952 | ||
948 | if (userlen > bufferlen) { | 953 | if (userlen > bufferlen) |
949 | 954 | return -ENOBUFS; | |
950 | pr_err("Buffer too small - got %d needs %d\n", | ||
951 | bufferlen, userlen); | ||
952 | return -ETOOSMALL; | ||
953 | } | ||
954 | 955 | ||
955 | *requestid = desc.trans_id; | 956 | *requestid = desc.trans_id; |
956 | 957 | ||
957 | /* Copy over the packet to the user buffer */ | 958 | /* Copy over the packet to the user buffer */ |
958 | ret = hv_ringbuffer_read(&channel->inbound, buffer, userlen, | 959 | ret = hv_ringbuffer_read(&channel->inbound, buffer, userlen, |
959 | (desc.offset8 << 3), &signal); | 960 | raw ? 0 : desc.offset8 << 3, &signal); |
960 | 961 | ||
961 | if (signal) | 962 | if (signal) |
962 | vmbus_setevent(channel); | 963 | vmbus_setevent(channel); |
963 | 964 | ||
964 | return 0; | 965 | return ret; |
966 | } | ||
967 | |||
968 | int vmbus_recvpacket(struct vmbus_channel *channel, void *buffer, | ||
969 | u32 bufferlen, u32 *buffer_actual_len, | ||
970 | u64 *requestid) | ||
971 | { | ||
972 | return __vmbus_recvpacket(channel, buffer, bufferlen, | ||
973 | buffer_actual_len, requestid, false); | ||
965 | } | 974 | } |
966 | EXPORT_SYMBOL(vmbus_recvpacket); | 975 | EXPORT_SYMBOL(vmbus_recvpacket); |
967 | 976 | ||
@@ -972,37 +981,7 @@ int vmbus_recvpacket_raw(struct vmbus_channel *channel, void *buffer, | |||
972 | u32 bufferlen, u32 *buffer_actual_len, | 981 | u32 bufferlen, u32 *buffer_actual_len, |
973 | u64 *requestid) | 982 | u64 *requestid) |
974 | { | 983 | { |
975 | struct vmpacket_descriptor desc; | 984 | return __vmbus_recvpacket(channel, buffer, bufferlen, |
976 | u32 packetlen; | 985 | buffer_actual_len, requestid, true); |
977 | int ret; | ||
978 | bool signal = false; | ||
979 | |||
980 | *buffer_actual_len = 0; | ||
981 | *requestid = 0; | ||
982 | |||
983 | |||
984 | ret = hv_ringbuffer_peek(&channel->inbound, &desc, | ||
985 | sizeof(struct vmpacket_descriptor)); | ||
986 | if (ret != 0) | ||
987 | return 0; | ||
988 | |||
989 | |||
990 | packetlen = desc.len8 << 3; | ||
991 | |||
992 | *buffer_actual_len = packetlen; | ||
993 | |||
994 | if (packetlen > bufferlen) | ||
995 | return -ENOBUFS; | ||
996 | |||
997 | *requestid = desc.trans_id; | ||
998 | |||
999 | /* Copy over the entire packet to the user buffer */ | ||
1000 | ret = hv_ringbuffer_read(&channel->inbound, buffer, packetlen, 0, | ||
1001 | &signal); | ||
1002 | |||
1003 | if (signal) | ||
1004 | vmbus_setevent(channel); | ||
1005 | |||
1006 | return ret; | ||
1007 | } | 986 | } |
1008 | EXPORT_SYMBOL_GPL(vmbus_recvpacket_raw); | 987 | EXPORT_SYMBOL_GPL(vmbus_recvpacket_raw); |