projects
/
platform
/
kernel
/
linux-starfive.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
locking/ww_mutex/test: Fix potential workqueue corruption
[platform/kernel/linux-starfive.git]
/
kernel
/
locking
/
test-ww_mutex.c
diff --git
a/kernel/locking/test-ww_mutex.c
b/kernel/locking/test-ww_mutex.c
index
93cca6e
..
7c5a8f0
100644
(file)
--- a/
kernel/locking/test-ww_mutex.c
+++ b/
kernel/locking/test-ww_mutex.c
@@
-466,7
+466,6
@@
retry:
} while (!time_after(jiffies, stress->timeout));
kfree(order);
} while (!time_after(jiffies, stress->timeout));
kfree(order);
- kfree(stress);
}
struct reorder_lock {
}
struct reorder_lock {
@@
-531,7
+530,6
@@
out:
list_for_each_entry_safe(ll, ln, &locks, link)
kfree(ll);
kfree(order);
list_for_each_entry_safe(ll, ln, &locks, link)
kfree(ll);
kfree(order);
- kfree(stress);
}
static void stress_one_work(struct work_struct *work)
}
static void stress_one_work(struct work_struct *work)
@@
-552,8
+550,6
@@
static void stress_one_work(struct work_struct *work)
break;
}
} while (!time_after(jiffies, stress->timeout));
break;
}
} while (!time_after(jiffies, stress->timeout));
-
- kfree(stress);
}
#define STRESS_INORDER BIT(0)
}
#define STRESS_INORDER BIT(0)
@@
-564,15
+560,24
@@
static void stress_one_work(struct work_struct *work)
static int stress(int nlocks, int nthreads, unsigned int flags)
{
struct ww_mutex *locks;
static int stress(int nlocks, int nthreads, unsigned int flags)
{
struct ww_mutex *locks;
- int n;
+ struct stress *stress_array;
+ int n, count;
locks = kmalloc_array(nlocks, sizeof(*locks), GFP_KERNEL);
if (!locks)
return -ENOMEM;
locks = kmalloc_array(nlocks, sizeof(*locks), GFP_KERNEL);
if (!locks)
return -ENOMEM;
+ stress_array = kmalloc_array(nthreads, sizeof(*stress_array),
+ GFP_KERNEL);
+ if (!stress_array) {
+ kfree(locks);
+ return -ENOMEM;
+ }
+
for (n = 0; n < nlocks; n++)
ww_mutex_init(&locks[n], &ww_class);
for (n = 0; n < nlocks; n++)
ww_mutex_init(&locks[n], &ww_class);
+ count = 0;
for (n = 0; nthreads; n++) {
struct stress *stress;
void (*fn)(struct work_struct *work);
for (n = 0; nthreads; n++) {
struct stress *stress;
void (*fn)(struct work_struct *work);
@@
-596,9
+601,7
@@
static int stress(int nlocks, int nthreads, unsigned int flags)
if (!fn)
continue;
if (!fn)
continue;
- stress = kmalloc(sizeof(*stress), GFP_KERNEL);
- if (!stress)
- break;
+ stress = &stress_array[count++];
INIT_WORK(&stress->work, fn);
stress->locks = locks;
INIT_WORK(&stress->work, fn);
stress->locks = locks;
@@
-613,6
+616,7
@@
static int stress(int nlocks, int nthreads, unsigned int flags)
for (n = 0; n < nlocks; n++)
ww_mutex_destroy(&locks[n]);
for (n = 0; n < nlocks; n++)
ww_mutex_destroy(&locks[n]);
+ kfree(stress_array);
kfree(locks);
return 0;
kfree(locks);
return 0;