Commit d94a041519f3ab1ac023bf917619cd8c4a7d3c01

Authored by Shailabh Nagar
Committed by Linus Torvalds
1 parent 7d94dddd43

[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

... ... @@ -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,