Commit d94a041519f3ab1ac023bf917619cd8c4a7d3c01
Committed by
Linus Torvalds
1 parent
7d94dddd43
Exists in
master
and in
4 other branches
[PATCH] taskstats: free skb, avoid returns in send_cpu_listeners
Add a missing freeing of skb in the case there are no listeners at all. Also remove the returning of error values by the function as it is unused by the sole caller. Signed-off-by: Shailabh Nagar <nagar@watson.ibm.com> Signed-off-by: Chandra Seetharaman <sekharan@us.ibm.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Showing 1 changed file with 11 additions and 13 deletions Side-by-side Diff
kernel/taskstats.c
... | ... | @@ -121,46 +121,45 @@ |
121 | 121 | /* |
122 | 122 | * Send taskstats data in @skb to listeners registered for @cpu's exit data |
123 | 123 | */ |
124 | -static int send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) | |
124 | +static void send_cpu_listeners(struct sk_buff *skb, unsigned int cpu) | |
125 | 125 | { |
126 | 126 | struct genlmsghdr *genlhdr = nlmsg_data((struct nlmsghdr *)skb->data); |
127 | 127 | struct listener_list *listeners; |
128 | 128 | struct listener *s, *tmp; |
129 | 129 | struct sk_buff *skb_next, *skb_cur = skb; |
130 | 130 | void *reply = genlmsg_data(genlhdr); |
131 | - int rc, ret, delcount = 0; | |
131 | + int rc, delcount = 0; | |
132 | 132 | |
133 | 133 | rc = genlmsg_end(skb, reply); |
134 | 134 | if (rc < 0) { |
135 | 135 | nlmsg_free(skb); |
136 | - return rc; | |
136 | + return; | |
137 | 137 | } |
138 | 138 | |
139 | 139 | rc = 0; |
140 | 140 | listeners = &per_cpu(listener_array, cpu); |
141 | 141 | down_read(&listeners->sem); |
142 | - list_for_each_entry_safe(s, tmp, &listeners->list, list) { | |
142 | + list_for_each_entry(s, &listeners->list, list) { | |
143 | 143 | skb_next = NULL; |
144 | 144 | if (!list_is_last(&s->list, &listeners->list)) { |
145 | 145 | skb_next = skb_clone(skb_cur, GFP_KERNEL); |
146 | - if (!skb_next) { | |
147 | - nlmsg_free(skb_cur); | |
148 | - rc = -ENOMEM; | |
146 | + if (!skb_next) | |
149 | 147 | break; |
150 | - } | |
151 | 148 | } |
152 | - ret = genlmsg_unicast(skb_cur, s->pid); | |
153 | - if (ret == -ECONNREFUSED) { | |
149 | + rc = genlmsg_unicast(skb_cur, s->pid); | |
150 | + if (rc == -ECONNREFUSED) { | |
154 | 151 | s->valid = 0; |
155 | 152 | delcount++; |
156 | - rc = ret; | |
157 | 153 | } |
158 | 154 | skb_cur = skb_next; |
159 | 155 | } |
160 | 156 | up_read(&listeners->sem); |
161 | 157 | |
158 | + if (skb_cur) | |
159 | + nlmsg_free(skb_cur); | |
160 | + | |
162 | 161 | if (!delcount) |
163 | - return rc; | |
162 | + return; | |
164 | 163 | |
165 | 164 | /* Delete invalidated entries */ |
166 | 165 | down_write(&listeners->sem); |
... | ... | @@ -171,7 +170,6 @@ |
171 | 170 | } |
172 | 171 | } |
173 | 172 | up_write(&listeners->sem); |
174 | - return rc; | |
175 | 173 | } |
176 | 174 | |
177 | 175 | static int fill_pid(pid_t pid, struct task_struct *pidtsk, |