[PATCH 1/2] nsiproxy.sys: Avoid redundant pid mapping in tcp_conns_enumerate_all().

Paul Gofman pgofman at codeweavers.com
Tue Mar 22 13:54:49 CDT 2022


Signed-off-by: Paul Gofman <pgofman at codeweavers.com>
---
   Sword of Legends Online calls GetTcpTable() twice (with different sort flag) every 3-4 seconds.
   With the move of the implementation to nsi.dll / nsiproxy.sys the performance of this function regressed
   and now these calls are responsible for visible delay in rendering each 3-4 seconds. I found that the majority
   of time is wasted for mapping pids while that mapping result is not used in this case.
   These two patches reduce the time for GetTcpTable() from roughly 50ms to roughly 5ms. Further improvement looks
   possible but are probably more ugly.

 dlls/nsiproxy.sys/tcp.c | 41 +++++++++++++++++++++++------------------
 1 file changed, 23 insertions(+), 18 deletions(-)

diff --git a/dlls/nsiproxy.sys/tcp.c b/dlls/nsiproxy.sys/tcp.c
index 0cd81ae86e5..5ff3dbd2378 100644
--- a/dlls/nsiproxy.sys/tcp.c
+++ b/dlls/nsiproxy.sys/tcp.c
@@ -540,7 +540,7 @@ static NTSTATUS tcp_conns_enumerate_all( DWORD filter, struct nsi_tcp_conn_key *
         memset( &key, 0, sizeof(key) );
         memset( &dyn, 0, sizeof(dyn) );
         memset( &stat, 0, sizeof(stat) );
-        pid_map = get_pid_map( &pid_map_size );
+        if (static_data) pid_map = get_pid_map( &pid_map_size );
 
         /* skip header line */
         ptr = fgets( buf, sizeof(buf), fp );
@@ -558,15 +558,17 @@ static NTSTATUS tcp_conns_enumerate_all( DWORD filter, struct nsi_tcp_conn_key *
             key.local.Ipv4.sin_port = htons( key.local.Ipv4.sin_port );
             key.remote.Ipv4.sin_port = htons( key.remote.Ipv4.sin_port );
 
-            stat.pid = find_owning_pid( pid_map, pid_map_size, inode );
-            stat.create_time = 0; /* FIXME */
-            stat.mod_info = 0; /* FIXME */
-
             if (num < *count)
             {
                 if (key_data) *key_data++ = key;
                 if (dynamic_data) *dynamic_data++ = dyn;
-                if (static_data) *static_data++ = stat;
+                if (static_data)
+                {
+                    stat.pid = find_owning_pid( pid_map, pid_map_size, inode );
+                    stat.create_time = 0; /* FIXME */
+                    stat.mod_info = 0; /* FIXME */
+                    *static_data++ = stat;
+                }
             }
             num++;
         }
@@ -601,16 +603,17 @@ static NTSTATUS tcp_conns_enumerate_all( DWORD filter, struct nsi_tcp_conn_key *
                                                                      addr_scopes_size );
                 key.remote.Ipv6.sin6_scope_id = find_ipv6_addr_scope( &key.remote.Ipv6.sin6_addr, addr_scopes,
                                                                       addr_scopes_size );
-
-                stat.pid = find_owning_pid( pid_map, pid_map_size, inode );
-                stat.create_time = 0; /* FIXME */
-                stat.mod_info = 0; /* FIXME */
-
                 if (num < *count)
                 {
                     if (key_data) *key_data++ = key;
                     if (dynamic_data) *dynamic_data++ = dyn;
-                    if (static_data) *static_data++ = stat;
+                    if (static_data)
+                    {
+                        stat.pid = find_owning_pid( pid_map, pid_map_size, inode );
+                        stat.create_time = 0; /* FIXME */
+                        stat.mod_info = 0; /* FIXME */
+                        *static_data++ = stat;
+                    }
                 }
                 num++;
             }
@@ -649,7 +652,7 @@ static NTSTATUS tcp_conns_enumerate_all( DWORD filter, struct nsi_tcp_conn_key *
         if (len <= sizeof(struct xinpgen)) goto err;
 
         addr_scopes = get_ipv6_addr_scope_table( &addr_scopes_size );
-        pid_map = get_pid_map( &pid_map_size );
+        if (class >= TCP_TABLE_OWNER_PID_LISTENER) pid_map = get_pid_map( &pid_map_size );
 
         orig_xig = (struct xinpgen *)buf;
         xig = orig_xig;
@@ -708,15 +711,17 @@ static NTSTATUS tcp_conns_enumerate_all( DWORD filter, struct nsi_tcp_conn_key *
                                                                       addr_scopes_size );
             }
 
-            stat.pid = find_owning_pid( pid_map, pid_map_size, (UINT_PTR)sock->so_pcb );
-            stat.create_time = 0; /* FIXME */
-            stat.mod_info = 0; /* FIXME */
-
             if (num < *count)
             {
                 if (key_data) *key_data++ = key;
                 if (dynamic_data) *dynamic_data++ = dyn;
-                if (static_data) *static_data++ = stat;
+                if (static_data)
+                {
+                    stat.pid = find_owning_pid( pid_map, pid_map_size, (UINT_PTR)sock->so_pcb );
+                    stat.create_time = 0; /* FIXME */
+                    stat.mod_info = 0; /* FIXME */
+                    *static_data++ = stat;
+                }
             }
             num++;
         }
-- 
2.35.1




More information about the wine-devel mailing list