From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8D30FC54E67 for ; Wed, 27 Mar 2024 17:05:08 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 21B3F6B0093; Wed, 27 Mar 2024 13:05:08 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 1CACC6B0096; Wed, 27 Mar 2024 13:05:08 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 093236B0098; Wed, 27 Mar 2024 13:05:08 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0011.hostedemail.com [216.40.44.11]) by kanga.kvack.org (Postfix) with ESMTP id E057A6B0093 for ; Wed, 27 Mar 2024 13:05:07 -0400 (EDT) Received: from smtpin16.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay02.hostedemail.com (Postfix) with ESMTP id 92F3D1208FE for ; Wed, 27 Mar 2024 17:05:07 +0000 (UTC) X-FDA: 81943444254.16.E0F4953 Received: from mail-lf1-f43.google.com (mail-lf1-f43.google.com [209.85.167.43]) by imf17.hostedemail.com (Postfix) with ESMTP id 63FB540009 for ; Wed, 27 Mar 2024 17:05:04 +0000 (UTC) Authentication-Results: imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=MJEm+yvq; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf17.hostedemail.com: domain of urezki@gmail.com designates 209.85.167.43 as permitted sender) smtp.mailfrom=urezki@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1711559104; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=0u22ZZTDpHsEnHr6zo+bAw1nZam/xA1U+BZ2+kMWMIY=; b=humrF7oaE9MVbFgMTlxGMciMpyKVXzZhVuHaisTkrxSMPn9GOOzBc9nqk4abl8rJpOVUVv UDCnBsNvKJ5YMnusCA7kGIn5cqMhv8kuOlMcQwIOSYRi99O39AG1o1E560NF/2mT1QHbYV t6dXkwlNmOySaGNmCYVfdlTR/nS2WVo= ARC-Authentication-Results: i=1; imf17.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=MJEm+yvq; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf17.hostedemail.com: domain of urezki@gmail.com designates 209.85.167.43 as permitted sender) smtp.mailfrom=urezki@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1711559104; a=rsa-sha256; cv=none; b=bvwVofT0JaZQJlxuDcbDhv9tFRpFlf92sfeOqJHwtLHyrtF9nOSTokpxbk63ageAhNX+5T gsAu71VY5ouKGdE09mvO6UDR28EEHLm1m8XrJU5PKuVeB8ExoI0QhOR0RU0G8VdpNOWiA9 pc6wvJ6+2tt8TXzrAmDCOL/7Q8qhMjc= Received: by mail-lf1-f43.google.com with SMTP id 2adb3069b0e04-512bde3d197so5132086e87.0 for ; Wed, 27 Mar 2024 10:05:03 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1711559102; x=1712163902; darn=kvack.org; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:date:from:from:to:cc:subject:date:message-id:reply-to; bh=0u22ZZTDpHsEnHr6zo+bAw1nZam/xA1U+BZ2+kMWMIY=; b=MJEm+yvqDayOzCw3BBfI6rm0h7QL7fkhrlTNFck7+9klj6K2UPTWV4VE5Qm8a6aWl8 6xR5/W8rhVp5AJByESFK0DDYk4qmlM3kVU/v48YGjnVHOuQxRU/C/EYeTq/laJSTpPG4 9IPWVZ5+RnKHtr1j/iUVHZpYelqDmAgGLbMDoQagcAEA39d1HYry7LProUL7L7iVQ0DO H3UKieZFeMLv12egMwu59nGWBEAvoi4HZhRzlYAUgwYJrXnrWPuC0wmkagFWQxk53mQ/ 062cJFVAmgzY+sn4ivj9xQa7Oj9q4kmQyM4QqHimqY4WPSyblnIQuj1Jigs3PWpy9p8G LYKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1711559102; x=1712163902; h=in-reply-to:content-disposition:mime-version:references:message-id :subject:cc:to:date:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=0u22ZZTDpHsEnHr6zo+bAw1nZam/xA1U+BZ2+kMWMIY=; b=R2Y+etmazMI3c64gjtrsNEZTtx6kuOM3axQRCyd5rtq2Z5TlTi+5m4RjQ4FyiwOCGK spuYAbOchVvtauFvY38n/LC4wa5oBUo3ws200A6c13+JpRhuYM3K+MnrweCKO+ui6vK4 BkWA4X4I3HVQUeXS4bRAgQDHgW70S1rYA1kjR+rBcY+Rf4i9K6uRCv3IQG7SADtobHoC KRmpg4QZtHiWsV8hpnHXwfubG7TxBJpen+zlwPw/pnIz4Nh7Y13X38NQSXu0Ls5aoi23 i2kyW1PARf+OmI4KF5fbPlR7oXcHYkwnQtlC6xJoSow0a3AaRDyFlBwmuM5zT2HtetOe BPug== X-Gm-Message-State: AOJu0YzeDAfS2brJ++4X0InJuHVyusgSc0C9IaITXh9n0CR5NowbWKrz Y/SrAuw2bUL5yGt/+cKbuqMXQuFWg25HJFk4iB8cV8A9Ygb9f3Xg X-Google-Smtp-Source: AGHT+IGYSiVbgvgtOMdfP8XEiry2xzRsGAAag38DpVg4b9wgNdR8ywbaCbaIBeG6V3gjnTQ+A/QqWA== X-Received: by 2002:a19:5f14:0:b0:515:b164:4112 with SMTP id t20-20020a195f14000000b00515b1644112mr39089lfb.68.1711559101738; Wed, 27 Mar 2024 10:05:01 -0700 (PDT) Received: from pc638.lan (host-185-121-47-193.sydskane.nu. [185.121.47.193]) by smtp.gmail.com with ESMTPSA id u12-20020a196a0c000000b00513cf5ef2b4sm1887213lfu.86.2024.03.27.10.05.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 27 Mar 2024 10:05:01 -0700 (PDT) From: Uladzislau Rezki X-Google-Original-From: Uladzislau Rezki Date: Wed, 27 Mar 2024 18:04:59 +0100 To: Jens Axboe , Omar Sandoval Cc: Linux-MM , Andrew Morton Subject: Re: [PATCH] mm: vmalloc: annotate find_vmap_area_exceed_addr_lock() for lockdep Message-ID: References: <86cb4eaa-2ef3-47e6-87f8-96b15895a7ce@kernel.dk> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: X-Rspam-User: X-Rspamd-Server: rspam12 X-Rspamd-Queue-Id: 63FB540009 X-Stat-Signature: mzkxrscuqah19jk7xcx38ytdqmkrohwe X-HE-Tag: 1711559104-216643 X-HE-Meta: U2FsdGVkX1/VZvNz6u+1fsjvbfKiBSf+jxIEFK1wRYK417U0kDTqClRlUksuPImSigJtwlDmHgXu6XA70zP4W93XTB/UaM0xjcCNCbR1q/zVG4V8SD5UWe9vzVsg5myFI0+JibXV6hq4gbRDy5HuwIgAwjL0j1/8IsJHMBAIXQxEFTL/bffgONDvsAMccwOnmBkpHUym+DdhS1bPaZeetJC1D2CAWexAeeGSv/v9ovG5xPYOT1YL2U33RY9ghiVtsLG+8r9LSW1yhmv4oXELpgLB16ESf+ODTwtfw7g7uUlTpjdBPQ8u7RuyYZvOLEj19hD8veGOTHcbQph8ftTQ3NuXtiYGTN//D2NpsOKttJCROeke3Mb1K1lyaB9nL+Rz0DXX6CgrWBT4XLA/kVSSyiP5TSVidVe/iA2urI/TQTash1QtHLX94kfuRHW5Kaig9owVpNlnYLnPJmIMYYRG0oeFb3ONcp4NFVaspMEDvUM8zs/5lY6Zhcl8pS0o4dYp9oRzecOZcKC5joQMd3cBIxW6clbErXn0tEETlqOWs2GQvOydhSn/XqMoeOD9J4uzci9/ded9lyfybkI2y8p/4d1Z0FFrXqTkt0cGF7UNRU1ByoUEvO8UYJzECRrSv9ks2i8j/CrieUPJ1O3EhNKYIklziXsrp3krHkxLtmFV9Qi3AYZncpIORzg+cOlYqkcy9tbwCW8W4Zsv1Zdu0NI52A3nWOZy4Cl207nrTNNlRevRGouw2tM+Vo7sIqsPRFPDpz82c8KOIAH7xMdvTaThjfGN9PUs8d2YgLbVmuA+1H6/h/dR48nZw7reTDk4Wf1l2gJoVoo6P9Rhv4YEmXZ+s70Xed402PboOZKZGFGc+ae80Hao0K2x3awaSTFxpBJJQx5n6t4YkPix4tox7/ZJ6VJe0bzUn63LIpGKndaEOQgOw/YNy2TIr3IZzv0SfCRI2NYWtWLLZp7D2Y05KUk 4P1c5Drh VrLezQJP1dYUzH1uh3A3OXaxOTJkXmOG1OUDokA1I8NHHi3ZA9cbm0mLIcuz9cC0nh8OkGv+4qBReKo/IHA9pvJSouOVLqa0/w6wmI+N/SrID2QZqpC7XV/JDaKUYQ1jGQ/XTxmKRSl2DfJHglWm+AmfkQFiWmM0RJ1lgtg3YFvld3cfdzOIzdWBRDcIplg1zy+u2K1hT3K3Ejfw6VrCdGvROTRcX0Gh1PNnu3g5wKbGh76jxOnCV8K5ZfnWNrFyfTVNeUDeDO9aIDTUbzWAu6+0bXVqaMRwBkQeAbjyGVCWL6VXGbUQWHuGeX7wK8hm3TGWooKrx0PNcmuvgBafXF9kGKAmAHLGzJJrNhXDKbRs28zG1rHkIXtJBfd349BEfnOATomNYSQcHtpJ5L2oLs0WNDP8BcGcSmp4urjy3vBTex/hJGS7QgcFzdg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: Hello, Jens, Omar! > On Tue, Mar 26, 2024 at 04:24:01PM -0600, Jens Axboe wrote: > > On 3/26/24 3:25 PM, Jens Axboe wrote: > > > diff --git a/mm/vmalloc.c b/mm/vmalloc.c > > > index 22aa63f4ef63..26a69fa6809c 100644 > > > --- a/mm/vmalloc.c > > > +++ b/mm/vmalloc.c > > > @@ -1032,7 +1032,7 @@ find_vmap_area_exceed_addr_lock(unsigned long addr, struct vmap_area **va) > > > for (i = 0; i < nr_vmap_nodes; i++) { > > > vn = &vmap_nodes[i]; > > > > > > - spin_lock(&vn->busy.lock); > > > + spin_lock_nested(&vn->busy.lock, i); > > > va_lowest = __find_vmap_area_exceed_addr(addr, &vn->busy.root); > > > if (va_lowest) { > > > if (!va_node || va_lowest->va_start < (*va)->va_start) { > > > > Omar said he tested this and ran into lockdep complaining as it only > > supports 8 subclasses. So this patch can't work, but that still leaves > > the current kernel code buggy... > > > It is a bit tricky. Let me rewrite it so a lockdep does not complain. > > Thank you for your report. > Could you please check and test below? It is based on latest 6.9-rc1 tip. I have reworked it a bit and now it does not hold two locks so the lockdep should not complain. diff --git a/mm/vmalloc.c b/mm/vmalloc.c index 22aa63f4ef63..9b1a41e12d70 100644 --- a/mm/vmalloc.c +++ b/mm/vmalloc.c @@ -989,6 +989,27 @@ unsigned long vmalloc_nr_pages(void) return atomic_long_read(&nr_vmalloc_pages); } +static struct vmap_area *__find_vmap_area(unsigned long addr, struct rb_root *root) +{ + struct rb_node *n = root->rb_node; + + addr = (unsigned long)kasan_reset_tag((void *)addr); + + while (n) { + struct vmap_area *va; + + va = rb_entry(n, struct vmap_area, rb_node); + if (addr < va->va_start) + n = n->rb_left; + else if (addr >= va->va_end) + n = n->rb_right; + else + return va; + } + + return NULL; +} + /* Look up the first VA which satisfies addr < va_end, NULL if none. */ static struct vmap_area * __find_vmap_area_exceed_addr(unsigned long addr, struct rb_root *root) @@ -1025,47 +1046,40 @@ __find_vmap_area_exceed_addr(unsigned long addr, struct rb_root *root) static struct vmap_node * find_vmap_area_exceed_addr_lock(unsigned long addr, struct vmap_area **va) { - struct vmap_node *vn, *va_node = NULL; - struct vmap_area *va_lowest; + unsigned long va_start_lowest; + struct vmap_node *vn; int i; - for (i = 0; i < nr_vmap_nodes; i++) { +repeat: + for (i = 0, va_start_lowest = 0; i < nr_vmap_nodes; i++) { vn = &vmap_nodes[i]; spin_lock(&vn->busy.lock); - va_lowest = __find_vmap_area_exceed_addr(addr, &vn->busy.root); - if (va_lowest) { - if (!va_node || va_lowest->va_start < (*va)->va_start) { - if (va_node) - spin_unlock(&va_node->busy.lock); - - *va = va_lowest; - va_node = vn; - continue; - } - } + *va = __find_vmap_area_exceed_addr(addr, &vn->busy.root); + + if (*va) + if (!va_start_lowest || (*va)->va_start < va_start_lowest) + va_start_lowest = (*va)->va_start; spin_unlock(&vn->busy.lock); } - return va_node; -} - -static struct vmap_area *__find_vmap_area(unsigned long addr, struct rb_root *root) -{ - struct rb_node *n = root->rb_node; + /* + * Check if found VA exists, it might it is gone away. + * In this case we repeat the search because a VA has + * been removed concurrently thus we need to proceed + * with next one what is a rare case. + */ + if (va_start_lowest) { + vn = addr_to_node(va_start_lowest); - addr = (unsigned long)kasan_reset_tag((void *)addr); + spin_lock(&vn->busy.lock); + *va = __find_vmap_area(va_start_lowest, &vn->busy.root); - while (n) { - struct vmap_area *va; + if (*va) + return vn; - va = rb_entry(n, struct vmap_area, rb_node); - if (addr < va->va_start) - n = n->rb_left; - else if (addr >= va->va_end) - n = n->rb_right; - else - return va; + spin_unlock(&vn->busy.lock); + goto repeat; } return NULL; Thank you! -- Uladzislau Rezki