diff options
| -rw-r--r-- | crypto/pcrypt.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c index 77425530ee11..de3078215fe6 100644 --- a/crypto/pcrypt.c +++ b/crypto/pcrypt.c | |||
| @@ -26,6 +26,7 @@ | |||
| 26 | #include <linux/slab.h> | 26 | #include <linux/slab.h> |
| 27 | #include <linux/notifier.h> | 27 | #include <linux/notifier.h> |
| 28 | #include <linux/kobject.h> | 28 | #include <linux/kobject.h> |
| 29 | #include <linux/cpu.h> | ||
| 29 | #include <crypto/pcrypt.h> | 30 | #include <crypto/pcrypt.h> |
| 30 | 31 | ||
| 31 | struct padata_pcrypt { | 32 | struct padata_pcrypt { |
| @@ -409,6 +410,7 @@ static int pcrypt_cpumask_change_notify(struct notifier_block *self, | |||
| 409 | { | 410 | { |
| 410 | struct padata_pcrypt *pcrypt; | 411 | struct padata_pcrypt *pcrypt; |
| 411 | struct pcrypt_cpumask *new_mask, *old_mask; | 412 | struct pcrypt_cpumask *new_mask, *old_mask; |
| 413 | struct padata_cpumask *cpumask = (struct padata_cpumask *)data; | ||
| 412 | 414 | ||
| 413 | if (!(val & PADATA_CPU_SERIAL)) | 415 | if (!(val & PADATA_CPU_SERIAL)) |
| 414 | return 0; | 416 | return 0; |
| @@ -424,7 +426,7 @@ static int pcrypt_cpumask_change_notify(struct notifier_block *self, | |||
| 424 | 426 | ||
| 425 | old_mask = pcrypt->cb_cpumask; | 427 | old_mask = pcrypt->cb_cpumask; |
| 426 | 428 | ||
| 427 | padata_get_cpumask(pcrypt->pinst, PADATA_CPU_SERIAL, new_mask->mask); | 429 | cpumask_copy(new_mask->mask, cpumask->cbcpu); |
| 428 | rcu_assign_pointer(pcrypt->cb_cpumask, new_mask); | 430 | rcu_assign_pointer(pcrypt->cb_cpumask, new_mask); |
| 429 | synchronize_rcu_bh(); | 431 | synchronize_rcu_bh(); |
| 430 | 432 | ||
| @@ -451,6 +453,8 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt, | |||
| 451 | int ret = -ENOMEM; | 453 | int ret = -ENOMEM; |
| 452 | struct pcrypt_cpumask *mask; | 454 | struct pcrypt_cpumask *mask; |
| 453 | 455 | ||
| 456 | get_online_cpus(); | ||
| 457 | |||
| 454 | pcrypt->wq = create_workqueue(name); | 458 | pcrypt->wq = create_workqueue(name); |
| 455 | if (!pcrypt->wq) | 459 | if (!pcrypt->wq) |
| 456 | goto err; | 460 | goto err; |
| @@ -467,7 +471,7 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt, | |||
| 467 | goto err_free_padata; | 471 | goto err_free_padata; |
| 468 | } | 472 | } |
| 469 | 473 | ||
| 470 | padata_get_cpumask(pcrypt->pinst, PADATA_CPU_SERIAL, mask->mask); | 474 | cpumask_and(mask->mask, cpu_possible_mask, cpu_active_mask); |
| 471 | rcu_assign_pointer(pcrypt->cb_cpumask, mask); | 475 | rcu_assign_pointer(pcrypt->cb_cpumask, mask); |
| 472 | 476 | ||
| 473 | pcrypt->nblock.notifier_call = pcrypt_cpumask_change_notify; | 477 | pcrypt->nblock.notifier_call = pcrypt_cpumask_change_notify; |
| @@ -479,7 +483,10 @@ static int pcrypt_init_padata(struct padata_pcrypt *pcrypt, | |||
| 479 | if (ret) | 483 | if (ret) |
| 480 | goto err_unregister_notifier; | 484 | goto err_unregister_notifier; |
| 481 | 485 | ||
| 486 | put_online_cpus(); | ||
| 487 | |||
| 482 | return ret; | 488 | return ret; |
| 489 | |||
| 483 | err_unregister_notifier: | 490 | err_unregister_notifier: |
| 484 | padata_unregister_cpumask_notifier(pcrypt->pinst, &pcrypt->nblock); | 491 | padata_unregister_cpumask_notifier(pcrypt->pinst, &pcrypt->nblock); |
| 485 | err_free_cpumask: | 492 | err_free_cpumask: |
| @@ -490,6 +497,8 @@ err_free_padata: | |||
| 490 | err_destroy_workqueue: | 497 | err_destroy_workqueue: |
| 491 | destroy_workqueue(pcrypt->wq); | 498 | destroy_workqueue(pcrypt->wq); |
| 492 | err: | 499 | err: |
| 500 | put_online_cpus(); | ||
| 501 | |||
| 493 | return ret; | 502 | return ret; |
| 494 | } | 503 | } |
| 495 | 504 | ||
