From owner-freebsd-hackers@FreeBSD.ORG Wed Sep 17 15:41:56 2014 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 00DE7F0 for ; Wed, 17 Sep 2014 15:41:55 +0000 (UTC) Received: from mail.ignoranthack.me (ignoranthack.me [199.102.79.106]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id D3457E2A for ; Wed, 17 Sep 2014 15:41:55 +0000 (UTC) Received: from [192.168.200.200] (unknown [50.136.155.142]) (using SSLv3 with cipher DHE-RSA-AES128-SHA (128/128 bits)) (No client certificate requested) (Authenticated sender: sbruno@ignoranthack.me) by mail.ignoranthack.me (Postfix) with ESMTPSA id 722A819413C; Wed, 17 Sep 2014 15:41:53 +0000 (UTC) Subject: Re: [PATCH] C++ compatibility for some kernel headers From: Sean Bruno Reply-To: sbruno@freebsd.org To: Sebastian Huber In-Reply-To: <1410952389-30368-1-git-send-email-sebastian.huber@embedded-brains.de> References: <1410952389-30368-1-git-send-email-sebastian.huber@embedded-brains.de> Content-Type: text/plain; charset="us-ascii" Date: Wed, 17 Sep 2014 08:41:51 -0700 Message-ID: <1410968511.1166.30.camel@bruno> Mime-Version: 1.0 X-Mailer: Evolution 2.32.1 FreeBSD GNOME Team Port Content-Transfer-Encoding: 7bit Cc: freebsd-hackers@freebsd.org X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 17 Sep 2014 15:41:56 -0000 On Wed, 2014-09-17 at 13:13 +0200, Sebastian Huber wrote: > We ported the FreeBSD network stack to RTEMS. Some users want to write > network interface drivers in C++. It would be nice if we can make some > FreeBSD kernel headers C++ compatible. > Want to post this over to freebsd-arch@ so you can experience a full "bikeshed" over this? :-) But seriously, freebsd-arch@ is a good place to discuss things that change behavior and capabilites (not bug fixes) and this patch definitely seems to need a good once over. sean > sys/buf_ring.h: > > Mabye it is better to fix the integer type of br_cons_head to be able to > use it in atomic_cmpset_int(). > > sys/mbuf.h: > > Maybe it is better to fix the integer type of ext_cnt to be able to use > it for uma_find_refcnt(). > --- > sys/net/ifq.h | 16 ++++++++-------- > sys/sys/buf_ring.h | 9 +++++---- > sys/sys/mbuf.h | 17 +++++++++-------- > 3 files changed, 22 insertions(+), 20 deletions(-) > > diff --git a/sys/net/ifq.h b/sys/net/ifq.h > index cf0c506..c970443 100644 > --- a/sys/net/ifq.h > +++ b/sys/net/ifq.h > @@ -332,7 +332,7 @@ drbr_enqueue(struct ifnet *ifp, struct buf_ring *br, struct mbuf *m) > } > > static __inline void > -drbr_putback(struct ifnet *ifp, struct buf_ring *br, struct mbuf *new) > +drbr_putback(struct ifnet *ifp, struct buf_ring *br, struct mbuf *new_mbuf) > { > /* > * The top of the list needs to be swapped > @@ -344,11 +344,11 @@ drbr_putback(struct ifnet *ifp, struct buf_ring *br, struct mbuf *new) > * Peek in altq case dequeued it > * so put it back. > */ > - IFQ_DRV_PREPEND(&ifp->if_snd, new); > + IFQ_DRV_PREPEND(&ifp->if_snd, new_mbuf); > return; > } > #endif > - buf_ring_putback_sc(br, new); > + buf_ring_putback_sc(br, new_mbuf); > } > > static __inline struct mbuf * > @@ -367,7 +367,7 @@ drbr_peek(struct ifnet *ifp, struct buf_ring *br) > return (m); > } > #endif > - return(buf_ring_peek(br)); > + return ((struct mbuf *)buf_ring_peek(br)); > } > > static __inline void > @@ -379,7 +379,7 @@ drbr_flush(struct ifnet *ifp, struct buf_ring *br) > if (ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) > IFQ_PURGE(&ifp->if_snd); > #endif > - while ((m = buf_ring_dequeue_sc(br)) != NULL) > + while ((m = (struct mbuf *)buf_ring_dequeue_sc(br)) != NULL) > m_freem(m); > } > > @@ -402,7 +402,7 @@ drbr_dequeue(struct ifnet *ifp, struct buf_ring *br) > return (m); > } > #endif > - return (buf_ring_dequeue_sc(br)); > + return ((struct mbuf *)buf_ring_dequeue_sc(br)); > } > > static __inline void > @@ -435,11 +435,11 @@ drbr_dequeue_cond(struct ifnet *ifp, struct buf_ring *br, > return (m); > } > #endif > - m = buf_ring_peek(br); > + m = (struct mbuf *)buf_ring_peek(br); > if (m == NULL || func(m, arg) == 0) > return (NULL); > > - return (buf_ring_dequeue_sc(br)); > + return ((struct mbuf *)buf_ring_dequeue_sc(br)); > } > > static __inline int > diff --git a/sys/sys/buf_ring.h b/sys/sys/buf_ring.h > index a46aa2d..934f1a7 100644 > --- a/sys/sys/buf_ring.h > +++ b/sys/sys/buf_ring.h > @@ -86,7 +86,8 @@ buf_ring_enqueue(struct buf_ring *br, void *buf) > critical_exit(); > return (ENOBUFS); > } > - } while (!atomic_cmpset_int(&br->br_prod_head, prod_head, prod_next)); > + } while (!atomic_cmpset_int((volatile int *)&br->br_prod_head, > + prod_head, prod_next)); > #ifdef DEBUG_BUFRING > if (br->br_ring[prod_head] != NULL) > panic("dangling value in enqueue"); > @@ -135,7 +136,7 @@ buf_ring_dequeue_mc(struct buf_ring *br) > return (NULL); > } > > - success = atomic_cmpset_int(&br->br_cons_head, cons_head, > + success = atomic_cmpset_int((volatile int *)&br->br_cons_head, cons_head, > cons_next); > } while (success == 0); > > @@ -253,11 +254,11 @@ buf_ring_advance_sc(struct buf_ring *br) > * the compare and an atomic. > */ > static __inline void > -buf_ring_putback_sc(struct buf_ring *br, void *new) > +buf_ring_putback_sc(struct buf_ring *br, void *new_item) > { > KASSERT(br->br_cons_head != br->br_prod_tail, > ("Buf-Ring has none in putback")) ; > - br->br_ring[br->br_cons_head] = new; > + br->br_ring[br->br_cons_head] = new_item; > } > > /* > diff --git a/sys/sys/mbuf.h b/sys/sys/mbuf.h > index d3e6ce0..960636b 100644 > --- a/sys/sys/mbuf.h > +++ b/sys/sys/mbuf.h > @@ -627,7 +627,7 @@ m_get(int how, short type) > > args.flags = 0; > args.type = type; > - return (uma_zalloc_arg(zone_mbuf, &args, how)); > + return ((struct mbuf *)uma_zalloc_arg(zone_mbuf, &args, how)); > } > > /* > @@ -641,7 +641,7 @@ m_getclr(int how, short type) > > args.flags = 0; > args.type = type; > - m = uma_zalloc_arg(zone_mbuf, &args, how); > + m = (struct mbuf *)uma_zalloc_arg(zone_mbuf, &args, how); > if (m != NULL) > bzero(m->m_data, MLEN); > return (m); > @@ -654,7 +654,7 @@ m_gethdr(int how, short type) > > args.flags = M_PKTHDR; > args.type = type; > - return (uma_zalloc_arg(zone_mbuf, &args, how)); > + return ((struct mbuf *)uma_zalloc_arg(zone_mbuf, &args, how)); > } > > static __inline struct mbuf * > @@ -664,7 +664,7 @@ m_getcl(int how, short type, int flags) > > args.flags = flags; > args.type = type; > - return (uma_zalloc_arg(zone_pack, &args, how)); > + return ((struct mbuf *)uma_zalloc_arg(zone_pack, &args, how)); > } > > static __inline void > @@ -703,7 +703,7 @@ m_cljget(struct mbuf *m, int how, int size) > m->m_ext.ext_buf = NULL; > > zone = m_getzone(size); > - return (uma_zalloc_arg(zone, m, how)); > + return ((struct mbuf *)uma_zalloc_arg(zone, m, how)); > } > > static __inline void > @@ -736,12 +736,13 @@ m_cljset(struct mbuf *m, void *cl, int type) > break; > } > > - m->m_data = m->m_ext.ext_buf = cl; > - m->m_ext.ext_free = m->m_ext.ext_arg1 = m->m_ext.ext_arg2 = NULL; > + m->m_data = m->m_ext.ext_buf = (caddr_t)cl; > + m->m_ext.ext_free = NULL; > + m->m_ext.ext_arg1 = m->m_ext.ext_arg2 = NULL; > m->m_ext.ext_size = size; > m->m_ext.ext_type = type; > m->m_ext.ext_flags = 0; > - m->m_ext.ext_cnt = uma_find_refcnt(zone, cl); > + m->m_ext.ext_cnt = (u_int *)uma_find_refcnt(zone, cl); > m->m_flags |= M_EXT; > > }