[U-Boot] [PATCH 03/31] netloop: speed up NetLoop
Heiko Schocher
hs at denx.de
Wed Jan 28 10:38:42 CET 2009
NetLoop polls every cycle with getenv some environment variables.
This is horribly slow, especially when the environment is big.
This patch reads only the environment variables in NetLoop,
when they were changed.
Signed-off-by: Heiko Schocher <hs at denx.de>
---
common/cmd_nvedit.c | 6 +++
include/common.h | 1 +
net/eth.c | 11 +++++-
net/net.c | 88 +++++++++++++++++++++++++++-----------------------
4 files changed, 63 insertions(+), 43 deletions(-)
diff --git a/common/cmd_nvedit.c b/common/cmd_nvedit.c
index 8f6310a..9218945 100644
--- a/common/cmd_nvedit.c
+++ b/common/cmd_nvedit.c
@@ -75,7 +75,12 @@ DECLARE_GLOBAL_DATA_PTR;
static const unsigned long baudrate_table[] = CONFIG_SYS_BAUDRATE_TABLE;
#define N_BAUDRATES (sizeof(baudrate_table) / sizeof(baudrate_table[0]))
+static int env_id = 1;
+int get_env_id (void)
+{
+ return env_id;
+}
/************************************************************************
* Command interface: print one or all environment variables
*/
@@ -168,6 +173,7 @@ int _do_setenv (int flag, int argc, char *argv[])
return 1;
}
+ env_id++;
/*
* search if variable with this name already exists
*/
diff --git a/include/common.h b/include/common.h
index 5968036..85ee090 100644
--- a/include/common.h
+++ b/include/common.h
@@ -269,6 +269,7 @@ void forceenv (char *, char *);
#ifdef CONFIG_AUTO_COMPLETE
int env_complete(char *var, int maxv, char *cmdv[], int maxsz, char *buf);
#endif
+int get_env_id (void);
void pci_init (void);
void pci_init_board(void);
diff --git a/net/eth.c b/net/eth.c
index b7ef09f..d1d73cb 100644
--- a/net/eth.c
+++ b/net/eth.c
@@ -28,7 +28,11 @@
#if defined(CONFIG_CMD_NET) && defined(CONFIG_NET_MULTI)
+static char *act = 0;
+static int env_changed_id = 0;
+
/*
+*
* CPU and board-specific Ethernet initializations. Aliased function
* signals caller to move on
*/
@@ -439,13 +443,16 @@ void eth_try_another(int first_restart)
#ifdef CONFIG_NET_MULTI
void eth_set_current(void)
{
- char *act;
struct eth_device* old_current;
if (!eth_current) /* XXX no current */
return;
- act = getenv("ethact");
+ if ((*act == 0) || (env_changed_id < get_env_id()))
+ {
+ act = getenv("ethact");
+ env_changed_id = get_env_id();
+ }
if (act != NULL) {
old_current = eth_current;
do {
diff --git a/net/net.c b/net/net.c
index e6547f9..eca149c 100644
--- a/net/net.c
+++ b/net/net.c
@@ -209,6 +209,8 @@ uchar NetArpWaitPacketBuf[PKTSIZE_ALIGN + PKTALIGN];
ulong NetArpWaitTimerStart;
int NetArpWaitTry;
+int env_changed_id = 0;
+
void ArpRequest (void)
{
int i;
@@ -341,63 +343,67 @@ restart:
* packets and timer events.
*/
- switch (protocol) {
+ /* update just, if the environment has changed */
+ if (env_changed_id < get_env_id ()) {
+ switch (protocol) {
#if defined(CONFIG_CMD_NFS)
- case NFS:
+ case NFS:
#endif
#if defined(CONFIG_CMD_PING)
- case PING:
+ case PING:
#endif
#if defined(CONFIG_CMD_SNTP)
- case SNTP:
+ case SNTP:
#endif
- case NETCONS:
- case TFTP:
- NetCopyIP(&NetOurIP, &bd->bi_ip_addr);
- NetOurGatewayIP = getenv_IPaddr ("gatewayip");
- NetOurSubnetMask= getenv_IPaddr ("netmask");
- NetOurVLAN = getenv_VLAN("vlan");
- NetOurNativeVLAN = getenv_VLAN("nvlan");
+ case NETCONS:
+ case TFTP:
+ NetCopyIP(&NetOurIP, &bd->bi_ip_addr);
+ NetOurGatewayIP = getenv_IPaddr ("gatewayip");
+ NetOurSubnetMask= getenv_IPaddr ("netmask");
+ NetOurVLAN = getenv_VLAN("vlan");
+ NetOurNativeVLAN = getenv_VLAN("nvlan");
- switch (protocol) {
+ switch (protocol) {
#if defined(CONFIG_CMD_NFS)
- case NFS:
+ case NFS:
#endif
- case NETCONS:
- case TFTP:
- NetServerIP = getenv_IPaddr ("serverip");
- break;
+ case NETCONS:
+ case TFTP:
+ NetServerIP = getenv_IPaddr ("serverip");
+ break;
#if defined(CONFIG_CMD_PING)
- case PING:
- /* nothing */
- break;
+ case PING:
+ /* nothing */
+ break;
#endif
#if defined(CONFIG_CMD_SNTP)
- case SNTP:
- /* nothing */
- break;
+ case SNTP:
+ /* nothing */
+ break;
#endif
+ default:
+ break;
+ }
+
+ break;
+ case BOOTP:
+ case RARP:
+ /*
+ * initialize our IP addr to 0 in order to accept ANY
+ * IP addr assigned to us by the BOOTP / RARP server
+ */
+ NetOurIP = 0;
+ NetServerIP = getenv_IPaddr ("serverip");
+ NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
+ NetOurNativeVLAN = getenv_VLAN("nvlan");
+ case CDP:
+ NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
+ NetOurNativeVLAN = getenv_VLAN("nvlan");
+ break;
default:
break;
}
-
- break;
- case BOOTP:
- case RARP:
- /*
- * initialize our IP addr to 0 in order to accept ANY
- * IP addr assigned to us by the BOOTP / RARP server
- */
- NetOurIP = 0;
- NetServerIP = getenv_IPaddr ("serverip");
- NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
- NetOurNativeVLAN = getenv_VLAN("nvlan");
- case CDP:
- NetOurVLAN = getenv_VLAN("vlan"); /* VLANs must be read */
- NetOurNativeVLAN = getenv_VLAN("nvlan");
- break;
- default:
- break;
+ env_changed_id = get_env_id ();
}
switch (net_check_prereq (protocol)) {
--
1.6.0.6
--
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
More information about the U-Boot
mailing list