diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-02 16:40:27 -0700 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2017-05-02 16:40:27 -0700 | 
| commit | 8d65b08debc7e62b2c6032d7fe7389d895b92cbc (patch) | |
| tree | 0c3141b60c3a03cc32742b5750c5e763b9dae489 /include/linux/hyperv.h | |
| parent | 5a0387a8a8efb90ae7fea1e2e5c62de3efa74691 (diff) | |
| parent | 5d15af6778b8e4ed1fd41b040283af278e7a9a72 (diff) | |
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next
Pull networking updates from David Millar:
 "Here are some highlights from the 2065 networking commits that
  happened this development cycle:
   1) XDP support for IXGBE (John Fastabend) and thunderx (Sunil Kowuri)
   2) Add a generic XDP driver, so that anyone can test XDP even if they
      lack a networking device whose driver has explicit XDP support
      (me).
   3) Sparc64 now has an eBPF JIT too (me)
   4) Add a BPF program testing framework via BPF_PROG_TEST_RUN (Alexei
      Starovoitov)
   5) Make netfitler network namespace teardown less expensive (Florian
      Westphal)
   6) Add symmetric hashing support to nft_hash (Laura Garcia Liebana)
   7) Implement NAPI and GRO in netvsc driver (Stephen Hemminger)
   8) Support TC flower offload statistics in mlxsw (Arkadi Sharshevsky)
   9) Multiqueue support in stmmac driver (Joao Pinto)
  10) Remove TCP timewait recycling, it never really could possibly work
      well in the real world and timestamp randomization really zaps any
      hint of usability this feature had (Soheil Hassas Yeganeh)
  11) Support level3 vs level4 ECMP route hashing in ipv4 (Nikolay
      Aleksandrov)
  12) Add socket busy poll support to epoll (Sridhar Samudrala)
  13) Netlink extended ACK support (Johannes Berg, Pablo Neira Ayuso,
      and several others)
  14) IPSEC hw offload infrastructure (Steffen Klassert)"
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next: (2065 commits)
  tipc: refactor function tipc_sk_recv_stream()
  tipc: refactor function tipc_sk_recvmsg()
  net: thunderx: Optimize page recycling for XDP
  net: thunderx: Support for XDP header adjustment
  net: thunderx: Add support for XDP_TX
  net: thunderx: Add support for XDP_DROP
  net: thunderx: Add basic XDP support
  net: thunderx: Cleanup receive buffer allocation
  net: thunderx: Optimize CQE_TX handling
  net: thunderx: Optimize RBDR descriptor handling
  net: thunderx: Support for page recycling
  ipx: call ipxitf_put() in ioctl error path
  net: sched: add helpers to handle extended actions
  qed*: Fix issues in the ptp filter config implementation.
  qede: Fix concurrency issue in PTP Tx path processing.
  stmmac: Add support for SIMATIC IOT2000 platform
  net: hns: fix ethtool_get_strings overflow in hns driver
  tcp: fix wraparound issue in tcp_lp
  bpf, arm64: fix jit branch offset related to ldimm64
  bpf, arm64: implement jiting of BPF_XADD
  ...
Diffstat (limited to 'include/linux/hyperv.h')
| -rw-r--r-- | include/linux/hyperv.h | 96 | 
1 files changed, 30 insertions, 66 deletions
diff --git a/include/linux/hyperv.h b/include/linux/hyperv.h index 970771a5f739..0c170a3f0d8b 100644 --- a/include/linux/hyperv.h +++ b/include/linux/hyperv.h @@ -1508,14 +1508,6 @@ static inline  void hv_signal_on_read(struct vmbus_channel *channel)  	return;  } -static inline void -init_cached_read_index(struct vmbus_channel *channel) -{ -	struct hv_ring_buffer_info *rbi = &channel->inbound; - -	rbi->cached_read_index = rbi->ring_buffer->read_index; -} -  /*   * Mask off host interrupt callback notifications   */ @@ -1549,76 +1541,48 @@ static inline u32 hv_end_read(struct hv_ring_buffer_info *rbi)  /*   * An API to support in-place processing of incoming VMBUS packets.   */ -#define VMBUS_PKT_TRAILER	8 -static inline struct vmpacket_descriptor * -get_next_pkt_raw(struct vmbus_channel *channel) +/* Get data payload associated with descriptor */ +static inline void *hv_pkt_data(const struct vmpacket_descriptor *desc)  { -	struct hv_ring_buffer_info *ring_info = &channel->inbound; -	u32 priv_read_loc = ring_info->priv_read_index; -	void *ring_buffer = hv_get_ring_buffer(ring_info); -	u32 dsize = ring_info->ring_datasize; -	/* -	 * delta is the difference between what is available to read and -	 * what was already consumed in place. We commit read index after -	 * the whole batch is processed. -	 */ -	u32 delta = priv_read_loc >= ring_info->ring_buffer->read_index ? -		priv_read_loc - ring_info->ring_buffer->read_index : -		(dsize - ring_info->ring_buffer->read_index) + priv_read_loc; -	u32 bytes_avail_toread = (hv_get_bytes_to_read(ring_info) - delta); - -	if (bytes_avail_toread < sizeof(struct vmpacket_descriptor)) -		return NULL; - -	return ring_buffer + priv_read_loc; +	return (void *)((unsigned long)desc + (desc->offset8 << 3));  } -/* - * A helper function to step through packets "in-place" - * This API is to be called after each successful call - * get_next_pkt_raw(). - */ -static inline void put_pkt_raw(struct vmbus_channel *channel, -				struct vmpacket_descriptor *desc) +/* Get data size associated with descriptor */ +static inline u32 hv_pkt_datalen(const struct vmpacket_descriptor *desc)  { -	struct hv_ring_buffer_info *ring_info = &channel->inbound; -	u32 packetlen = desc->len8 << 3; -	u32 dsize = ring_info->ring_datasize; - -	/* -	 * Include the packet trailer. -	 */ -	ring_info->priv_read_index += packetlen + VMBUS_PKT_TRAILER; -	ring_info->priv_read_index %= dsize; +	return (desc->len8 << 3) - (desc->offset8 << 3);  } + +struct vmpacket_descriptor * +hv_pkt_iter_first(struct vmbus_channel *channel); + +struct vmpacket_descriptor * +__hv_pkt_iter_next(struct vmbus_channel *channel, +		   const struct vmpacket_descriptor *pkt); + +void hv_pkt_iter_close(struct vmbus_channel *channel); +  /* - * This call commits the read index and potentially signals the host. - * Here is the pattern for using the "in-place" consumption APIs: - * - * init_cached_read_index(); - * - * while (get_next_pkt_raw() { - *	process the packet "in-place"; - *	put_pkt_raw(); - * } - * if (packets processed in place) - *	commit_rd_index(); + * Get next packet descriptor from iterator + * If at end of list, return NULL and update host.   */ -static inline void commit_rd_index(struct vmbus_channel *channel) +static inline struct vmpacket_descriptor * +hv_pkt_iter_next(struct vmbus_channel *channel, +		 const struct vmpacket_descriptor *pkt)  { -	struct hv_ring_buffer_info *ring_info = &channel->inbound; -	/* -	 * Make sure all reads are done before we update the read index since -	 * the writer may start writing to the read area once the read index -	 * is updated. -	 */ -	virt_rmb(); -	ring_info->ring_buffer->read_index = ring_info->priv_read_index; +	struct vmpacket_descriptor *nxt; + +	nxt = __hv_pkt_iter_next(channel, pkt); +	if (!nxt) +		hv_pkt_iter_close(channel); -	hv_signal_on_read(channel); +	return nxt;  } +#define foreach_vmbus_pkt(pkt, channel) \ +	for (pkt = hv_pkt_iter_first(channel); pkt; \ +	    pkt = hv_pkt_iter_next(channel, pkt))  #endif /* _HYPERV_H */  | 
