diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-12 17:12:04 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-07-12 17:12:04 -0400 |
commit | 56a50f20eade9a1777375d40e04434788b6ff414 (patch) | |
tree | b346e7e5bb5b805d46658f969d7f748bb70add14 | |
parent | 303f8ad1c5f4bed903a62f4afdbd2b252e2a1270 (diff) | |
parent | 6d827fbcc370ca259a2905309f64161ab7b10596 (diff) |
Merge tag 'char-misc-3.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc driver fixes from Greg KH:
"Here are two hyperv driver fixes, and one i8k driver fix for 3.16"
* tag 'char-misc-3.16-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
i8k: Fix non-SMP operation
Drivers: hv: util: Fix a bug in the KVP code
Drivers: hv: vmbus: Fix a bug in the channel callback dispatch code
-rw-r--r-- | drivers/char/i8k.c | 4 | ||||
-rw-r--r-- | drivers/hv/connection.c | 8 | ||||
-rw-r--r-- | drivers/hv/hv_kvp.c | 17 | ||||
-rw-r--r-- | drivers/hv/hv_util.c | 2 |
4 files changed, 24 insertions, 7 deletions
diff --git a/drivers/char/i8k.c b/drivers/char/i8k.c index d915707d2ba1..93dcad0c1cbe 100644 --- a/drivers/char/i8k.c +++ b/drivers/char/i8k.c | |||
@@ -138,7 +138,9 @@ static int i8k_smm(struct smm_regs *regs) | |||
138 | if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) | 138 | if (!alloc_cpumask_var(&old_mask, GFP_KERNEL)) |
139 | return -ENOMEM; | 139 | return -ENOMEM; |
140 | cpumask_copy(old_mask, ¤t->cpus_allowed); | 140 | cpumask_copy(old_mask, ¤t->cpus_allowed); |
141 | set_cpus_allowed_ptr(current, cpumask_of(0)); | 141 | rc = set_cpus_allowed_ptr(current, cpumask_of(0)); |
142 | if (rc) | ||
143 | goto out; | ||
142 | if (smp_processor_id() != 0) { | 144 | if (smp_processor_id() != 0) { |
143 | rc = -EBUSY; | 145 | rc = -EBUSY; |
144 | goto out; | 146 | goto out; |
diff --git a/drivers/hv/connection.c b/drivers/hv/connection.c index e84f4526eb36..ae22e3c1fc4c 100644 --- a/drivers/hv/connection.c +++ b/drivers/hv/connection.c | |||
@@ -339,9 +339,13 @@ static void process_chn_event(u32 relid) | |||
339 | */ | 339 | */ |
340 | 340 | ||
341 | do { | 341 | do { |
342 | hv_begin_read(&channel->inbound); | 342 | if (read_state) |
343 | hv_begin_read(&channel->inbound); | ||
343 | channel->onchannel_callback(arg); | 344 | channel->onchannel_callback(arg); |
344 | bytes_to_read = hv_end_read(&channel->inbound); | 345 | if (read_state) |
346 | bytes_to_read = hv_end_read(&channel->inbound); | ||
347 | else | ||
348 | bytes_to_read = 0; | ||
345 | } while (read_state && (bytes_to_read != 0)); | 349 | } while (read_state && (bytes_to_read != 0)); |
346 | } else { | 350 | } else { |
347 | pr_err("no channel callback for relid - %u\n", relid); | 351 | pr_err("no channel callback for relid - %u\n", relid); |
diff --git a/drivers/hv/hv_kvp.c b/drivers/hv/hv_kvp.c index ea852537307e..521c14625b3a 100644 --- a/drivers/hv/hv_kvp.c +++ b/drivers/hv/hv_kvp.c | |||
@@ -127,6 +127,17 @@ kvp_work_func(struct work_struct *dummy) | |||
127 | kvp_respond_to_host(NULL, HV_E_FAIL); | 127 | kvp_respond_to_host(NULL, HV_E_FAIL); |
128 | } | 128 | } |
129 | 129 | ||
130 | static void poll_channel(struct vmbus_channel *channel) | ||
131 | { | ||
132 | if (channel->target_cpu != smp_processor_id()) | ||
133 | smp_call_function_single(channel->target_cpu, | ||
134 | hv_kvp_onchannelcallback, | ||
135 | channel, true); | ||
136 | else | ||
137 | hv_kvp_onchannelcallback(channel); | ||
138 | } | ||
139 | |||
140 | |||
130 | static int kvp_handle_handshake(struct hv_kvp_msg *msg) | 141 | static int kvp_handle_handshake(struct hv_kvp_msg *msg) |
131 | { | 142 | { |
132 | int ret = 1; | 143 | int ret = 1; |
@@ -155,7 +166,7 @@ static int kvp_handle_handshake(struct hv_kvp_msg *msg) | |||
155 | kvp_register(dm_reg_value); | 166 | kvp_register(dm_reg_value); |
156 | kvp_transaction.active = false; | 167 | kvp_transaction.active = false; |
157 | if (kvp_transaction.kvp_context) | 168 | if (kvp_transaction.kvp_context) |
158 | hv_kvp_onchannelcallback(kvp_transaction.kvp_context); | 169 | poll_channel(kvp_transaction.kvp_context); |
159 | } | 170 | } |
160 | return ret; | 171 | return ret; |
161 | } | 172 | } |
@@ -568,7 +579,7 @@ response_done: | |||
568 | 579 | ||
569 | vmbus_sendpacket(channel, recv_buffer, buf_len, req_id, | 580 | vmbus_sendpacket(channel, recv_buffer, buf_len, req_id, |
570 | VM_PKT_DATA_INBAND, 0); | 581 | VM_PKT_DATA_INBAND, 0); |
571 | 582 | poll_channel(channel); | |
572 | } | 583 | } |
573 | 584 | ||
574 | /* | 585 | /* |
@@ -603,7 +614,7 @@ void hv_kvp_onchannelcallback(void *context) | |||
603 | return; | 614 | return; |
604 | } | 615 | } |
605 | 616 | ||
606 | vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 2, &recvlen, | 617 | vmbus_recvpacket(channel, recv_buffer, PAGE_SIZE * 4, &recvlen, |
607 | &requestid); | 618 | &requestid); |
608 | 619 | ||
609 | if (recvlen > 0) { | 620 | if (recvlen > 0) { |
diff --git a/drivers/hv/hv_util.c b/drivers/hv/hv_util.c index dd761806f0e8..3b9c9ef0deb8 100644 --- a/drivers/hv/hv_util.c +++ b/drivers/hv/hv_util.c | |||
@@ -319,7 +319,7 @@ static int util_probe(struct hv_device *dev, | |||
319 | (struct hv_util_service *)dev_id->driver_data; | 319 | (struct hv_util_service *)dev_id->driver_data; |
320 | int ret; | 320 | int ret; |
321 | 321 | ||
322 | srv->recv_buffer = kmalloc(PAGE_SIZE * 2, GFP_KERNEL); | 322 | srv->recv_buffer = kmalloc(PAGE_SIZE * 4, GFP_KERNEL); |
323 | if (!srv->recv_buffer) | 323 | if (!srv->recv_buffer) |
324 | return -ENOMEM; | 324 | return -ENOMEM; |
325 | if (srv->util_init) { | 325 | if (srv->util_init) { |