summaryrefslogtreecommitdiffstats
path: root/src/net/tcp
diff options
context:
space:
mode:
authorMichael Brown2014-04-28 13:31:23 +0200
committerMichael Brown2014-04-28 13:31:23 +0200
commite825a96a25aa060c8b0d6af49192fc0ea3616ba0 (patch)
tree38a3d73e544849027b8439587079c7018b5f94d4 /src/net/tcp
parent[tcp] Profile transmit and receive datapaths (diff)
downloadipxe-e825a96a25aa060c8b0d6af49192fc0ea3616ba0.tar.gz
ipxe-e825a96a25aa060c8b0d6af49192fc0ea3616ba0.tar.xz
ipxe-e825a96a25aa060c8b0d6af49192fc0ea3616ba0.zip
[http] Profile receive datapath
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/net/tcp')
-rw-r--r--src/net/tcp/httpcore.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/net/tcp/httpcore.c b/src/net/tcp/httpcore.c
index 6552ca2b..1d1953e6 100644
--- a/src/net/tcp/httpcore.c
+++ b/src/net/tcp/httpcore.c
@@ -53,6 +53,7 @@ FILE_LICENCE ( GPL2_OR_LATER );
#include <ipxe/acpi.h>
#include <ipxe/version.h>
#include <ipxe/params.h>
+#include <ipxe/profile.h>
#include <ipxe/http.h>
/* Disambiguate the various error causes */
@@ -93,6 +94,12 @@ FILE_LICENCE ( GPL2_OR_LATER );
/** Retry delay used when we cannot understand the Retry-After header */
#define HTTP_RETRY_SECONDS 5
+/** Receive profiler */
+static struct profiler http_rx_profiler __profiler = { .name = "http.rx" };
+
+/** Data transfer profiler */
+static struct profiler http_xfer_profiler __profiler = { .name = "http.xfer" };
+
/** HTTP flags */
enum http_flags {
/** Request is waiting to be transmitted */
@@ -892,6 +899,7 @@ static int http_socket_deliver ( struct http_request *http,
ssize_t line_len;
int rc = 0;
+ profile_start ( &http_rx_profiler );
while ( iobuf && iob_len ( iobuf ) ) {
switch ( http->rx_state ) {
@@ -927,16 +935,20 @@ static int http_socket_deliver ( struct http_request *http,
iob_pull ( iobuf, data_len );
} else if ( data_len < iob_len ( iobuf ) ) {
/* Deliver partial buffer as raw data */
+ profile_start ( &http_xfer_profiler );
rc = xfer_deliver_raw ( &http->xfer,
iobuf->data, data_len );
iob_pull ( iobuf, data_len );
if ( rc != 0 )
goto done;
+ profile_stop ( &http_xfer_profiler );
} else {
/* Deliver whole I/O buffer */
+ profile_start ( &http_xfer_profiler );
if ( ( rc = xfer_deliver_iob ( &http->xfer,
iob_disown ( iobuf ) ) ) != 0 )
goto done;
+ profile_stop ( &http_xfer_profiler );
}
http->rx_len += data_len;
if ( http->chunk_remaining ) {
@@ -985,6 +997,7 @@ static int http_socket_deliver ( struct http_request *http,
if ( rc )
http_close ( http, rc );
free_iob ( iobuf );
+ profile_stop ( &http_rx_profiler );
return rc;
}