Re: [Xenomai-core] [PATCH v3 9/9] nucleus: Include all heaps in statistics

2009-11-16 Thread Jan Kiszka
Philippe Gerum wrote:
 ...
 I would rather pick your suggestion to introduce a display-oriented name
 we could call a label instead, to make clear that we are only dealing
 with pretty-printing in /proc.
 
 I.e.
 
 - xnheap_init() remains unchanged
 - xnheap_set_label(fmt, args...) is introduced
 

OK, will take this route!

Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

___
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core


Re: [Xenomai-core] [PATCH v3 9/9] nucleus: Include all heaps in statistics

2009-11-15 Thread Philippe Gerum
On Wed, 2009-11-11 at 13:59 +0100, Jan Kiszka wrote:
 Jan Kiszka wrote:
  Philippe Gerum wrote:
  On Tue, 2009-10-20 at 13:37 +0200, Jan Kiszka wrote:
  This extends /proc/xenomai/heap with statistics about all currently used
  heaps. It takes care to flush nklock while iterating of this potentially
  long list.
 
  Signed-off-by: Jan Kiszka jan.kis...@siemens.com
  ---
 
   include/nucleus/heap.h|   12 +++-
   ksrc/drivers/ipc/iddp.c   |3 +
   ksrc/drivers/ipc/xddp.c   |6 ++
   ksrc/nucleus/heap.c   |  131 
  -
   ksrc/nucleus/module.c |2 -
   ksrc/nucleus/pod.c|5 +-
   ksrc/nucleus/shadow.c |5 +-
   ksrc/skins/native/heap.c  |6 +-
   ksrc/skins/native/pipe.c  |4 +
   ksrc/skins/native/queue.c |6 +-
   ksrc/skins/posix/shm.c|4 +
   ksrc/skins/psos+/rn.c |6 +-
   ksrc/skins/rtai/shm.c |7 ++
   ksrc/skins/vrtx/heap.c|6 +-
   ksrc/skins/vrtx/syscall.c |3 +
   15 files changed, 169 insertions(+), 37 deletions(-)
 
  diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
  index 44db738..f653cd7 100644
  --- a/include/nucleus/heap.h
  +++ b/include/nucleus/heap.h
  @@ -115,6 +115,10 @@ typedef struct xnheap {
 
XNARCH_DECL_DISPLAY_CONTEXT();
 
  + xnholder_t stat_link;   /* Link in heapq */
  +
  + char name[48];
  s,48,XNOBJECT_NAME_LEN
  
  OK, but XNOBJECT_NAME_LEN+16 (due to class prefixes and additional
  information like the minor ID).
  
  +
   } xnheap_t;
 
   extern xnheap_t kheap;
  @@ -202,7 +206,8 @@ void xnheap_cleanup_proc(void);
 
   int xnheap_init_mapped(xnheap_t *heap,
   u_long heapsize,
  -int memflags);
  +int memflags,
  +const char *name, ...);
 
  The va_list is handy, but this breaks the common pattern used throughout
  the rest of the nucleus, based on passing pre-formatted labels. So
  either we make all creation calls use va_lists (but xnthread would need
  more work), or we make xnheap_init_mapped use the not-so-handy current
  form.
 
  Actually, providing xnheap_set_name() and a name parameter/va_list to
  xnheap_init* is one too many, this clutters an inner interface
  uselessly. The latter should go away, assuming that anon heaps may still
  exist.
  
  If we want to print all heaps, we should at least set a name indicating
  their class. And therefore we need to pass a descriptive name along with
  /every/ heap initialization. Forcing the majority of xnheap_init users
  to additionally issue xnheap_set_name is the cluttering a wanted to
  avoid. Only a minority needs this split-up, and therefore you see both
  interfaces in my patch.
  
   void xnheap_destroy_mapped(xnheap_t *heap,
   void (*release)(struct xnheap *heap),
  @@ -224,7 +229,10 @@ void xnheap_destroy_mapped(xnheap_t *heap,
   int xnheap_init(xnheap_t *heap,
void *heapaddr,
u_long heapsize,
  - u_long pagesize);
  + u_long pagesize,
  + const char *name, ...);
  +
  +void xnheap_set_name(xnheap_t *heap, const char *name, ...);
 
   void xnheap_destroy(xnheap_t *heap,
void (*flushfn)(xnheap_t *heap,
  diff --git a/ksrc/drivers/ipc/iddp.c b/ksrc/drivers/ipc/iddp.c
  index a407946..b6382f1 100644
  --- a/ksrc/drivers/ipc/iddp.c
  +++ b/ksrc/drivers/ipc/iddp.c
  @@ -559,7 +559,8 @@ static int __iddp_bind_socket(struct rtipc_private 
  *priv,
}
 
ret = xnheap_init(sk-privpool,
  -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
  +   poolmem, poolsz, XNHEAP_PAGE_SIZE,
  +   ippd: %d, port);
if (ret) {
xnarch_free_host_mem(poolmem, poolsz);
goto fail;
  diff --git a/ksrc/drivers/ipc/xddp.c b/ksrc/drivers/ipc/xddp.c
  index f62147a..a5dafef 100644
  --- a/ksrc/drivers/ipc/xddp.c
  +++ b/ksrc/drivers/ipc/xddp.c
  @@ -703,7 +703,7 @@ static int __xddp_bind_socket(struct rtipc_private 
  *priv,
}
 
ret = xnheap_init(sk-privpool,
  -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
  +   poolmem, poolsz, XNHEAP_PAGE_SIZE, );
if (ret) {
xnarch_free_host_mem(poolmem, poolsz);
goto fail;
  @@ -746,6 +746,10 @@ static int __xddp_bind_socket(struct rtipc_private 
  *priv,
sk-minor = ret;
sa-sipc_port = ret;
sk-name = *sa;
  +
  + if (poolsz  0)
  + xnheap_set_name(sk-bufpool, xddp: %d, sa-sipc_port);
  +
/* Set default destination if unset at binding time. */
if (sk-peer.sipc_port  0)
sk-peer = *sa;
  diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
  index 96c46f8..793d1c5 100644
  --- 

Re: [Xenomai-core] [PATCH v3 9/9] nucleus: Include all heaps in statistics

2009-11-11 Thread Jan Kiszka
Jan Kiszka wrote:
 Philippe Gerum wrote:
 On Tue, 2009-10-20 at 13:37 +0200, Jan Kiszka wrote:
 This extends /proc/xenomai/heap with statistics about all currently used
 heaps. It takes care to flush nklock while iterating of this potentially
 long list.

 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---

  include/nucleus/heap.h|   12 +++-
  ksrc/drivers/ipc/iddp.c   |3 +
  ksrc/drivers/ipc/xddp.c   |6 ++
  ksrc/nucleus/heap.c   |  131 
 -
  ksrc/nucleus/module.c |2 -
  ksrc/nucleus/pod.c|5 +-
  ksrc/nucleus/shadow.c |5 +-
  ksrc/skins/native/heap.c  |6 +-
  ksrc/skins/native/pipe.c  |4 +
  ksrc/skins/native/queue.c |6 +-
  ksrc/skins/posix/shm.c|4 +
  ksrc/skins/psos+/rn.c |6 +-
  ksrc/skins/rtai/shm.c |7 ++
  ksrc/skins/vrtx/heap.c|6 +-
  ksrc/skins/vrtx/syscall.c |3 +
  15 files changed, 169 insertions(+), 37 deletions(-)

 diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
 index 44db738..f653cd7 100644
 --- a/include/nucleus/heap.h
 +++ b/include/nucleus/heap.h
 @@ -115,6 +115,10 @@ typedef struct xnheap {

   XNARCH_DECL_DISPLAY_CONTEXT();

 + xnholder_t stat_link;   /* Link in heapq */
 +
 + char name[48];
 s,48,XNOBJECT_NAME_LEN
 
 OK, but XNOBJECT_NAME_LEN+16 (due to class prefixes and additional
 information like the minor ID).
 
 +
  } xnheap_t;

  extern xnheap_t kheap;
 @@ -202,7 +206,8 @@ void xnheap_cleanup_proc(void);

  int xnheap_init_mapped(xnheap_t *heap,
  u_long heapsize,
 -int memflags);
 +int memflags,
 +const char *name, ...);

 The va_list is handy, but this breaks the common pattern used throughout
 the rest of the nucleus, based on passing pre-formatted labels. So
 either we make all creation calls use va_lists (but xnthread would need
 more work), or we make xnheap_init_mapped use the not-so-handy current
 form.

 Actually, providing xnheap_set_name() and a name parameter/va_list to
 xnheap_init* is one too many, this clutters an inner interface
 uselessly. The latter should go away, assuming that anon heaps may still
 exist.
 
 If we want to print all heaps, we should at least set a name indicating
 their class. And therefore we need to pass a descriptive name along with
 /every/ heap initialization. Forcing the majority of xnheap_init users
 to additionally issue xnheap_set_name is the cluttering a wanted to
 avoid. Only a minority needs this split-up, and therefore you see both
 interfaces in my patch.
 
  void xnheap_destroy_mapped(xnheap_t *heap,
  void (*release)(struct xnheap *heap),
 @@ -224,7 +229,10 @@ void xnheap_destroy_mapped(xnheap_t *heap,
  int xnheap_init(xnheap_t *heap,
   void *heapaddr,
   u_long heapsize,
 - u_long pagesize);
 + u_long pagesize,
 + const char *name, ...);
 +
 +void xnheap_set_name(xnheap_t *heap, const char *name, ...);

  void xnheap_destroy(xnheap_t *heap,
   void (*flushfn)(xnheap_t *heap,
 diff --git a/ksrc/drivers/ipc/iddp.c b/ksrc/drivers/ipc/iddp.c
 index a407946..b6382f1 100644
 --- a/ksrc/drivers/ipc/iddp.c
 +++ b/ksrc/drivers/ipc/iddp.c
 @@ -559,7 +559,8 @@ static int __iddp_bind_socket(struct rtipc_private 
 *priv,
   }

   ret = xnheap_init(sk-privpool,
 -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
 +   poolmem, poolsz, XNHEAP_PAGE_SIZE,
 +   ippd: %d, port);
   if (ret) {
   xnarch_free_host_mem(poolmem, poolsz);
   goto fail;
 diff --git a/ksrc/drivers/ipc/xddp.c b/ksrc/drivers/ipc/xddp.c
 index f62147a..a5dafef 100644
 --- a/ksrc/drivers/ipc/xddp.c
 +++ b/ksrc/drivers/ipc/xddp.c
 @@ -703,7 +703,7 @@ static int __xddp_bind_socket(struct rtipc_private 
 *priv,
   }

   ret = xnheap_init(sk-privpool,
 -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
 +   poolmem, poolsz, XNHEAP_PAGE_SIZE, );
   if (ret) {
   xnarch_free_host_mem(poolmem, poolsz);
   goto fail;
 @@ -746,6 +746,10 @@ static int __xddp_bind_socket(struct rtipc_private 
 *priv,
   sk-minor = ret;
   sa-sipc_port = ret;
   sk-name = *sa;
 +
 + if (poolsz  0)
 + xnheap_set_name(sk-bufpool, xddp: %d, sa-sipc_port);
 +
   /* Set default destination if unset at binding time. */
   if (sk-peer.sipc_port  0)
   sk-peer = *sa;
 diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
 index 96c46f8..793d1c5 100644
 --- a/ksrc/nucleus/heap.c
 +++ b/ksrc/nucleus/heap.c
 @@ -76,6 +76,9 @@ EXPORT_SYMBOL_GPL(kheap);
  xnheap_t kstacks;/* Private stack pool */
  #endif

 +static DEFINE_XNQUEUE(heapq);/* Heap 

Re: [Xenomai-core] [PATCH v3 9/9] nucleus: Include all heaps in statistics

2009-10-22 Thread Jan Kiszka
Philippe Gerum wrote:
 On Tue, 2009-10-20 at 13:37 +0200, Jan Kiszka wrote:
 This extends /proc/xenomai/heap with statistics about all currently used
 heaps. It takes care to flush nklock while iterating of this potentially
 long list.

 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---

  include/nucleus/heap.h|   12 +++-
  ksrc/drivers/ipc/iddp.c   |3 +
  ksrc/drivers/ipc/xddp.c   |6 ++
  ksrc/nucleus/heap.c   |  131 
 -
  ksrc/nucleus/module.c |2 -
  ksrc/nucleus/pod.c|5 +-
  ksrc/nucleus/shadow.c |5 +-
  ksrc/skins/native/heap.c  |6 +-
  ksrc/skins/native/pipe.c  |4 +
  ksrc/skins/native/queue.c |6 +-
  ksrc/skins/posix/shm.c|4 +
  ksrc/skins/psos+/rn.c |6 +-
  ksrc/skins/rtai/shm.c |7 ++
  ksrc/skins/vrtx/heap.c|6 +-
  ksrc/skins/vrtx/syscall.c |3 +
  15 files changed, 169 insertions(+), 37 deletions(-)

 diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
 index 44db738..f653cd7 100644
 --- a/include/nucleus/heap.h
 +++ b/include/nucleus/heap.h
 @@ -115,6 +115,10 @@ typedef struct xnheap {

   XNARCH_DECL_DISPLAY_CONTEXT();

 + xnholder_t stat_link;   /* Link in heapq */
 +
 + char name[48];
 
 s,48,XNOBJECT_NAME_LEN

OK, but XNOBJECT_NAME_LEN+16 (due to class prefixes and additional
information like the minor ID).

 
 +
  } xnheap_t;

  extern xnheap_t kheap;
 @@ -202,7 +206,8 @@ void xnheap_cleanup_proc(void);

  int xnheap_init_mapped(xnheap_t *heap,
  u_long heapsize,
 -int memflags);
 +int memflags,
 +const char *name, ...);

 
 The va_list is handy, but this breaks the common pattern used throughout
 the rest of the nucleus, based on passing pre-formatted labels. So
 either we make all creation calls use va_lists (but xnthread would need
 more work), or we make xnheap_init_mapped use the not-so-handy current
 form.
 
 Actually, providing xnheap_set_name() and a name parameter/va_list to
 xnheap_init* is one too many, this clutters an inner interface
 uselessly. The latter should go away, assuming that anon heaps may still
 exist.

If we want to print all heaps, we should at least set a name indicating
their class. And therefore we need to pass a descriptive name along with
/every/ heap initialization. Forcing the majority of xnheap_init users
to additionally issue xnheap_set_name is the cluttering a wanted to
avoid. Only a minority needs this split-up, and therefore you see both
interfaces in my patch.

 
  void xnheap_destroy_mapped(xnheap_t *heap,
  void (*release)(struct xnheap *heap),
 @@ -224,7 +229,10 @@ void xnheap_destroy_mapped(xnheap_t *heap,
  int xnheap_init(xnheap_t *heap,
   void *heapaddr,
   u_long heapsize,
 - u_long pagesize);
 + u_long pagesize,
 + const char *name, ...);
 +
 +void xnheap_set_name(xnheap_t *heap, const char *name, ...);

  void xnheap_destroy(xnheap_t *heap,
   void (*flushfn)(xnheap_t *heap,
 diff --git a/ksrc/drivers/ipc/iddp.c b/ksrc/drivers/ipc/iddp.c
 index a407946..b6382f1 100644
 --- a/ksrc/drivers/ipc/iddp.c
 +++ b/ksrc/drivers/ipc/iddp.c
 @@ -559,7 +559,8 @@ static int __iddp_bind_socket(struct rtipc_private *priv,
   }

   ret = xnheap_init(sk-privpool,
 -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
 +   poolmem, poolsz, XNHEAP_PAGE_SIZE,
 +   ippd: %d, port);
   if (ret) {
   xnarch_free_host_mem(poolmem, poolsz);
   goto fail;
 diff --git a/ksrc/drivers/ipc/xddp.c b/ksrc/drivers/ipc/xddp.c
 index f62147a..a5dafef 100644
 --- a/ksrc/drivers/ipc/xddp.c
 +++ b/ksrc/drivers/ipc/xddp.c
 @@ -703,7 +703,7 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
   }

   ret = xnheap_init(sk-privpool,
 -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
 +   poolmem, poolsz, XNHEAP_PAGE_SIZE, );
   if (ret) {
   xnarch_free_host_mem(poolmem, poolsz);
   goto fail;
 @@ -746,6 +746,10 @@ static int __xddp_bind_socket(struct rtipc_private 
 *priv,
   sk-minor = ret;
   sa-sipc_port = ret;
   sk-name = *sa;
 +
 + if (poolsz  0)
 + xnheap_set_name(sk-bufpool, xddp: %d, sa-sipc_port);
 +
   /* Set default destination if unset at binding time. */
   if (sk-peer.sipc_port  0)
   sk-peer = *sa;
 diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
 index 96c46f8..793d1c5 100644
 --- a/ksrc/nucleus/heap.c
 +++ b/ksrc/nucleus/heap.c
 @@ -76,6 +76,9 @@ EXPORT_SYMBOL_GPL(kheap);
  xnheap_t kstacks;/* Private stack pool */
  #endif

 +static DEFINE_XNQUEUE(heapq);/* Heap list for /proc reporting */
 

Re: [Xenomai-core] [PATCH v3 9/9] nucleus: Include all heaps in statistics

2009-10-20 Thread Philippe Gerum
On Tue, 2009-10-20 at 13:37 +0200, Jan Kiszka wrote:
 This extends /proc/xenomai/heap with statistics about all currently used
 heaps. It takes care to flush nklock while iterating of this potentially
 long list.
 
 Signed-off-by: Jan Kiszka jan.kis...@siemens.com
 ---
 
  include/nucleus/heap.h|   12 +++-
  ksrc/drivers/ipc/iddp.c   |3 +
  ksrc/drivers/ipc/xddp.c   |6 ++
  ksrc/nucleus/heap.c   |  131 
 -
  ksrc/nucleus/module.c |2 -
  ksrc/nucleus/pod.c|5 +-
  ksrc/nucleus/shadow.c |5 +-
  ksrc/skins/native/heap.c  |6 +-
  ksrc/skins/native/pipe.c  |4 +
  ksrc/skins/native/queue.c |6 +-
  ksrc/skins/posix/shm.c|4 +
  ksrc/skins/psos+/rn.c |6 +-
  ksrc/skins/rtai/shm.c |7 ++
  ksrc/skins/vrtx/heap.c|6 +-
  ksrc/skins/vrtx/syscall.c |3 +
  15 files changed, 169 insertions(+), 37 deletions(-)
 
 diff --git a/include/nucleus/heap.h b/include/nucleus/heap.h
 index 44db738..f653cd7 100644
 --- a/include/nucleus/heap.h
 +++ b/include/nucleus/heap.h
 @@ -115,6 +115,10 @@ typedef struct xnheap {
  
   XNARCH_DECL_DISPLAY_CONTEXT();
  
 + xnholder_t stat_link;   /* Link in heapq */
 +
 + char name[48];

s,48,XNOBJECT_NAME_LEN

 +
  } xnheap_t;
  
  extern xnheap_t kheap;
 @@ -202,7 +206,8 @@ void xnheap_cleanup_proc(void);
  
  int xnheap_init_mapped(xnheap_t *heap,
  u_long heapsize,
 -int memflags);
 +int memflags,
 +const char *name, ...);
  

The va_list is handy, but this breaks the common pattern used throughout
the rest of the nucleus, based on passing pre-formatted labels. So
either we make all creation calls use va_lists (but xnthread would need
more work), or we make xnheap_init_mapped use the not-so-handy current
form.

Actually, providing xnheap_set_name() and a name parameter/va_list to
xnheap_init* is one too many, this clutters an inner interface
uselessly. The latter should go away, assuming that anon heaps may still
exist.

  void xnheap_destroy_mapped(xnheap_t *heap,
  void (*release)(struct xnheap *heap),
 @@ -224,7 +229,10 @@ void xnheap_destroy_mapped(xnheap_t *heap,
  int xnheap_init(xnheap_t *heap,
   void *heapaddr,
   u_long heapsize,
 - u_long pagesize);
 + u_long pagesize,
 + const char *name, ...);
 +
 +void xnheap_set_name(xnheap_t *heap, const char *name, ...);
  
  void xnheap_destroy(xnheap_t *heap,
   void (*flushfn)(xnheap_t *heap,
 diff --git a/ksrc/drivers/ipc/iddp.c b/ksrc/drivers/ipc/iddp.c
 index a407946..b6382f1 100644
 --- a/ksrc/drivers/ipc/iddp.c
 +++ b/ksrc/drivers/ipc/iddp.c
 @@ -559,7 +559,8 @@ static int __iddp_bind_socket(struct rtipc_private *priv,
   }
  
   ret = xnheap_init(sk-privpool,
 -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
 +   poolmem, poolsz, XNHEAP_PAGE_SIZE,
 +   ippd: %d, port);
   if (ret) {
   xnarch_free_host_mem(poolmem, poolsz);
   goto fail;
 diff --git a/ksrc/drivers/ipc/xddp.c b/ksrc/drivers/ipc/xddp.c
 index f62147a..a5dafef 100644
 --- a/ksrc/drivers/ipc/xddp.c
 +++ b/ksrc/drivers/ipc/xddp.c
 @@ -703,7 +703,7 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
   }
  
   ret = xnheap_init(sk-privpool,
 -   poolmem, poolsz, XNHEAP_PAGE_SIZE);
 +   poolmem, poolsz, XNHEAP_PAGE_SIZE, );
   if (ret) {
   xnarch_free_host_mem(poolmem, poolsz);
   goto fail;
 @@ -746,6 +746,10 @@ static int __xddp_bind_socket(struct rtipc_private *priv,
   sk-minor = ret;
   sa-sipc_port = ret;
   sk-name = *sa;
 +
 + if (poolsz  0)
 + xnheap_set_name(sk-bufpool, xddp: %d, sa-sipc_port);
 +
   /* Set default destination if unset at binding time. */
   if (sk-peer.sipc_port  0)
   sk-peer = *sa;
 diff --git a/ksrc/nucleus/heap.c b/ksrc/nucleus/heap.c
 index 96c46f8..793d1c5 100644
 --- a/ksrc/nucleus/heap.c
 +++ b/ksrc/nucleus/heap.c
 @@ -76,6 +76,9 @@ EXPORT_SYMBOL_GPL(kheap);
  xnheap_t kstacks;/* Private stack pool */
  #endif
  
 +static DEFINE_XNQUEUE(heapq);/* Heap list for /proc reporting */
 +static unsigned long heapq_rev;
 +
  static void init_extent(xnheap_t *heap, xnextent_t *extent)
  {
   caddr_t freepage;
 @@ -108,7 +111,7 @@ static void init_extent(xnheap_t *heap, xnextent_t 
 *extent)
   */
  
  /*!
 - * \fn xnheap_init(xnheap_t *heap,void *heapaddr,u_long heapsize,u_long 
 pagesize)
 + * \fn xnheap_init(xnheap_t *heap,void *heapaddr,u_long heapsize,u_long 
 pagesize,const char *name,...)
   * \brief Initialize a memory heap.
   *
   * Initializes a memory heap suitable