Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 9e3ffd7c authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "net: qualcomm: rmnet: Use dowlink marker for GRO flushing"

parents 447d816a 90fa5035
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -71,6 +71,7 @@ struct rmnet_port {
	/* dl marker elements */
	struct list_head dl_list;
	struct rmnet_port_priv_stats stats;
	int dl_marker_flush;
};

extern struct rtnl_link_ops rmnet_link_ops;
+17 −5
Original line number Diff line number Diff line
@@ -77,8 +77,8 @@ EXPORT_SYMBOL(rmnet_shs_skb_entry);
void
rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)
{
	struct rmnet_priv *priv = netdev_priv(skb->dev);
	int (*rmnet_shs_stamp)(struct sk_buff *skb, struct rmnet_port *port);
	struct rmnet_priv *priv = netdev_priv(skb->dev);

	skb_reset_transport_header(skb);
	skb_reset_network_header(skb);
@@ -93,11 +93,23 @@ rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port)
		return;
	}

	if (port->data_format & RMNET_INGRESS_FORMAT_DL_MARKER) {
		if (!rmnet_check_skb_can_gro(skb) &&
		    port->dl_marker_flush >= 0) {
			struct napi_struct *napi = get_current_napi_context();

			napi_gro_receive(napi, skb);
			port->dl_marker_flush++;
		} else {
			netif_receive_skb(skb);
		}
	} else {
		if (!rmnet_check_skb_can_gro(skb))
			gro_cells_receive(&priv->gro_cells, skb);
		else
			netif_receive_skb(skb);
	}
}
EXPORT_SYMBOL(rmnet_deliver_skb);

/* MAP handler */
+12 −0
Original line number Diff line number Diff line
@@ -99,6 +99,8 @@ static void rmnet_map_dl_hdr_notify(struct rmnet_port *port,
{
	struct rmnet_map_dl_ind *tmp;

	port->dl_marker_flush = 0;

	list_for_each_entry(tmp, &port->dl_list, list)
		tmp->dl_hdr_handler(dlhdr);
}
@@ -107,9 +109,17 @@ static void rmnet_map_dl_trl_notify(struct rmnet_port *port,
				     struct rmnet_map_dl_ind_trl *dltrl)
{
	struct rmnet_map_dl_ind *tmp;
	struct napi_struct *napi;

	list_for_each_entry(tmp, &port->dl_list, list)
		tmp->dl_trl_handler(dltrl);

	if (port->dl_marker_flush) {
		napi = get_current_napi_context();
		napi_gro_flush(napi, false);
	}

	port->dl_marker_flush = -1;
}

static void rmnet_map_process_flow_start(struct sk_buff *skb,
@@ -253,6 +263,8 @@ void rmnet_map_cmd_exit(struct rmnet_port *port)
void rmnet_map_cmd_init(struct rmnet_port *port)
{
	INIT_LIST_HEAD(&port->dl_list);

	port->dl_marker_flush = -1;
}

int rmnet_map_dl_ind_register(struct rmnet_port *port,