aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ipc/mqueue.c10
-rw-r--r--ipc/msgutil.c6
2 files changed, 14 insertions, 2 deletions
diff --git a/ipc/mqueue.c b/ipc/mqueue.c
index ba44164ea1f9..6f93bda7e408 100644
--- a/ipc/mqueue.c
+++ b/ipc/mqueue.c
@@ -430,7 +430,8 @@ static void mqueue_evict_inode(struct inode *inode)
430 struct user_struct *user; 430 struct user_struct *user;
431 unsigned long mq_bytes, mq_treesize; 431 unsigned long mq_bytes, mq_treesize;
432 struct ipc_namespace *ipc_ns; 432 struct ipc_namespace *ipc_ns;
433 struct msg_msg *msg; 433 struct msg_msg *msg, *nmsg;
434 LIST_HEAD(tmp_msg);
434 435
435 clear_inode(inode); 436 clear_inode(inode);
436 437
@@ -441,10 +442,15 @@ static void mqueue_evict_inode(struct inode *inode)
441 info = MQUEUE_I(inode); 442 info = MQUEUE_I(inode);
442 spin_lock(&info->lock); 443 spin_lock(&info->lock);
443 while ((msg = msg_get(info)) != NULL) 444 while ((msg = msg_get(info)) != NULL)
444 free_msg(msg); 445 list_add_tail(&msg->m_list, &tmp_msg);
445 kfree(info->node_cache); 446 kfree(info->node_cache);
446 spin_unlock(&info->lock); 447 spin_unlock(&info->lock);
447 448
449 list_for_each_entry_safe(msg, nmsg, &tmp_msg, m_list) {
450 list_del(&msg->m_list);
451 free_msg(msg);
452 }
453
448 /* Total amount of bytes accounted for the mqueue */ 454 /* Total amount of bytes accounted for the mqueue */
449 mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) + 455 mq_treesize = info->attr.mq_maxmsg * sizeof(struct msg_msg) +
450 min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) * 456 min_t(unsigned int, info->attr.mq_maxmsg, MQ_PRIO_MAX) *
diff --git a/ipc/msgutil.c b/ipc/msgutil.c
index 84598025a6ad..e65593742e2b 100644
--- a/ipc/msgutil.c
+++ b/ipc/msgutil.c
@@ -18,6 +18,7 @@
18#include <linux/utsname.h> 18#include <linux/utsname.h>
19#include <linux/proc_ns.h> 19#include <linux/proc_ns.h>
20#include <linux/uaccess.h> 20#include <linux/uaccess.h>
21#include <linux/sched.h>
21 22
22#include "util.h" 23#include "util.h"
23 24
@@ -64,6 +65,9 @@ static struct msg_msg *alloc_msg(size_t len)
64 pseg = &msg->next; 65 pseg = &msg->next;
65 while (len > 0) { 66 while (len > 0) {
66 struct msg_msgseg *seg; 67 struct msg_msgseg *seg;
68
69 cond_resched();
70
67 alen = min(len, DATALEN_SEG); 71 alen = min(len, DATALEN_SEG);
68 seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT); 72 seg = kmalloc(sizeof(*seg) + alen, GFP_KERNEL_ACCOUNT);
69 if (seg == NULL) 73 if (seg == NULL)
@@ -176,6 +180,8 @@ void free_msg(struct msg_msg *msg)
176 kfree(msg); 180 kfree(msg);
177 while (seg != NULL) { 181 while (seg != NULL) {
178 struct msg_msgseg *tmp = seg->next; 182 struct msg_msgseg *tmp = seg->next;
183
184 cond_resched();
179 kfree(seg); 185 kfree(seg);
180 seg = tmp; 186 seg = tmp;
181 } 187 }