summaryrefslogtreecommitdiff
Commit message (Collapse)AuthorAgeFilesLines
...
* | | Merge branch 'hashx_perf' into 'main'Ian Jackson2023-08-2310-389/+388
|\ \ \ | |/ / |/| | | | | | | | hashx: Performance improvements for program generation See merge request tpo/core/arti!1524
| * | hashx: Use a boxed slice for Program storageMicah Elizabeth Scott2023-08-211-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | This is a very small change that converts our Vec cheaply into a boxed slice during program generation. Program generation speed shows no changes, and there's no change when using compiled hashes, but is a surprisingly effective 10% speedup to interpreted hash execution. Signed-off-by: Micah Elizabeth Scott <[email protected]>
| * | hashx: Assembly buffer sizing and tidyingMicah Elizabeth Scott2023-08-213-34/+104
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I was looking for ways to optimize out the many redundant capacity checks in the Assembler. I didn't find any promising approaches, but I also saw no evidence that it was an important bottleneck. (A simple unsafe fix didn't improve any important metrics) While I was in there, I tightened up the buffer size definitions for both x86_64 and aarch64, and added assertions to test the limits we set for the size of prologue, epilogue, and single instructions. I kept some of the inlining and data type tweaks, even though benchmarks show no difference. They seem like a step in the right direction, from the disassembly at least. Signed-off-by: Micah Elizabeth Scott <[email protected]>
| * | hashx: avoid surprising overhead of enum code() methodMicah Elizabeth Scott2023-08-211-3/+3
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This is a very simple change that avoids a surprising performance pitfall: using the code() method on an enum from another crate caused a non-inlined function call in code where we otherwise expect a high level of compiler optimization. Replacing code() with a cast to u8 avoids this function call and allows more intensive optimization at the call site. Signed-off-by: Micah Elizabeth Scott <[email protected]>
| * | hashx: Rearrange destination register validator for performanceMicah Elizabeth Scott2023-08-212-12/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | This hoists a few decisions out of the innermost portions of choose_dst_reg, by moving what we can out of dst_register_allowed. Wallclock time benchmarks: generate-interp improves, -6.0% Cachegrind benchmarks: generate_interp_1000x, -5.0% instructions, -11.6% L2 access, -6% RAM Signed-off-by: Micah Elizabeth Scott <[email protected]>
| * | hashx: New approach to avoid memcpy in ProgramMicah Elizabeth Scott2023-08-217-63/+49
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | I was trying to eliminate all the places where we copied a Program (about 4100 bytes) except for the one final copy into a Box; but that approach was proving too annoying. Even returning a Program via Result will cause multiple unnecessary copies that don't optimize out. This patch switches approaches, and instead allocates a Vec<Instruction> presized to the correct capacity. This allocation is made as early as possible and retained for the lifetime of the program if necessary. This means we'll never avoid a heap allocation, but we can always avoid extra copies and we don't need a separate Box for interpreted programs. Performance effects are subtle. Overall wallclock time doesn't change much. Cachegrind shows some accesses moving up from RAM to L2 cache. Using GDB to probe memcpy sizes shows that large (>1024b) memcpy are now totally gone in the generate-interp test. Signed-off-by: Micah Elizabeth Scott <[email protected]>
| * | hashx: Rewrite RegisterSet again to reduce CPU frontend stallsMicah Elizabeth Scott2023-08-216-210/+103
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Closer inspection of the CPU counters showed that the branching in RegisterSet::index() was a big problem, contributing to the overall CPU frontend stall bottleneck in program generation. This new version is less general, and closer to the appraoch used by the original C implementation. We store a sorted ArrayVec of in-set registers, and most operations construct the RegisterSet only once using a combined filter predicate. Choosing a register from a set is now cheaper in branches, instructions, and L1 cache space. We now very rarely manipulate an entire RegisterSet in any way other than by selecting a register randomly. (Just for the register R5 special case.) Wallclock time benchmarks: generate-interp improves, -7.0% generate-x86_64 improves, -7.2% Cachegrind benchmarks: generate_interp_1000x, more total instructions run but a large decrease in frontend cache misses. +4.6% instructions, +11% L1 accesses, -99% L2 access, -40% RAM access. generate_compiled_100x, +4.0% instructions, +9.4% L1 access. cache miss improvements: -57% L2 access, -25% RAM access. Signed-off-by: Micah Elizabeth Scott <[email protected]>
| * | hashx: new RegisterWriter format handles more cases transparentlyMicah Elizabeth Scott2023-08-213-99/+112
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | There was a special case in writer_pair_allowed for making add and subtract equivalent. This patch changes RegisterWriter's encoding, using per-opcode variants instead of per-format variants. The Add/Sub merge can now happen earlier, when RegisterWriter is constructed. Before and after RegisterWriter sizes are the same, at 8 bytes. This patch removes many uses of Option<RegisterWriter> in favor of using a new RegisterWriter::None default, and passes by value rather than by reference. Wallclock time benchmarks: generate-interp improves, -7.5% generate-x86_64 improves, -5.3% Cachegrind benchmarks: generate_interp_1000x, negligible change in total instructions, improvement in cache footprint: -22.8% L2 accesses Signed-off-by: Micah Elizabeth Scott <[email protected]>
* | | Merge branch 'spelling' into 'main'Nick Mathewson2023-08-229-11/+11
|\ \ \ | | | | | | | | | | | | | | | | Fix a few typos. See merge request tpo/core/arti!1532
| * | | arti-client: Fix a couple more typos.Nick Mathewson2023-08-222-2/+2
| | | | | | | | | | | | | | | | I spotted these while I was working on something else.
| * | | Use "typos-cli" to fix a bunch of typos.Nick Mathewson2023-08-227-9/+9
|/ / /
* | | Merge branch 'nightly-warnings-20230822' into 'main'Nick Mathewson2023-08-223-7/+8
|\ \ \ | | | | | | | | | | | | | | | | Fix a few warnings from nightly clippy See merge request tpo/core/arti!1533
| * | | arti::cfg tests: Use fold to make nightly clippy happierNick Mathewson2023-08-221-4/+5
| | | |
| * | | Resolve a pair of warnings about redundant closures.Nick Mathewson2023-08-222-3/+3
|/ / /
* | | Merge branch 'netdir-todo-2-take-2' into 'main'gabi-2502023-08-223-6/+186
|\ \ \ | | | | | | | | | | | | | | | | tor-netdir: Add separate functions for computing hsdirs for upload/download. See merge request tpo/core/arti!1518
| * | | tor-netdir: Use an owned HsBlindId instead of a reference.Gabriela Moldovan2023-08-222-5/+5
| | | | | | | | | | | | | | | | `HsBlindId` is `Copy`.
| * | | tor-netdir: Replace flat_map() with cartesian_product().Gabriela Moldovan2023-08-221-7/+2
| | | |
| * | | tor-netdir: Make `hs_dirs_upload` take an iterator instead of a slice (fmt).Gabriela Moldovan2023-08-221-4/+6
| | | |
| * | | tor-netdir: Make `hs_dirs_upload` take an iterator instead of a slice.Gabriela Moldovan2023-08-221-7/+10
| | | |
| * | | tor-netdir: Add TODO about making HsDirOp private.Gabriela Moldovan2023-08-221-0/+3
| | | | | | | | | | | | | | | | When `hs_dirs` is removed this won't n't need to be public anymore.
| * | | tor-hsclient: Use hs_dirs_download instead of the deprecated hs_dirs.Gabriela Moldovan2023-08-222-7/+6
| | | |
| * | | tor-netdir: Deprecate hs_dirs().Gabriela Moldovan2023-08-222-0/+3
| | | |
| * | | tor-netdir: Add separate functions for computing hsdirs for upload/download.Gabriela Moldovan2023-08-222-0/+103
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | The hsdir selection algorithm for uploads and downloads is different enough to justify splitting `hs_dirs` into 2 different functions. More specifically, when selecting the relays to upload a service's descriptors to, the service's `hsids` need to be matched up with the correct `ring` (using the time period) before applying `select_nodes` to pick the replicas. This is not the case when downloading, because for downloads select relays from the current ring.
| * | | tor-netdir: Add private helpers for selecting hsdirs.Gabriela Moldovan2023-08-221-0/+72
| | |/ | |/| | | | | | | | | | | | | These will become useful when we split `hs_dirs()` into 2 separate functions (one for uploading/services, and another for downloading/clients).
* | | Merge branch 'ipt_establish_better' into 'main'Nick Mathewson2023-08-227-120/+347
|\ \ \ | |/ / |/| | | | | | | | hsserrvice: resolve many TODOs in ipt_establish.rs See merge request tpo/core/arti!1522
| * | hss: Improve comments in IptEstablisher::drop.Nick Mathewson2023-08-221-2/+8
| | |
| * | hss: Allow IptEstablisher to start in Advertised mode.Nick Mathewson2023-08-221-18/+20
| | |
| * | hss: switch to select_biasedNick Mathewson2023-08-221-1/+1
| | |
| * | hss: change terminate oneshot to send "void".Nick Mathewson2023-08-223-7/+11
| | | | | | | | | | | | We don't actually want to distinguish drop from not-drop.
| * | hss: enable tor_proto/experimental-apiNick Mathewson2023-08-221-1/+5
| | | | | | | | | | | | Needed for ClientCirc::wait_for_close
| * | HSS: Use correct timeouts and delays in IptEstablisherNick Mathewson2023-08-223-8/+9
| | |
| * | HSS: Use a more accurate timeout for ESTABLISH_INTRO handshake.Nick Mathewson2023-08-221-10/+11
| | |
| * | HSS: Refactor RendRequest so we can return a stream of it.Nick Mathewson2023-08-226-46/+76
| | | | | | | | | | | | | | | | | | | | | We need a type that holds a rend_handshake::IntroRequest object internally, but where we don't materialize that object from the Introduce2 message inside the MsgHandler, since that's more crypto than we want to put in that task.
| * | HSS: Use DropNotifyWatchSender.Nick Mathewson2023-08-221-3/+3
| | | | | | | | | | | | This ensures that the status becomes Faulty when the reactor exits.
| * | HSS: Implement start_accepting and drop for IptEstablisher.Nick Mathewson2023-08-221-14/+75
| | | | | | | | | | | | This does not yet do exactly what's documented, but it's closer.
| * | hss: launch task to establish introduce requests.Nick Mathewson2023-08-221-14/+76
| | | | | | | | | | | | | | | (This requires us to change the type of the data sent in the stream. I hope to put it back soon.)
| * | hss: Once an ipt session is established, let it keep running.Nick Mathewson2023-08-221-6/+10
| | |
| * | hss: make Ipt establisher code use an mpsc::Sender.Nick Mathewson2023-08-221-28/+32
| | | | | | | | | | | | | | | This solves some problems but introduces a few new ones; I've tried to open comments for the latter.
| * | hss: Establish intro point by RelayIds.Nick Mathewson2023-08-223-8/+56
| | |
| * | proto: fix a comment to refer to circuits, not channels.Nick Mathewson2023-08-221-1/+1
|/ /
* | Merge branch 'webpki-update' into 'main'Ian Jackson2023-08-222-2/+15
|\ \ | | | | | | | | | | | | Resolve (mostly) RUSTSEC-2023-0052 See merge request tpo/core/arti!1534
| * | Add a cargo-audit exception for RUSTSEC-2023-0052Nick Mathewson2023-08-221-0/+13
| | | | | | | | | | | | | | | We've solved this for rustls-webpki, but tls-api (which arti-hyper uses) still requires the unmaintained webpki crate. See #1016.
| * | Upgrade to rustls-webpki unaffected by RUSTSEC-2023-0053Nick Mathewson2023-08-221-2/+2
| | |
* | | Merge branch 'send_raw_msg' into 'main'Nick Mathewson2023-08-223-1/+50
|\ \ \ | | | | | | | | | | | | | | | | | | | | | | | | proto: new ClientCirc::send_raw_msg function. Closes #1010 See merge request tpo/core/arti!1525
| * | | proto: Add crossrefs between start_conversation and send_raw_msgNick Mathewson2023-08-221-0/+6
| | | |
| * | | proto: new ClientCirc::send_raw_msg function.Nick Mathewson2023-08-213-1/+44
| | | | | | | | | | | | | | | | Closes #1010.
* | | | Merge branch 'upgrade_num_enum' into 'main'Ian Jackson2023-08-223-6/+6
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | Upgrade num_enum dependency to 0.7 See merge request tpo/core/arti!1530
| * | | | Upgrade num_enum dependency to 0.7Nick Mathewson2023-08-213-6/+6
| | |_|/ | |/| |
* | | | Merge branch 'redundant_config_links' into 'main'Nick Mathewson2023-08-228-11/+11
|\ \ \ \ | | | | | | | | | | | | | | | | | | | | Resolve warnings about ambiguous/redundant doc links See merge request tpo/core/arti!1531
| * | | | Resolve warnings about ambiguous/redundant doc linksNick Mathewson2023-08-228-11/+11
| | |_|/ | |/| | | | | | | | | | | | | | Nightly rustdoc now warns if you have a link that isn't necessary, and if you have a link that might refer to two different things.