Re: [PATCH 4/7] HMM: Remove superflous RCU protection around radix tree lookup
On Tue, Mar 06, 2018 at 09:33:13AM -0800, Tejun Heo wrote: > hmm_devmem_find() requires rcu_read_lock_held() but there's nothing > which actually uses the RCU protection. The only caller is > hmm_devmem_pages_create() which already grabs the mutex and does > superflous rcu_read_lock/unlock() around the function. > > This doesn't add anything and just adds to confusion. Remove the RCU > protection and open-code the radix tree lookup. If this needs to > become more sophisticated in the future, let's add them back when > necessary. > > Signed-off-by: Tejun HeoReviewed-by: Jérôme Glisse > Cc: linux...@kvack.org > Cc: Linus Torvalds > --- > Hello, Jérôme. > > This came up while auditing percpu_ref users for missing explicit RCU > grace periods. HMM doesn't seem to depend on RCU protection at all, > so I thought it'd be better to remove it for now. It's only compile > tested. Good catch some left over of old logic. I have more cleanup queued up now that i am about to post nouveau patches to use all this. Thanks for fixing this. > > Thanks. > > mm/hmm.c | 12 ++-- > 1 file changed, 2 insertions(+), 10 deletions(-) > > diff --git a/mm/hmm.c b/mm/hmm.c > index 320545b98..d4627c5 100644 > --- a/mm/hmm.c > +++ b/mm/hmm.c > @@ -845,13 +845,6 @@ static void hmm_devmem_release(struct device *dev, void > *data) > hmm_devmem_radix_release(resource); > } > > -static struct hmm_devmem *hmm_devmem_find(resource_size_t phys) > -{ > - WARN_ON_ONCE(!rcu_read_lock_held()); > - > - return radix_tree_lookup(_devmem_radix, phys >> PA_SECTION_SHIFT); > -} > - > static int hmm_devmem_pages_create(struct hmm_devmem *devmem) > { > resource_size_t key, align_start, align_size, align_end; > @@ -892,9 +885,8 @@ static int hmm_devmem_pages_create(struct hmm_devmem > *devmem) > for (key = align_start; key <= align_end; key += PA_SECTION_SIZE) { > struct hmm_devmem *dup; > > - rcu_read_lock(); > - dup = hmm_devmem_find(key); > - rcu_read_unlock(); > + dup = radix_tree_lookup(_devmem_radix, > + key >> PA_SECTION_SHIFT); > if (dup) { > dev_err(device, "%s: collides with mapping for %s\n", > __func__, dev_name(dup->device)); > -- > 2.9.5 >
Re: [PATCH 4/7] HMM: Remove superflous RCU protection around radix tree lookup
On Tue, Mar 06, 2018 at 09:33:13AM -0800, Tejun Heo wrote: > hmm_devmem_find() requires rcu_read_lock_held() but there's nothing > which actually uses the RCU protection. The only caller is > hmm_devmem_pages_create() which already grabs the mutex and does > superflous rcu_read_lock/unlock() around the function. > > This doesn't add anything and just adds to confusion. Remove the RCU > protection and open-code the radix tree lookup. If this needs to > become more sophisticated in the future, let's add them back when > necessary. > > Signed-off-by: Tejun Heo Reviewed-by: Jérôme Glisse > Cc: linux...@kvack.org > Cc: Linus Torvalds > --- > Hello, Jérôme. > > This came up while auditing percpu_ref users for missing explicit RCU > grace periods. HMM doesn't seem to depend on RCU protection at all, > so I thought it'd be better to remove it for now. It's only compile > tested. Good catch some left over of old logic. I have more cleanup queued up now that i am about to post nouveau patches to use all this. Thanks for fixing this. > > Thanks. > > mm/hmm.c | 12 ++-- > 1 file changed, 2 insertions(+), 10 deletions(-) > > diff --git a/mm/hmm.c b/mm/hmm.c > index 320545b98..d4627c5 100644 > --- a/mm/hmm.c > +++ b/mm/hmm.c > @@ -845,13 +845,6 @@ static void hmm_devmem_release(struct device *dev, void > *data) > hmm_devmem_radix_release(resource); > } > > -static struct hmm_devmem *hmm_devmem_find(resource_size_t phys) > -{ > - WARN_ON_ONCE(!rcu_read_lock_held()); > - > - return radix_tree_lookup(_devmem_radix, phys >> PA_SECTION_SHIFT); > -} > - > static int hmm_devmem_pages_create(struct hmm_devmem *devmem) > { > resource_size_t key, align_start, align_size, align_end; > @@ -892,9 +885,8 @@ static int hmm_devmem_pages_create(struct hmm_devmem > *devmem) > for (key = align_start; key <= align_end; key += PA_SECTION_SIZE) { > struct hmm_devmem *dup; > > - rcu_read_lock(); > - dup = hmm_devmem_find(key); > - rcu_read_unlock(); > + dup = radix_tree_lookup(_devmem_radix, > + key >> PA_SECTION_SHIFT); > if (dup) { > dev_err(device, "%s: collides with mapping for %s\n", > __func__, dev_name(dup->device)); > -- > 2.9.5 >
[PATCH 4/7] HMM: Remove superflous RCU protection around radix tree lookup
hmm_devmem_find() requires rcu_read_lock_held() but there's nothing which actually uses the RCU protection. The only caller is hmm_devmem_pages_create() which already grabs the mutex and does superflous rcu_read_lock/unlock() around the function. This doesn't add anything and just adds to confusion. Remove the RCU protection and open-code the radix tree lookup. If this needs to become more sophisticated in the future, let's add them back when necessary. Signed-off-by: Tejun HeoCc: Jérôme Glisse Cc: linux...@kvack.org Cc: Linus Torvalds --- Hello, Jérôme. This came up while auditing percpu_ref users for missing explicit RCU grace periods. HMM doesn't seem to depend on RCU protection at all, so I thought it'd be better to remove it for now. It's only compile tested. Thanks. mm/hmm.c | 12 ++-- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/mm/hmm.c b/mm/hmm.c index 320545b98..d4627c5 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -845,13 +845,6 @@ static void hmm_devmem_release(struct device *dev, void *data) hmm_devmem_radix_release(resource); } -static struct hmm_devmem *hmm_devmem_find(resource_size_t phys) -{ - WARN_ON_ONCE(!rcu_read_lock_held()); - - return radix_tree_lookup(_devmem_radix, phys >> PA_SECTION_SHIFT); -} - static int hmm_devmem_pages_create(struct hmm_devmem *devmem) { resource_size_t key, align_start, align_size, align_end; @@ -892,9 +885,8 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem) for (key = align_start; key <= align_end; key += PA_SECTION_SIZE) { struct hmm_devmem *dup; - rcu_read_lock(); - dup = hmm_devmem_find(key); - rcu_read_unlock(); + dup = radix_tree_lookup(_devmem_radix, + key >> PA_SECTION_SHIFT); if (dup) { dev_err(device, "%s: collides with mapping for %s\n", __func__, dev_name(dup->device)); -- 2.9.5
[PATCH 4/7] HMM: Remove superflous RCU protection around radix tree lookup
hmm_devmem_find() requires rcu_read_lock_held() but there's nothing which actually uses the RCU protection. The only caller is hmm_devmem_pages_create() which already grabs the mutex and does superflous rcu_read_lock/unlock() around the function. This doesn't add anything and just adds to confusion. Remove the RCU protection and open-code the radix tree lookup. If this needs to become more sophisticated in the future, let's add them back when necessary. Signed-off-by: Tejun Heo Cc: Jérôme Glisse Cc: linux...@kvack.org Cc: Linus Torvalds --- Hello, Jérôme. This came up while auditing percpu_ref users for missing explicit RCU grace periods. HMM doesn't seem to depend on RCU protection at all, so I thought it'd be better to remove it for now. It's only compile tested. Thanks. mm/hmm.c | 12 ++-- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/mm/hmm.c b/mm/hmm.c index 320545b98..d4627c5 100644 --- a/mm/hmm.c +++ b/mm/hmm.c @@ -845,13 +845,6 @@ static void hmm_devmem_release(struct device *dev, void *data) hmm_devmem_radix_release(resource); } -static struct hmm_devmem *hmm_devmem_find(resource_size_t phys) -{ - WARN_ON_ONCE(!rcu_read_lock_held()); - - return radix_tree_lookup(_devmem_radix, phys >> PA_SECTION_SHIFT); -} - static int hmm_devmem_pages_create(struct hmm_devmem *devmem) { resource_size_t key, align_start, align_size, align_end; @@ -892,9 +885,8 @@ static int hmm_devmem_pages_create(struct hmm_devmem *devmem) for (key = align_start; key <= align_end; key += PA_SECTION_SIZE) { struct hmm_devmem *dup; - rcu_read_lock(); - dup = hmm_devmem_find(key); - rcu_read_unlock(); + dup = radix_tree_lookup(_devmem_radix, + key >> PA_SECTION_SHIFT); if (dup) { dev_err(device, "%s: collides with mapping for %s\n", __func__, dev_name(dup->device)); -- 2.9.5