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

Commit c5ca6535 authored by Chinmay Agarwal's avatar Chinmay Agarwal
Browse files

Revert "drivers: rmnet_perf: Update logic for nonlinear SKBs"



This reverts commit 72a8f8d6 .

Change-Id: Icc38d51a1a785ecfa533e4f53b312fa7016b2e11

Signed-off-by: default avatarChinmay Agarwal <chinagar@codeaurora.org>
parent 638b0c23
Loading
Loading
Loading
Loading
+19 −33
Original line number Diff line number Diff line
@@ -116,15 +116,16 @@ rmnet_perf_config_free_resources(struct rmnet_perf *perf)
	}

	/* Free everything flow nodes currently hold */
	rmnet_perf_opt_flush_all_flow_nodes();
	rmnet_perf_opt_flush_all_flow_nodes(perf);

	/* Get rid of 64k sk_buff cache */
	rmnet_perf_config_free_64k_buffs(perf);
	/* Before we free tcp_opt's structures, make sure we arent holding
	 * any SKB's hostage
	 */
	rmnet_perf_core_free_held_skbs();
	rmnet_perf_core_free_held_skbs(perf);

	//rmnet_perf_core_timer_exit(perf->core_meta);
	/* Since we allocated in one chunk, we will also free in one chunk */
	kfree(perf);

@@ -192,11 +193,11 @@ static int rmnet_perf_config_allocate_resources(struct rmnet_perf **perf)
		*flow_node = buffer_head;
		buffer_head += flow_node_size;
		(*flow_node)->num_pkts_held = 0;
		(*flow_node)->len = 0;
	}

	local_perf->core_meta = buffer_head;
	core_meta = local_perf->core_meta;
	//rmnet_perf_core_timer_init(core_meta);
	buffer_head += core_meta_size;

	/* Assign common (not specific to something like opt) structures */
@@ -344,18 +345,6 @@ rmnet_perf_dereg_callbacks(struct net_device *dev,
	return return_val_final;
}

static bool rmnet_perf_config_hook_registered(void)
{
	int (*deag_entry)(struct sk_buff *skb);
	void (*frag_entry)(struct rmnet_frag_descriptor *frag_desc,
			   struct rmnet_port *port);

	deag_entry = rcu_dereference(rmnet_perf_deag_entry);
	frag_entry = rcu_dereference(rmnet_perf_desc_entry);

	return deag_entry || frag_entry;
}

/* TODO Needs modifying*/
static int rmnet_perf_config_notify_cb(struct notifier_block *nb,
				       unsigned long event, void *data)
@@ -371,12 +360,11 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb,
	switch (event) {
	case NETDEV_UNREGISTER:
		if (rmnet_is_real_dev_registered(dev) &&
		    rmnet_perf_config_hook_registered() &&
		    (!strncmp(dev->name, "rmnet_ipa0", 10) ||
		     !strncmp(dev->name, "rmnet_mhi0", 10))) {
		    rmnet_perf_deag_entry &&
		    !strncmp(dev->name, "rmnet_ipa0", 10)) {
			struct rmnet_perf_core_meta *core_meta =
				perf->core_meta;
			pr_info("%s(): rmnet_perf netdevice unregister\n",
			pr_err("%s(): rmnet_perf netdevice unregister\n",
			       __func__);
			return_val = rmnet_perf_dereg_callbacks(dev, core_meta);
			return_val |= rmnet_perf_netdev_down();
@@ -384,22 +372,19 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb,
				pr_err("%s(): Error on netdev down event\n",
				       __func__);
			RCU_INIT_POINTER(rmnet_perf_deag_entry, NULL);
			RCU_INIT_POINTER(rmnet_perf_desc_entry, NULL);
			RCU_INIT_POINTER(rmnet_perf_chain_end, NULL);
		}
		break;
	case NETDEV_REGISTER:
		pr_info("%s(): rmnet_perf netdevice register, name = %s\n",
		pr_err("%s(): rmnet_perf netdevice register, name = %s\n",
		       __func__, dev->name);
		/* Check prevents us from allocating resources for every
		 * interface
		 */
		if (!rmnet_perf_config_hook_registered() &&
		if (!rmnet_perf_deag_entry &&
		    strncmp(dev->name, "rmnet_data", 10) == 0) {
			struct rmnet_priv *priv = netdev_priv(dev);

			port = rmnet_get_port(priv->real_dev);
			return_val = rmnet_perf_netdev_up(priv->real_dev,
			return_val |= rmnet_perf_netdev_up(priv->real_dev,
							   port);
			if (return_val == RMNET_PERF_RESOURCE_MGMT_FAIL) {
				pr_err("%s(): rmnet_perf allocation "
@@ -413,9 +398,10 @@ static int rmnet_perf_config_notify_cb(struct notifier_block *nb,
				       "failed. Continue without them\n",
					__func__);
			}
			rmnet_perf_core_set_ingress_hook();
			pr_info("%s(): rmnet_perf registered on name = %s\n",
				__func__, dev->name);
			RCU_INIT_POINTER(rmnet_perf_deag_entry,
					 rmnet_perf_core_deaggregate);
			pr_err("%s(): rmnet_perf registered on "
			       "name = %s\n", __func__, dev->name);
		}
		break;
	default:
@@ -431,13 +417,13 @@ static struct notifier_block rmnet_perf_dev_notifier __read_mostly = {

int __init rmnet_perf_init(void)
{
	pr_info("%s(): initializing rmnet_perf\n", __func__);
	pr_err("%s(): initializing rmnet_perf\n", __func__);
	return register_netdevice_notifier(&rmnet_perf_dev_notifier);
}

void __exit rmnet_perf_exit(void)
{
	pr_info("%s(): exiting rmnet_perf\n", __func__);
	pr_err("%s(): exiting rmnet_perf\n", __func__);
	unregister_netdevice_notifier(&rmnet_perf_dev_notifier);
}

+18 −5
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@

#include <linux/skbuff.h>
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_config.h>
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_descriptor.h>
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_handlers.h>
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_map.h>
#include <../drivers/net/ethernet/qualcomm/rmnet/rmnet_trace.h>
@@ -33,11 +32,25 @@ enum rmnet_perf_resource_management_e {
};

/* rmnet based variables that we rely on*/
extern void rmnet_deliver_skb(struct sk_buff *skb, struct rmnet_port *port);
extern struct rmnet_endpoint *rmnet_get_endpoint(struct rmnet_port *port,
						 u8 mux_id);
extern int rmnet_is_real_dev_registered(const struct net_device *real_dev);
extern void rmnet_set_skb_proto(struct sk_buff *skb);
extern int (*rmnet_perf_deag_entry)(struct sk_buff *skb);
extern void (*rmnet_perf_desc_entry)(struct rmnet_frag_descriptor *frag_desc,
				     struct rmnet_port *port);
extern void (*rmnet_perf_chain_end)(void);

extern int rmnet_map_checksum_downlink_packet(struct sk_buff *skb, u16 len);
extern struct napi_struct *get_current_napi_context(void);
//extern int napi_gro_complete(struct sk_buff *skb);

extern int rmnet_map_flow_command(struct sk_buff *skb, struct rmnet_port *port,
				bool rmnet_perf);
extern int rmnet_map_dl_ind_register(struct rmnet_port *port,
			      struct rmnet_map_dl_ind *dl_ind);
extern int rmnet_map_dl_ind_deregister(struct rmnet_port *port,
				struct rmnet_map_dl_ind *dl_ind);
extern struct rmnet_port *rmnet_get_port(struct net_device *real_dev);
extern void rmnet_map_cmd_init(struct rmnet_port *port);
extern void rmnet_map_cmd_exit(struct rmnet_port *port);

/* Function declarations */
struct rmnet_perf *rmnet_perf_config_get_perf(void);
Loading