Merge branch 'linux-linaro-lsk-v4.4' into linux-linaro-lsk-v4.4-android
authorAlex Shi <alex.shi@linaro.org>
Fri, 26 May 2017 04:03:29 +0000 (12:03 +0800)
committerAlex Shi <alex.shi@linaro.org>
Fri, 26 May 2017 04:03:29 +0000 (12:03 +0800)
1  2 
Makefile
arch/arm64/include/asm/uaccess.h
drivers/md/Kconfig
fs/ext4/crypto_fname.c
fs/ext4/ext4.h
fs/ext4/readpage.c
fs/f2fs/inline.c
kernel/fork.c
kernel/sched/fair.c
kernel/sched/sched.h

diff --combined Makefile
index cee5c09124ba2656ad6d62208a063c789c3e991a,a5ecb29c6ed3807d37697b85d156e5eeb83dea9e..28e7f8bda80bb14a438bc26f2462bd5176b45dc4
+++ b/Makefile
@@@ -1,6 -1,6 +1,6 @@@
  VERSION = 4
  PATCHLEVEL = 4
- SUBLEVEL = 69
+ SUBLEVEL = 70
  EXTRAVERSION =
  NAME = Blurry Fish Butt
  
@@@ -146,7 -146,7 +146,7 @@@ PHONY += $(MAKECMDGOALS) sub-mak
  $(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
        @:
  
 -sub-make: FORCE
 +sub-make:
        $(Q)$(MAKE) -C $(KBUILD_OUTPUT) KBUILD_SRC=$(CURDIR) \
        -f $(CURDIR)/Makefile $(filter-out _all sub-make,$(MAKECMDGOALS))
  
@@@ -1000,7 -1000,7 +1000,7 @@@ prepare1: prepare2 $(version_h) include
  
  archprepare: archheaders archscripts prepare1 scripts_basic
  
 -prepare0: archprepare FORCE
 +prepare0: archprepare
        $(Q)$(MAKE) $(build)=.
  
  # All the preparing..
@@@ -1045,7 -1045,7 +1045,7 @@@ INSTALL_FW_PATH=$(INSTALL_MOD_PATH)/lib
  export INSTALL_FW_PATH
  
  PHONY += firmware_install
 -firmware_install: FORCE
 +firmware_install:
        @mkdir -p $(objtree)/firmware
        $(Q)$(MAKE) -f $(srctree)/scripts/Makefile.fwinst obj=firmware __fw_install
  
@@@ -1065,7 -1065,7 +1065,7 @@@ PHONY += archscript
  archscripts:
  
  PHONY += __headers
 -__headers: $(version_h) scripts_basic asm-generic archheaders archscripts FORCE
 +__headers: $(version_h) scripts_basic asm-generic archheaders archscripts
        $(Q)$(MAKE) $(build)=scripts build_unifdef
  
  PHONY += headers_install_all
index efafdf39cb3b224041deed877f011958b3c06650,b444c7c023cc874b4a436ae493e9c5f1a02f7aa2..ac177d96e7730b4e0a385496c63c1fde4d07d49b
  #ifndef __ASM_UACCESS_H
  #define __ASM_UACCESS_H
  
 +#include <asm/alternative.h>
 +#include <asm/kernel-pgtable.h>
 +#include <asm/sysreg.h>
 +
 +#ifndef __ASSEMBLY__
 +
  /*
   * User space memory access functions
   */
  #include <linux/string.h>
  #include <linux/thread_info.h>
  
 -#include <asm/alternative.h>
  #include <asm/cpufeature.h>
  #include <asm/ptrace.h>
 -#include <asm/sysreg.h>
  #include <asm/errno.h>
  #include <asm/memory.h>
  #include <asm/compiler.h>
@@@ -108,11 -104,12 +108,12 @@@ static inline void set_fs(mm_segment_t 
   */
  #define __range_ok(addr, size)                                                \
  ({                                                                    \
+       unsigned long __addr = (unsigned long __force)(addr);           \
        unsigned long flag, roksum;                                     \
        __chk_user_ptr(addr);                                           \
        asm("adds %1, %1, %3; ccmp %1, %4, #2, cc; cset %0, ls"         \
                : "=&r" (flag), "=&r" (roksum)                          \
-               : "1" (addr), "Ir" (size),                              \
+               : "1" (__addr), "Ir" (size),                            \
                  "r" (current_thread_info()->addr_limit)               \
                : "cc");                                                \
        flag;                                                           \
        "       .long           (" #from " - .), (" #to " - .)\n"       \
        "       .popsection\n"
  
 +/*
 + * User access enabling/disabling.
 + */
 +#ifdef CONFIG_ARM64_SW_TTBR0_PAN
 +static inline void __uaccess_ttbr0_disable(void)
 +{
 +      unsigned long ttbr;
 +
 +      /* reserved_ttbr0 placed at the end of swapper_pg_dir */
 +      ttbr = read_sysreg(ttbr1_el1) + SWAPPER_DIR_SIZE;
 +      write_sysreg(ttbr, ttbr0_el1);
 +      isb();
 +}
 +
 +static inline void __uaccess_ttbr0_enable(void)
 +{
 +      unsigned long flags;
 +
 +      /*
 +       * Disable interrupts to avoid preemption between reading the 'ttbr0'
 +       * variable and the MSR. A context switch could trigger an ASID
 +       * roll-over and an update of 'ttbr0'.
 +       */
 +      local_irq_save(flags);
 +      write_sysreg(current_thread_info()->ttbr0, ttbr0_el1);
 +      isb();
 +      local_irq_restore(flags);
 +}
 +
 +static inline bool uaccess_ttbr0_disable(void)
 +{
 +      if (!system_uses_ttbr0_pan())
 +              return false;
 +      __uaccess_ttbr0_disable();
 +      return true;
 +}
 +
 +static inline bool uaccess_ttbr0_enable(void)
 +{
 +      if (!system_uses_ttbr0_pan())
 +              return false;
 +      __uaccess_ttbr0_enable();
 +      return true;
 +}
 +#else
 +static inline bool uaccess_ttbr0_disable(void)
 +{
 +      return false;
 +}
 +
 +static inline bool uaccess_ttbr0_enable(void)
 +{
 +      return false;
 +}
 +#endif
 +
 +#define __uaccess_disable(alt)                                                \
 +do {                                                                  \
 +      if (!uaccess_ttbr0_disable())                                   \
 +              asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), alt,          \
 +                              CONFIG_ARM64_PAN));                     \
 +} while (0)
 +
 +#define __uaccess_enable(alt)                                         \
 +do {                                                                  \
 +      if (!uaccess_ttbr0_enable())                                    \
 +              asm(ALTERNATIVE("nop", SET_PSTATE_PAN(0), alt,          \
 +                              CONFIG_ARM64_PAN));                     \
 +} while (0)
 +
 +static inline void uaccess_disable(void)
 +{
 +      __uaccess_disable(ARM64_HAS_PAN);
 +}
 +
 +static inline void uaccess_enable(void)
 +{
 +      __uaccess_enable(ARM64_HAS_PAN);
 +}
 +
 +/*
 + * These functions are no-ops when UAO is present.
 + */
 +static inline void uaccess_disable_not_uao(void)
 +{
 +      __uaccess_disable(ARM64_ALT_PAN_NOT_UAO);
 +}
 +
 +static inline void uaccess_enable_not_uao(void)
 +{
 +      __uaccess_enable(ARM64_ALT_PAN_NOT_UAO);
 +}
 +
  /*
   * The "__xxx" versions of the user access functions do not verify the address
   * space - it must have been done previously with a separate "access_ok()"
  do {                                                                  \
        unsigned long __gu_val;                                         \
        __chk_user_ptr(ptr);                                            \
 -      asm(ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_ALT_PAN_NOT_UAO,\
 -                      CONFIG_ARM64_PAN));                             \
 +      uaccess_enable_not_uao();                                       \
        switch (sizeof(*(ptr))) {                                       \
        case 1:                                                         \
                __get_user_asm("ldrb", "ldtrb", "%w", __gu_val, (ptr),  \
        default:                                                        \
                BUILD_BUG();                                            \
        }                                                               \
 +      uaccess_disable_not_uao();                                      \
        (x) = (__force __typeof__(*(ptr)))__gu_val;                     \
 -      asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_ALT_PAN_NOT_UAO,\
 -                      CONFIG_ARM64_PAN));                             \
  } while (0)
  
  #define __get_user(x, ptr)                                            \
  do {                                                                  \
        __typeof__(*(ptr)) __pu_val = (x);                              \
        __chk_user_ptr(ptr);                                            \
 -      asm(ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_ALT_PAN_NOT_UAO,\
 -                      CONFIG_ARM64_PAN));                             \
 +      uaccess_enable_not_uao();                                       \
        switch (sizeof(*(ptr))) {                                       \
        case 1:                                                         \
                __put_user_asm("strb", "sttrb", "%w", __pu_val, (ptr),  \
        default:                                                        \
                BUILD_BUG();                                            \
        }                                                               \
 -      asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_ALT_PAN_NOT_UAO,\
 -                      CONFIG_ARM64_PAN));                             \
 +      uaccess_disable_not_uao();                                      \
  } while (0)
  
  #define __put_user(x, ptr)                                            \
@@@ -420,66 -328,4 +421,66 @@@ extern long strncpy_from_user(char *des
  extern __must_check long strlen_user(const char __user *str);
  extern __must_check long strnlen_user(const char __user *str, long n);
  
 +#else /* __ASSEMBLY__ */
 +
 +#include <asm/assembler.h>
 +
 +/*
 + * User access enabling/disabling macros.
 + */
 +#ifdef CONFIG_ARM64_SW_TTBR0_PAN
 +      .macro  __uaccess_ttbr0_disable, tmp1
 +      mrs     \tmp1, ttbr1_el1                // swapper_pg_dir
 +      add     \tmp1, \tmp1, #SWAPPER_DIR_SIZE // reserved_ttbr0 at the end of swapper_pg_dir
 +      msr     ttbr0_el1, \tmp1                // set reserved TTBR0_EL1
 +      isb
 +      .endm
 +
 +      .macro  __uaccess_ttbr0_enable, tmp1
 +      get_thread_info \tmp1
 +      ldr     \tmp1, [\tmp1, #TSK_TI_TTBR0]   // load saved TTBR0_EL1
 +      msr     ttbr0_el1, \tmp1                // set the non-PAN TTBR0_EL1
 +      isb
 +      .endm
 +
 +      .macro  uaccess_ttbr0_disable, tmp1
 +alternative_if_not ARM64_HAS_PAN
 +      __uaccess_ttbr0_disable \tmp1
 +alternative_else_nop_endif
 +      .endm
 +
 +      .macro  uaccess_ttbr0_enable, tmp1, tmp2
 +alternative_if_not ARM64_HAS_PAN
 +      save_and_disable_irq \tmp2              // avoid preemption
 +      __uaccess_ttbr0_enable \tmp1
 +      restore_irq \tmp2
 +alternative_else_nop_endif
 +      .endm
 +#else
 +      .macro  uaccess_ttbr0_disable, tmp1
 +      .endm
 +
 +      .macro  uaccess_ttbr0_enable, tmp1, tmp2
 +      .endm
 +#endif
 +
 +/*
 + * These macros are no-ops when UAO is present.
 + */
 +      .macro  uaccess_disable_not_uao, tmp1
 +      uaccess_ttbr0_disable \tmp1
 +alternative_if ARM64_ALT_PAN_NOT_UAO
 +      SET_PSTATE_PAN(1)
 +alternative_else_nop_endif
 +      .endm
 +
 +      .macro  uaccess_enable_not_uao, tmp1, tmp2
 +      uaccess_ttbr0_enable \tmp1, \tmp2
 +alternative_if ARM64_ALT_PAN_NOT_UAO
 +      SET_PSTATE_PAN(0)
 +alternative_else_nop_endif
 +      .endm
 +
 +#endif        /* __ASSEMBLY__ */
 +
  #endif /* __ASM_UACCESS_H */
diff --combined drivers/md/Kconfig
index 6f2fde5d98e7f82a0c387411334df0a3cfff9f13,108249f52fa91ecbcd4e6e1edab28b4b814e6b8a..5649d1ab008381fe9391499c46c957916c03d046
@@@ -357,6 -357,7 +357,7 @@@ config DM_LOG_USERSPAC
  config DM_RAID
         tristate "RAID 1/4/5/6/10 target"
         depends on BLK_DEV_DM
+        select MD_RAID0
         select MD_RAID1
         select MD_RAID10
         select MD_RAID456
@@@ -458,33 -459,6 +459,33 @@@ config DM_VERIT
  
          If unsure, say N.
  
 +config DM_VERITY_HASH_PREFETCH_MIN_SIZE_128
 +      bool "Prefetch size 128"
 +
 +config DM_VERITY_HASH_PREFETCH_MIN_SIZE
 +      int "Verity hash prefetch minimum size"
 +      depends on DM_VERITY
 +      range 1 4096
 +      default 128 if DM_VERITY_HASH_PREFETCH_MIN_SIZE_128
 +      default 1
 +      ---help---
 +        This sets minimum number of hash blocks to prefetch for dm-verity.
 +        For devices like eMMC, having larger prefetch size like 128 can improve
 +        performance with increased memory consumption for keeping more hashes
 +        in RAM.
 +
 +config DM_VERITY_FEC
 +      bool "Verity forward error correction support"
 +      depends on DM_VERITY
 +      select REED_SOLOMON
 +      select REED_SOLOMON_DEC8
 +      ---help---
 +        Add forward error correction support to dm-verity. This option
 +        makes it possible to use pre-generated error correction data to
 +        recover from corrupted blocks.
 +
 +        If unsure, say N.
 +
  config DM_SWITCH
        tristate "Switch target support (EXPERIMENTAL)"
        depends on BLK_DEV_DM
@@@ -515,33 -489,4 +516,33 @@@ config DM_LOG_WRITE
  
          If unsure, say N.
  
 +config DM_VERITY_AVB
 +      tristate "Support AVB specific verity error behavior"
 +      depends on DM_VERITY
 +      ---help---
 +        Enables Android Verified Boot platform-specific error
 +        behavior. In particular, it will modify the vbmeta partition
 +        specified on the kernel command-line when non-transient error
 +        occurs (followed by a panic).
 +
 +        If unsure, say N.
 +
 +config DM_ANDROID_VERITY
 +      bool "Android verity target support"
 +      depends on DM_VERITY=y
 +      depends on X509_CERTIFICATE_PARSER
 +      depends on SYSTEM_TRUSTED_KEYRING
 +      depends on PUBLIC_KEY_ALGO_RSA
 +      depends on KEYS
 +      depends on ASYMMETRIC_KEY_TYPE
 +      depends on ASYMMETRIC_PUBLIC_KEY_SUBTYPE
 +      depends on MD_LINEAR=y
 +      select DM_VERITY_HASH_PREFETCH_MIN_SIZE_128
 +      ---help---
 +        This device-mapper target is virtually a VERITY target. This
 +        target is setup by reading the metadata contents piggybacked
 +        to the actual data blocks in the block device. The signature
 +        of the metadata contents are verified against the key included
 +        in the system keyring. Upon success, the underlying verity
 +        target is setup.
  endif # MD
diff --combined fs/ext4/crypto_fname.c
index e2645ca9b95e0651a34bab34405b68b4dc03f740,2cfe3ffc276ff5011fd17b3940976249faf95149..026716bdbbfc1654eb7b302e6b6772102fa87d12
@@@ -44,8 -44,7 +44,8 @@@ static void ext4_dir_crypt_complete(str
  
  bool ext4_valid_filenames_enc_mode(uint32_t mode)
  {
 -      return (mode == EXT4_ENCRYPTION_MODE_AES_256_CTS);
 +      return (mode == EXT4_ENCRYPTION_MODE_AES_256_CTS ||
 +              mode == EXT4_ENCRYPTION_MODE_AES_256_HEH);
  }
  
  static unsigned max_name_len(struct inode *inode)
@@@ -344,7 -343,7 +344,7 @@@ int _ext4_fname_disk_to_usr(struct inod
                memcpy(buf+4, &hinfo->minor_hash, 4);
        } else
                memset(buf, 0, 8);
-       memcpy(buf + 8, iname->name + iname->len - 16, 16);
+       memcpy(buf + 8, iname->name + ((iname->len - 17) & ~15), 16);
        oname->name[0] = '_';
        ret = digest_encode(buf, 24, oname->name+1);
        oname->len = ret + 1;
diff --combined fs/ext4/ext4.h
index 663d44c47db8c3aece5a752661731fd2e1acc822,c8ad14c697c4a72da15f147061a419aefdf09356..6edacb849e48231a93fb6ddf1dc5d8961c1d20b5
@@@ -589,7 -589,6 +589,7 @@@ enum 
  #define EXT4_ENCRYPTION_MODE_AES_256_GCM      2
  #define EXT4_ENCRYPTION_MODE_AES_256_CBC      3
  #define EXT4_ENCRYPTION_MODE_AES_256_CTS      4
 +#define EXT4_ENCRYPTION_MODE_AES_256_HEH      126
  
  #include "ext4_crypto.h"
  
@@@ -1442,7 -1441,7 +1442,7 @@@ struct ext4_sb_info 
        struct list_head s_es_list;     /* List of inodes with reclaimable extents */
        long s_es_nr_inode;
        struct ext4_es_stats s_es_stats;
 -      struct mb_cache *s_mb_cache;
 +      struct mb2_cache *s_mb_cache;
        spinlock_t s_es_lock ____cacheline_aligned_in_smp;
  
        /* Ratelimit ext4 messages. */
@@@ -2262,11 -2261,13 +2262,13 @@@ extern struct kmem_cache *ext4_crypt_in
  bool ext4_valid_contents_enc_mode(uint32_t mode);
  uint32_t ext4_validate_encryption_key_size(uint32_t mode, uint32_t size);
  extern struct workqueue_struct *ext4_read_workqueue;
- struct ext4_crypto_ctx *ext4_get_crypto_ctx(struct inode *inode);
+ struct ext4_crypto_ctx *ext4_get_crypto_ctx(struct inode *inode,
+                                           gfp_t gfp_flags);
  void ext4_release_crypto_ctx(struct ext4_crypto_ctx *ctx);
  void ext4_restore_control_page(struct page *data_page);
  struct page *ext4_encrypt(struct inode *inode,
-                         struct page *plaintext_page);
+                         struct page *plaintext_page,
+                         gfp_t gfp_flags);
  int ext4_decrypt(struct page *page);
  int ext4_encrypted_zeroout(struct inode *inode, struct ext4_extent *ex);
  extern const struct dentry_operations ext4_encrypted_d_ops;
@@@ -2455,8 -2456,7 +2457,8 @@@ extern int ext4_mb_add_groupinfo(struc
                ext4_group_t i, struct ext4_group_desc *desc);
  extern int ext4_group_add_blocks(handle_t *handle, struct super_block *sb,
                                ext4_fsblk_t block, unsigned long count);
 -extern int ext4_trim_fs(struct super_block *, struct fstrim_range *);
 +extern int ext4_trim_fs(struct super_block *, struct fstrim_range *,
 +                              unsigned long blkdev_flags);
  
  /* inode.c */
  int ext4_inode_is_fast_symlink(struct inode *inode);
diff --combined fs/ext4/readpage.c
index 1c5db9fd9c8f174fcf86b094669ec3383442a30a,bc7642f57dc82b6e4862d02e07b6a3b1ed67250c..783e33d839cffe7a748375180f2d4583dc258f72
@@@ -45,7 -45,6 +45,7 @@@
  #include <linux/cleancache.h>
  
  #include "ext4.h"
 +#include <trace/events/android_fs.h>
  
  /*
   * Call ext4_decrypt on every single page, reusing the encryption
@@@ -87,17 -86,6 +87,17 @@@ static inline bool ext4_bio_encrypted(s
  #endif
  }
  
 +static void
 +ext4_trace_read_completion(struct bio *bio)
 +{
 +      struct page *first_page = bio->bi_io_vec[0].bv_page;
 +
 +      if (first_page != NULL)
 +              trace_android_fs_dataread_end(first_page->mapping->host,
 +                                            page_offset(first_page),
 +                                            bio->bi_iter.bi_size);
 +}
 +
  /*
   * I/O completion handler for multipage BIOs.
   *
@@@ -115,9 -103,6 +115,9 @@@ static void mpage_end_io(struct bio *bi
        struct bio_vec *bv;
        int i;
  
 +      if (trace_android_fs_dataread_start_enabled())
 +              ext4_trace_read_completion(bio);
 +
        if (ext4_bio_encrypted(bio)) {
                struct ext4_crypto_ctx *ctx = bio->bi_private;
  
        bio_put(bio);
  }
  
 +static void
 +ext4_submit_bio_read(struct bio *bio)
 +{
 +      if (trace_android_fs_dataread_start_enabled()) {
 +              struct page *first_page = bio->bi_io_vec[0].bv_page;
 +
 +              if (first_page != NULL) {
 +                      char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
 +
 +                      path = android_fstrace_get_pathname(pathbuf,
 +                                                  MAX_TRACE_PATHBUF_LEN,
 +                                                  first_page->mapping->host);
 +                      trace_android_fs_dataread_start(
 +                              first_page->mapping->host,
 +                              page_offset(first_page),
 +                              bio->bi_iter.bi_size,
 +                              current->pid,
 +                              path,
 +                              current->comm);
 +              }
 +      }
 +      submit_bio(READ, bio);
 +}
 +
  int ext4_mpage_readpages(struct address_space *mapping,
                         struct list_head *pages, struct page *page,
                         unsigned nr_pages)
                 */
                if (bio && (last_block_in_bio != blocks[0] - 1)) {
                submit_and_realloc:
 -                      submit_bio(READ, bio);
 +                      ext4_submit_bio_read(bio);
                        bio = NULL;
                }
                if (bio == NULL) {
  
                        if (ext4_encrypted_inode(inode) &&
                            S_ISREG(inode->i_mode)) {
-                               ctx = ext4_get_crypto_ctx(inode);
+                               ctx = ext4_get_crypto_ctx(inode, GFP_NOFS);
                                if (IS_ERR(ctx))
                                        goto set_error_page;
                        }
                if (((map.m_flags & EXT4_MAP_BOUNDARY) &&
                     (relative_block == map.m_len)) ||
                    (first_hole != blocks_per_page)) {
 -                      submit_bio(READ, bio);
 +                      ext4_submit_bio_read(bio);
                        bio = NULL;
                } else
                        last_block_in_bio = blocks[blocks_per_page - 1];
                goto next_page;
        confused:
                if (bio) {
 -                      submit_bio(READ, bio);
 +                      ext4_submit_bio_read(bio);
                        bio = NULL;
                }
                if (!PageUptodate(page))
        }
        BUG_ON(pages && !list_empty(pages));
        if (bio)
 -              submit_bio(READ, bio);
 +              ext4_submit_bio_read(bio);
        return 0;
  }
diff --combined fs/f2fs/inline.c
index dbb2cc4df603722d8f9ed755ca3772bcb6382c57,ad80f916b64d4abc4433f732a4fa24bc42bcb5b4..f35f3eb3541f6dc5bf686522cb7874f76bec0522
@@@ -13,7 -13,6 +13,7 @@@
  
  #include "f2fs.h"
  #include "node.h"
 +#include <trace/events/android_fs.h>
  
  bool f2fs_may_inline_data(struct inode *inode)
  {
@@@ -85,29 -84,14 +85,29 @@@ int f2fs_read_inline_data(struct inode 
  {
        struct page *ipage;
  
 +      if (trace_android_fs_dataread_start_enabled()) {
 +              char *path, pathbuf[MAX_TRACE_PATHBUF_LEN];
 +
 +              path = android_fstrace_get_pathname(pathbuf,
 +                                                  MAX_TRACE_PATHBUF_LEN,
 +                                                  inode);
 +              trace_android_fs_dataread_start(inode, page_offset(page),
 +                                              PAGE_SIZE, current->pid,
 +                                              path, current->comm);
 +      }
 +
        ipage = get_node_page(F2FS_I_SB(inode), inode->i_ino);
        if (IS_ERR(ipage)) {
 +              trace_android_fs_dataread_end(inode, page_offset(page),
 +                                            PAGE_SIZE);
                unlock_page(page);
                return PTR_ERR(ipage);
        }
  
        if (!f2fs_has_inline_data(inode)) {
                f2fs_put_page(ipage, 1);
 +              trace_android_fs_dataread_end(inode, page_offset(page),
 +                                            PAGE_SIZE);
                return -EAGAIN;
        }
  
  
        SetPageUptodate(page);
        f2fs_put_page(ipage, 1);
 +      trace_android_fs_dataread_end(inode, page_offset(page),
 +                                    PAGE_SIZE);
        unlock_page(page);
        return 0;
  }
@@@ -321,7 -303,7 +321,7 @@@ struct f2fs_dir_entry *find_in_inline_d
        if (IS_ERR(ipage))
                return NULL;
  
-       namehash = f2fs_dentry_hash(&name);
+       namehash = f2fs_dentry_hash(&name, fname);
  
        inline_dentry = inline_data_addr(ipage);
  
@@@ -486,7 -468,7 +486,7 @@@ int f2fs_add_inline_entry(struct inode 
  
        f2fs_wait_on_page_writeback(ipage, NODE);
  
-       name_hash = f2fs_dentry_hash(name);
+       name_hash = f2fs_dentry_hash(name, NULL);
        make_dentry_ptr(NULL, &d, (void *)dentry_blk, 2);
        f2fs_update_dentry(ino, mode, &d, name, name_hash, bit_pos);
  
diff --combined kernel/fork.c
index 52272755f69acdb89e871e7e7942e9ffd98657f8,0ee630f3ad4b1dd60dbabf44b886ea492ac5983f..cf0013cdf3c74d6e191b488e648dd838504700e8
@@@ -827,8 -827,7 +827,8 @@@ struct mm_struct *mm_access(struct task
  
        mm = get_task_mm(task);
        if (mm && mm != current->mm &&
 -                      !ptrace_may_access(task, mode)) {
 +                      !ptrace_may_access(task, mode) &&
 +                      !capable(CAP_SYS_RESOURCE)) {
                mmput(mm);
                mm = ERR_PTR(-EACCES);
        }
@@@ -1591,11 -1590,13 +1591,13 @@@ static struct task_struct *copy_process
        */
        recalc_sigpending();
        if (signal_pending(current)) {
-               spin_unlock(&current->sighand->siglock);
-               write_unlock_irq(&tasklist_lock);
                retval = -ERESTARTNOINTR;
                goto bad_fork_cancel_cgroup;
        }
+       if (unlikely(!(ns_of_pid(pid)->nr_hashed & PIDNS_HASH_ADDING))) {
+               retval = -ENOMEM;
+               goto bad_fork_cancel_cgroup;
+       }
  
        if (likely(p->pid)) {
                ptrace_init_task(p, (clone_flags & CLONE_PTRACE) || trace);
        return p;
  
  bad_fork_cancel_cgroup:
+       spin_unlock(&current->sighand->siglock);
+       write_unlock_irq(&tasklist_lock);
        cgroup_cancel_fork(p, cgrp_ss_priv);
  bad_fork_free_pid:
        threadgroup_change_end(current);
diff --combined kernel/sched/fair.c
index 83cfb72b2d95a0ad3f32f9331077ef63a1e96ba1,812069b66f47fb82e282a8429b79af0d3f83f26b..6f353de3f3902aebb5c5097bcfc182c22bbab1c7
  #include <linux/mempolicy.h>
  #include <linux/migrate.h>
  #include <linux/task_work.h>
 +#include <linux/module.h>
  
  #include <trace/events/sched.h>
  
  #include "sched.h"
 +#include "tune.h"
 +#include "walt.h"
  
  /*
   * Targeted preemption latency for CPU-bound tasks:
  unsigned int sysctl_sched_latency = 6000000ULL;
  unsigned int normalized_sysctl_sched_latency = 6000000ULL;
  
 +unsigned int sysctl_sched_is_big_little = 0;
 +unsigned int sysctl_sched_sync_hint_enable = 1;
 +unsigned int sysctl_sched_initial_task_util = 0;
 +unsigned int sysctl_sched_cstate_aware = 1;
 +
 +#ifdef CONFIG_SCHED_WALT
 +unsigned int sysctl_sched_use_walt_cpu_util = 1;
 +unsigned int sysctl_sched_use_walt_task_util = 1;
 +__read_mostly unsigned int sysctl_sched_walt_cpu_high_irqload =
 +    (10 * NSEC_PER_MSEC);
 +#endif
  /*
   * The initial- and re-scaling of tunables is configurable
   * (default SCHED_TUNABLESCALING_LOG = *(1+ilog(ncpus))
@@@ -696,9 -682,7 +696,9 @@@ void init_entity_runnable_average(struc
        sa->period_contrib = 1023;
        sa->load_avg = scale_load_down(se->load.weight);
        sa->load_sum = sa->load_avg * LOAD_AVG_MAX;
 -      sa->util_avg = scale_load_down(SCHED_LOAD_SCALE);
 +      sa->util_avg =  sched_freq() ?
 +              sysctl_sched_initial_task_util :
 +              scale_load_down(SCHED_LOAD_SCALE);
        sa->util_sum = sa->util_avg * LOAD_AVG_MAX;
        /* when this task enqueue'ed, it will contribute to its cfs_rq's load_avg */
  }
@@@ -2616,7 -2600,6 +2616,7 @@@ __update_load_avg(u64 now, int cpu, str
  
        scale_freq = arch_scale_freq_capacity(NULL, cpu);
        scale_cpu = arch_scale_cpu_capacity(NULL, cpu);
 +      trace_sched_contrib_scale_f(cpu, scale_freq, scale_cpu);
  
        /* delta_w is the amount already accumulated against our next period */
        delta_w = sa->period_contrib;
@@@ -2757,10 -2740,6 +2757,10 @@@ static inline int update_cfs_rq_load_av
        cfs_rq->load_last_update_time_copy = sa->last_update_time;
  #endif
  
 +      /* Trace CPU load, unless cfs_rq belongs to a non-root task_group */
 +      if (cfs_rq == &rq_of(cfs_rq)->cfs)
 +              trace_sched_load_avg_cpu(cpu_of(rq_of(cfs_rq)), cfs_rq);
 +
        return decayed || removed;
  }
  
@@@ -2781,9 -2760,6 +2781,9 @@@ static inline void update_load_avg(stru
  
        if (update_cfs_rq_load_avg(now, cfs_rq) && update_tg)
                update_tg_load_avg(cfs_rq, 0);
 +
 +      if (entity_is_task(se))
 +              trace_sched_load_avg_task(task_of(se), &se->avg);
  }
  
  static void attach_entity_load_avg(struct cfs_rq *cfs_rq, struct sched_entity *se)
@@@ -2864,45 -2840,27 +2864,45 @@@ dequeue_entity_load_avg(struct cfs_rq *
                max_t(s64,  cfs_rq->runnable_load_sum - se->avg.load_sum, 0);
  }
  
 -/*
 - * Task first catches up with cfs_rq, and then subtract
 - * itself from the cfs_rq (task must be off the queue now).
 - */
 -void remove_entity_load_avg(struct sched_entity *se)
 -{
 -      struct cfs_rq *cfs_rq = cfs_rq_of(se);
 -      u64 last_update_time;
 -
  #ifndef CONFIG_64BIT
 +static inline u64 cfs_rq_last_update_time(struct cfs_rq *cfs_rq)
 +{
        u64 last_update_time_copy;
 +      u64 last_update_time;
  
        do {
                last_update_time_copy = cfs_rq->load_last_update_time_copy;
                smp_rmb();
                last_update_time = cfs_rq->avg.last_update_time;
        } while (last_update_time != last_update_time_copy);
 +
 +      return last_update_time;
 +}
  #else
 -      last_update_time = cfs_rq->avg.last_update_time;
 +static inline u64 cfs_rq_last_update_time(struct cfs_rq *cfs_rq)
 +{
 +      return cfs_rq->avg.last_update_time;
 +}
  #endif
  
 +/*
 + * Task first catches up with cfs_rq, and then subtract
 + * itself from the cfs_rq (task must be off the queue now).
 + */
 +void remove_entity_load_avg(struct sched_entity *se)
 +{
 +      struct cfs_rq *cfs_rq = cfs_rq_of(se);
 +      u64 last_update_time;
 +
 +      /*
 +       * Newly created task or never used group entity should not be removed
 +       * from its (source) cfs_rq
 +       */
 +      if (se->avg.last_update_time == 0)
 +              return;
 +
 +      last_update_time = cfs_rq_last_update_time(cfs_rq);
 +
        __update_load_avg(last_update_time, cpu_of(rq_of(cfs_rq)), &se->avg, 0, 0, NULL);
        atomic_long_add(se->avg.load_avg, &cfs_rq->removed_load_avg);
        atomic_long_add(se->avg.util_avg, &cfs_rq->removed_util_avg);
@@@ -3004,7 -2962,6 +3004,7 @@@ static void enqueue_sleeper(struct cfs_
                        }
  
                        trace_sched_stat_blocked(tsk, delta);
 +                      trace_sched_blocked_reason(tsk);
  
                        /*
                         * Blocking time is in units of nanosecs, so shift by
@@@ -3961,6 -3918,26 +3961,26 @@@ static void check_enqueue_throttle(stru
        if (!cfs_bandwidth_used())
                return;
  
+       /* Synchronize hierarchical throttle counter: */
+       if (unlikely(!cfs_rq->throttle_uptodate)) {
+               struct rq *rq = rq_of(cfs_rq);
+               struct cfs_rq *pcfs_rq;
+               struct task_group *tg;
+               cfs_rq->throttle_uptodate = 1;
+               /* Get closest up-to-date node, because leaves go first: */
+               for (tg = cfs_rq->tg->parent; tg; tg = tg->parent) {
+                       pcfs_rq = tg->cfs_rq[cpu_of(rq)];
+                       if (pcfs_rq->throttle_uptodate)
+                               break;
+               }
+               if (tg) {
+                       cfs_rq->throttle_count = pcfs_rq->throttle_count;
+                       cfs_rq->throttled_clock_task = rq_clock_task(rq);
+               }
+       }
        /* an active group must be handled by the update_curr()->put() path */
        if (!cfs_rq->runtime_enabled || cfs_rq->curr)
                return;
@@@ -4200,28 -4177,6 +4220,28 @@@ static inline void hrtick_update(struc
  }
  #endif
  
 +#ifdef CONFIG_SMP
 +static bool cpu_overutilized(int cpu);
 +static inline unsigned long boosted_cpu_util(int cpu);
 +#else
 +#define boosted_cpu_util(cpu) cpu_util(cpu)
 +#endif
 +
 +#ifdef CONFIG_SMP
 +static void update_capacity_of(int cpu)
 +{
 +      unsigned long req_cap;
 +
 +      if (!sched_freq())
 +              return;
 +
 +      /* Convert scale-invariant capacity to cpu. */
 +      req_cap = boosted_cpu_util(cpu);
 +      req_cap = req_cap * SCHED_CAPACITY_SCALE / capacity_orig_of(cpu);
 +      set_cfs_cpu_capacity(cpu, true, req_cap);
 +}
 +#endif
 +
  /*
   * The enqueue_task method is called before nr_running is
   * increased. Here we update the fair scheduling stats and
@@@ -4232,10 -4187,6 +4252,10 @@@ enqueue_task_fair(struct rq *rq, struc
  {
        struct cfs_rq *cfs_rq;
        struct sched_entity *se = &p->se;
 +#ifdef CONFIG_SMP
 +      int task_new = flags & ENQUEUE_WAKEUP_NEW;
 +      int task_wakeup = flags & ENQUEUE_WAKEUP;
 +#endif
  
        for_each_sched_entity(se) {
                if (se->on_rq)
                if (cfs_rq_throttled(cfs_rq))
                        break;
                cfs_rq->h_nr_running++;
 +              walt_inc_cfs_cumulative_runnable_avg(cfs_rq, p);
  
                flags = ENQUEUE_WAKEUP;
        }
        for_each_sched_entity(se) {
                cfs_rq = cfs_rq_of(se);
                cfs_rq->h_nr_running++;
 +              walt_inc_cfs_cumulative_runnable_avg(cfs_rq, p);
  
                if (cfs_rq_throttled(cfs_rq))
                        break;
        if (!se)
                add_nr_running(rq, 1);
  
 +#ifdef CONFIG_SMP
 +
 +      /*
 +       * Update SchedTune accounting.
 +       *
 +       * We do it before updating the CPU capacity to ensure the
 +       * boost value of the current task is accounted for in the
 +       * selection of the OPP.
 +       *
 +       * We do it also in the case where we enqueue a throttled task;
 +       * we could argue that a throttled task should not boost a CPU,
 +       * however:
 +       * a) properly implementing CPU boosting considering throttled
 +       *    tasks will increase a lot the complexity of the solution
 +       * b) it's not easy to quantify the benefits introduced by
 +       *    such a more complex solution.
 +       * Thus, for the time being we go for the simple solution and boost
 +       * also for throttled RQs.
 +       */
 +      schedtune_enqueue_task(p, cpu_of(rq));
 +
 +      if (!se) {
 +              walt_inc_cumulative_runnable_avg(rq, p);
 +              if (!task_new && !rq->rd->overutilized &&
 +                  cpu_overutilized(rq->cpu)) {
 +                      rq->rd->overutilized = true;
 +                      trace_sched_overutilized(true);
 +              }
 +
 +              /*
 +               * We want to potentially trigger a freq switch
 +               * request only for tasks that are waking up; this is
 +               * because we get here also during load balancing, but
 +               * in these cases it seems wise to trigger as single
 +               * request after load balancing is done.
 +               */
 +              if (task_new || task_wakeup)
 +                      update_capacity_of(cpu_of(rq));
 +      }
 +
 +#endif /* CONFIG_SMP */
        hrtick_update(rq);
  }
  
@@@ -4342,19 -4250,17 +4362,18 @@@ static void dequeue_task_fair(struct r
                if (cfs_rq_throttled(cfs_rq))
                        break;
                cfs_rq->h_nr_running--;
 +              walt_dec_cfs_cumulative_runnable_avg(cfs_rq, p);
  
                /* Don't dequeue parent if it has other entities besides us */
                if (cfs_rq->load.weight) {
+                       /* Avoid re-evaluating load for this entity: */
+                       se = parent_entity(se);
                        /*
                         * Bias pick_next to pick a task from this cfs_rq, as
                         * p is sleeping when it is within its sched_slice.
                         */
-                       if (task_sleep && parent_entity(se))
-                               set_next_buddy(parent_entity(se));
-                       /* avoid re-evaluating load for this entity */
-                       se = parent_entity(se);
+                       if (task_sleep && se && !throttled_hierarchy(cfs_rq))
+                               set_next_buddy(se);
                        break;
                }
                flags |= DEQUEUE_SLEEP;
        for_each_sched_entity(se) {
                cfs_rq = cfs_rq_of(se);
                cfs_rq->h_nr_running--;
 +              walt_dec_cfs_cumulative_runnable_avg(cfs_rq, p);
  
                if (cfs_rq_throttled(cfs_rq))
                        break;
        if (!se)
                sub_nr_running(rq, 1);
  
 +#ifdef CONFIG_SMP
 +
 +      /*
 +       * Update SchedTune accounting
 +       *
 +       * We do it before updating the CPU capacity to ensure the
 +       * boost value of the current task is accounted for in the
 +       * selection of the OPP.
 +       */
 +      schedtune_dequeue_task(p, cpu_of(rq));
 +
 +      if (!se) {
 +              walt_dec_cumulative_runnable_avg(rq, p);
 +
 +              /*
 +               * We want to potentially trigger a freq switch
 +               * request only for tasks that are going to sleep;
 +               * this is because we get here also during load
 +               * balancing, but in these cases it seems wise to
 +               * trigger as single request after load balancing is
 +               * done.
 +               */
 +              if (task_sleep) {
 +                      if (rq->cfs.nr_running)
 +                              update_capacity_of(cpu_of(rq));
 +                      else if (sched_freq())
 +                              set_cfs_cpu_capacity(cpu_of(rq), false, 0);
 +              }
 +      }
 +
 +#endif /* CONFIG_SMP */
 +
        hrtick_update(rq);
  }
  
@@@ -4633,6 -4506,15 +4652,6 @@@ static unsigned long target_load(int cp
        return max(rq->cpu_load[type-1], total);
  }
  
 -static unsigned long capacity_of(int cpu)
 -{
 -      return cpu_rq(cpu)->cpu_capacity;
 -}
 -
 -static unsigned long capacity_orig_of(int cpu)
 -{
 -      return cpu_rq(cpu)->cpu_capacity_orig;
 -}
  
  static unsigned long cpu_avg_load_per_task(int cpu)
  {
@@@ -4806,392 -4688,6 +4825,392 @@@ static long effective_load(struct task_
  
  #endif
  
 +/*
 + * Returns the current capacity of cpu after applying both
 + * cpu and freq scaling.
 + */
 +unsigned long capacity_curr_of(int cpu)
 +{
 +      return cpu_rq(cpu)->cpu_capacity_orig *
 +             arch_scale_freq_capacity(NULL, cpu)
 +             >> SCHED_CAPACITY_SHIFT;
 +}
 +
 +static inline bool energy_aware(void)
 +{
 +      return sched_feat(ENERGY_AWARE);
 +}
 +
 +struct energy_env {
 +      struct sched_group      *sg_top;
 +      struct sched_group      *sg_cap;
 +      int                     cap_idx;
 +      int                     util_delta;
 +      int                     src_cpu;
 +      int                     dst_cpu;
 +      int                     energy;
 +      int                     payoff;
 +      struct task_struct      *task;
 +      struct {
 +              int before;
 +              int after;
 +              int delta;
 +              int diff;
 +      } nrg;
 +      struct {
 +              int before;
 +              int after;
 +              int delta;
 +      } cap;
 +};
 +
 +/*
 + * __cpu_norm_util() returns the cpu util relative to a specific capacity,
 + * i.e. it's busy ratio, in the range [0..SCHED_LOAD_SCALE] which is useful for
 + * energy calculations. Using the scale-invariant util returned by
 + * cpu_util() and approximating scale-invariant util by:
 + *
 + *   util ~ (curr_freq/max_freq)*1024 * capacity_orig/1024 * running_time/time
 + *
 + * the normalized util can be found using the specific capacity.
 + *
 + *   capacity = capacity_orig * curr_freq/max_freq
 + *
 + *   norm_util = running_time/time ~ util/capacity
 + */
 +static unsigned long __cpu_norm_util(int cpu, unsigned long capacity, int delta)
 +{
 +      int util = __cpu_util(cpu, delta);
 +
 +      if (util >= capacity)
 +              return SCHED_CAPACITY_SCALE;
 +
 +      return (util << SCHED_CAPACITY_SHIFT)/capacity;
 +}
 +
 +static int calc_util_delta(struct energy_env *eenv, int cpu)
 +{
 +      if (cpu == eenv->src_cpu)
 +              return -eenv->util_delta;
 +      if (cpu == eenv->dst_cpu)
 +              return eenv->util_delta;
 +      return 0;
 +}
 +
 +static
 +unsigned long group_max_util(struct energy_env *eenv)
 +{
 +      int i, delta;
 +      unsigned long max_util = 0;
 +
 +      for_each_cpu(i, sched_group_cpus(eenv->sg_cap)) {
 +              delta = calc_util_delta(eenv, i);
 +              max_util = max(max_util, __cpu_util(i, delta));
 +      }
 +
 +      return max_util;
 +}
 +
 +/*
 + * group_norm_util() returns the approximated group util relative to it's
 + * current capacity (busy ratio) in the range [0..SCHED_LOAD_SCALE] for use in
 + * energy calculations. Since task executions may or may not overlap in time in
 + * the group the true normalized util is between max(cpu_norm_util(i)) and
 + * sum(cpu_norm_util(i)) when iterating over all cpus in the group, i. The
 + * latter is used as the estimate as it leads to a more pessimistic energy
 + * estimate (more busy).
 + */
 +static unsigned
 +long group_norm_util(struct energy_env *eenv, struct sched_group *sg)
 +{
 +      int i, delta;
 +      unsigned long util_sum = 0;
 +      unsigned long capacity = sg->sge->cap_states[eenv->cap_idx].cap;
 +
 +      for_each_cpu(i, sched_group_cpus(sg)) {
 +              delta = calc_util_delta(eenv, i);
 +              util_sum += __cpu_norm_util(i, capacity, delta);
 +      }
 +
 +      if (util_sum > SCHED_CAPACITY_SCALE)
 +              return SCHED_CAPACITY_SCALE;
 +      return util_sum;
 +}
 +
 +static int find_new_capacity(struct energy_env *eenv,
 +      const struct sched_group_energy * const sge)
 +{
 +      int idx;
 +      unsigned long util = group_max_util(eenv);
 +
 +      for (idx = 0; idx < sge->nr_cap_states; idx++) {
 +              if (sge->cap_states[idx].cap >= util)
 +                      break;
 +      }
 +
 +      eenv->cap_idx = idx;
 +
 +      return idx;
 +}
 +
 +static int group_idle_state(struct sched_group *sg)
 +{
 +      int i, state = INT_MAX;
 +
 +      /* Find the shallowest idle state in the sched group. */
 +      for_each_cpu(i, sched_group_cpus(sg))
 +              state = min(state, idle_get_state_idx(cpu_rq(i)));
 +
 +      /* Take non-cpuidle idling into account (active idle/arch_cpu_idle()) */
 +      state++;
 +
 +      return state;
 +}
 +
 +/*
 + * sched_group_energy(): Computes the absolute energy consumption of cpus
 + * belonging to the sched_group including shared resources shared only by
 + * members of the group. Iterates over all cpus in the hierarchy below the
 + * sched_group starting from the bottom working it's way up before going to
 + * the next cpu until all cpus are covered at all levels. The current
 + * implementation is likely to gather the same util statistics multiple times.
 + * This can probably be done in a faster but more complex way.
 + * Note: sched_group_energy() may fail when racing with sched_domain updates.
 + */
 +static int sched_group_energy(struct energy_env *eenv)
 +{
 +      struct sched_domain *sd;
 +      int cpu, total_energy = 0;
 +      struct cpumask visit_cpus;
 +      struct sched_group *sg;
 +
 +      WARN_ON(!eenv->sg_top->sge);
 +
 +      cpumask_copy(&visit_cpus, sched_group_cpus(eenv->sg_top));
 +
 +      while (!cpumask_empty(&visit_cpus)) {
 +              struct sched_group *sg_shared_cap = NULL;
 +
 +              cpu = cpumask_first(&visit_cpus);
 +
 +              /*
 +               * Is the group utilization affected by cpus outside this
 +               * sched_group?
 +               */
 +              sd = rcu_dereference(per_cpu(sd_scs, cpu));
 +
 +              if (!sd)
 +                      /*
 +                       * We most probably raced with hotplug; returning a
 +                       * wrong energy estimation is better than entering an
 +                       * infinite loop.
 +                       */
 +                      return -EINVAL;
 +
 +              if (sd->parent)
 +                      sg_shared_cap = sd->parent->groups;
 +
 +              for_each_domain(cpu, sd) {
 +                      sg = sd->groups;
 +
 +                      /* Has this sched_domain already been visited? */
 +                      if (sd->child && group_first_cpu(sg) != cpu)
 +                              break;
 +
 +                      do {
 +                              unsigned long group_util;
 +                              int sg_busy_energy, sg_idle_energy;
 +                              int cap_idx, idle_idx;
 +
 +                              if (sg_shared_cap && sg_shared_cap->group_weight >= sg->group_weight)
 +                                      eenv->sg_cap = sg_shared_cap;
 +                              else
 +                                      eenv->sg_cap = sg;
 +
 +                              cap_idx = find_new_capacity(eenv, sg->sge);
 +
 +                              if (sg->group_weight == 1) {
 +                                      /* Remove capacity of src CPU (before task move) */
 +                                      if (eenv->util_delta == 0 &&
 +                                          cpumask_test_cpu(eenv->src_cpu, sched_group_cpus(sg))) {
 +                                              eenv->cap.before = sg->sge->cap_states[cap_idx].cap;
 +                                              eenv->cap.delta -= eenv->cap.before;
 +                                      }
 +                                      /* Add capacity of dst CPU  (after task move) */
 +                                      if (eenv->util_delta != 0 &&
 +                                          cpumask_test_cpu(eenv->dst_cpu, sched_group_cpus(sg))) {
 +                                              eenv->cap.after = sg->sge->cap_states[cap_idx].cap;
 +                                              eenv->cap.delta += eenv->cap.after;
 +                                      }
 +                              }
 +
 +                              idle_idx = group_idle_state(sg);
 +                              group_util = group_norm_util(eenv, sg);
 +                              sg_busy_energy = (group_util * sg->sge->cap_states[cap_idx].power)
 +                                                              >> SCHED_CAPACITY_SHIFT;
 +                              sg_idle_energy = ((SCHED_LOAD_SCALE-group_util)
 +                                                              * sg->sge->idle_states[idle_idx].power)
 +                                                              >> SCHED_CAPACITY_SHIFT;
 +
 +                              total_energy += sg_busy_energy + sg_idle_energy;
 +
 +                              if (!sd->child)
 +                                      cpumask_xor(&visit_cpus, &visit_cpus, sched_group_cpus(sg));
 +
 +                              if (cpumask_equal(sched_group_cpus(sg), sched_group_cpus(eenv->sg_top)))
 +                                      goto next_cpu;
 +
 +                      } while (sg = sg->next, sg != sd->groups);
 +              }
 +next_cpu:
 +              cpumask_clear_cpu(cpu, &visit_cpus);
 +              continue;
 +      }
 +
 +      eenv->energy = total_energy;
 +      return 0;
 +}
 +
 +static inline bool cpu_in_sg(struct sched_group *sg, int cpu)
 +{
 +      return cpu != -1 && cpumask_test_cpu(cpu, sched_group_cpus(sg));
 +}
 +
 +/*
 + * energy_diff(): Estimate the energy impact of changing the utilization
 + * distribution. eenv specifies the change: utilisation amount, source, and
 + * destination cpu. Source or destination cpu may be -1 in which case the
 + * utilization is removed from or added to the system (e.g. task wake-up). If
 + * both are specified, the utilization is migrated.
 + */
 +static inline int __energy_diff(struct energy_env *eenv)
 +{
 +      struct sched_domain *sd;
 +      struct sched_group *sg;
 +      int sd_cpu = -1, energy_before = 0, energy_after = 0;
 +
 +      struct energy_env eenv_before = {
 +              .util_delta     = 0,
 +              .src_cpu        = eenv->src_cpu,
 +              .dst_cpu        = eenv->dst_cpu,
 +              .nrg            = { 0, 0, 0, 0},
 +              .cap            = { 0, 0, 0 },
 +      };
 +
 +      if (eenv->src_cpu == eenv->dst_cpu)
 +              return 0;
 +
 +      sd_cpu = (eenv->src_cpu != -1) ? eenv->src_cpu : eenv->dst_cpu;
 +      sd = rcu_dereference(per_cpu(sd_ea, sd_cpu));
 +
 +      if (!sd)
 +              return 0; /* Error */
 +
 +      sg = sd->groups;
 +
 +      do {
 +              if (cpu_in_sg(sg, eenv->src_cpu) || cpu_in_sg(sg, eenv->dst_cpu)) {
 +                      eenv_before.sg_top = eenv->sg_top = sg;
 +
 +                      if (sched_group_energy(&eenv_before))
 +                              return 0; /* Invalid result abort */
 +                      energy_before += eenv_before.energy;
 +
 +                      /* Keep track of SRC cpu (before) capacity */
 +                      eenv->cap.before = eenv_before.cap.before;
 +                      eenv->cap.delta = eenv_before.cap.delta;
 +
 +                      if (sched_group_energy(eenv))
 +                              return 0; /* Invalid result abort */
 +                      energy_after += eenv->energy;
 +              }
 +      } while (sg = sg->next, sg != sd->groups);
 +
 +      eenv->nrg.before = energy_before;
 +      eenv->nrg.after = energy_after;
 +      eenv->nrg.diff = eenv->nrg.after - eenv->nrg.before;
 +      eenv->payoff = 0;
 +
 +      trace_sched_energy_diff(eenv->task,
 +                      eenv->src_cpu, eenv->dst_cpu, eenv->util_delta,
 +                      eenv->nrg.before, eenv->nrg.after, eenv->nrg.diff,
 +                      eenv->cap.before, eenv->cap.after, eenv->cap.delta,
 +                      eenv->nrg.delta, eenv->payoff);
 +
 +      return eenv->nrg.diff;
 +}
 +
 +#ifdef CONFIG_SCHED_TUNE
 +
 +struct target_nrg schedtune_target_nrg;
 +
 +/*
 + * System energy normalization
 + * Returns the normalized value, in the range [0..SCHED_LOAD_SCALE],
 + * corresponding to the specified energy variation.
 + */
 +static inline int
 +normalize_energy(int energy_diff)
 +{
 +      u32 normalized_nrg;
 +#ifdef CONFIG_SCHED_DEBUG
 +      int max_delta;
 +
 +      /* Check for boundaries */
 +      max_delta  = schedtune_target_nrg.max_power;
 +      max_delta -= schedtune_target_nrg.min_power;
 +      WARN_ON(abs(energy_diff) >= max_delta);
 +#endif
 +
 +      /* Do scaling using positive numbers to increase the range */
 +      normalized_nrg = (energy_diff < 0) ? -energy_diff : energy_diff;
 +
 +      /* Scale by energy magnitude */
 +      normalized_nrg <<= SCHED_LOAD_SHIFT;
 +
 +      /* Normalize on max energy for target platform */
 +      normalized_nrg = reciprocal_divide(
 +                      normalized_nrg, schedtune_target_nrg.rdiv);
 +
 +      return (energy_diff < 0) ? -normalized_nrg : normalized_nrg;
 +}
 +
 +static inline int
 +energy_diff(struct energy_env *eenv)
 +{
 +      int boost = schedtune_task_boost(eenv->task);
 +      int nrg_delta;
 +
 +      /* Conpute "absolute" energy diff */
 +      __energy_diff(eenv);
 +
 +      /* Return energy diff when boost margin is 0 */
 +      if (boost == 0)
 +              return eenv->nrg.diff;
 +
 +      /* Compute normalized energy diff */
 +      nrg_delta = normalize_energy(eenv->nrg.diff);
 +      eenv->nrg.delta = nrg_delta;
 +
 +      eenv->payoff = schedtune_accept_deltas(
 +                      eenv->nrg.delta,
 +                      eenv->cap.delta,
 +                      eenv->task);
 +
 +      /*
 +       * When SchedTune is enabled, the energy_diff() function will return
 +       * the computed energy payoff value. Since the energy_diff() return
 +       * value is expected to be negative by its callers, this evaluation
 +       * function return a negative value each time the evaluation return a
 +       * positive payoff, which is the condition for the acceptance of
 +       * a scheduling decision
 +       */
 +      return -eenv->payoff;
 +}
 +#else /* CONFIG_SCHED_TUNE */
 +#define energy_diff(eenv) __energy_diff(eenv)
 +#endif
 +
  /*
   * Detect M:N waker/wakee relationships via a switching-frequency heuristic.
   * A waker of many should wake a different task than the one last awakened
@@@ -5283,160 -4779,6 +5302,160 @@@ static int wake_affine(struct sched_dom
        return 1;
  }
  
 +static inline unsigned long task_util(struct task_struct *p)
 +{
 +#ifdef CONFIG_SCHED_WALT
 +      if (!walt_disabled && sysctl_sched_use_walt_task_util) {
 +              unsigned long demand = p->ravg.demand;
 +              return (demand << 10) / walt_ravg_window;
 +      }
 +#endif
 +      return p->se.avg.util_avg;
 +}
 +
 +unsigned int capacity_margin = 1280; /* ~20% margin */
 +
 +static inline unsigned long boosted_task_util(struct task_struct *task);
 +
 +static inline bool __task_fits(struct task_struct *p, int cpu, int util)
 +{
 +      unsigned long capacity = capacity_of(cpu);
 +
 +      util += boosted_task_util(p);
 +
 +      return (capacity * 1024) > (util * capacity_margin);
 +}
 +
 +static inline bool task_fits_max(struct task_struct *p, int cpu)
 +{
 +      unsigned long capacity = capacity_of(cpu);
 +      unsigned long max_capacity = cpu_rq(cpu)->rd->max_cpu_capacity.val;
 +
 +      if (capacity == max_capacity)
 +              return true;
 +
 +      if (capacity * capacity_margin > max_capacity * 1024)
 +              return true;
 +
 +      return __task_fits(p, cpu, 0);
 +}
 +
 +static inline bool task_fits_spare(struct task_struct *p, int cpu)
 +{
 +      return __task_fits(p, cpu, cpu_util(cpu));
 +}
 +
 +static bool cpu_overutilized(int cpu)
 +{
 +      return (capacity_of(cpu) * 1024) < (cpu_util(cpu) * capacity_margin);
 +}
 +
 +#ifdef CONFIG_SCHED_TUNE
 +
 +static long
 +schedtune_margin(unsigned long signal, long boost)
 +{
 +      long long margin = 0;
 +
 +      /*
 +       * Signal proportional compensation (SPC)
 +       *
 +       * The Boost (B) value is used to compute a Margin (M) which is
 +       * proportional to the complement of the original Signal (S):
 +       *   M = B * (SCHED_LOAD_SCALE - S), if B is positive
 +       *   M = B * S, if B is negative
 +       * The obtained M could be used by the caller to "boost" S.
 +       */
 +      if (boost >= 0) {
 +              margin  = SCHED_LOAD_SCALE - signal;
 +              margin *= boost;
 +      } else
 +              margin = -signal * boost;
 +      /*
 +       * Fast integer division by constant:
 +       *  Constant   :                 (C) = 100
 +       *  Precision  : 0.1%            (P) = 0.1
 +       *  Reference  : C * 100 / P     (R) = 100000
 +       *
 +       * Thus:
 +       *  Shift bits : ceil(log(R,2))  (S) = 17
 +       *  Mult const : round(2^S/C)    (M) = 1311
 +       *
 +       *
 +       */
 +      margin  *= 1311;
 +      margin >>= 17;
 +
 +      if (boost < 0)
 +              margin *= -1;
 +      return margin;
 +}
 +
 +static inline int
 +schedtune_cpu_margin(unsigned long util, int cpu)
 +{
 +      int boost = schedtune_cpu_boost(cpu);
 +
 +      if (boost == 0)
 +              return 0;
 +
 +      return schedtune_margin(util, boost);
 +}
 +
 +static inline long
 +schedtune_task_margin(struct task_struct *task)
 +{
 +      int boost = schedtune_task_boost(task);
 +      unsigned long util;
 +      long margin;
 +
 +      if (boost == 0)
 +              return 0;
 +
 +      util = task_util(task);
 +      margin = schedtune_margin(util, boost);
 +
 +      return margin;
 +}
 +
 +#else /* CONFIG_SCHED_TUNE */
 +
 +static inline int
 +schedtune_cpu_margin(unsigned long util, int cpu)
 +{
 +      return 0;
 +}
 +
 +static inline int
 +schedtune_task_margin(struct task_struct *task)
 +{
 +      return 0;
 +}
 +
 +#endif /* CONFIG_SCHED_TUNE */
 +
 +static inline unsigned long
 +boosted_cpu_util(int cpu)
 +{
 +      unsigned long util = cpu_util(cpu);
 +      long margin = schedtune_cpu_margin(util, cpu);
 +
 +      trace_sched_boost_cpu(cpu, util, margin);
 +
 +      return util + margin;
 +}
 +
 +static inline unsigned long
 +boosted_task_util(struct task_struct *task)
 +{
 +      unsigned long util = task_util(task);
 +      long margin = schedtune_task_margin(task);
 +
 +      trace_sched_boost_task(task, util, margin);
 +
 +      return util + margin;
 +}
 +
  /*
   * find_idlest_group finds and returns the least busy CPU group within the
   * domain.
@@@ -5446,10 -4788,7 +5465,10 @@@ find_idlest_group(struct sched_domain *
                  int this_cpu, int sd_flag)
  {
        struct sched_group *idlest = NULL, *group = sd->groups;
 +      struct sched_group *fit_group = NULL, *spare_group = NULL;
        unsigned long min_load = ULONG_MAX, this_load = 0;
 +      unsigned long fit_capacity = ULONG_MAX;
 +      unsigned long max_spare_capacity = capacity_margin - SCHED_LOAD_SCALE;
        int load_idx = sd->forkexec_idx;
        int imbalance = 100 + (sd->imbalance_pct-100)/2;
  
                load_idx = sd->wake_idx;
  
        do {
 -              unsigned long load, avg_load;
 +              unsigned long load, avg_load, spare_capacity;
                int local_group;
                int i;
  
                                load = target_load(i, load_idx);
  
                        avg_load += load;
 +
 +                      /*
 +                       * Look for most energy-efficient group that can fit
 +                       * that can fit the task.
 +                       */
 +                      if (capacity_of(i) < fit_capacity && task_fits_spare(p, i)) {
 +                              fit_capacity = capacity_of(i);
 +                              fit_group = group;
 +                      }
 +
 +                      /*
 +                       * Look for group which has most spare capacity on a
 +                       * single cpu.
 +                       */
 +                      spare_capacity = capacity_of(i) - cpu_util(i);
 +                      if (spare_capacity > max_spare_capacity) {
 +                              max_spare_capacity = spare_capacity;
 +                              spare_group = group;
 +                      }
                }
  
                /* Adjust by relative CPU capacity of the group */
                }
        } while (group = group->next, group != sd->groups);
  
 +      if (fit_group)
 +              return fit_group;
 +
 +      if (spare_group)
 +              return spare_group;
 +
        if (!idlest || 100*this_load < imbalance*min_load)
                return NULL;
        return idlest;
@@@ -5538,7 -4852,7 +5557,7 @@@ find_idlest_cpu(struct sched_group *gro
  
        /* Traverse only the allowed CPUs */
        for_each_cpu_and(i, sched_group_cpus(group), tsk_cpus_allowed(p)) {
 -              if (idle_cpu(i)) {
 +              if (task_fits_spare(p, i)) {
                        struct rq *rq = cpu_rq(i);
                        struct cpuidle_state *idle = idle_get_state(rq);
                        if (idle && idle->exit_latency < min_exit_latency) {
                                min_exit_latency = idle->exit_latency;
                                latest_idle_timestamp = rq->idle_stamp;
                                shallowest_idle_cpu = i;
 -                      } else if ((!idle || idle->exit_latency == min_exit_latency) &&
 +                      } else if (idle_cpu(i) &&
 +                                 (!idle || idle->exit_latency == min_exit_latency) &&
                                   rq->idle_stamp > latest_idle_timestamp) {
                                /*
                                 * If equal or no active idle state, then
                                 */
                                latest_idle_timestamp = rq->idle_stamp;
                                shallowest_idle_cpu = i;
 +                      } else if (shallowest_idle_cpu == -1) {
 +                              /*
 +                               * If we haven't found an idle CPU yet
 +                               * pick a non-idle one that can fit the task as
 +                               * fallback.
 +                               */
 +                              shallowest_idle_cpu = i;
                        }
                } else if (shallowest_idle_cpu == -1) {
                        load = weighted_cpuload(i);
@@@ -5588,20 -4894,15 +5607,20 @@@ static int select_idle_sibling(struct t
        struct sched_domain *sd;
        struct sched_group *sg;
        int i = task_cpu(p);
 +      int best_idle = -1;
 +      int best_idle_cstate = -1;
 +      int best_idle_capacity = INT_MAX;
  
 -      if (idle_cpu(target))
 -              return target;
 +      if (!sysctl_sched_cstate_aware) {
 +              if (idle_cpu(target))
 +                      return target;
  
 -      /*
 -       * If the prevous cpu is cache affine and idle, don't be stupid.
 -       */
 -      if (i != target && cpus_share_cache(i, target) && idle_cpu(i))
 -              return i;
 +              /*
 +               * If the prevous cpu is cache affine and idle, don't be stupid.
 +               */
 +              if (i != target && cpus_share_cache(i, target) && idle_cpu(i))
 +                      return i;
 +      }
  
        /*
         * Otherwise, iterate the domains and find an elegible idle cpu.
                                                tsk_cpus_allowed(p)))
                                goto next;
  
 -                      for_each_cpu(i, sched_group_cpus(sg)) {
 -                              if (i == target || !idle_cpu(i))
 -                                      goto next;
 -                      }
 +                      if (sysctl_sched_cstate_aware) {
 +                              for_each_cpu_and(i, tsk_cpus_allowed(p), sched_group_cpus(sg)) {
 +                                      struct rq *rq = cpu_rq(i);
 +                                      int idle_idx = idle_get_state_idx(rq);
 +                                      unsigned long new_usage = boosted_task_util(p);
 +                                      unsigned long capacity_orig = capacity_orig_of(i);
 +                                      if (new_usage > capacity_orig || !idle_cpu(i))
 +                                              goto next;
 +
 +                                      if (i == target && new_usage <= capacity_curr_of(target))
 +                                              return target;
 +
 +                                      if (best_idle < 0 || (idle_idx < best_idle_cstate && capacity_orig <= best_idle_capacity)) {
 +                                              best_idle = i;
 +                                              best_idle_cstate = idle_idx;
 +                                              best_idle_capacity = capacity_orig;
 +                                      }
 +                              }
 +                      } else {
 +                              for_each_cpu(i, sched_group_cpus(sg)) {
 +                                      if (i == target || !idle_cpu(i))
 +                                              goto next;
 +                              }
  
 -                      target = cpumask_first_and(sched_group_cpus(sg),
 +                              target = cpumask_first_and(sched_group_cpus(sg),
                                        tsk_cpus_allowed(p));
 -                      goto done;
 +                              goto done;
 +                      }
  next:
                        sg = sg->next;
                } while (sg != sd->groups);
        }
 +      if (best_idle > 0)
 +              target = best_idle;
 +
  done:
        return target;
  }
  
 -/*
 - * cpu_util returns the amount of capacity of a CPU that is used by CFS
 - * tasks. The unit of the return value must be the one of capacity so we can
 - * compare the utilization with the capacity of the CPU that is available for
 - * CFS task (ie cpu_capacity).
 - *
 - * cfs_rq.avg.util_avg is the sum of running time of runnable tasks plus the
 - * recent utilization of currently non-runnable tasks on a CPU. It represents
 - * the amount of utilization of a CPU in the range [0..capacity_orig] where
 - * capacity_orig is the cpu_capacity available at the highest frequency
 - * (arch_scale_freq_capacity()).
 - * The utilization of a CPU converges towards a sum equal to or less than the
 - * current capacity (capacity_curr <= capacity_orig) of the CPU because it is
 - * the running time on this CPU scaled by capacity_curr.
 - *
 - * Nevertheless, cfs_rq.avg.util_avg can be higher than capacity_curr or even
 - * higher than capacity_orig because of unfortunate rounding in
 - * cfs.avg.util_avg or just after migrating tasks and new task wakeups until
 - * the average stabilizes with the new running time. We need to check that the
 - * utilization stays within the range of [0..capacity_orig] and cap it if
 - * necessary. Without utilization capping, a group could be seen as overloaded
 - * (CPU0 utilization at 121% + CPU1 utilization at 80%) whereas CPU1 has 20% of
 - * available capacity. We allow utilization to overshoot capacity_curr (but not
 - * capacity_orig) as it useful for predicting the capacity required after task
 - * migrations (scheduler-driven DVFS).
 - */
 -static int cpu_util(int cpu)
 +static inline int find_best_target(struct task_struct *p, bool boosted, bool prefer_idle)
  {
 -      unsigned long util = cpu_rq(cpu)->cfs.avg.util_avg;
 -      unsigned long capacity = capacity_orig_of(cpu);
 +      int iter_cpu;
 +      int target_cpu = -1;
 +      int target_util = 0;
 +      int backup_capacity = 0;
 +      int best_idle_cpu = -1;
 +      int best_idle_cstate = INT_MAX;
 +      int backup_cpu = -1;
 +      unsigned long task_util_boosted, new_util;
 +
 +      task_util_boosted = boosted_task_util(p);
 +      for (iter_cpu = 0; iter_cpu < NR_CPUS; iter_cpu++) {
 +              int cur_capacity;
 +              struct rq *rq;
 +              int idle_idx;
 +
 +              /*
 +               * Iterate from higher cpus for boosted tasks.
 +               */
 +              int i = boosted ? NR_CPUS-iter_cpu-1 : iter_cpu;
 +
 +              if (!cpu_online(i) || !cpumask_test_cpu(i, tsk_cpus_allowed(p)))
 +                      continue;
 +
 +              /*
 +               * p's blocked utilization is still accounted for on prev_cpu
 +               * so prev_cpu will receive a negative bias due to the double
 +               * accounting. However, the blocked utilization may be zero.
 +               */
 +              new_util = cpu_util(i) + task_util_boosted;
 +
 +              /*
 +               * Ensure minimum capacity to grant the required boost.
 +               * The target CPU can be already at a capacity level higher
 +               * than the one required to boost the task.
 +               */
 +              if (new_util > capacity_orig_of(i))
 +                      continue;
 +
 +#ifdef CONFIG_SCHED_WALT
 +              if (walt_cpu_high_irqload(i))
 +                      continue;
 +#endif
 +              /*
 +               * Unconditionally favoring tasks that prefer idle cpus to
 +               * improve latency.
 +               */
 +              if (idle_cpu(i) && prefer_idle) {
 +                      if (best_idle_cpu < 0)
 +                              best_idle_cpu = i;
 +                      continue;
 +              }
 +
 +              cur_capacity = capacity_curr_of(i);
 +              rq = cpu_rq(i);
 +              idle_idx = idle_get_state_idx(rq);
 +
 +              if (new_util < cur_capacity) {
 +                      if (cpu_rq(i)->nr_running) {
 +                              if (prefer_idle) {
 +                                      /* Find a target cpu with highest
 +                                       * utilization.
 +                                       */
 +                                      if (target_util == 0 ||
 +                                              target_util < new_util) {
 +                                              target_cpu = i;
 +                                              target_util = new_util;
 +                                      }
 +                              } else {
 +                                      /* Find a target cpu with lowest
 +                                       * utilization.
 +                                       */
 +                                      if (target_util == 0 ||
 +                                              target_util > new_util) {
 +                                              target_cpu = i;
 +                                              target_util = new_util;
 +                                      }
 +                              }
 +                      } else if (!prefer_idle) {
 +                              if (best_idle_cpu < 0 ||
 +                                      (sysctl_sched_cstate_aware &&
 +                                              best_idle_cstate > idle_idx)) {
 +                                      best_idle_cstate = idle_idx;
 +                                      best_idle_cpu = i;
 +                              }
 +                      }
 +              } else if (backup_capacity == 0 ||
 +                              backup_capacity > cur_capacity) {
 +                      // Find a backup cpu with least capacity.
 +                      backup_capacity = cur_capacity;
 +                      backup_cpu = i;
 +              }
 +      }
 +
 +      if (prefer_idle && best_idle_cpu >= 0)
 +              target_cpu = best_idle_cpu;
 +      else if (target_cpu < 0)
 +              target_cpu = best_idle_cpu >= 0 ? best_idle_cpu : backup_cpu;
 +
 +      return target_cpu;
 +}
 +
 +static int energy_aware_wake_cpu(struct task_struct *p, int target, int sync)
 +{
 +      struct sched_domain *sd;
 +      struct sched_group *sg, *sg_target;
 +      int target_max_cap = INT_MAX;
 +      int target_cpu = task_cpu(p);
 +      unsigned long task_util_boosted, new_util;
 +      int i;
 +
 +      if (sysctl_sched_sync_hint_enable && sync) {
 +              int cpu = smp_processor_id();
 +              cpumask_t search_cpus;
 +              cpumask_and(&search_cpus, tsk_cpus_allowed(p), cpu_online_mask);
 +              if (cpumask_test_cpu(cpu, &search_cpus))
 +                      return cpu;
 +      }
 +
 +      sd = rcu_dereference(per_cpu(sd_ea, task_cpu(p)));
 +
 +      if (!sd)
 +              return target;
 +
 +      sg = sd->groups;
 +      sg_target = sg;
 +
 +      if (sysctl_sched_is_big_little) {
 +
 +              /*
 +               * Find group with sufficient capacity. We only get here if no cpu is
 +               * overutilized. We may end up overutilizing a cpu by adding the task,
 +               * but that should not be any worse than select_idle_sibling().
 +               * load_balance() should sort it out later as we get above the tipping
 +               * point.
 +               */
 +              do {
 +                      /* Assuming all cpus are the same in group */
 +                      int max_cap_cpu = group_first_cpu(sg);
 +
 +                      /*
 +                       * Assume smaller max capacity means more energy-efficient.
 +                       * Ideally we should query the energy model for the right
 +                       * answer but it easily ends up in an exhaustive search.
 +                       */
 +                      if (capacity_of(max_cap_cpu) < target_max_cap &&
 +                          task_fits_max(p, max_cap_cpu)) {
 +                              sg_target = sg;
 +                              target_max_cap = capacity_of(max_cap_cpu);
 +                      }
 +              } while (sg = sg->next, sg != sd->groups);
  
 -      return (util >= capacity) ? capacity : util;
 +              task_util_boosted = boosted_task_util(p);
 +              /* Find cpu with sufficient capacity */
 +              for_each_cpu_and(i, tsk_cpus_allowed(p), sched_group_cpus(sg_target)) {
 +                      /*
 +                       * p's blocked utilization is still accounted for on prev_cpu
 +                       * so prev_cpu will receive a negative bias due to the double
 +                       * accounting. However, the blocked utilization may be zero.
 +                       */
 +                      new_util = cpu_util(i) + task_util_boosted;
 +
 +                      /*
 +                       * Ensure minimum capacity to grant the required boost.
 +                       * The target CPU can be already at a capacity level higher
 +                       * than the one required to boost the task.
 +                       */
 +                      if (new_util > capacity_orig_of(i))
 +                              continue;
 +
 +                      if (new_util < capacity_curr_of(i)) {
 +                              target_cpu = i;
 +                              if (cpu_rq(i)->nr_running)
 +                                      break;
 +                      }
 +
 +                      /* cpu has capacity at higher OPP, keep it as fallback */
 +                      if (target_cpu == task_cpu(p))
 +                              target_cpu = i;
 +              }
 +      } else {
 +              /*
 +               * Find a cpu with sufficient capacity
 +               */
 +#ifdef CONFIG_CGROUP_SCHEDTUNE
 +              bool boosted = schedtune_task_boost(p) > 0;
 +              bool prefer_idle = schedtune_prefer_idle(p) > 0;
 +#else
 +              bool boosted = 0;
 +              bool prefer_idle = 0;
 +#endif
 +              int tmp_target = find_best_target(p, boosted, prefer_idle);
 +              if (tmp_target >= 0) {
 +                      target_cpu = tmp_target;
 +                      if ((boosted || prefer_idle) && idle_cpu(target_cpu))
 +                              return target_cpu;
 +              }
 +      }
 +
 +      if (target_cpu != task_cpu(p)) {
 +              struct energy_env eenv = {
 +                      .util_delta     = task_util(p),
 +                      .src_cpu        = task_cpu(p),
 +                      .dst_cpu        = target_cpu,
 +                      .task           = p,
 +              };
 +
 +              /* Not enough spare capacity on previous cpu */
 +              if (cpu_overutilized(task_cpu(p)))
 +                      return target_cpu;
 +
 +              if (energy_diff(&eenv) >= 0)
 +                      return task_cpu(p);
 +      }
 +
 +      return target_cpu;
  }
  
  /*
@@@ -5894,9 -4987,7 +5913,9 @@@ select_task_rq_fair(struct task_struct 
        int sync = wake_flags & WF_SYNC;
  
        if (sd_flag & SD_BALANCE_WAKE)
 -              want_affine = !wake_wide(p) && cpumask_test_cpu(cpu, tsk_cpus_allowed(p));
 +              want_affine = (!wake_wide(p) && task_fits_max(p, cpu) &&
 +                            cpumask_test_cpu(cpu, tsk_cpus_allowed(p))) ||
 +                            energy_aware();
  
        rcu_read_lock();
        for_each_domain(cpu, tmp) {
        }
  
        if (!sd) {
 -              if (sd_flag & SD_BALANCE_WAKE) /* XXX always ? */
 +              if (energy_aware() && !cpu_rq(cpu)->rd->overutilized)
 +                      new_cpu = energy_aware_wake_cpu(p, prev_cpu, sync);
 +              else if (sd_flag & SD_BALANCE_WAKE) /* XXX always ? */
                        new_cpu = select_idle_sibling(p, new_cpu);
  
        } else while (sd) {
@@@ -5998,8 -5087,6 +6017,8 @@@ static void task_dead_fair(struct task_
  {
        remove_entity_load_avg(&p->se);
  }
 +#else
 +#define task_fits_max(p, cpu) true
  #endif /* CONFIG_SMP */
  
  static unsigned long
@@@ -6246,8 -5333,6 +6265,8 @@@ again
        if (hrtick_enabled(rq))
                hrtick_start_fair(rq, p);
  
 +      rq->misfit_task = !task_fits_max(p, rq->cpu);
 +
        return p;
  simple:
        cfs_rq = &rq->cfs;
        if (hrtick_enabled(rq))
                hrtick_start_fair(rq, p);
  
 +      rq->misfit_task = !task_fits_max(p, rq->cpu);
 +
        return p;
  
  idle:
 +      rq->misfit_task = 0;
        /*
         * This is OK, because current is on_cpu, which avoids it being picked
         * for load-balance and preemption/IRQs are still disabled avoiding
@@@ -6487,13 -5569,6 +6506,13 @@@ static unsigned long __read_mostly max_
  
  enum fbq_type { regular, remote, all };
  
 +enum group_type {
 +      group_other = 0,
 +      group_misfit_task,
 +      group_imbalanced,
 +      group_overloaded,
 +};
 +
  #define LBF_ALL_PINNED        0x01
  #define LBF_NEED_BREAK        0x02
  #define LBF_DST_PINNED  0x04
@@@ -6512,7 -5587,6 +6531,7 @@@ struct lb_env 
        int                     new_dst_cpu;
        enum cpu_idle_type      idle;
        long                    imbalance;
 +      unsigned int            src_grp_nr_running;
        /* The set of CPUs under consideration for load-balancing */
        struct cpumask          *cpus;
  
        unsigned int            loop_max;
  
        enum fbq_type           fbq_type;
 +      enum group_type         busiest_group_type;
        struct list_head        tasks;
  };
  
@@@ -6705,9 -5778,7 +6724,9 @@@ static void detach_task(struct task_str
  
        deactivate_task(env->src_rq, p, 0);
        p->on_rq = TASK_ON_RQ_MIGRATING;
 +      double_lock_balance(env->src_rq, env->dst_rq);
        set_task_cpu(p, env->dst_cpu);
 +      double_unlock_balance(env->src_rq, env->dst_rq);
  }
  
  /*
@@@ -6852,10 -5923,6 +6871,10 @@@ static void attach_one_task(struct rq *
  {
        raw_spin_lock(&rq->lock);
        attach_task(rq, p);
 +      /*
 +       * We want to potentially raise target_cpu's OPP.
 +       */
 +      update_capacity_of(cpu_of(rq));
        raw_spin_unlock(&rq->lock);
  }
  
@@@ -6877,11 -5944,6 +6896,11 @@@ static void attach_tasks(struct lb_env 
                attach_task(env->dst_rq, p);
        }
  
 +      /*
 +       * We want to potentially raise env.dst_cpu's OPP.
 +       */
 +      update_capacity_of(env->dst_cpu);
 +
        raw_spin_unlock(&env->dst_rq->lock);
  }
  
@@@ -6977,6 -6039,12 +6996,6 @@@ static unsigned long task_h_load(struc
  
  /********** Helpers for find_busiest_group ************************/
  
 -enum group_type {
 -      group_other = 0,
 -      group_imbalanced,
 -      group_overloaded,
 -};
 -
  /*
   * sg_lb_stats - stats of a sched_group required for load_balancing
   */
@@@ -6992,7 -6060,6 +7011,7 @@@ struct sg_lb_stats 
        unsigned int group_weight;
        enum group_type group_type;
        int group_no_capacity;
 +      int group_misfit_task; /* A cpu has a task too big for its capacity */
  #ifdef CONFIG_NUMA_BALANCING
        unsigned int nr_numa_running;
        unsigned int nr_preferred_running;
@@@ -7084,58 -6151,19 +7103,58 @@@ static unsigned long scale_rt_capacity(
  
        used = div_u64(avg, total);
  
 +      /*
 +       * deadline bandwidth is defined at system level so we must
 +       * weight this bandwidth with the max capacity of the system.
 +       * As a reminder, avg_bw is 20bits width and
 +       * scale_cpu_capacity is 10 bits width
 +       */
 +      used += div_u64(rq->dl.avg_bw, arch_scale_cpu_capacity(NULL, cpu));
 +
        if (likely(used < SCHED_CAPACITY_SCALE))
                return SCHED_CAPACITY_SCALE - used;
  
        return 1;
  }
  
 +void init_max_cpu_capacity(struct max_cpu_capacity *mcc)
 +{
 +      raw_spin_lock_init(&mcc->lock);
 +      mcc->val = 0;
 +      mcc->cpu = -1;
 +}
 +
  static void update_cpu_capacity(struct sched_domain *sd, int cpu)
  {
        unsigned long capacity = arch_scale_cpu_capacity(sd, cpu);
        struct sched_group *sdg = sd->groups;
 +      struct max_cpu_capacity *mcc;
 +      unsigned long max_capacity;
 +      int max_cap_cpu;
 +      unsigned long flags;
  
        cpu_rq(cpu)->cpu_capacity_orig = capacity;
  
 +      mcc = &cpu_rq(cpu)->rd->max_cpu_capacity;
 +
 +      raw_spin_lock_irqsave(&mcc->lock, flags);
 +      max_capacity = mcc->val;
 +      max_cap_cpu = mcc->cpu;
 +
 +      if ((max_capacity > capacity && max_cap_cpu == cpu) ||
 +          (max_capacity < capacity)) {
 +              mcc->val = capacity;
 +              mcc->cpu = cpu;
 +#ifdef CONFIG_SCHED_DEBUG
 +              raw_spin_unlock_irqrestore(&mcc->lock, flags);
 +              printk_deferred(KERN_INFO "CPU%d: update max cpu_capacity %lu\n",
 +                              cpu, capacity);
 +              goto skip_unlock;
 +#endif
 +      }
 +      raw_spin_unlock_irqrestore(&mcc->lock, flags);
 +
 +skip_unlock: __attribute__ ((unused));
        capacity *= scale_rt_capacity(cpu);
        capacity >>= SCHED_CAPACITY_SHIFT;
  
  
        cpu_rq(cpu)->cpu_capacity = capacity;
        sdg->sgc->capacity = capacity;
 +      sdg->sgc->max_capacity = capacity;
  }
  
  void update_group_capacity(struct sched_domain *sd, int cpu)
  {
        struct sched_domain *child = sd->child;
        struct sched_group *group, *sdg = sd->groups;
 -      unsigned long capacity;
 +      unsigned long capacity, max_capacity;
        unsigned long interval;
  
        interval = msecs_to_jiffies(sd->balance_interval);
        }
  
        capacity = 0;
 +      max_capacity = 0;
  
        if (child->flags & SD_OVERLAP) {
                /*
                         */
                        if (unlikely(!rq->sd)) {
                                capacity += capacity_of(cpu);
 -                              continue;
 +                      } else {
 +                              sgc = rq->sd->groups->sgc;
 +                              capacity += sgc->capacity;
                        }
  
 -                      sgc = rq->sd->groups->sgc;
 -                      capacity += sgc->capacity;
 +                      max_capacity = max(capacity, max_capacity);
                }
        } else  {
                /*
  
                group = child->groups;
                do {
 -                      capacity += group->sgc->capacity;
 +                      struct sched_group_capacity *sgc = group->sgc;
 +
 +                      capacity += sgc->capacity;
 +                      max_capacity = max(sgc->max_capacity, max_capacity);
                        group = group->next;
                } while (group != child->groups);
        }
  
        sdg->sgc->capacity = capacity;
 +      sdg->sgc->max_capacity = max_capacity;
  }
  
  /*
@@@ -7308,18 -6329,6 +7327,18 @@@ group_is_overloaded(struct lb_env *env
        return false;
  }
  
 +
 +/*
 + * group_smaller_cpu_capacity: Returns true if sched_group sg has smaller
 + * per-cpu capacity than sched_group ref.
 + */
 +static inline bool
 +group_smaller_cpu_capacity(struct sched_group *sg, struct sched_group *ref)
 +{
 +      return sg->sgc->max_capacity + capacity_margin - SCHED_LOAD_SCALE <
 +                                                      ref->sgc->max_capacity;
 +}
 +
  static inline enum
  group_type group_classify(struct sched_group *group,
                          struct sg_lb_stats *sgs)
        if (sg_imbalanced(group))
                return group_imbalanced;
  
 +      if (sgs->group_misfit_task)
 +              return group_misfit_task;
 +
        return group_other;
  }
  
   * @local_group: Does group contain this_cpu.
   * @sgs: variable to hold the statistics for this group.
   * @overload: Indicate more than one runnable task for any CPU.
 + * @overutilized: Indicate overutilization for any CPU.
   */
  static inline void update_sg_lb_stats(struct lb_env *env,
                        struct sched_group *group, int load_idx,
                        int local_group, struct sg_lb_stats *sgs,
 -                      bool *overload)
 +                      bool *overload, bool *overutilized)
  {
        unsigned long load;
 -      int i;
 +      int i, nr_running;
  
        memset(sgs, 0, sizeof(*sgs));
  
                sgs->group_util += cpu_util(i);
                sgs->sum_nr_running += rq->cfs.h_nr_running;
  
 -              if (rq->nr_running > 1)
 +              nr_running = rq->nr_running;
 +              if (nr_running > 1)
                        *overload = true;
  
  #ifdef CONFIG_NUMA_BALANCING
                sgs->nr_preferred_running += rq->nr_preferred_running;
  #endif
                sgs->sum_weighted_load += weighted_cpuload(i);
 -              if (idle_cpu(i))
 +              /*
 +               * No need to call idle_cpu() if nr_running is not 0
 +               */
 +              if (!nr_running && idle_cpu(i))
                        sgs->idle_cpus++;
 +
 +              if (cpu_overutilized(i)) {
 +                      *overutilized = true;
 +                      if (!sgs->group_misfit_task && rq->misfit_task)
 +                              sgs->group_misfit_task = capacity_of(i);
 +              }
        }
  
        /* Adjust by relative CPU capacity of the group */
@@@ -7430,25 -6425,9 +7449,25 @@@ static bool update_sd_pick_busiest(stru
        if (sgs->group_type < busiest->group_type)
                return false;
  
 +      /*
 +       * Candidate sg doesn't face any serious load-balance problems
 +       * so don't pick it if the local sg is already filled up.
 +       */
 +      if (sgs->group_type == group_other &&
 +          !group_has_capacity(env, &sds->local_stat))
 +              return false;
 +
        if (sgs->avg_load <= busiest->avg_load)
                return false;
  
 +      /*
 +       * Candiate sg has no more than one task per cpu and has higher
 +       * per-cpu capacity. No reason to pull tasks to less capable cpus.
 +       */
 +      if (sgs->sum_nr_running <= sgs->group_weight &&
 +          group_smaller_cpu_capacity(sds->local, sg))
 +              return false;
 +
        /* This is the busiest node in its class. */
        if (!(env->sd->flags & SD_ASYM_PACKING))
                return true;
@@@ -7510,7 -6489,7 +7529,7 @@@ static inline void update_sd_lb_stats(s
        struct sched_group *sg = env->sd->groups;
        struct sg_lb_stats tmp_sgs;
        int load_idx, prefer_sibling = 0;
 -      bool overload = false;
 +      bool overload = false, overutilized = false;
  
        if (child && child->flags & SD_PREFER_SIBLING)
                prefer_sibling = 1;
                }
  
                update_sg_lb_stats(env, sg, load_idx, local_group, sgs,
 -                                              &overload);
 +                                              &overload, &overutilized);
  
                if (local_group)
                        goto next_group;
                        sgs->group_type = group_classify(sg, sgs);
                }
  
 +              /*
 +               * Ignore task groups with misfit tasks if local group has no
 +               * capacity or if per-cpu capacity isn't higher.
 +               */
 +              if (sgs->group_type == group_misfit_task &&
 +                  (!group_has_capacity(env, &sds->local_stat) ||
 +                   !group_smaller_cpu_capacity(sg, sds->local)))
 +                      sgs->group_type = group_other;
 +
                if (update_sd_pick_busiest(env, sds, sg, sgs)) {
                        sds->busiest = sg;
                        sds->busiest_stat = *sgs;
@@@ -7579,23 -6549,10 +7598,23 @@@ next_group
        if (env->sd->flags & SD_NUMA)
                env->fbq_type = fbq_classify_group(&sds->busiest_stat);
  
 +      env->src_grp_nr_running = sds->busiest_stat.sum_nr_running;
 +
        if (!env->sd->parent) {
                /* update overload indicator if we are at root domain */
                if (env->dst_rq->rd->overload != overload)
                        env->dst_rq->rd->overload = overload;
 +
 +              /* Update over-utilization (tipping point, U >= 0) indicator */
 +              if (env->dst_rq->rd->overutilized != overutilized) {
 +                      env->dst_rq->rd->overutilized = overutilized;
 +                      trace_sched_overutilized(overutilized);
 +              }
 +      } else {
 +              if (!env->dst_rq->rd->overutilized && overutilized) {
 +                      env->dst_rq->rd->overutilized = true;
 +                      trace_sched_overutilized(true);
 +              }
        }
  
  }
@@@ -7744,22 -6701,6 +7763,22 @@@ static inline void calculate_imbalance(
         */
        if (busiest->avg_load <= sds->avg_load ||
            local->avg_load >= sds->avg_load) {
 +              /* Misfitting tasks should be migrated in any case */
 +              if (busiest->group_type == group_misfit_task) {
 +                      env->imbalance = busiest->group_misfit_task;
 +                      return;
 +              }
 +
 +              /*
 +               * Busiest group is overloaded, local is not, use the spare
 +               * cycles to maximize throughput
 +               */
 +              if (busiest->group_type == group_overloaded &&
 +                  local->group_type <= group_misfit_task) {
 +                      env->imbalance = busiest->load_per_task;
 +                      return;
 +              }
 +
                env->imbalance = 0;
                return fix_small_imbalance(env, sds);
        }
                (sds->avg_load - local->avg_load) * local->group_capacity
        ) / SCHED_CAPACITY_SCALE;
  
 +      /* Boost imbalance to allow misfit task to be balanced. */
 +      if (busiest->group_type == group_misfit_task)
 +              env->imbalance = max_t(long, env->imbalance,
 +                                   busiest->group_misfit_task);
 +
        /*
         * if *imbalance is less than the average load per runnable task
         * there is no guarantee that any tasks will be moved so we'll have
@@@ -7839,10 -6775,6 +7858,10 @@@ static struct sched_group *find_busiest
         * this level.
         */
        update_sd_lb_stats(env, &sds);
 +
 +      if (energy_aware() && !env->dst_rq->rd->overutilized)
 +              goto out_balanced;
 +
        local = &sds.local_stat;
        busiest = &sds.busiest_stat;
  
            busiest->group_no_capacity)
                goto force_balance;
  
 +      /* Misfitting tasks should be dealt with regardless of the avg load */
 +      if (busiest->group_type == group_misfit_task) {
 +              goto force_balance;
 +      }
 +
        /*
         * If the local group is busier than the selected busiest group
         * don't try and pull any tasks.
                 * might end up to just move the imbalance on another group
                 */
                if ((busiest->group_type != group_overloaded) &&
 -                              (local->idle_cpus <= (busiest->idle_cpus + 1)))
 +                  (local->idle_cpus <= (busiest->idle_cpus + 1)) &&
 +                  !group_smaller_cpu_capacity(sds.busiest, sds.local))
                        goto out_balanced;
        } else {
                /*
        }
  
  force_balance:
 +      env->busiest_group_type = busiest->group_type;
        /* Looks like there is an imbalance. Compute it */
        calculate_imbalance(env, &sds);
        return sds.busiest;
@@@ -7972,8 -6897,7 +7991,8 @@@ static struct rq *find_busiest_queue(st
                 */
  
                if (rq->nr_running == 1 && wl > env->imbalance &&
 -                  !check_cpu_capacity(rq, env->sd))
 +                  !check_cpu_capacity(rq, env->sd) &&
 +                  env->busiest_group_type != group_misfit_task)
                        continue;
  
                /*
@@@ -8034,13 -6958,6 +8053,13 @@@ static int need_active_balance(struct l
                        return 1;
        }
  
 +      if ((capacity_of(env->src_cpu) < capacity_of(env->dst_cpu)) &&
 +                              env->src_rq->cfs.h_nr_running == 1 &&
 +                              cpu_overutilized(env->src_cpu) &&
 +                              !cpu_overutilized(env->dst_cpu)) {
 +                      return 1;
 +      }
 +
        return unlikely(sd->nr_balance_failed > sd->cache_nice_tries+2);
  }
  
@@@ -8162,11 -7079,6 +8181,11 @@@ more_balance
                 * ld_moved     - cumulative load moved across iterations
                 */
                cur_ld_moved = detach_tasks(&env);
 +              /*
 +               * We want to potentially lower env.src_cpu's OPP.
 +               */
 +              if (cur_ld_moved)
 +                      update_capacity_of(env.src_cpu);
  
                /*
                 * We've detached some tasks from busiest_rq. Every
                 * excessive cache_hot migrations and active balances.
                 */
                if (idle != CPU_NEWLY_IDLE)
 -                      sd->nr_balance_failed++;
 +                      if (env.src_grp_nr_running > 1)
 +                              sd->nr_balance_failed++;
  
                if (need_active_balance(&env)) {
                        raw_spin_lock_irqsave(&busiest->lock, flags);
@@@ -8391,7 -7302,6 +8410,7 @@@ static int idle_balance(struct rq *this
        struct sched_domain *sd;
        int pulled_task = 0;
        u64 curr_cost = 0;
 +      long removed_util=0;
  
        idle_enter_fair(this_rq);
  
         */
        this_rq->idle_stamp = rq_clock(this_rq);
  
 -      if (this_rq->avg_idle < sysctl_sched_migration_cost ||
 -          !this_rq->rd->overload) {
 +      if (!energy_aware() &&
 +          (this_rq->avg_idle < sysctl_sched_migration_cost ||
 +           !this_rq->rd->overload)) {
                rcu_read_lock();
                sd = rcu_dereference_check_sched_domain(this_rq->sd);
                if (sd)
  
        raw_spin_unlock(&this_rq->lock);
  
 +      /*
 +       * If removed_util_avg is !0 we most probably migrated some task away
 +       * from this_cpu. In this case we might be willing to trigger an OPP
 +       * update, but we want to do so if we don't find anybody else to pull
 +       * here (we will trigger an OPP update with the pulled task's enqueue
 +       * anyway).
 +       *
 +       * Record removed_util before calling update_blocked_averages, and use
 +       * it below (before returning) to see if an OPP update is required.
 +       */
 +      removed_util = atomic_long_read(&(this_rq->cfs).removed_util_avg);
        update_blocked_averages(this_cpu);
        rcu_read_lock();
        for_each_domain(this_cpu, sd) {
        if (pulled_task) {
                idle_exit_fair(this_rq);
                this_rq->idle_stamp = 0;
 +      } else if (removed_util) {
 +              /*
 +               * No task pulled and someone has been migrated away.
 +               * Good case to trigger an OPP update.
 +               */
 +              update_capacity_of(this_cpu);
        }
  
        return pulled_task;
@@@ -8555,13 -7447,8 +8574,13 @@@ static int active_load_balance_cpu_stop
                schedstat_inc(sd, alb_count);
  
                p = detach_one_task(&env);
 -              if (p)
 +              if (p) {
                        schedstat_inc(sd, alb_pushed);
 +                      /*
 +                       * We want to potentially lower env.src_cpu's OPP.
 +                       */
 +                      update_capacity_of(env.src_cpu);
 +              }
                else
                        schedstat_inc(sd, alb_failed);
        }
@@@ -8941,13 -7828,12 +8960,13 @@@ static inline bool nohz_kick_needed(str
        if (time_before(now, nohz.next_balance))
                return false;
  
 -      if (rq->nr_running >= 2)
 +      if (rq->nr_running >= 2 &&
 +          (!energy_aware() || cpu_overutilized(cpu)))
                return true;
  
        rcu_read_lock();
        sd = rcu_dereference(per_cpu(sd_busy, cpu));
 -      if (sd) {
 +      if (sd && !energy_aware()) {
                sgc = sd->groups->sgc;
                nr_busy = atomic_read(&sgc->nr_busy_cpus);
  
@@@ -9053,16 -7939,6 +9072,16 @@@ static void task_tick_fair(struct rq *r
  
        if (static_branch_unlikely(&sched_numa_balancing))
                task_tick_numa(rq, curr);
 +
 +#ifdef CONFIG_SMP
 +      if (!rq->rd->overutilized && cpu_overutilized(task_cpu(curr))) {
 +              rq->rd->overutilized = true;
 +              trace_sched_overutilized(true);
 +      }
 +
 +      rq->misfit_task = !task_fits_max(curr, rq->cpu);
 +#endif
 +
  }
  
  /*
diff --combined kernel/sched/sched.h
index 780522c65cea170b640ede23dc977f60147c130f,4e5db65d1aab17c1e61e8b9d39384afcf404f54b..0386a2cdb0089f6638322952f619a8672ac5ffe6
@@@ -410,10 -410,6 +410,10 @@@ struct cfs_rq 
        struct list_head leaf_cfs_rq_list;
        struct task_group *tg;  /* group that "owns" this runqueue */
  
 +#ifdef CONFIG_SCHED_WALT
 +      u64 cumulative_runnable_avg;
 +#endif
 +
  #ifdef CONFIG_CFS_BANDWIDTH
        int runtime_enabled;
        u64 runtime_expires;
  
        u64 throttled_clock, throttled_clock_task;
        u64 throttled_clock_task_time;
-       int throttled, throttle_count;
+       int throttled, throttle_count, throttle_uptodate;
        struct list_head throttled_list;
  #endif /* CONFIG_CFS_BANDWIDTH */
  #endif /* CONFIG_FAIR_GROUP_SCHED */
@@@ -510,18 -506,10 +510,18 @@@ struct dl_rq 
  #else
        struct dl_bw dl_bw;
  #endif
 +      /* This is the "average utilization" for this runqueue */
 +      s64 avg_bw;
  };
  
  #ifdef CONFIG_SMP
  
 +struct max_cpu_capacity {
 +      raw_spinlock_t lock;
 +      unsigned long val;
 +      int cpu;
 +};
 +
  /*
   * We add the notion of a root-domain which will be used to define per-domain
   * variables. Each exclusive cpuset essentially defines an island domain by
@@@ -540,9 -528,6 +540,9 @@@ struct root_domain 
        /* Indicate more than one runnable task for any CPU */
        bool overload;
  
 +      /* Indicate one or more cpus over-utilized (tipping point) */
 +      bool overutilized;
 +
        /*
         * The bit corresponding to a CPU gets set here if such CPU has more
         * than one runnable -deadline task (as it is below for RT tasks).
         */
        cpumask_var_t rto_mask;
        struct cpupri cpupri;
 +
 +      /* Maximum cpu capacity in the system. */
 +      struct max_cpu_capacity max_cpu_capacity;
  };
  
  extern struct root_domain def_root_domain;
@@@ -590,7 -572,6 +590,7 @@@ struct rq 
        #define CPU_LOAD_IDX_MAX 5
        unsigned long cpu_load[CPU_LOAD_IDX_MAX];
        unsigned long last_load_update_tick;
 +      unsigned int misfit_task;
  #ifdef CONFIG_NO_HZ_COMMON
        u64 nohz_stamp;
        unsigned long nohz_flags;
  #ifdef CONFIG_NO_HZ_FULL
        unsigned long last_sched_tick;
  #endif
 +
 +#ifdef CONFIG_CPU_QUIET
 +      /* time-based average load */
 +      u64 nr_last_stamp;
 +      u64 nr_running_integral;
 +      seqcount_t ave_seqcnt;
 +#endif
 +
        /* capture load from *all* tasks on this cpu: */
        struct load_weight load;
        unsigned long nr_load_updates;
        u64 max_idle_balance_cost;
  #endif
  
 +#ifdef CONFIG_SCHED_WALT
 +      /*
 +       * max_freq = user or thermal defined maximum
 +       * max_possible_freq = maximum supported by hardware
 +       */
 +      unsigned int cur_freq, max_freq, min_freq, max_possible_freq;
 +      struct cpumask freq_domain_cpumask;
 +
 +      u64 cumulative_runnable_avg;
 +      int efficiency; /* Differentiate cpus with different IPC capability */
 +      int load_scale_factor;
 +      int capacity;
 +      int max_possible_capacity;
 +      u64 window_start;
 +      u64 curr_runnable_sum;
 +      u64 prev_runnable_sum;
 +      u64 nt_curr_runnable_sum;
 +      u64 nt_prev_runnable_sum;
 +      u64 cur_irqload;
 +      u64 avg_irqload;
 +      u64 irqload_ts;
 +#endif /* CONFIG_SCHED_WALT */
 +
 +
  #ifdef CONFIG_IRQ_TIME_ACCOUNTING
        u64 prev_irq_time;
  #endif
  #ifdef CONFIG_CPU_IDLE
        /* Must be inspected within a rcu lock section */
        struct cpuidle_state *idle_state;
 +      int idle_state_idx;
  #endif
  };
  
@@@ -888,8 -836,6 +888,8 @@@ DECLARE_PER_CPU(int, sd_llc_id)
  DECLARE_PER_CPU(struct sched_domain *, sd_numa);
  DECLARE_PER_CPU(struct sched_domain *, sd_busy);
  DECLARE_PER_CPU(struct sched_domain *, sd_asym);
 +DECLARE_PER_CPU(struct sched_domain *, sd_ea);
 +DECLARE_PER_CPU(struct sched_domain *, sd_scs);
  
  struct sched_group_capacity {
        atomic_t ref;
         * CPU capacity of this group, SCHED_LOAD_SCALE being max capacity
         * for a single CPU.
         */
 -      unsigned int capacity;
 +      unsigned long capacity;
 +      unsigned long max_capacity; /* Max per-cpu capacity in group */
        unsigned long next_update;
        int imbalance; /* XXX unrelated to capacity but shared group state */
        /*
@@@ -915,7 -860,6 +915,7 @@@ struct sched_group 
  
        unsigned int group_weight;
        struct sched_group_capacity *sgc;
 +      const struct sched_group_energy *sge;
  
        /*
         * The CPUs this group covers.
@@@ -1219,7 -1163,6 +1219,7 @@@ static const u32 prio_to_wmult[40] = 
  #endif
  #define ENQUEUE_REPLENISH     0x08
  #define ENQUEUE_RESTORE       0x10
 +#define ENQUEUE_WAKEUP_NEW    0x20
  
  #define DEQUEUE_SLEEP         0x01
  #define DEQUEUE_SAVE          0x02
@@@ -1305,7 -1248,6 +1305,7 @@@ extern const struct sched_class idle_sc
  
  #ifdef CONFIG_SMP
  
 +extern void init_max_cpu_capacity(struct max_cpu_capacity *mcc);
  extern void update_group_capacity(struct sched_domain *sd, int cpu);
  
  extern void trigger_load_balance(struct rq *rq);
@@@ -1334,17 -1276,6 +1334,17 @@@ static inline struct cpuidle_state *idl
        WARN_ON(!rcu_read_lock_held());
        return rq->idle_state;
  }
 +
 +static inline void idle_set_state_idx(struct rq *rq, int idle_state_idx)
 +{
 +      rq->idle_state_idx = idle_state_idx;
 +}
 +
 +static inline int idle_get_state_idx(struct rq *rq)
 +{
 +      WARN_ON(!rcu_read_lock_held());
 +      return rq->idle_state_idx;
 +}
  #else
  static inline void idle_set_state(struct rq *rq,
                                  struct cpuidle_state *idle_state)
@@@ -1355,15 -1286,6 +1355,15 @@@ static inline struct cpuidle_state *idl
  {
        return NULL;
  }
 +
 +static inline void idle_set_state_idx(struct rq *rq, int idle_state_idx)
 +{
 +}
 +
 +static inline int idle_get_state_idx(struct rq *rq)
 +{
 +      return -1;
 +}
  #endif
  
  extern void sysrq_sched_debug_show(void);
@@@ -1388,7 -1310,7 +1388,7 @@@ unsigned long to_ratio(u64 period, u64 
  
  extern void init_entity_runnable_average(struct sched_entity *se);
  
 -static inline void add_nr_running(struct rq *rq, unsigned count)
 +static inline void __add_nr_running(struct rq *rq, unsigned count)
  {
        unsigned prev_nr = rq->nr_running;
  
        }
  }
  
 -static inline void sub_nr_running(struct rq *rq, unsigned count)
 +static inline void __sub_nr_running(struct rq *rq, unsigned count)
  {
        rq->nr_running -= count;
  }
  
 +#ifdef CONFIG_CPU_QUIET
 +#define NR_AVE_SCALE(x)               ((x) << FSHIFT)
 +static inline u64 do_nr_running_integral(struct rq *rq)
 +{
 +      s64 nr, deltax;
 +      u64 nr_running_integral = rq->nr_running_integral;
 +
 +      deltax = rq->clock_task - rq->nr_last_stamp;
 +      nr = NR_AVE_SCALE(rq->nr_running);
 +
 +      nr_running_integral += nr * deltax;
 +
 +      return nr_running_integral;
 +}
 +
 +static inline void add_nr_running(struct rq *rq, unsigned count)
 +{
 +      write_seqcount_begin(&rq->ave_seqcnt);
 +      rq->nr_running_integral = do_nr_running_integral(rq);
 +      rq->nr_last_stamp = rq->clock_task;
 +      __add_nr_running(rq, count);
 +      write_seqcount_end(&rq->ave_seqcnt);
 +}
 +
 +static inline void sub_nr_running(struct rq *rq, unsigned count)
 +{
 +      write_seqcount_begin(&rq->ave_seqcnt);
 +      rq->nr_running_integral = do_nr_running_integral(rq);
 +      rq->nr_last_stamp = rq->clock_task;
 +      __sub_nr_running(rq, count);
 +      write_seqcount_end(&rq->ave_seqcnt);
 +}
 +#else
 +#define add_nr_running __add_nr_running
 +#define sub_nr_running __sub_nr_running
 +#endif
 +
  static inline void rq_last_tick_reset(struct rq *rq)
  {
  #ifdef CONFIG_NO_HZ_FULL
@@@ -1530,146 -1415,10 +1530,146 @@@ unsigned long arch_scale_cpu_capacity(s
  }
  #endif
  
 +#ifdef CONFIG_SMP
 +static inline unsigned long capacity_of(int cpu)
 +{
 +      return cpu_rq(cpu)->cpu_capacity;
 +}
 +
 +static inline unsigned long capacity_orig_of(int cpu)
 +{
 +      return cpu_rq(cpu)->cpu_capacity_orig;
 +}
 +
 +extern unsigned int sysctl_sched_use_walt_cpu_util;
 +extern unsigned int walt_ravg_window;
 +extern unsigned int walt_disabled;
 +
 +/*
 + * cpu_util returns the amount of capacity of a CPU that is used by CFS
 + * tasks. The unit of the return value must be the one of capacity so we can
 + * compare the utilization with the capacity of the CPU that is available for
 + * CFS task (ie cpu_capacity).
 + *
 + * cfs_rq.avg.util_avg is the sum of running time of runnable tasks plus the
 + * recent utilization of currently non-runnable tasks on a CPU. It represents
 + * the amount of utilization of a CPU in the range [0..capacity_orig] where
 + * capacity_orig is the cpu_capacity available at the highest frequency
 + * (arch_scale_freq_capacity()).
 + * The utilization of a CPU converges towards a sum equal to or less than the
 + * current capacity (capacity_curr <= capacity_orig) of the CPU because it is
 + * the running time on this CPU scaled by capacity_curr.
 + *
 + * Nevertheless, cfs_rq.avg.util_avg can be higher than capacity_curr or even
 + * higher than capacity_orig because of unfortunate rounding in
 + * cfs.avg.util_avg or just after migrating tasks and new task wakeups until
 + * the average stabilizes with the new running time. We need to check that the
 + * utilization stays within the range of [0..capacity_orig] and cap it if
 + * necessary. Without utilization capping, a group could be seen as overloaded
 + * (CPU0 utilization at 121% + CPU1 utilization at 80%) whereas CPU1 has 20% of
 + * available capacity. We allow utilization to overshoot capacity_curr (but not
 + * capacity_orig) as it useful for predicting the capacity required after task
 + * migrations (scheduler-driven DVFS).
 + */
 +static inline unsigned long __cpu_util(int cpu, int delta)
 +{
 +      unsigned long util = cpu_rq(cpu)->cfs.avg.util_avg;
 +      unsigned long capacity = capacity_orig_of(cpu);
 +
 +#ifdef CONFIG_SCHED_WALT
 +      if (!walt_disabled && sysctl_sched_use_walt_cpu_util) {
 +              util = cpu_rq(cpu)->prev_runnable_sum << SCHED_LOAD_SHIFT;
 +              do_div(util, walt_ravg_window);
 +      }
 +#endif
 +      delta += util;
 +      if (delta < 0)
 +              return 0;
 +
 +      return (delta >= capacity) ? capacity : delta;
 +}
 +
 +static inline unsigned long cpu_util(int cpu)
 +{
 +      return __cpu_util(cpu, 0);
 +}
 +
 +#endif
 +
 +#ifdef CONFIG_CPU_FREQ_GOV_SCHED
 +#define capacity_max SCHED_CAPACITY_SCALE
 +extern unsigned int capacity_margin;
 +extern struct static_key __sched_freq;
 +
 +static inline bool sched_freq(void)
 +{
 +      return static_key_false(&__sched_freq);
 +}
 +
 +DECLARE_PER_CPU(struct sched_capacity_reqs, cpu_sched_capacity_reqs);
 +void update_cpu_capacity_request(int cpu, bool request);
 +
 +static inline void set_cfs_cpu_capacity(int cpu, bool request,
 +                                      unsigned long capacity)
 +{
 +      struct sched_capacity_reqs *scr = &per_cpu(cpu_sched_capacity_reqs, cpu);
 +
 +#ifdef CONFIG_SCHED_WALT
 +       if (!walt_disabled && sysctl_sched_use_walt_cpu_util) {
 +              int rtdl = scr->rt + scr->dl;
 +              /*
 +               * WALT tracks the utilization of a CPU considering the load
 +               * generated by all the scheduling classes.
 +               * Since the following call to:
 +               *    update_cpu_capacity
 +               * is already adding the RT and DL utilizations let's remove
 +               * these contributions from the WALT signal.
 +               */
 +              if (capacity > rtdl)
 +                      capacity -= rtdl;
 +              else
 +                      capacity = 0;
 +      }
 +#endif
 +      if (scr->cfs != capacity) {
 +              scr->cfs = capacity;
 +              update_cpu_capacity_request(cpu, request);
 +      }
 +}
 +
 +static inline void set_rt_cpu_capacity(int cpu, bool request,
 +                                     unsigned long capacity)
 +{
 +      if (per_cpu(cpu_sched_capacity_reqs, cpu).rt != capacity) {
 +              per_cpu(cpu_sched_capacity_reqs, cpu).rt = capacity;
 +              update_cpu_capacity_request(cpu, request);
 +      }
 +}
 +
 +static inline void set_dl_cpu_capacity(int cpu, bool request,
 +                                     unsigned long capacity)
 +{
 +      if (per_cpu(cpu_sched_capacity_reqs, cpu).dl != capacity) {
 +              per_cpu(cpu_sched_capacity_reqs, cpu).dl = capacity;
 +              update_cpu_capacity_request(cpu, request);
 +      }
 +}
 +#else
 +static inline bool sched_freq(void) { return false; }
 +static inline void set_cfs_cpu_capacity(int cpu, bool request,
 +                                      unsigned long capacity)
 +{ }
 +static inline void set_rt_cpu_capacity(int cpu, bool request,
 +                                     unsigned long capacity)
 +{ }
 +static inline void set_dl_cpu_capacity(int cpu, bool request,
 +                                     unsigned long capacity)
 +{ }
 +#endif
 +
  static inline void sched_rt_avg_update(struct rq *rq, u64 rt_delta)
  {
        rq->rt_avg += rt_delta * arch_scale_freq_capacity(NULL, cpu_of(rq));
 -      sched_avg_update(rq);
  }
  #else
  static inline void sched_rt_avg_update(struct rq *rq, u64 rt_delta) { }
@@@ -1758,9 -1507,6 +1758,9 @@@ task_rq_unlock(struct rq *rq, struct ta
        raw_spin_unlock_irqrestore(&p->pi_lock, *flags);
  }
  
 +extern struct rq *lock_rq_of(struct task_struct *p, unsigned long *flags);
 +extern void unlock_rq_of(struct rq *rq, struct task_struct *p, unsigned long *flags);
 +
  #ifdef CONFIG_SMP
  #ifdef CONFIG_PREEMPT
  
@@@ -1833,8 -1579,7 +1833,8 @@@ static inline int double_lock_balance(s
  static inline void double_unlock_balance(struct rq *this_rq, struct rq *busiest)
        __releases(busiest->lock)
  {
 -      raw_spin_unlock(&busiest->lock);
 +      if (this_rq != busiest)
 +              raw_spin_unlock(&busiest->lock);
        lock_set_subclass(&this_rq->lock.dep_map, 0, _RET_IP_);
  }