Thread (15 messages) flat view 15 messages, 5 authors, 2017-08-30

RE: [patch net-next 1/3] idr: Add new APIs to support unsigned long

From: Chris Mi <hidden>
Date: 2017-08-29 07:34:50

Hi,
-----Original Message-----
From: Hannes Frederic Sowa [mailto:hannes@stressinduktion.org]
Sent: Tuesday, August 29, 2017 3:14 PM
To: Chris Mi <redacted>
Cc: netdev@vger.kernel.org; jhs@mojatatu.com;
xiyou.wangcong@gmail.com; jiri@resnulli.us; davem@davemloft.net;
mawilcox@microsoft.com
Subject: Re: [patch net-next 1/3] idr: Add new APIs to support unsigned long

Hello,

Chris Mi [off-list ref] writes:
quoted
The following new APIs are added:

int idr_alloc_ext(struct idr *idr, void *ptr, unsigned long *index,
                  unsigned long start, unsigned long end, gfp_t gfp);
static inline void *idr_remove_ext(struct idr *idr, unsigned long id);
static inline void *idr_find_ext(const struct idr *idr, unsigned long
id); void *idr_replace_ext(struct idr *idr, void *ptr, unsigned long
id); void *idr_get_next_ext(struct idr *idr, unsigned long *nextid);

Signed-off-by: Chris Mi <redacted>
Signed-off-by: Jiri Pirko <redacted>
---
 include/linux/idr.h        | 16 ++++++++++
 include/linux/radix-tree.h |  3 ++
 lib/idr.c                  | 56 +++++++++++++++++++++++++++++++++++
 lib/radix-tree.c           | 73
++++++++++++++++++++++++++++++++++++++++++++++
quoted
 4 files changed, 148 insertions(+)
[...]
quoted
+int idr_alloc_ext(struct idr *idr, void *ptr, unsigned long *index,
+		  unsigned long start, unsigned long end, gfp_t gfp) {
+	void __rcu **slot;
+	struct radix_tree_iter iter;
+
+	if (WARN_ON_ONCE(radix_tree_is_internal_node(ptr)))
+		return -EINVAL;
+
+	radix_tree_iter_init(&iter, start);
+	slot = idr_get_free_ext(&idr->idr_rt, &iter, gfp, end);
+	if (IS_ERR(slot))
+		return PTR_ERR(slot);
+
+	radix_tree_iter_replace(&idr->idr_rt, &iter, slot, ptr);
+	radix_tree_iter_tag_clear(&idr->idr_rt, &iter, IDR_FREE);
+
+	if (index)
+		*index = iter.index;
+	return 0;
+}
+EXPORT_SYMBOL_GPL(idr_alloc_ext);
Can you express idr_alloc in terms of idr_alloc_ext? Same for most of the
other functions (it seems that signed int was used as return value to indicate
error cases, thus it should be easy to map those).
In idr_alloc(), we have the following check:

        if (WARN_ON_ONCE(start < 0))
                return -EINVAL;

But in idr_alloc_ext(), since we are using unsigned long, we needn't such check.

In order to reuse several lines of code, I think it is not worth to express idr_alloc()
In terms of idr_alloc_ext. 

Thanks,
Chris
[...]

Thanks,
Hannes
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help