On Tue, 11 Sep 2018, Gao Xiang wrote:
> Hi Julia,
>
> There were lkp logs reporting that before, but I have no idea why it is
> reported.
> z_pagemap_global_lock is taken iff (pages = z_pagemap_global), and it is
> unlocked at
>
> > 3883a79a Gao Xiang 2018-07-26 987 if (pages == z_pagemap_global)
> > 3883a79a Gao Xiang 2018-07-26 988
> > mutex_unlock(&z_pagemap_global_lock);
>
> It is designed on purpose for now. actually erofs is actually running on our
> commerical
> products but I haven't observed lock leaking. hmmmm...
>
> If I am wrong, please point out thanks...
It's fine. Sorry for the wrong report. Coccinelle can't analyze
conditional tests and that level, and I missed the unlocked when I looked
at it.
julia
>
> Thanks,
> Gao Xiang
>
> On 2018/9/11 21:40, Julia Lawall wrote:
> > I don't know if there is a problem here. Please check the lines mentiond
> > below, ie lines 839 and 1003.
> >
> > julia
> >
> > ---------- Forwarded message ----------
> > Date: Tue, 11 Sep 2018 17:17:15 +0800
> > From: kbuild test robot <l...@intel.com>
> > To: kbu...@01.org
> > Cc: Julia Lawall <julia.law...@lip6.fr>
> > Subject: [staging:staging-next 118/220]
> > drivers/staging/erofs/unzip_vle.c:1003:1-7: preceding lock on line 839
> >
> > CC: kbuild-...@01.org
> > CC: de...@driverdev.osuosl.org
> > TO: Gao Xiang <gaoxian...@huawei.com>
> > CC: "Greg Kroah-Hartman" <gre...@linuxfoundation.org>
> > CC: Chao Yu <yuch...@huawei.com>, Chao Yu <c...@kernel.org>
> >
> > Hi Gao,
> >
> > First bad commit (maybe != root cause):
> >
> > tree: https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
> > staging-next
> > head: 7aaaabd50d785e30b290054b3a1b115393927da3
> > commit: aca19723604c232ffc6376c1c6cd9c8a12158dcc [118/220] Revert "staging:
> > erofs: disable compiling temporarile"
> > :::::: branch date: 17 hours ago
> > :::::: commit date: 25 hours ago
> >
> >>> drivers/staging/erofs/unzip_vle.c:1003:1-7: preceding lock on line 839
> >
> > #
> > https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git/commit/?id=aca19723604c232ffc6376c1c6cd9c8a12158dcc
> > git remote add staging
> > https://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
> > git remote update staging
> > git checkout aca19723604c232ffc6376c1c6cd9c8a12158dcc
> > vim +1003 drivers/staging/erofs/unzip_vle.c
> >
> > 3883a79a Gao Xiang 2018-07-26 787
> > 3883a79a Gao Xiang 2018-07-26 788 static int z_erofs_vle_unzip(struct
> > super_block *sb,
> > 3883a79a Gao Xiang 2018-07-26 789 struct z_erofs_vle_workgroup
> > *grp,
> > 3883a79a Gao Xiang 2018-07-26 790 struct list_head *page_pool)
> > 3883a79a Gao Xiang 2018-07-26 791 {
> > 3883a79a Gao Xiang 2018-07-26 792 struct erofs_sb_info *const sbi
> > = EROFS_SB(sb);
> > 105d4ad8 Gao Xiang 2018-07-26 793 #ifdef EROFS_FS_HAS_MANAGED_CACHE
> > 105d4ad8 Gao Xiang 2018-07-26 794 struct address_space *const
> > mngda = sbi->managed_cache->i_mapping;
> > 105d4ad8 Gao Xiang 2018-07-26 795 #endif
> > 3883a79a Gao Xiang 2018-07-26 796 const unsigned clusterpages =
> > erofs_clusterpages(sbi);
> > 3883a79a Gao Xiang 2018-07-26 797
> > 3883a79a Gao Xiang 2018-07-26 798 struct z_erofs_pagevec_ctor
> > ctor;
> > 3883a79a Gao Xiang 2018-07-26 799 unsigned nr_pages;
> > 3883a79a Gao Xiang 2018-07-26 800 #ifndef CONFIG_EROFS_FS_ZIP_MULTIREF
> > 3883a79a Gao Xiang 2018-07-26 801 unsigned sparsemem_pages = 0;
> > 3883a79a Gao Xiang 2018-07-26 802 #endif
> > 3883a79a Gao Xiang 2018-07-26 803 struct page
> > *pages_onstack[Z_EROFS_VLE_VMAP_ONSTACK_PAGES];
> > 3883a79a Gao Xiang 2018-07-26 804 struct page **pages,
> > **compressed_pages, *page;
> > 3883a79a Gao Xiang 2018-07-26 805 unsigned i, llen;
> > 3883a79a Gao Xiang 2018-07-26 806
> > 3883a79a Gao Xiang 2018-07-26 807 enum z_erofs_page_type
> > page_type;
> > 3883a79a Gao Xiang 2018-07-26 808 bool overlapped;
> > 3883a79a Gao Xiang 2018-07-26 809 struct z_erofs_vle_work *work;
> > 3883a79a Gao Xiang 2018-07-26 810 void *vout;
> > 3883a79a Gao Xiang 2018-07-26 811 int err;
> > 3883a79a Gao Xiang 2018-07-26 812
> > 3883a79a Gao Xiang 2018-07-26 813 might_sleep();
> > 3883a79a Gao Xiang 2018-07-26 814 #ifndef CONFIG_EROFS_FS_ZIP_MULTIREF
> > 3883a79a Gao Xiang 2018-07-26 815 work =
> > z_erofs_vle_grab_primary_work(grp);
> > 3883a79a Gao Xiang 2018-07-26 816 #else
> > 3883a79a Gao Xiang 2018-07-26 817 BUG();
> > 3883a79a Gao Xiang 2018-07-26 818 #endif
> > 3883a79a Gao Xiang 2018-07-26 819
> > BUG_ON(!READ_ONCE(work->nr_pages));
> > 3883a79a Gao Xiang 2018-07-26 820
> > 3883a79a Gao Xiang 2018-07-26 821 mutex_lock(&work->lock);
> > 3883a79a Gao Xiang 2018-07-26 822 nr_pages = work->nr_pages;
> > 3883a79a Gao Xiang 2018-07-26 823
> > 3883a79a Gao Xiang 2018-07-26 824 if (likely(nr_pages <=
> > Z_EROFS_VLE_VMAP_ONSTACK_PAGES))
> > 3883a79a Gao Xiang 2018-07-26 825 pages = pages_onstack;
> > 3883a79a Gao Xiang 2018-07-26 826 else if (nr_pages <=
> > Z_EROFS_VLE_VMAP_GLOBAL_PAGES &&
> > 3883a79a Gao Xiang 2018-07-26 827
> > mutex_trylock(&z_pagemap_global_lock))
> > 3883a79a Gao Xiang 2018-07-26 828 pages =
> > z_pagemap_global;
> > 3883a79a Gao Xiang 2018-07-26 829 else {
> > 3883a79a Gao Xiang 2018-07-26 830 repeat:
> > 3883a79a Gao Xiang 2018-07-26 831 pages =
> > kvmalloc_array(nr_pages,
> > 3883a79a Gao Xiang 2018-07-26 832 sizeof(struct
> > page *), GFP_KERNEL);
> > 3883a79a Gao Xiang 2018-07-26 833
> > 3883a79a Gao Xiang 2018-07-26 834 /* fallback to global
> > pagemap for the lowmem scenario */
> > 3883a79a Gao Xiang 2018-07-26 835 if (unlikely(pages ==
> > NULL)) {
> > 3883a79a Gao Xiang 2018-07-26 836 if (nr_pages >
> > Z_EROFS_VLE_VMAP_GLOBAL_PAGES)
> > 3883a79a Gao Xiang 2018-07-26 837 goto
> > repeat;
> > 3883a79a Gao Xiang 2018-07-26 838 else {
> > 3883a79a Gao Xiang 2018-07-26 @839
> > mutex_lock(&z_pagemap_global_lock);
> > 3883a79a Gao Xiang 2018-07-26 840 pages =
> > z_pagemap_global;
> > 3883a79a Gao Xiang 2018-07-26 841 }
> > 3883a79a Gao Xiang 2018-07-26 842 }
> > 3883a79a Gao Xiang 2018-07-26 843 }
> > 3883a79a Gao Xiang 2018-07-26 844
> > 3883a79a Gao Xiang 2018-07-26 845 for (i = 0; i < nr_pages; ++i)
> > 3883a79a Gao Xiang 2018-07-26 846 pages[i] = NULL;
> > 3883a79a Gao Xiang 2018-07-26 847
> > 3883a79a Gao Xiang 2018-07-26 848 z_erofs_pagevec_ctor_init(&ctor,
> > 3883a79a Gao Xiang 2018-07-26 849
> > Z_EROFS_VLE_INLINE_PAGEVECS, work->pagevec, 0);
> > 3883a79a Gao Xiang 2018-07-26 850
> > 3883a79a Gao Xiang 2018-07-26 851 for (i = 0; i < work->vcnt;
> > ++i) {
> > 3883a79a Gao Xiang 2018-07-26 852 unsigned pagenr;
> > 3883a79a Gao Xiang 2018-07-26 853
> > 3883a79a Gao Xiang 2018-07-26 854 page =
> > z_erofs_pagevec_ctor_dequeue(&ctor, &page_type);
> > 3883a79a Gao Xiang 2018-07-26 855
> > 3883a79a Gao Xiang 2018-07-26 856 /* all pages in pagevec
> > ought to be valid */
> > 3883a79a Gao Xiang 2018-07-26 857 DBG_BUGON(page == NULL);
> > 3883a79a Gao Xiang 2018-07-26 858 DBG_BUGON(page->mapping
> > == NULL);
> > 3883a79a Gao Xiang 2018-07-26 859
> > 3883a79a Gao Xiang 2018-07-26 860 if
> > (z_erofs_gather_if_stagingpage(page_pool, page))
> > 3883a79a Gao Xiang 2018-07-26 861 continue;
> > 3883a79a Gao Xiang 2018-07-26 862
> > 3883a79a Gao Xiang 2018-07-26 863 if (page_type ==
> > Z_EROFS_VLE_PAGE_TYPE_HEAD)
> > 3883a79a Gao Xiang 2018-07-26 864 pagenr = 0;
> > 3883a79a Gao Xiang 2018-07-26 865 else
> > 3883a79a Gao Xiang 2018-07-26 866 pagenr =
> > z_erofs_onlinepage_index(page);
> > 3883a79a Gao Xiang 2018-07-26 867
> > 3883a79a Gao Xiang 2018-07-26 868 BUG_ON(pagenr >=
> > nr_pages);
> > 3883a79a Gao Xiang 2018-07-26 869
> > 3883a79a Gao Xiang 2018-07-26 870 #ifndef CONFIG_EROFS_FS_ZIP_MULTIREF
> > 3883a79a Gao Xiang 2018-07-26 871 BUG_ON(pages[pagenr] !=
> > NULL);
> > 3883a79a Gao Xiang 2018-07-26 872 ++sparsemem_pages;
> > 3883a79a Gao Xiang 2018-07-26 873 #endif
> > 3883a79a Gao Xiang 2018-07-26 874 pages[pagenr] = page;
> > 3883a79a Gao Xiang 2018-07-26 875 }
> > 3883a79a Gao Xiang 2018-07-26 876
> > 3883a79a Gao Xiang 2018-07-26 877
> > z_erofs_pagevec_ctor_exit(&ctor, true);
> > 3883a79a Gao Xiang 2018-07-26 878
> > 3883a79a Gao Xiang 2018-07-26 879 overlapped = false;
> > 3883a79a Gao Xiang 2018-07-26 880 compressed_pages =
> > grp->compressed_pages;
> > 3883a79a Gao Xiang 2018-07-26 881
> > 3883a79a Gao Xiang 2018-07-26 882 for (i = 0; i < clusterpages;
> > ++i) {
> > 3883a79a Gao Xiang 2018-07-26 883 unsigned pagenr;
> > 3883a79a Gao Xiang 2018-07-26 884
> > 3883a79a Gao Xiang 2018-07-26 885 page =
> > compressed_pages[i];
> > 3883a79a Gao Xiang 2018-07-26 886
> > 3883a79a Gao Xiang 2018-07-26 887 /* all compressed pages
> > ought to be valid */
> > 3883a79a Gao Xiang 2018-07-26 888 DBG_BUGON(page == NULL);
> > 3883a79a Gao Xiang 2018-07-26 889 DBG_BUGON(page->mapping
> > == NULL);
> > 3883a79a Gao Xiang 2018-07-26 890
> > 3883a79a Gao Xiang 2018-07-26 891 if
> > (z_erofs_is_stagingpage(page))
> > 3883a79a Gao Xiang 2018-07-26 892 continue;
> > 105d4ad8 Gao Xiang 2018-07-26 893 #ifdef EROFS_FS_HAS_MANAGED_CACHE
> > 105d4ad8 Gao Xiang 2018-07-26 894 else if (page->mapping
> > == mngda) {
> > 105d4ad8 Gao Xiang 2018-07-26 895
> > BUG_ON(PageLocked(page));
> > 105d4ad8 Gao Xiang 2018-07-26 896
> > BUG_ON(!PageUptodate(page));
> > 105d4ad8 Gao Xiang 2018-07-26 897 continue;
> > 105d4ad8 Gao Xiang 2018-07-26 898 }
> > 105d4ad8 Gao Xiang 2018-07-26 899 #endif
> > 3883a79a Gao Xiang 2018-07-26 900
> > 3883a79a Gao Xiang 2018-07-26 901 /* only non-head page
> > could be reused as a compressed page */
> > 3883a79a Gao Xiang 2018-07-26 902 pagenr =
> > z_erofs_onlinepage_index(page);
> > 3883a79a Gao Xiang 2018-07-26 903
> > 3883a79a Gao Xiang 2018-07-26 904 BUG_ON(pagenr >=
> > nr_pages);
> > 3883a79a Gao Xiang 2018-07-26 905 #ifndef CONFIG_EROFS_FS_ZIP_MULTIREF
> > 3883a79a Gao Xiang 2018-07-26 906 BUG_ON(pages[pagenr] !=
> > NULL);
> > 3883a79a Gao Xiang 2018-07-26 907 ++sparsemem_pages;
> > 3883a79a Gao Xiang 2018-07-26 908 #endif
> > 3883a79a Gao Xiang 2018-07-26 909 pages[pagenr] = page;
> > 3883a79a Gao Xiang 2018-07-26 910
> > 3883a79a Gao Xiang 2018-07-26 911 overlapped = true;
> > 3883a79a Gao Xiang 2018-07-26 912 }
> > 3883a79a Gao Xiang 2018-07-26 913
> > 3883a79a Gao Xiang 2018-07-26 914 llen = (nr_pages << PAGE_SHIFT)
> > - work->pageofs;
> > 3883a79a Gao Xiang 2018-07-26 915
> > 3883a79a Gao Xiang 2018-07-26 916 if
> > (z_erofs_vle_workgrp_fmt(grp) == Z_EROFS_VLE_WORKGRP_FMT_PLAIN) {
> > 3883a79a Gao Xiang 2018-07-26 917 /* FIXME! this should
> > be fixed in the future */
> > 3883a79a Gao Xiang 2018-07-26 918 BUG_ON(grp->llen !=
> > llen);
> > 3883a79a Gao Xiang 2018-07-26 919
> > 3883a79a Gao Xiang 2018-07-26 920 err =
> > z_erofs_vle_plain_copy(compressed_pages, clusterpages,
> > 3883a79a Gao Xiang 2018-07-26 921 pages,
> > nr_pages, work->pageofs);
> > 3883a79a Gao Xiang 2018-07-26 922 goto out;
> > 3883a79a Gao Xiang 2018-07-26 923 }
> > 3883a79a Gao Xiang 2018-07-26 924
> > 3883a79a Gao Xiang 2018-07-26 925 if (llen > grp->llen)
> > 3883a79a Gao Xiang 2018-07-26 926 llen = grp->llen;
> > 3883a79a Gao Xiang 2018-07-26 927
> > 3883a79a Gao Xiang 2018-07-26 928 err =
> > z_erofs_vle_unzip_fast_percpu(compressed_pages,
> > 3883a79a Gao Xiang 2018-07-26 929 clusterpages, pages,
> > llen, work->pageofs,
> > 3883a79a Gao Xiang 2018-07-26 930
> > z_erofs_onlinepage_endio);
> > 3883a79a Gao Xiang 2018-07-26 931 if (err != -ENOTSUPP)
> > 3883a79a Gao Xiang 2018-07-26 932 goto out_percpu;
> > 3883a79a Gao Xiang 2018-07-26 933
> > 3883a79a Gao Xiang 2018-07-26 934 #ifndef CONFIG_EROFS_FS_ZIP_MULTIREF
> > 3883a79a Gao Xiang 2018-07-26 935 if (sparsemem_pages >=
> > nr_pages) {
> > 3883a79a Gao Xiang 2018-07-26 936 BUG_ON(sparsemem_pages
> > > nr_pages);
> > 3883a79a Gao Xiang 2018-07-26 937 goto skip_allocpage;
> > 3883a79a Gao Xiang 2018-07-26 938 }
> > 3883a79a Gao Xiang 2018-07-26 939 #endif
> > 3883a79a Gao Xiang 2018-07-26 940
> > 3883a79a Gao Xiang 2018-07-26 941 for (i = 0; i < nr_pages; ++i) {
> > 3883a79a Gao Xiang 2018-07-26 942 if (pages[i] != NULL)
> > 3883a79a Gao Xiang 2018-07-26 943 continue;
> > 3883a79a Gao Xiang 2018-07-26 944
> > 3883a79a Gao Xiang 2018-07-26 945 pages[i] =
> > __stagingpage_alloc(page_pool, GFP_NOFS);
> > 3883a79a Gao Xiang 2018-07-26 946 }
> > 3883a79a Gao Xiang 2018-07-26 947
> > 3883a79a Gao Xiang 2018-07-26 948 #ifndef CONFIG_EROFS_FS_ZIP_MULTIREF
> > 3883a79a Gao Xiang 2018-07-26 949 skip_allocpage:
> > 3883a79a Gao Xiang 2018-07-26 950 #endif
> > 3883a79a Gao Xiang 2018-07-26 951 vout = erofs_vmap(pages,
> > nr_pages);
> > 3883a79a Gao Xiang 2018-07-26 952
> > 3883a79a Gao Xiang 2018-07-26 953 err =
> > z_erofs_vle_unzip_vmap(compressed_pages,
> > 3883a79a Gao Xiang 2018-07-26 954 clusterpages, vout,
> > llen, work->pageofs, overlapped);
> > 3883a79a Gao Xiang 2018-07-26 955
> > 3883a79a Gao Xiang 2018-07-26 956 erofs_vunmap(vout, nr_pages);
> > 3883a79a Gao Xiang 2018-07-26 957
> > 3883a79a Gao Xiang 2018-07-26 958 out:
> > 3883a79a Gao Xiang 2018-07-26 959 for (i = 0; i < nr_pages; ++i) {
> > 3883a79a Gao Xiang 2018-07-26 960 page = pages[i];
> > 3883a79a Gao Xiang 2018-07-26 961 DBG_BUGON(page->mapping
> > == NULL);
> > 3883a79a Gao Xiang 2018-07-26 962
> > 3883a79a Gao Xiang 2018-07-26 963 /* recycle all
> > individual staging pages */
> > 3883a79a Gao Xiang 2018-07-26 964 if
> > (z_erofs_gather_if_stagingpage(page_pool, page))
> > 3883a79a Gao Xiang 2018-07-26 965 continue;
> > 3883a79a Gao Xiang 2018-07-26 966
> > 3883a79a Gao Xiang 2018-07-26 967 if (unlikely(err < 0))
> > 3883a79a Gao Xiang 2018-07-26 968
> > SetPageError(page);
> > 3883a79a Gao Xiang 2018-07-26 969
> > 3883a79a Gao Xiang 2018-07-26 970
> > z_erofs_onlinepage_endio(page);
> > 3883a79a Gao Xiang 2018-07-26 971 }
> > 3883a79a Gao Xiang 2018-07-26 972
> > 3883a79a Gao Xiang 2018-07-26 973 out_percpu:
> > 3883a79a Gao Xiang 2018-07-26 974 for (i = 0; i < clusterpages;
> > ++i) {
> > 3883a79a Gao Xiang 2018-07-26 975 page =
> > compressed_pages[i];
> > 3883a79a Gao Xiang 2018-07-26 976
> > 105d4ad8 Gao Xiang 2018-07-26 977 #ifdef EROFS_FS_HAS_MANAGED_CACHE
> > 105d4ad8 Gao Xiang 2018-07-26 978 if (page->mapping ==
> > mngda)
> > 105d4ad8 Gao Xiang 2018-07-26 979 continue;
> > 105d4ad8 Gao Xiang 2018-07-26 980 #endif
> > 3883a79a Gao Xiang 2018-07-26 981 /* recycle all
> > individual staging pages */
> > 3883a79a Gao Xiang 2018-07-26 982
> > (void)z_erofs_gather_if_stagingpage(page_pool, page);
> > 3883a79a Gao Xiang 2018-07-26 983
> > 3883a79a Gao Xiang 2018-07-26 984
> > WRITE_ONCE(compressed_pages[i], NULL);
> > 3883a79a Gao Xiang 2018-07-26 985 }
> > 3883a79a Gao Xiang 2018-07-26 986
> > 3883a79a Gao Xiang 2018-07-26 987 if (pages == z_pagemap_global)
> > 3883a79a Gao Xiang 2018-07-26 988
> > mutex_unlock(&z_pagemap_global_lock);
> > 3883a79a Gao Xiang 2018-07-26 989 else if (unlikely(pages !=
> > pages_onstack))
> > 3883a79a Gao Xiang 2018-07-26 990 kvfree(pages);
> > 3883a79a Gao Xiang 2018-07-26 991
> > 3883a79a Gao Xiang 2018-07-26 992 work->nr_pages = 0;
> > 3883a79a Gao Xiang 2018-07-26 993 work->vcnt = 0;
> > 3883a79a Gao Xiang 2018-07-26 994
> > 3883a79a Gao Xiang 2018-07-26 995 /* all work locks MUST be taken
> > before the following line */
> > 3883a79a Gao Xiang 2018-07-26 996
> > 3883a79a Gao Xiang 2018-07-26 997 WRITE_ONCE(grp->next,
> > Z_EROFS_VLE_WORKGRP_NIL);
> > 3883a79a Gao Xiang 2018-07-26 998
> > 3883a79a Gao Xiang 2018-07-26 999 /* all work locks SHOULD be
> > released right now */
> > 3883a79a Gao Xiang 2018-07-26 1000 mutex_unlock(&work->lock);
> > 3883a79a Gao Xiang 2018-07-26 1001
> > 3883a79a Gao Xiang 2018-07-26 1002 z_erofs_vle_work_release(work);
> > 3883a79a Gao Xiang 2018-07-26 @1003 return err;
> > 3883a79a Gao Xiang 2018-07-26 1004 }
> > 3883a79a Gao Xiang 2018-07-26 1005
> >
> > :::::: The code at line 1003 was first introduced by commit
> > :::::: 3883a79abd02272222a214a5f84395d41eecdc84 staging: erofs: introduce
> > VLE decompression support
> >
> > :::::: TO: Gao Xiang <gaoxian...@huawei.com>
> > :::::: CC: Greg Kroah-Hartman <gre...@linuxfoundation.org>
> >
> > ---
> > 0-DAY kernel test infrastructure Open Source Technology
> > Center
> > https://lists.01.org/pipermail/kbuild-all Intel
> > Corporation
> >
>
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel