diff options
| -rw-r--r-- | drivers/hv/hv_balloon.c | 35 |
1 files changed, 21 insertions, 14 deletions
diff --git a/drivers/hv/hv_balloon.c b/drivers/hv/hv_balloon.c index f6c0011a0337..dd289fd179ca 100644 --- a/drivers/hv/hv_balloon.c +++ b/drivers/hv/hv_balloon.c | |||
| @@ -403,7 +403,7 @@ struct dm_info_header { | |||
| 403 | */ | 403 | */ |
| 404 | 404 | ||
| 405 | struct dm_info_msg { | 405 | struct dm_info_msg { |
| 406 | struct dm_info_header header; | 406 | struct dm_header hdr; |
| 407 | __u32 reserved; | 407 | __u32 reserved; |
| 408 | __u32 info_size; | 408 | __u32 info_size; |
| 409 | __u8 info[]; | 409 | __u8 info[]; |
| @@ -503,13 +503,17 @@ static void hot_add_req(struct hv_dynmem_device *dm, struct dm_hot_add *msg) | |||
| 503 | 503 | ||
| 504 | static void process_info(struct hv_dynmem_device *dm, struct dm_info_msg *msg) | 504 | static void process_info(struct hv_dynmem_device *dm, struct dm_info_msg *msg) |
| 505 | { | 505 | { |
| 506 | switch (msg->header.type) { | 506 | struct dm_info_header *info_hdr; |
| 507 | |||
| 508 | info_hdr = (struct dm_info_header *)msg->info; | ||
| 509 | |||
| 510 | switch (info_hdr->type) { | ||
| 507 | case INFO_TYPE_MAX_PAGE_CNT: | 511 | case INFO_TYPE_MAX_PAGE_CNT: |
| 508 | pr_info("Received INFO_TYPE_MAX_PAGE_CNT\n"); | 512 | pr_info("Received INFO_TYPE_MAX_PAGE_CNT\n"); |
| 509 | pr_info("Data Size is %d\n", msg->header.data_size); | 513 | pr_info("Data Size is %d\n", info_hdr->data_size); |
| 510 | break; | 514 | break; |
| 511 | default: | 515 | default: |
| 512 | pr_info("Received Unknown type: %d\n", msg->header.type); | 516 | pr_info("Received Unknown type: %d\n", info_hdr->type); |
| 513 | } | 517 | } |
| 514 | } | 518 | } |
| 515 | 519 | ||
| @@ -879,7 +883,7 @@ static int balloon_probe(struct hv_device *dev, | |||
| 879 | balloon_onchannelcallback, dev); | 883 | balloon_onchannelcallback, dev); |
| 880 | 884 | ||
| 881 | if (ret) | 885 | if (ret) |
| 882 | return ret; | 886 | goto probe_error0; |
| 883 | 887 | ||
| 884 | dm_device.dev = dev; | 888 | dm_device.dev = dev; |
| 885 | dm_device.state = DM_INITIALIZING; | 889 | dm_device.state = DM_INITIALIZING; |
| @@ -891,7 +895,7 @@ static int balloon_probe(struct hv_device *dev, | |||
| 891 | kthread_run(dm_thread_func, &dm_device, "hv_balloon"); | 895 | kthread_run(dm_thread_func, &dm_device, "hv_balloon"); |
| 892 | if (IS_ERR(dm_device.thread)) { | 896 | if (IS_ERR(dm_device.thread)) { |
| 893 | ret = PTR_ERR(dm_device.thread); | 897 | ret = PTR_ERR(dm_device.thread); |
| 894 | goto probe_error0; | 898 | goto probe_error1; |
| 895 | } | 899 | } |
| 896 | 900 | ||
| 897 | hv_set_drvdata(dev, &dm_device); | 901 | hv_set_drvdata(dev, &dm_device); |
| @@ -914,12 +918,12 @@ static int balloon_probe(struct hv_device *dev, | |||
| 914 | VM_PKT_DATA_INBAND, | 918 | VM_PKT_DATA_INBAND, |
| 915 | VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); | 919 | VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); |
| 916 | if (ret) | 920 | if (ret) |
| 917 | goto probe_error1; | 921 | goto probe_error2; |
| 918 | 922 | ||
| 919 | t = wait_for_completion_timeout(&dm_device.host_event, 5*HZ); | 923 | t = wait_for_completion_timeout(&dm_device.host_event, 5*HZ); |
| 920 | if (t == 0) { | 924 | if (t == 0) { |
| 921 | ret = -ETIMEDOUT; | 925 | ret = -ETIMEDOUT; |
| 922 | goto probe_error1; | 926 | goto probe_error2; |
| 923 | } | 927 | } |
| 924 | 928 | ||
| 925 | /* | 929 | /* |
| @@ -928,7 +932,7 @@ static int balloon_probe(struct hv_device *dev, | |||
| 928 | */ | 932 | */ |
| 929 | if (dm_device.state == DM_INIT_ERROR) { | 933 | if (dm_device.state == DM_INIT_ERROR) { |
| 930 | ret = -ETIMEDOUT; | 934 | ret = -ETIMEDOUT; |
| 931 | goto probe_error1; | 935 | goto probe_error2; |
| 932 | } | 936 | } |
| 933 | /* | 937 | /* |
| 934 | * Now submit our capabilities to the host. | 938 | * Now submit our capabilities to the host. |
| @@ -961,12 +965,12 @@ static int balloon_probe(struct hv_device *dev, | |||
| 961 | VM_PKT_DATA_INBAND, | 965 | VM_PKT_DATA_INBAND, |
| 962 | VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); | 966 | VMBUS_DATA_PACKET_FLAG_COMPLETION_REQUESTED); |
| 963 | if (ret) | 967 | if (ret) |
| 964 | goto probe_error1; | 968 | goto probe_error2; |
| 965 | 969 | ||
| 966 | t = wait_for_completion_timeout(&dm_device.host_event, 5*HZ); | 970 | t = wait_for_completion_timeout(&dm_device.host_event, 5*HZ); |
| 967 | if (t == 0) { | 971 | if (t == 0) { |
| 968 | ret = -ETIMEDOUT; | 972 | ret = -ETIMEDOUT; |
| 969 | goto probe_error1; | 973 | goto probe_error2; |
| 970 | } | 974 | } |
| 971 | 975 | ||
| 972 | /* | 976 | /* |
| @@ -975,18 +979,20 @@ static int balloon_probe(struct hv_device *dev, | |||
| 975 | */ | 979 | */ |
| 976 | if (dm_device.state == DM_INIT_ERROR) { | 980 | if (dm_device.state == DM_INIT_ERROR) { |
| 977 | ret = -ETIMEDOUT; | 981 | ret = -ETIMEDOUT; |
| 978 | goto probe_error1; | 982 | goto probe_error2; |
| 979 | } | 983 | } |
| 980 | 984 | ||
| 981 | dm_device.state = DM_INITIALIZED; | 985 | dm_device.state = DM_INITIALIZED; |
| 982 | 986 | ||
| 983 | return 0; | 987 | return 0; |
| 984 | 988 | ||
| 985 | probe_error1: | 989 | probe_error2: |
| 986 | kthread_stop(dm_device.thread); | 990 | kthread_stop(dm_device.thread); |
| 987 | 991 | ||
| 988 | probe_error0: | 992 | probe_error1: |
| 989 | vmbus_close(dev->channel); | 993 | vmbus_close(dev->channel); |
| 994 | probe_error0: | ||
| 995 | kfree(send_buffer); | ||
| 990 | return ret; | 996 | return ret; |
| 991 | } | 997 | } |
| 992 | 998 | ||
| @@ -999,6 +1005,7 @@ static int balloon_remove(struct hv_device *dev) | |||
| 999 | 1005 | ||
| 1000 | vmbus_close(dev->channel); | 1006 | vmbus_close(dev->channel); |
| 1001 | kthread_stop(dm->thread); | 1007 | kthread_stop(dm->thread); |
| 1008 | kfree(send_buffer); | ||
| 1002 | 1009 | ||
| 1003 | return 0; | 1010 | return 0; |
| 1004 | } | 1011 | } |
