Re: [PATCH 1/5] DCCP: Shift ccid3_li_hist

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



|  > /** tfrc_lh_interval_new  -  Insert new record into the Loss Interval database
|  
|  if it inserts it should be named foo_add or foo_insert, _new, at least
|  in the convention I used in DCCP is just for constructors, just to
|  allocate space and initialize the fields. In other areas of the kernel
|  people use _aloc, like in sock_alloc with the same semantics. Only
|  after the object is created we use something like _add or _insert to
|  put it into some list, hash table, etc.
That is a good point, since the function really does not merely allocate, it
 * tests if a loss interval candidate is really new 
 * if yes allocates
 * and then updates all dependent variables (length of I_0 and I_mean)
So `_new' will be dropped, if there are no other suggestions, I'll make it `_add'.

  
|  >  * @lh:            Loss Interval database
|  
|  And who allocated lh, i.e. what is its constructor? is it embedded
|  into some other struct? like
@lh is the tfrc loss interval database, declared in ccid3.h,

struct ccid3_hc_rx_sock {
        u8                              ccid3hcrx_last_counter:4;
        enum ccid3_hc_rx_states         ccid3hcrx_state:8;
        u32                             ccid3hcrx_bytes_recv;
        u32                             ccid3hcrx_x_recv;
        u32                             ccid3hcrx_rtt;
        ktime_t                         ccid3hcrx_last_feedback;
        struct tfrc_rx_hist             ccid3hcrx_hist;		
	struct tfrc_loss_hist           ccid3hcrx_li_hist	/* <== here */
	/* ... */
};

Both tfrc_rx_hist (packet_history.h) and tfrc_loss_hist (loss_interval.h) are
part of the structures used/exported by the TFRC module.

|  and then you call tfrc_lh_interval_new(&hcrx->ccid3hcrx_lh, ...) ?
Yes that is right, it is used via the wrapper in the following manner in ccid3.c

	/*
         *      Handle pending losses and otherwise check for new loss
         */
        if (tfrc_rx_loss_pending(&hcrx->ccid3hcrx_hist) &&
            tfrc_rx_handle_loss(&hcrx->ccid3hcrx_hist,
                                &hcrx->ccid3hcrx_li_hist,
                                skb, ndp, ccid3_first_li, sk) ) {
                do_feedback = FBACK_PARAM_CHANGE;
                goto done_receiving;
        }


|  >  * @rh:            Receive history containing a fresh loss event
|  >  * @calc_first_li: Caller-dependent routine to compute length of first interval
|  >  */
|  > int tfrc_lh_interval_new(struct tfrc_loss_hist *lh, struct tfrc_rx_hist *rh,
|  >                          u32 (*calc_first_li)(struct sock *), struct sock *sk)
|  >
|  > The price to pay is that the argument for *calc_first_li needs to be carried, too,
|  > but other than that it separates the CCID3 and TFRC interfaces.
|  
|  What are the reasons for sk to be needed? In the recent patches I kept
|  it just because we still use the ugly dccp_timestamp() interface that
|  needs it, but we have to solve that and at some point I think the best
|  thing is for the dccp_tfrc_lib code to not know a thing about struct
|  sock.
The struct sock is used (as you guessed) to dereference the ccid3_hc_rx_sock:

static u32 ccid3_first_li(struct sock *sk)
{
        struct ccid3_hc_rx_sock *hcrx = ccid3_hc_rx_sk(sk);
  	/* ... */
}

And the ccid3_hc_rx_sock knows all the relevant parameters (rtt, bytes_received,
when the last feedback was sent, and so on).
So if CCID4 wanted to call the loss interval code, it would just be
	struct ccid4_hc_rx_sock *hcrx = ccid4_hc_rx_sk(sk);     

(With regard to the timestamps, I have updated most of my patches to migrate to ktime_t,
as per Ian's earlier suggestion.)



|  > This function is not actually used (though visible) in CCID3, the one that is called is
|  
|  Why visible?
In net/dccp/ccids/lib/loss_interval.h it is declared as

 extern int  tfrc_lh_interval_new(struct tfrc_loss_hist *, struct tfrc_rx_hist *,
                                  u32 (*first_li)(struct sock *), struct sock *);

I thought it would make sense to export it in case someone wants to later create
a different loss handling mechanism. I can drop the declaration if that is preferable.

|  Oh, I see, with the same intent as what is in my tree, i.e. Ian's
|  rewritten patches:
|  
|  http://git.kernel.org/?p=linux/kernel/git/acme/net-2.6.git;a=blob_plain;f=net/dccp/ccids/lib/loss_interval.h;hb=e3370bb96ed004618a9398b6098421c7b05ac943
I perused most of your patches this morning when I wrote the email, but didn't reply immediately 
since part of the thoughts overlapped with this email.


|  There are just tree functions, no loss interval
|  constructor/destructor, no loss event constructor/destructor, just
|  three functions:
|  
|  extern void dccp_li_hist_purge(struct list_head *list);
|  
|  extern u32 dccp_li_hist_calc_i_mean(struct list_head *list);
|  
|  extern void dccp_li_update_li(struct sock *sk,
|  			      struct list_head *li_hist_list,
|  			      struct list_head *hist_list,
|  			      struct timeval *last_feedback, u16 s,
|  			      u32 bytes_recv, u32 previous_x_recv,
|  			      u64 seq_loss, u8 win_loss);
|  
|  I guess the distance from what is in this tree right now for where you
|  want to go is not that big, at least conceptually, i.e. right now the
|  loss_event.c code doesn't touches ccid specific private state, the
|  interface was reduced to just three functions.
|  
You have done a lot of work and managed to boil down some degree of complexity into just
three functions. In my patch set there is of course the overhead of constructor / destructor
but with that the tfrc_lib could be put into its own, separate module. 
I am amazed that you were able to do this so fast, separating the code out has taken me
several weeks of work. And it does not create overhead: there are in general more deleted than
added lines in the patch.

|  Looks conceptually sound, proceed :-)
|  
I will resubmit the patch set as soon as these changes become visible in David Miller's tree.
-
To unsubscribe from this list: send the line "unsubscribe dccp" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel]     [IETF DCCP]     [Linux Networking]     [Git]     [Security]     [Linux Assembly]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]

  Powered by Linux