mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-14 08:36:12 -04:00
Merge branch 'android11-5.4' into 'android11-5.4-lts'
Sync up with the latest changes in 'android11-5.4' Signed-off-by: Greg Kroah-Hartman <gregkh@google.com> Change-Id: Ia6cb40b5c15dd009b4cd8d3a9db48e8b9af5b9d0
This commit is contained in:
commit
215e998966
13 changed files with 1868 additions and 912 deletions
File diff suppressed because it is too large
Load diff
|
|
@ -1289,6 +1289,8 @@
|
|||
kvmalloc_node
|
||||
kzfree
|
||||
led_blink_set
|
||||
led_classdev_flash_register_ext
|
||||
led_classdev_flash_unregister
|
||||
led_classdev_register_ext
|
||||
led_classdev_unregister
|
||||
led_get_default_pattern
|
||||
|
|
|
|||
3
android/abi_gki_aarch64_workarounds
Normal file
3
android/abi_gki_aarch64_workarounds
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[abi_whitelist]
|
||||
# b/167230325
|
||||
ehci_handshake
|
||||
|
|
@ -268,6 +268,19 @@ static void notrace __restore_processor_state(struct saved_context *ctxt)
|
|||
/* Needed by apm.c */
|
||||
void notrace restore_processor_state(void)
|
||||
{
|
||||
#ifdef __clang__
|
||||
// The following code snippet is copied from __restore_processor_state.
|
||||
// Its purpose is to prepare GS segment before the function is called.
|
||||
// Since the function is compiled with SCS on, it will use GS at its
|
||||
// entry.
|
||||
// TODO: Hack to be removed later when compiler bug is fixed.
|
||||
#ifdef CONFIG_X86_64
|
||||
wrmsrl(MSR_GS_BASE, saved_context.kernelmode_gs_base);
|
||||
#else
|
||||
loadsegment(fs, __KERNEL_PERCPU);
|
||||
loadsegment(gs, __KERNEL_STACK_CANARY);
|
||||
#endif
|
||||
#endif
|
||||
__restore_processor_state(&saved_context);
|
||||
}
|
||||
#ifdef CONFIG_X86_32
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ android/abi_gki_aarch64_qcom
|
|||
android/abi_gki_aarch64_sunxi
|
||||
android/abi_gki_aarch64_unisoc
|
||||
android/abi_gki_aarch64_vivo
|
||||
android/abi_gki_aarch64_workarounds
|
||||
"
|
||||
TRIM_NONLISTED_KMI=1
|
||||
KMI_SYMBOL_LIST_ADD_ONLY=1
|
||||
|
|
|
|||
|
|
@ -3306,7 +3306,7 @@ static void binder_transaction(struct binder_proc *proc,
|
|||
|
||||
t->buffer = binder_alloc_new_buf(&target_proc->alloc, tr->data_size,
|
||||
tr->offsets_size, extra_buffers_size,
|
||||
!reply && (t->flags & TF_ONE_WAY));
|
||||
!reply && (t->flags & TF_ONE_WAY), current->tgid);
|
||||
if (IS_ERR(t->buffer)) {
|
||||
/*
|
||||
* -ESRCH indicates VMA cleared. The target is dying.
|
||||
|
|
|
|||
|
|
@ -339,12 +339,50 @@ static inline struct vm_area_struct *binder_alloc_get_vma(
|
|||
return vma;
|
||||
}
|
||||
|
||||
static void debug_low_async_space_locked(struct binder_alloc *alloc, int pid)
|
||||
{
|
||||
/*
|
||||
* Find the amount and size of buffers allocated by the current caller;
|
||||
* The idea is that once we cross the threshold, whoever is responsible
|
||||
* for the low async space is likely to try to send another async txn,
|
||||
* and at some point we'll catch them in the act. This is more efficient
|
||||
* than keeping a map per pid.
|
||||
*/
|
||||
struct rb_node *n = alloc->free_buffers.rb_node;
|
||||
struct binder_buffer *buffer;
|
||||
size_t total_alloc_size = 0;
|
||||
size_t num_buffers = 0;
|
||||
|
||||
for (n = rb_first(&alloc->allocated_buffers); n != NULL;
|
||||
n = rb_next(n)) {
|
||||
buffer = rb_entry(n, struct binder_buffer, rb_node);
|
||||
if (buffer->pid != pid)
|
||||
continue;
|
||||
if (!buffer->async_transaction)
|
||||
continue;
|
||||
total_alloc_size += binder_alloc_buffer_size(alloc, buffer)
|
||||
+ sizeof(struct binder_buffer);
|
||||
num_buffers++;
|
||||
}
|
||||
|
||||
/*
|
||||
* Warn if this pid has more than 50 transactions, or more than 50% of
|
||||
* async space (which is 25% of total buffer size).
|
||||
*/
|
||||
if (num_buffers > 50 || total_alloc_size > alloc->buffer_size / 4) {
|
||||
binder_alloc_debug(BINDER_DEBUG_USER_ERROR,
|
||||
"%d: pid %d spamming oneway? %zd buffers allocated for a total size of %zd\n",
|
||||
alloc->pid, pid, num_buffers, total_alloc_size);
|
||||
}
|
||||
}
|
||||
|
||||
static struct binder_buffer *binder_alloc_new_buf_locked(
|
||||
struct binder_alloc *alloc,
|
||||
size_t data_size,
|
||||
size_t offsets_size,
|
||||
size_t extra_buffers_size,
|
||||
int is_async)
|
||||
int is_async,
|
||||
int pid)
|
||||
{
|
||||
struct rb_node *n = alloc->free_buffers.rb_node;
|
||||
struct binder_buffer *buffer;
|
||||
|
|
@ -487,11 +525,20 @@ static struct binder_buffer *binder_alloc_new_buf_locked(
|
|||
buffer->offsets_size = offsets_size;
|
||||
buffer->async_transaction = is_async;
|
||||
buffer->extra_buffers_size = extra_buffers_size;
|
||||
buffer->pid = pid;
|
||||
if (is_async) {
|
||||
alloc->free_async_space -= size + sizeof(struct binder_buffer);
|
||||
binder_alloc_debug(BINDER_DEBUG_BUFFER_ALLOC_ASYNC,
|
||||
"%d: binder_alloc_buf size %zd async free %zd\n",
|
||||
alloc->pid, size, alloc->free_async_space);
|
||||
if (alloc->free_async_space < alloc->buffer_size / 10) {
|
||||
/*
|
||||
* Start detecting spammers once we have less than 20%
|
||||
* of async space left (which is less than 10% of total
|
||||
* buffer size).
|
||||
*/
|
||||
debug_low_async_space_locked(alloc, pid);
|
||||
}
|
||||
}
|
||||
return buffer;
|
||||
|
||||
|
|
@ -509,6 +556,7 @@ err_alloc_buf_struct_failed:
|
|||
* @offsets_size: user specified buffer offset
|
||||
* @extra_buffers_size: size of extra space for meta-data (eg, security context)
|
||||
* @is_async: buffer for async transaction
|
||||
* @pid: pid to attribute allocation to (used for debugging)
|
||||
*
|
||||
* Allocate a new buffer given the requested sizes. Returns
|
||||
* the kernel version of the buffer pointer. The size allocated
|
||||
|
|
@ -521,13 +569,14 @@ struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc,
|
|||
size_t data_size,
|
||||
size_t offsets_size,
|
||||
size_t extra_buffers_size,
|
||||
int is_async)
|
||||
int is_async,
|
||||
int pid)
|
||||
{
|
||||
struct binder_buffer *buffer;
|
||||
|
||||
mutex_lock(&alloc->mutex);
|
||||
buffer = binder_alloc_new_buf_locked(alloc, data_size, offsets_size,
|
||||
extra_buffers_size, is_async);
|
||||
extra_buffers_size, is_async, pid);
|
||||
mutex_unlock(&alloc->mutex);
|
||||
return buffer;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -32,6 +32,7 @@ struct binder_transaction;
|
|||
* @offsets_size: size of array of offsets
|
||||
* @extra_buffers_size: size of space for other objects (like sg lists)
|
||||
* @user_data: user pointer to base of buffer space
|
||||
* @pid: pid to attribute the buffer to (caller)
|
||||
*
|
||||
* Bookkeeping structure for binder transaction buffers
|
||||
*/
|
||||
|
|
@ -51,6 +52,7 @@ struct binder_buffer {
|
|||
size_t offsets_size;
|
||||
size_t extra_buffers_size;
|
||||
void __user *user_data;
|
||||
int pid;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
@ -117,7 +119,8 @@ extern struct binder_buffer *binder_alloc_new_buf(struct binder_alloc *alloc,
|
|||
size_t data_size,
|
||||
size_t offsets_size,
|
||||
size_t extra_buffers_size,
|
||||
int is_async);
|
||||
int is_async,
|
||||
int pid);
|
||||
extern void binder_alloc_init(struct binder_alloc *alloc);
|
||||
extern int binder_alloc_shrinker_init(void);
|
||||
extern void binder_alloc_vma_close(struct binder_alloc *alloc);
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ static void binder_selftest_alloc_buf(struct binder_alloc *alloc,
|
|||
int i;
|
||||
|
||||
for (i = 0; i < BUFFER_NUM; i++) {
|
||||
buffers[i] = binder_alloc_new_buf(alloc, sizes[i], 0, 0, 0);
|
||||
buffers[i] = binder_alloc_new_buf(alloc, sizes[i], 0, 0, 0, 0);
|
||||
if (IS_ERR(buffers[i]) ||
|
||||
!check_buffer_pages_allocated(alloc, buffers[i],
|
||||
sizes[i])) {
|
||||
|
|
|
|||
|
|
@ -55,4 +55,3 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_rwsem_list_add);
|
|||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_alter_futex_plist_add);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_is_fpsimd_save);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipi_stop);
|
||||
EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_input_handle_event);
|
||||
|
|
|
|||
|
|
@ -26,10 +26,6 @@
|
|||
#include "input-compat.h"
|
||||
#include "input-poller.h"
|
||||
|
||||
#ifndef __GENKSYMS__
|
||||
#include <trace/hooks/debug.h>
|
||||
#endif
|
||||
|
||||
MODULE_AUTHOR("Vojtech Pavlik <vojtech@suse.cz>");
|
||||
MODULE_DESCRIPTION("Input core");
|
||||
MODULE_LICENSE("GPL");
|
||||
|
|
@ -442,7 +438,6 @@ void input_event(struct input_dev *dev,
|
|||
if (is_event_supported(type, dev->evbit, EV_MAX)) {
|
||||
|
||||
spin_lock_irqsave(&dev->event_lock, flags);
|
||||
trace_android_vh_input_handle_event(dev, type, code, value);
|
||||
input_handle_event(dev, type, code, value);
|
||||
spin_unlock_irqrestore(&dev->event_lock, flags);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,20 +11,12 @@
|
|||
#include <trace/hooks/vendor_hooks.h>
|
||||
|
||||
#if defined(CONFIG_TRACEPOINTS) && defined(CONFIG_ANDROID_VENDOR_HOOKS)
|
||||
|
||||
struct pt_regs;
|
||||
DECLARE_HOOK(android_vh_ipi_stop,
|
||||
TP_PROTO(struct pt_regs *regs),
|
||||
TP_ARGS(regs))
|
||||
|
||||
struct input_dev;
|
||||
DECLARE_HOOK(android_vh_input_handle_event,
|
||||
TP_PROTO(struct input_dev *dev, unsigned int type,
|
||||
unsigned int code, int value),
|
||||
TP_ARGS(dev, type, code, value))
|
||||
#else
|
||||
#define trace_android_vh_ipi_stop(regs)
|
||||
#define trace_android_vh_input_handle_event(dev, type, code, value)
|
||||
#endif
|
||||
|
||||
#endif /* _TRACE_HOOK_DEBUG_H */
|
||||
|
|
|
|||
|
|
@ -5609,12 +5609,13 @@ static void napi_skb_free_stolen_head(struct sk_buff *skb)
|
|||
kmem_cache_free(skbuff_head_cache, skb);
|
||||
}
|
||||
|
||||
static gro_result_t napi_skb_finish(gro_result_t ret, struct sk_buff *skb)
|
||||
static gro_result_t napi_skb_finish(struct napi_struct *napi,
|
||||
struct sk_buff *skb,
|
||||
gro_result_t ret)
|
||||
{
|
||||
switch (ret) {
|
||||
case GRO_NORMAL:
|
||||
if (netif_receive_skb_internal(skb))
|
||||
ret = GRO_DROP;
|
||||
gro_normal_one(napi, skb);
|
||||
break;
|
||||
|
||||
case GRO_DROP:
|
||||
|
|
@ -5646,7 +5647,7 @@ gro_result_t napi_gro_receive(struct napi_struct *napi, struct sk_buff *skb)
|
|||
|
||||
skb_gro_reset_offset(skb);
|
||||
|
||||
ret = napi_skb_finish(dev_gro_receive(napi, skb), skb);
|
||||
ret = napi_skb_finish(napi, skb, dev_gro_receive(napi, skb));
|
||||
trace_napi_gro_receive_exit(ret);
|
||||
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in a new issue