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

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

flat view

From: Chris Mi <hidden>
Date: 2017-08-29 08:00:49

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

Tue, Aug 29, 2017 at 09:34:47AM CEST, chrism@mellanox.com wrote:
quoted
Hi,
quoted
-----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.

You can just check and call idr_alloc_ext then to do the actual work.
OK, will fix it.
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help