diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-11-30 15:43:17 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-11-30 15:43:17 -0500 |
commit | b6839ef26e549de68c10359d45163b0cfb031183 (patch) | |
tree | b4cd7b04c0af7acbd7a3be8149410520075a3ad7 | |
parent | d7aca8a78c8bc5d3707691aab13cb4f7f6de696f (diff) | |
parent | 6484a677294aa5d08c0210f2f387ebb9be646115 (diff) |
Merge tag 'char-misc-4.20-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc
Pull char/misc fixes from Greg KH:
"Here are a few small char/misc driver fixes for 4.20-rc5 that resolve
a number of reported issues.
The "largest" here is the thunderbolt patch, which resolves an issue
with NVM upgrade, the smallest being some fsi driver fixes. There's
also a hyperv bugfix, and the usual binder bugfixes.
All of these have been in linux-next with no reported issues"
* tag 'char-misc-4.20-rc5' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/char-misc:
misc: mic/scif: fix copy-paste error in scif_create_remote_lookup
thunderbolt: Prevent root port runtime suspend during NVM upgrade
Drivers: hv: vmbus: check the creation_status in vmbus_establish_gpadl()
binder: fix race that allows malicious free of live buffer
fsi: fsi-scom.c: Remove duplicate header
fsi: master-ast-cf: select GENERIC_ALLOCATOR
-rw-r--r-- | drivers/android/binder.c | 21 | ||||
-rw-r--r-- | drivers/android/binder_alloc.c | 16 | ||||
-rw-r--r-- | drivers/android/binder_alloc.h | 3 | ||||
-rw-r--r-- | drivers/fsi/Kconfig | 1 | ||||
-rw-r--r-- | drivers/fsi/fsi-scom.c | 1 | ||||
-rw-r--r-- | drivers/hv/channel.c | 8 | ||||
-rw-r--r-- | drivers/misc/mic/scif/scif_rma.c | 2 | ||||
-rw-r--r-- | drivers/thunderbolt/switch.c | 40 |
8 files changed, 67 insertions, 25 deletions
diff --git a/drivers/android/binder.c b/drivers/android/binder.c index cb30a524d16d..9f1000d2a40c 100644 --- a/drivers/android/binder.c +++ b/drivers/android/binder.c | |||
@@ -2974,7 +2974,6 @@ static void binder_transaction(struct binder_proc *proc, | |||
2974 | t->buffer = NULL; | 2974 | t->buffer = NULL; |
2975 | goto err_binder_alloc_buf_failed; | 2975 | goto err_binder_alloc_buf_failed; |
2976 | } | 2976 | } |
2977 | t->buffer->allow_user_free = 0; | ||
2978 | t->buffer->debug_id = t->debug_id; | 2977 | t->buffer->debug_id = t->debug_id; |
2979 | t->buffer->transaction = t; | 2978 | t->buffer->transaction = t; |
2980 | t->buffer->target_node = target_node; | 2979 | t->buffer->target_node = target_node; |
@@ -3510,14 +3509,18 @@ static int binder_thread_write(struct binder_proc *proc, | |||
3510 | 3509 | ||
3511 | buffer = binder_alloc_prepare_to_free(&proc->alloc, | 3510 | buffer = binder_alloc_prepare_to_free(&proc->alloc, |
3512 | data_ptr); | 3511 | data_ptr); |
3513 | if (buffer == NULL) { | 3512 | if (IS_ERR_OR_NULL(buffer)) { |
3514 | binder_user_error("%d:%d BC_FREE_BUFFER u%016llx no match\n", | 3513 | if (PTR_ERR(buffer) == -EPERM) { |
3515 | proc->pid, thread->pid, (u64)data_ptr); | 3514 | binder_user_error( |
3516 | break; | 3515 | "%d:%d BC_FREE_BUFFER u%016llx matched unreturned or currently freeing buffer\n", |
3517 | } | 3516 | proc->pid, thread->pid, |
3518 | if (!buffer->allow_user_free) { | 3517 | (u64)data_ptr); |
3519 | binder_user_error("%d:%d BC_FREE_BUFFER u%016llx matched unreturned buffer\n", | 3518 | } else { |
3520 | proc->pid, thread->pid, (u64)data_ptr); | 3519 | binder_user_error( |
3520 | "%d:%d BC_FREE_BUFFER u%016llx no match\n", | ||
3521 | proc->pid, thread->pid, | ||
3522 | (u64)data_ptr); | ||
3523 | } | ||
3521 | break; | 3524 | break; |
3522 | } | 3525 | } |
3523 | binder_debug(BINDER_DEBUG_FREE_BUFFER, | 3526 | binder_debug(BINDER_DEBUG_FREE_BUFFER, |
diff --git a/drivers/android/binder_alloc.c b/drivers/android/binder_alloc.c index 64fd96eada31..030c98f35cca 100644 --- a/drivers/android/binder_alloc.c +++ b/drivers/android/binder_alloc.c | |||
@@ -151,16 +151,12 @@ static struct binder_buffer *binder_alloc_prepare_to_free_locked( | |||
151 | else { | 151 | else { |
152 | /* | 152 | /* |
153 | * Guard against user threads attempting to | 153 | * Guard against user threads attempting to |
154 | * free the buffer twice | 154 | * free the buffer when in use by kernel or |
155 | * after it's already been freed. | ||
155 | */ | 156 | */ |
156 | if (buffer->free_in_progress) { | 157 | if (!buffer->allow_user_free) |
157 | binder_alloc_debug(BINDER_DEBUG_USER_ERROR, | 158 | return ERR_PTR(-EPERM); |
158 | "%d:%d FREE_BUFFER u%016llx user freed buffer twice\n", | 159 | buffer->allow_user_free = 0; |
159 | alloc->pid, current->pid, | ||
160 | (u64)user_ptr); | ||
161 | return NULL; | ||
162 | } | ||
163 | buffer->free_in_progress = 1; | ||
164 | return buffer; | 160 | return buffer; |
165 | } | 161 | } |
166 | } | 162 | } |
@@ -500,7 +496,7 @@ static struct binder_buffer *binder_alloc_new_buf_locked( | |||
500 | 496 | ||
501 | rb_erase(best_fit, &alloc->free_buffers); | 497 | rb_erase(best_fit, &alloc->free_buffers); |
502 | buffer->free = 0; | 498 | buffer->free = 0; |
503 | buffer->free_in_progress = 0; | 499 | buffer->allow_user_free = 0; |
504 | binder_insert_allocated_buffer_locked(alloc, buffer); | 500 | binder_insert_allocated_buffer_locked(alloc, buffer); |
505 | binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, | 501 | binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC, |
506 | "%d: binder_alloc_buf size %zd got %pK\n", | 502 | "%d: binder_alloc_buf size %zd got %pK\n", |
diff --git a/drivers/android/binder_alloc.h b/drivers/android/binder_alloc.h index 9ef64e563856..fb3238c74c8a 100644 --- a/drivers/android/binder_alloc.h +++ b/drivers/android/binder_alloc.h | |||
@@ -50,8 +50,7 @@ struct binder_buffer { | |||
50 | unsigned free:1; | 50 | unsigned free:1; |
51 | unsigned allow_user_free:1; | 51 | unsigned allow_user_free:1; |
52 | unsigned async_transaction:1; | 52 | unsigned async_transaction:1; |
53 | unsigned free_in_progress:1; | 53 | unsigned debug_id:29; |
54 | unsigned debug_id:28; | ||
55 | 54 | ||
56 | struct binder_transaction *transaction; | 55 | struct binder_transaction *transaction; |
57 | 56 | ||
diff --git a/drivers/fsi/Kconfig b/drivers/fsi/Kconfig index af3a20dd5aa4..99c99a5d57fe 100644 --- a/drivers/fsi/Kconfig +++ b/drivers/fsi/Kconfig | |||
@@ -46,6 +46,7 @@ config FSI_MASTER_AST_CF | |||
46 | tristate "FSI master based on Aspeed ColdFire coprocessor" | 46 | tristate "FSI master based on Aspeed ColdFire coprocessor" |
47 | depends on GPIOLIB | 47 | depends on GPIOLIB |
48 | depends on GPIO_ASPEED | 48 | depends on GPIO_ASPEED |
49 | select GENERIC_ALLOCATOR | ||
49 | ---help--- | 50 | ---help--- |
50 | This option enables a FSI master using the AST2400 and AST2500 GPIO | 51 | This option enables a FSI master using the AST2400 and AST2500 GPIO |
51 | lines driven by the internal ColdFire coprocessor. This requires | 52 | lines driven by the internal ColdFire coprocessor. This requires |
diff --git a/drivers/fsi/fsi-scom.c b/drivers/fsi/fsi-scom.c index df94021dd9d1..81dc01ac2351 100644 --- a/drivers/fsi/fsi-scom.c +++ b/drivers/fsi/fsi-scom.c | |||
@@ -20,7 +20,6 @@ | |||
20 | #include <linux/fs.h> | 20 | #include <linux/fs.h> |
21 | #include <linux/uaccess.h> | 21 | #include <linux/uaccess.h> |
22 | #include <linux/slab.h> | 22 | #include <linux/slab.h> |
23 | #include <linux/cdev.h> | ||
24 | #include <linux/list.h> | 23 | #include <linux/list.h> |
25 | 24 | ||
26 | #include <uapi/linux/fsi.h> | 25 | #include <uapi/linux/fsi.h> |
diff --git a/drivers/hv/channel.c b/drivers/hv/channel.c index de8193f3b838..fe00b12e4417 100644 --- a/drivers/hv/channel.c +++ b/drivers/hv/channel.c | |||
@@ -516,6 +516,14 @@ int vmbus_establish_gpadl(struct vmbus_channel *channel, void *kbuffer, | |||
516 | } | 516 | } |
517 | wait_for_completion(&msginfo->waitevent); | 517 | wait_for_completion(&msginfo->waitevent); |
518 | 518 | ||
519 | if (msginfo->response.gpadl_created.creation_status != 0) { | ||
520 | pr_err("Failed to establish GPADL: err = 0x%x\n", | ||
521 | msginfo->response.gpadl_created.creation_status); | ||
522 | |||
523 | ret = -EDQUOT; | ||
524 | goto cleanup; | ||
525 | } | ||
526 | |||
519 | if (channel->rescind) { | 527 | if (channel->rescind) { |
520 | ret = -ENODEV; | 528 | ret = -ENODEV; |
521 | goto cleanup; | 529 | goto cleanup; |
diff --git a/drivers/misc/mic/scif/scif_rma.c b/drivers/misc/mic/scif/scif_rma.c index c824329f7012..0e4193cb08cf 100644 --- a/drivers/misc/mic/scif/scif_rma.c +++ b/drivers/misc/mic/scif/scif_rma.c | |||
@@ -416,7 +416,7 @@ static int scif_create_remote_lookup(struct scif_dev *remote_dev, | |||
416 | if (err) | 416 | if (err) |
417 | goto error_window; | 417 | goto error_window; |
418 | err = scif_map_page(&window->num_pages_lookup.lookup[j], | 418 | err = scif_map_page(&window->num_pages_lookup.lookup[j], |
419 | vmalloc_dma_phys ? | 419 | vmalloc_num_pages ? |
420 | vmalloc_to_page(&window->num_pages[i]) : | 420 | vmalloc_to_page(&window->num_pages[i]) : |
421 | virt_to_page(&window->num_pages[i]), | 421 | virt_to_page(&window->num_pages[i]), |
422 | remote_dev); | 422 | remote_dev); |
diff --git a/drivers/thunderbolt/switch.c b/drivers/thunderbolt/switch.c index 52ff854f0d6c..cd96994dc094 100644 --- a/drivers/thunderbolt/switch.c +++ b/drivers/thunderbolt/switch.c | |||
@@ -863,6 +863,30 @@ static ssize_t key_store(struct device *dev, struct device_attribute *attr, | |||
863 | } | 863 | } |
864 | static DEVICE_ATTR(key, 0600, key_show, key_store); | 864 | static DEVICE_ATTR(key, 0600, key_show, key_store); |
865 | 865 | ||
866 | static void nvm_authenticate_start(struct tb_switch *sw) | ||
867 | { | ||
868 | struct pci_dev *root_port; | ||
869 | |||
870 | /* | ||
871 | * During host router NVM upgrade we should not allow root port to | ||
872 | * go into D3cold because some root ports cannot trigger PME | ||
873 | * itself. To be on the safe side keep the root port in D0 during | ||
874 | * the whole upgrade process. | ||
875 | */ | ||
876 | root_port = pci_find_pcie_root_port(sw->tb->nhi->pdev); | ||
877 | if (root_port) | ||
878 | pm_runtime_get_noresume(&root_port->dev); | ||
879 | } | ||
880 | |||
881 | static void nvm_authenticate_complete(struct tb_switch *sw) | ||
882 | { | ||
883 | struct pci_dev *root_port; | ||
884 | |||
885 | root_port = pci_find_pcie_root_port(sw->tb->nhi->pdev); | ||
886 | if (root_port) | ||
887 | pm_runtime_put(&root_port->dev); | ||
888 | } | ||
889 | |||
866 | static ssize_t nvm_authenticate_show(struct device *dev, | 890 | static ssize_t nvm_authenticate_show(struct device *dev, |
867 | struct device_attribute *attr, char *buf) | 891 | struct device_attribute *attr, char *buf) |
868 | { | 892 | { |
@@ -912,10 +936,18 @@ static ssize_t nvm_authenticate_store(struct device *dev, | |||
912 | 936 | ||
913 | sw->nvm->authenticating = true; | 937 | sw->nvm->authenticating = true; |
914 | 938 | ||
915 | if (!tb_route(sw)) | 939 | if (!tb_route(sw)) { |
940 | /* | ||
941 | * Keep root port from suspending as long as the | ||
942 | * NVM upgrade process is running. | ||
943 | */ | ||
944 | nvm_authenticate_start(sw); | ||
916 | ret = nvm_authenticate_host(sw); | 945 | ret = nvm_authenticate_host(sw); |
917 | else | 946 | if (ret) |
947 | nvm_authenticate_complete(sw); | ||
948 | } else { | ||
918 | ret = nvm_authenticate_device(sw); | 949 | ret = nvm_authenticate_device(sw); |
950 | } | ||
919 | pm_runtime_mark_last_busy(&sw->dev); | 951 | pm_runtime_mark_last_busy(&sw->dev); |
920 | pm_runtime_put_autosuspend(&sw->dev); | 952 | pm_runtime_put_autosuspend(&sw->dev); |
921 | } | 953 | } |
@@ -1334,6 +1366,10 @@ static int tb_switch_add_dma_port(struct tb_switch *sw) | |||
1334 | if (ret <= 0) | 1366 | if (ret <= 0) |
1335 | return ret; | 1367 | return ret; |
1336 | 1368 | ||
1369 | /* Now we can allow root port to suspend again */ | ||
1370 | if (!tb_route(sw)) | ||
1371 | nvm_authenticate_complete(sw); | ||
1372 | |||
1337 | if (status) { | 1373 | if (status) { |
1338 | tb_sw_info(sw, "switch flash authentication failed\n"); | 1374 | tb_sw_info(sw, "switch flash authentication failed\n"); |
1339 | tb_switch_set_uuid(sw); | 1375 | tb_switch_set_uuid(sw); |