[Differential] D6137: tcp/lro: Refactor the free/active list operation.

sepherosa_gmail.com (Sepherosa Ziehau) phabric-noreply at FreeBSD.org
Fri Apr 29 02:29:19 UTC 2016


sepherosa_gmail.com updated this revision to Diff 15725.
sepherosa_gmail.com added a comment.


  Skip the free list operation, which may introduce extra cmp on hot code path

CHANGES SINCE LAST UPDATE
  https://reviews.freebsd.org/D6137?vs=15684&id=15725

REVISION DETAIL
  https://reviews.freebsd.org/D6137

AFFECTED FILES
  sys/netinet/tcp_lro.c

CHANGE DETAILS
  diff --git a/sys/netinet/tcp_lro.c b/sys/netinet/tcp_lro.c
  --- a/sys/netinet/tcp_lro.c
  +++ b/sys/netinet/tcp_lro.c
  @@ -69,6 +69,20 @@
   
   static void	tcp_lro_rx_done(struct lro_ctrl *lc);
   
  +static __inline void
  +tcp_lro_active_insert(struct lro_ctrl *lc, struct lro_entry *le)
  +{
  +
  +	LIST_INSERT_HEAD(&lc->lro_active, le, next);
  +}
  +
  +static __inline void
  +tcp_lro_active_remove(struct lro_entry *le)
  +{
  +
  +	LIST_REMOVE(le, next);
  +}
  +
   int
   tcp_lro_init(struct lro_ctrl *lc)
   {
  @@ -129,7 +143,7 @@
   
   	/* free active mbufs, if any */
   	while ((le = LIST_FIRST(&lc->lro_active)) != NULL) {
  -		LIST_REMOVE(le, next);
  +		tcp_lro_active_remove(le);
   		m_freem(le->m_head);
   	}
   
  @@ -234,7 +248,7 @@
   	struct lro_entry *le;
   
   	while ((le = LIST_FIRST(&lc->lro_active)) != NULL) {
  -		LIST_REMOVE(le, next);
  +		tcp_lro_active_remove(le);
   		tcp_lro_flush(lc, le);
   	}
   }
  @@ -252,7 +266,7 @@
   	timevalsub(&tv, timeout);
   	LIST_FOREACH_SAFE(le, &lc->lro_active, next, le_tmp) {
   		if (timevalcmp(&tv, &le->mtime, >=)) {
  -			LIST_REMOVE(le, next);
  +			tcp_lro_active_remove(le);
   			tcp_lro_flush(lc, le);
   		}
   	}
  @@ -620,16 +634,16 @@
   
   		/* Flush now if appending will result in overflow. */
   		if (le->p_len > (lc->lro_length_lim - tcp_data_len)) {
  -			LIST_REMOVE(le, next);
  +			tcp_lro_active_remove(le);
   			tcp_lro_flush(lc, le);
   			break;
   		}
   
   		/* Try to append the new segment. */
   		if (__predict_false(seq != le->next_seq ||
   		    (tcp_data_len == 0 && le->ack_seq == th->th_ack))) {
   			/* Out of order packet or duplicate ACK. */
  -			LIST_REMOVE(le, next);
  +			tcp_lro_active_remove(le);
   			tcp_lro_flush(lc, le);
   			return (TCP_LRO_CANNOT);
   		}
  @@ -662,7 +676,7 @@
   			 * be further delayed.
   			 */
   			if (le->append_cnt >= lc->lro_ackcnt_lim) {
  -				LIST_REMOVE(le, next);
  +				tcp_lro_active_remove(le);
   				tcp_lro_flush(lc, le);
   			}
   			return (0);
  @@ -686,7 +700,7 @@
   		 * overflow, pro-actively flush now.
   		 */
   		if (le->p_len > (lc->lro_length_lim - lc->ifp->if_mtu)) {
  -			LIST_REMOVE(le, next);
  +			tcp_lro_active_remove(le);
   			tcp_lro_flush(lc, le);
   		} else
   			getmicrotime(&le->mtime);
  @@ -701,7 +715,7 @@
   	/* Start a new segment chain. */
   	le = LIST_FIRST(&lc->lro_free);
   	LIST_REMOVE(le, next);
  -	LIST_INSERT_HEAD(&lc->lro_active, le, next);
  +	tcp_lro_active_insert(lc, le);
   	getmicrotime(&le->mtime);
   
   	/* Start filling in details. */

EMAIL PREFERENCES
  https://reviews.freebsd.org/settings/panel/emailpreferences/

To: sepherosa_gmail.com, network, adrian, delphij, glebius, hselasky, np, decui_microsoft.com, honzhan_microsoft.com, howard0su_gmail.com, transport, rrs, gallatin
Cc: freebsd-net-list
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D6137.15725.patch
Type: text/x-patch
Size: 2387 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-net/attachments/20160429/d5b75116/attachment.bin>


More information about the freebsd-net mailing list