tree: https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git master head: 647060f3b592d3c8df0c85dd887557b03e6ea897 commit: 6753c561f6535d2261e531ea923f2c0b18208fe3 [4504/4677] mm/zswap: add the flag can_sleep_mapped config: x86_64-randconfig-a016-20210119 (attached as .config) compiler: clang version 12.0.0 (https://github.com/llvm/llvm-project 22b68440e1647e16b5ee24b924986207173c02d1) reproduce (this is a W=1 build): wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross chmod +x ~/bin/make.cross # install x86_64 cross compiling tool for clang build # apt-get install binutils-x86-64-linux-gnu # https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/?id=6753c561f6535d2261e531ea923f2c0b18208fe3 git remote add linux-next https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git git fetch --no-tags linux-next master git checkout 6753c561f6535d2261e531ea923f2c0b18208fe3 # save the attached .config to linux build tree COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=x86_64 If you fix the issue, kindly add following tag as appropriate Reported-by: kernel test robot All warnings (new ones prefixed by >>): >> mm/zswap.c:947:17: warning: variable 'entry' is uninitialized when used here [-Wuninitialized] tmp = kmalloc(entry->length, GFP_ATOMIC); ^~~~~ mm/zswap.c:933:27: note: initialize the variable 'entry' to silence this warning struct zswap_entry *entry; ^ = NULL >> mm/zswap.c:1271:6: warning: variable 'ret' is used uninitialized whenever 'if' condition is true [-Wsometimes-uninitialized] if (!entry->length) { ^~~~~~~~~~~~~~ mm/zswap.c:1322:9: note: uninitialized use occurs here return ret; ^~~ mm/zswap.c:1271:2: note: remove the 'if' if its condition is always false if (!entry->length) { ^~~~~~~~~~~~~~~~~~~~~ mm/zswap.c:1259:9: note: initialize the variable 'ret' to silence this warning int ret; ^ = 0 2 warnings generated. vim +/entry +947 mm/zswap.c 914 915 /* 916 * Attempts to free an entry by adding a page to the swap cache, 917 * decompressing the entry data into the page, and issuing a 918 * bio write to write the page back to the swap device. 919 * 920 * This can be thought of as a "resumed writeback" of the page 921 * to the swap device. We are basically resuming the same swap 922 * writeback path that was intercepted with the frontswap_store() 923 * in the first place. After the page has been decompressed into 924 * the swap cache, the compressed version stored by zswap can be 925 * freed. 926 */ 927 static int zswap_writeback_entry(struct zpool *pool, unsigned long handle) 928 { 929 struct zswap_header *zhdr; 930 swp_entry_t swpentry; 931 struct zswap_tree *tree; 932 pgoff_t offset; 933 struct zswap_entry *entry; 934 struct page *page; 935 struct scatterlist input, output; 936 struct crypto_acomp_ctx *acomp_ctx; 937 938 u8 *src, *tmp; 939 unsigned int dlen; 940 int ret; 941 struct writeback_control wbc = { 942 .sync_mode = WB_SYNC_NONE, 943 }; 944 945 if (!zpool_can_sleep_mapped(pool)) { 946 > 947 tmp = kmalloc(entry->length, GFP_ATOMIC); 948 if (!tmp) 949 return -ENOMEM; 950 } 951 952 /* extract swpentry from data */ 953 zhdr = zpool_map_handle(pool, handle, ZPOOL_MM_RO); 954 swpentry = zhdr->swpentry; /* here */ 955 tree = zswap_trees[swp_type(swpentry)]; 956 offset = swp_offset(swpentry); 957 958 /* find and ref zswap entry */ 959 spin_lock(&tree->lock); 960 entry = zswap_entry_find_get(&tree->rbroot, offset); 961 if (!entry) { 962 /* entry was invalidated */ 963 spin_unlock(&tree->lock); 964 zpool_unmap_handle(pool, handle); 965 return 0; 966 } 967 spin_unlock(&tree->lock); 968 BUG_ON(offset != entry->offset); 969 970 /* try to allocate swap cache page */ 971 switch (zswap_get_swap_cache_page(swpentry, &page)) { 972 case ZSWAP_SWAPCACHE_FAIL: /* no memory or invalidate happened */ 973 ret = -ENOMEM; 974 goto fail; 975 976 case ZSWAP_SWAPCACHE_EXIST: 977 /* page is already in the swap cache, ignore for now */ 978 put_page(page); 979 ret = -EEXIST; 980 goto fail; 981 982 case ZSWAP_SWAPCACHE_NEW: /* page is locked */ 983 /* decompress */ 984 acomp_ctx = raw_cpu_ptr(entry->pool->acomp_ctx); 985 986 dlen = PAGE_SIZE; 987 src = (u8 *)zhdr + sizeof(struct zswap_header); 988 989 if (!zpool_can_sleep_mapped(pool)) { 990 991 memcpy(tmp, src, entry->length); 992 src = tmp; 993 994 zpool_unmap_handle(pool, handle); 995 } 996 997 mutex_lock(acomp_ctx->mutex); 998 sg_init_one(&input, src, entry->length); 999 sg_init_table(&output, 1); 1000 sg_set_page(&output, page, PAGE_SIZE, 0); 1001 acomp_request_set_params(acomp_ctx->req, &input, &output, entry->length, dlen); 1002 ret = crypto_wait_req(crypto_acomp_decompress(acomp_ctx->req), &acomp_ctx->wait); 1003 dlen = acomp_ctx->req->dlen; 1004 mutex_unlock(acomp_ctx->mutex); 1005 1006 BUG_ON(ret); 1007 BUG_ON(dlen != PAGE_SIZE); 1008 1009 /* page is up to date */ 1010 SetPageUptodate(page); 1011 } 1012 1013 /* move it to the tail of the inactive list after end_writeback */ 1014 SetPageReclaim(page); 1015 1016 /* start writeback */ 1017 __swap_writepage(page, &wbc, end_swap_bio_write); 1018 put_page(page); 1019 zswap_written_back_pages++; 1020 1021 spin_lock(&tree->lock); 1022 /* drop local reference */ 1023 zswap_entry_put(tree, entry); 1024 1025 /* 1026 * There are two possible situations for entry here: 1027 * (1) refcount is 1(normal case), entry is valid and on the tree 1028 * (2) refcount is 0, entry is freed and not on the tree 1029 * because invalidate happened during writeback 1030 * search the tree and free the entry if find entry 1031 */ 1032 if (entry == zswap_rb_search(&tree->rbroot, offset)) 1033 zswap_entry_put(tree, entry); 1034 spin_unlock(&tree->lock); 1035 1036 goto end; 1037 1038 /* 1039 * if we get here due to ZSWAP_SWAPCACHE_EXIST 1040 * a load may be happening concurrently. 1041 * it is safe and okay to not free the entry. 1042 * if we free the entry in the following put 1043 * it is also okay to return !0 1044 */ 1045 fail: 1046 spin_lock(&tree->lock); 1047 zswap_entry_put(tree, entry); 1048 spin_unlock(&tree->lock); 1049 1050 end: 1051 if (zpool_can_sleep_mapped(pool)) 1052 zpool_unmap_handle(pool, handle); 1053 else 1054 kfree(tmp); 1055 1056 return ret; 1057 } 1058 --- 0-DAY CI Kernel Test Service, Intel Corporation https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org