2011-05-19 01:04:56

by KOSAKI Motohiro

[permalink] [raw]
Subject: [PATCH] infiniband, ipath: convert old cpumask api into new one

Adapt new api. we plan to remove old one later. Almost change are
trivial. but there is one real fix. following code is unsafe.

int ncpus = num_online_cpus()
for (i = 0; i < ncpus; i++) {
..
}

because 1) we don't guarantee last bit of online cpus is equal
to num_online_cpus(). some arch assign sparse cpu number.
2) cpu hotplugging may change cpu_online_mask at same time.
we need to pin it by get_online_cpus().

Cc: Roland Dreier <[email protected]>
Cc: Sean Hefty <[email protected]>
Cc: Hal Rosenstock <[email protected]>
Cc: [email protected]
Cc: Ralph Campbell <[email protected]>
Signed-off-by: KOSAKI Motohiro <[email protected]>
---
drivers/infiniband/hw/ipath/ipath_file_ops.c | 11 +++++++----
1 files changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/infiniband/hw/ipath/ipath_file_ops.c b/drivers/infiniband/hw/ipath/ipath_file_ops.c
index bdf4422..aab5d89 100644
--- a/drivers/infiniband/hw/ipath/ipath_file_ops.c
+++ b/drivers/infiniband/hw/ipath/ipath_file_ops.c
@@ -40,6 +40,7 @@
#include <linux/highmem.h>
#include <linux/io.h>
#include <linux/jiffies.h>
+#include <linux/cpu.h>
#include <asm/pgtable.h>

#include "ipath_kernel.h"
@@ -1684,17 +1685,19 @@ static int find_best_unit(struct file *fp,
* information. There may be some issues with dual core numbering
* as well. This needs more work prior to release.
*/
- if (!cpumask_empty(&current->cpus_allowed) &&
- !cpumask_full(&current->cpus_allowed)) {
+ if (!cpumask_empty(tsk_cpus_allowed(current)) &&
+ !cpumask_full(tsk_cpus_allowed(current))) {
int ncpus = num_online_cpus(), curcpu = -1, nset = 0;
- for (i = 0; i < ncpus; i++)
- if (cpumask_test_cpu(i, &current->cpus_allowed)) {
+ get_online_cpus();
+ for_each_online_cpu(i)
+ if (cpumask_test_cpu(i, tsk_cpus_allowed(current))) {
ipath_cdbg(PROC, "%s[%u] affinity set for "
"cpu %d/%d\n", current->comm,
current->pid, i, ncpus);
curcpu = i;
nset++;
}
+ put_online_cpus();
if (curcpu != -1 && nset != ncpus) {
if (npresent) {
prefunit = curcpu / (ncpus / npresent);
--
1.7.3.1


2011-05-31 21:10:52

by Mike Marciniszyn

[permalink] [raw]
Subject: RE: [PATCH] infiniband, ipath: convert old cpumask api into new one

> Subject: [PATCH] infiniband, ipath: convert old cpumask api into new
> one
>
> Adapt new api. we plan to remove old one later. Almost change are
> trivial. but there is one real fix. following code is unsafe.
>
> int ncpus = num_online_cpus()
> for (i = 0; i < ncpus; i++) {
> ..
> }
>

Thanks for the patch!

Acked-by: Mike Marciniszyn <[email protected]>

This message and any attached documents contain information from QLogic Corporation or its wholly-owned subsidiaries that may be confidential. If you are not the intended recipient, you may not read, copy, distribute, or use this information. If you have received this transmission in error, please notify the sender immediately by reply e-mail and then delete this message.