At Mon, 26 Aug 2013 13:48:51 +0800,
Liu Yuan wrote:
> 
> On Mon, Aug 26, 2013 at 02:46:24PM +0900, MORITA Kazutaka wrote:
> > At Mon, 26 Aug 2013 13:21:18 +0800,
> > Liu Yuan wrote:
> > > 
> > > On Mon, Aug 26, 2013 at 10:39:26AM +0900, Hitoshi Mitake wrote:
> > > > At Sun, 25 Aug 2013 20:27:27 +0800,
> > > > Liu Yuan wrote:
> > > > > 
> > > > > Add a new struct sd_stat to monitor the activities of the sheep 
> > > > > daemon, which
> > > > > are read by the dog. Currently it is very crude and monitors only 
> > > > > request.
> > > > > 
> > > > > Signed-off-by: Liu Yuan <[email protected]>
> > > > > ---
> > > > >  include/internal_proto.h |   13 +++++++++++++
> > > > >  sheep/request.c          |   33 +++++++++++++++++++++++++++++++++
> > > > >  sheep/sheep_priv.h       |    1 +
> > > > >  3 files changed, 47 insertions(+)
> > > > > 
> > > > > diff --git a/include/internal_proto.h b/include/internal_proto.h
> > > > > index 2c24a52..adb9646 100644
> > > > > --- a/include/internal_proto.h
> > > > > +++ b/include/internal_proto.h
> > > > > @@ -215,4 +215,17 @@ struct object_cache_info {
> > > > >       uint8_t directio;
> > > > >  };
> > > > >  
> > > > > +struct sd_stat {
> > > > > +     struct s_request{
> > > > > +             uint64_t gway_active_nr; /* nr of running request */
> > > > > +             uint64_t peer_active_nr;
> > > > > +             uint64_t gway_total_nr; /* Total nr of requests 
> > > > > received */
> > > > > +             uint64_t peer_total_nr;
> > > > > +             uint64_t gway_total_rx; /* Data in */
> > > > > +             uint64_t gway_total_tx; /* Data out */
> > > > > +             uint64_t peer_total_rx;
> > > > > +             uint64_t peer_total_tx;
> > > > > +     } r;
> > > > > +};
> > > > > +
> > > > >  #endif /* __INTERNAL_PROTO_H__ */
> > > > > diff --git a/sheep/request.c b/sheep/request.c
> > > > > index a79f648..112258a 100644
> > > > > --- a/sheep/request.c
> > > > > +++ b/sheep/request.c
> > > > > @@ -315,6 +315,35 @@ static void queue_local_request(struct request 
> > > > > *req)
> > > > >       queue_work(sys->io_wqueue, &req->work);
> > > > >  }
> > > > >  
> > > > > +static inline void stat_request_begin(struct request *req)
> > > > > +{
> > > > > +     struct sd_req *hdr = &req->rq;
> > > > > +
> > > > > +     if (is_peer_op(req->op)) {
> > > > > +             sys->stat.r.peer_total_nr++;
> > > > > +             sys->stat.r.peer_active_nr++;
> > > > > +             if (hdr->flags & SD_FLAG_CMD_WRITE)
> > > > > +                     sys->stat.r.peer_total_rx += hdr->data_length;
> > > > > +             else
> > > > > +                     sys->stat.r.peer_total_tx += hdr->data_length;
> > > > > +     } else if(is_gateway_op(req->op)) {
> > > > > +             sys->stat.r.gway_total_nr++;
> > > > > +             sys->stat.r.gway_active_nr++;
> > > > > +             if (hdr->flags & SD_FLAG_CMD_WRITE)
> > > > > +                     sys->stat.r.gway_total_rx += hdr->data_length;
> > > > > +             else
> > > > > +                     sys->stat.r.gway_total_tx += hdr->data_length;
> > > > > +     }
> > > > > +}
> > > > > +
> > > > > +static inline void stat_request_end(struct request *req)
> > > > > +{
> > > > > +     if (is_peer_op(req->op))
> > > > > +             sys->stat.r.peer_active_nr--;
> > > > > +     else if(is_gateway_op(req->op))
> > > > > +             sys->stat.r.gway_active_nr--;
> > > > > +}
> > > > > +
> > > > 
> > > > The above two functions should be annotated with main_fn. BTW, why
> > > > should they be inline?
> > > 
> > > I'm wondering, do we need to mark every functions in main thread as 
> > > main_fn? I
> > 
> > If you don't guard sys->stat.* with a lock, they must be called in the
> > main thread.  I think this is an important case and suggest adding
> > main_fn to them.
> > 
> > > think only some important ones, by the way, if marked as inline, we can't
> > > mark them as main_fn.
> > 
> > Why?  I added main_fn to them but didn't hit any problems.
> > 
> >   main_fn static inline void stat_request_end(struct request *req)
> > 
> >   main_fn static inline void stat_request_end(struct request *req)
> 
> No problems but if they are inlined after complied, how does trace checker 
> check
> them? There are no symbols of them and or instrumented by mcount.

Ah, I see the point, but the thread checker is only for debugging,
right?  'inilne' is ignored when we disable an optimization with
--enable-debug, and I think it's make sense to add main_fn to inline
functions.  In addition, 'inline' is just a hint to GCC, and there is
no guarantee that the function will be inlined even with the release
build.

Thanks,

Kazutaka
-- 
sheepdog mailing list
[email protected]
http://lists.wpkg.org/mailman/listinfo/sheepdog

Reply via email to