idr: idr_pre_get() takes two arguments
authorFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 6 Oct 2013 18:44:47 +0000 (20:44 +0200)
committerFrançois Tigeot <ftigeot@wolfpond.org>
Sun, 6 Oct 2013 18:47:39 +0000 (20:47 +0200)
Don't diverge from the well-known Linux API

Makefile_upgrade.inc
share/man/man9/Makefile
share/man/man9/idr.9
sys/dev/drm/drm_crtc.c
sys/libkern/idr.c
sys/sys/idr.h

index 5c0c7fd..3cf8a6b 100644 (file)
@@ -2154,6 +2154,7 @@ TO_REMOVE+=/usr/share/nls/fo_FO.ISO8859-1
 TO_REMOVE+=/usr/share/nls/fo_FO.UTF-8
 TO_REMOVE+=/usr/share/nls/hi_IN.UTF-8
 TO_REMOVE+=/usr/share/nls/la_LN.UTF-8
+TO_REMOVE+=/usr/share/man/man9/idr_init1.9.gz
 
 .if ${MACHINE_ARCH} == "x86_64"
 TO_REMOVE+=/usr/sbin/stlstats
index bb375b9..3682fa5 100644 (file)
@@ -481,7 +481,6 @@ MLINKS+=idr.9 idr_destroy.9 \
        idr.9 idr_get_new.9 \
        idr.9 idr_get_new_above.9 \
        idr.9 idr_init.9 \
-       idr.9 idr_init1.9 \
        idr.9 idr_pre_get.9 \
        idr.9 idr_remove.9 \
        idr.9 idr_remove_all.9 \
index f63b62f..6317fd6 100644 (file)
@@ -35,7 +35,6 @@
 .Nm idr_get_new ,
 .Nm idr_get_new_above ,
 .Nm idr_init ,
-.Nm idr_init1 ,
 .Nm idr_pre_get ,
 .Nm idr_remove ,
 .Nm idr_remove_all ,
 .Fn idr_get_new_above "struct idr *idp" "void *ptr" "int sid" "int *id"
 .Ft void
 .Fn idr_init "struct idr *idp"
-.Ft void
-.Fn idr_init1 "struct idr *idp" "int size"
 .Ft int
-.Fn idr_pre_get "struct idr *idp"
+.Fn idr_pre_get "struct idr *idp" "unsigned gfp_mask"
 .Ft void
 .Fn idr_remove "struct idr *idp" "int id"
 .Ft void
@@ -109,17 +106,9 @@ should be called to grow the tree.
 .Pp
 The
 .Fn idr_init
-and
-.Fn idr_init1
-functions initialize an
+function initialize an
 .Nm
 handle that will be used by other functions of the API.
-.Fn idr_init
-initializes a tree with a hard coded default initial capacity (32).
-.Fn idr_init1
-takes additional parameter
-.Fa size
-to set the initial capacity manually.
 The
 .Fn idr_pre_get
 function should be called prior to calling the
@@ -130,9 +119,12 @@ It preallocates enough memory for subsequent calls to
 functions.
 This function should be called without any locks held.
 It returns 0 if enough memory couldn't be allocated, otherwise 1.
-This function lacks the
-.Sq Vt gfp_t Va gfp_mask
-parameter that is found in Linux version of this API.
+The
+.Sq Va gfp_mask
+parameter is only present for compatibility with the Linux implementation of
+this API and is unused on
+.Dx .
+.
 .Pp
 The
 .Fn idr_remove
index 0131ce0..e15c86f 100644 (file)
@@ -223,7 +223,7 @@ static int drm_mode_object_get(struct drm_device *dev,
        int ret;
 
 again:
-       if (idr_pre_get(&dev->mode_config.crtc_idr/*, GFP_KERNEL*/) == 0) {
+       if (idr_pre_get(&dev->mode_config.crtc_idr, GFP_KERNEL) == 0) {
                DRM_ERROR("Ran out memory getting a mode number\n");
                return -ENOMEM;
        }
index b33bed3..b3aee2e 100644 (file)
@@ -194,7 +194,7 @@ found:
 }
 
 int
-idr_pre_get(struct idr *idp)
+idr_pre_get(struct idr *idp, __unused unsigned gfp_mask)
 {
        lwkt_gettoken(&idp->idr_token);
        int error = idr_pre_get1(idp, idp->idr_maxwant, INT_MAX);
index 65b37a3..0ccb2a5 100644 (file)
 
 #include <sys/thread.h>
 
+#ifndef GFP_KERNEL
+#include <sys/malloc.h>
+#define GFP_KERNEL     M_WAITOK
+#endif
+
 struct idr_node {
        void    *data;
        char     reserved;
@@ -75,7 +80,7 @@ void   idr_destroy(struct idr *idp);
 int     idr_for_each(struct idr *idp, int (*fn)(int id, void *p, void *data), void *data);
 int     idr_get_new(struct idr *idp, void *ptr, int *id);
 int     idr_get_new_above(struct idr *idp, void *ptr, int sid, int *id);
-int     idr_pre_get(struct idr *idp);
+int     idr_pre_get(struct idr *idp, unsigned gfp_mask);
 
 void    idr_init(struct idr *idp);