tech-net archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: RFC: ALTQ caller refactor
Hi,
Thank you for comments.
On 2016/03/04 12:23, Taylor R Campbell wrote:
> Date: Fri, 4 Mar 2016 12:01:52 +0900
> From: Kengo NAKAHARA <k-nakahara%iij.ad.jp@localhost>
>
> On 2016/02/23 13:52, Kengo NAKAHARA wrote:
> > I want to uniform IFQ_ENQUEUE arguments whether ALTQ is defined or not.
> > # And I also want to eliminate ALTQ_DECL and ALTQ_COMMA macros...
> > So, I make struct altq_pktattr from IFQ_CLASSIFY and IFQ_ENQUEUE argument
> > to m_tag. Here is the patch.
> >
> > [...]
> >
> > Could you comment this patch? Any comments are welcome. In particular,
> > comments compared with the following thread.
> > http://mail-index.netbsd.org/tech-kern/2016/02/19/msg020238.html
>
> There is no objection for about two weeks. Can I commit above patch?
>
> If there is no objection, I will commit it after a few days or a week.
>
> One of the questions from the thread you cited is whether you can put
> it in the mbuf packet header instead of using an m_tag. I have no
> opinion on that, but it would be nice to address that question.
Hmm, I feel it is excessive to put mbuf packet. My main intention is
not increasing ALTQ performance but just removing pattr argument from
IFQ_ENQUEUE. Hmm..., maybe I don't have a sense...
> One comment on the patch after a quick glance:
>
> + altq_pattr_cache = pool_cache_init(sizeof(struct altq_pktattr)
> + + sizeof(struct m_tag),
> + 0, 0, 0, "altqmtag", NULL, IPL_NET, NULL, NULL, NULL);
>
> The addition of sizes here may not necessarily work. In particular,
> the pointer returned from pool_cache_get will be aligned, but adding
> sizeof(struct altq_pktattr) to that pointer does not necessarily give
> an aligned result:
>
> p = pool_cache_get(altq_pattr_cache, ...);
> pktattr = p;
> tag = (char *)p + sizeof(struct altq_pktattr);
>
> E.g., if struct altq_pktattr contains a single char member, then
> sizeof(struct altq_pktattr) will be 1, but if struct m_tag starts with
> a pointer, then you need padding between the char and the pointer.
>
> If you want to do this, you should create a structure containing both
> objects:
>
> struct altq_pktattr_tag {
> struct altq_pktattr apt_pktattr;
> struct m_tag apt_tag;
> };
>
> Then use the members of that structure:
>
> p = pool_cache_get(altq_pattr_cache, ...);
> pktattr = &p->apt_pktattr;
> tag = &p->apt_tag;
Hmm..., sorry, I am confused. Just to confirm, m_tag needs metadata
(struct m_tag) in the front of m_tag data(e.g. in this case struct
altq_pktqttr), so both struct m_tag and sturct altq_pktattr are
necessary, I think. It is similar to malloc(len + sizeof(struct m_tag))
in m_tag_get().
Could you tell me about the reason which the addition of sizes may not
necessarily work in detail?
>>From the pktattr or the tag, you can recover p, to pass to
> pool_cache_put, if you need:
>
> p = container_of(pktattr, struct altq_pktattr_tag, apt_pktattr);
> p = container_of(tag, struct altq_pktattr_tag, apt_tag);
>
> This is a safer idiom no matter how struct altq_pktattr and struct
> m_tag are defined. (I don't know what's in their actual definitions,
> and it may turn out to be that no compiler will ever add padding and
> that the arithmetic will happen to work out -- but using an auxiliary
> structure makes the intent clearer anyway.)
I see. I modify to such way.
Thanks,
--
//////////////////////////////////////////////////////////////////////
Internet Initiative Japan Inc.
Device Engineering Section,
Core Product Development Department,
Product Division,
Technology Unit
Kengo NAKAHARA <k-nakahara%iij.ad.jp@localhost>
Home |
Main Index |
Thread Index |
Old Index