hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/drivers/android/binder.c
....@@ -1399,7 +1399,8 @@
13991399 */
14001400 static void binder_free_ref(struct binder_ref *ref)
14011401 {
1402
- trace_android_vh_binder_del_ref(ref->proc ? ref->proc->tsk : 0, ref->data.desc);
1402
+ trace_android_vh_binder_del_ref(ref->proc ? ref->proc->tsk : NULL,
1403
+ ref->data.desc);
14031404 if (ref->node)
14041405 binder_free_node(ref->node);
14051406 kfree(ref->death);
....@@ -2033,24 +2034,23 @@
20332034 static void binder_transaction_buffer_release(struct binder_proc *proc,
20342035 struct binder_thread *thread,
20352036 struct binder_buffer *buffer,
2036
- binder_size_t failed_at,
2037
+ binder_size_t off_end_offset,
20372038 bool is_failure)
20382039 {
20392040 int debug_id = buffer->debug_id;
2040
- binder_size_t off_start_offset, buffer_offset, off_end_offset;
2041
+ binder_size_t off_start_offset, buffer_offset;
20412042
20422043 binder_debug(BINDER_DEBUG_TRANSACTION,
20432044 "%d buffer release %d, size %zd-%zd, failed at %llx\n",
20442045 proc->pid, buffer->debug_id,
20452046 buffer->data_size, buffer->offsets_size,
2046
- (unsigned long long)failed_at);
2047
+ (unsigned long long)off_end_offset);
20472048
20482049 if (buffer->target_node)
20492050 binder_dec_node(buffer->target_node, 1, 0);
20502051
20512052 off_start_offset = ALIGN(buffer->data_size, sizeof(void *));
2052
- off_end_offset = is_failure && failed_at ? failed_at :
2053
- off_start_offset + buffer->offsets_size;
2053
+
20542054 for (buffer_offset = off_start_offset; buffer_offset < off_end_offset;
20552055 buffer_offset += sizeof(binder_size_t)) {
20562056 struct binder_object_header *hdr;
....@@ -2208,6 +2208,21 @@
22082208 break;
22092209 }
22102210 }
2211
+}
2212
+
2213
+/* Clean up all the objects in the buffer */
2214
+static inline void binder_release_entire_buffer(struct binder_proc *proc,
2215
+ struct binder_thread *thread,
2216
+ struct binder_buffer *buffer,
2217
+ bool is_failure)
2218
+{
2219
+ binder_size_t off_end_offset;
2220
+
2221
+ off_end_offset = ALIGN(buffer->data_size, sizeof(void *));
2222
+ off_end_offset += buffer->offsets_size;
2223
+
2224
+ binder_transaction_buffer_release(proc, thread, buffer,
2225
+ off_end_offset, is_failure);
22112226 }
22122227
22132228 static int binder_translate_binder(struct flat_binder_object *fp,
....@@ -2871,7 +2886,8 @@
28712886 thread = binder_select_thread_ilocked(proc);
28722887
28732888 trace_android_vh_binder_proc_transaction(current, proc->tsk,
2874
- thread ? thread->task : 0, node->debug_id, t->code, pending_async);
2889
+ thread ? thread->task : NULL, node->debug_id, t->code,
2890
+ pending_async);
28752891
28762892 if (thread) {
28772893 binder_transaction_priority(thread->task, t, node_prio,
....@@ -2914,7 +2930,7 @@
29142930 t_outdated->buffer = NULL;
29152931 buffer->transaction = NULL;
29162932 trace_binder_transaction_update_buffer_release(buffer);
2917
- binder_transaction_buffer_release(proc, NULL, buffer, 0, 0);
2933
+ binder_release_entire_buffer(proc, NULL, buffer, false);
29182934 binder_alloc_free_buf(&proc->alloc, buffer);
29192935 kfree(t_outdated);
29202936 binder_stats_deleted(BINDER_STAT_TRANSACTION);
....@@ -3828,7 +3844,7 @@
38283844 binder_node_inner_unlock(buf_node);
38293845 }
38303846 trace_binder_transaction_buffer_release(buffer);
3831
- binder_transaction_buffer_release(proc, thread, buffer, 0, is_failure);
3847
+ binder_release_entire_buffer(proc, thread, buffer, is_failure);
38323848 binder_alloc_free_buf(&proc->alloc, buffer);
38333849 }
38343850
....@@ -6663,6 +6679,7 @@
66636679
66646680 err_alloc_device_names_failed:
66656681 debugfs_remove_recursive(binder_debugfs_dir_entry_root);
6682
+ binder_alloc_shrinker_exit();
66666683
66676684 return ret;
66686685 }