----- Original Message -----
 I like using the search command in crash, but noticed that it takes
 much
 longer than my own dump search tools.
 
 As an example, on a level 31 (lots of exclusions) dump from a 4 GB
 x86_64 system, this search command in (benchmarked with a command file)
 finds these results and takes almost 2 minutes:
 
 $ cat cmdfile2
 search -k 0xffff88012491b240
 
 $ time crash-5.1.1 kernel_link dump.201101161845 <cmdfile2
 ...
 
 ffff88012491b280: ffff88012491b240
 ffff880126dcca18: ffff88012491b240
 ffff880126dcca20: ffff88012491b240
 ffff880126dcca30: ffff88012491b240
 ffff880126dcca88: ffff88012491b240
 ffff880126eca148: ffff88012491b240
 ffffc9000468d148: ffff88012491b240
 
 real 1m52.834s
 user 1m50.571s
 sys 0m2.220s
 
 When you watch it search, the first 6 results come out in a few seconds,
 then nothing happens for a long time.
 
 The first six are coming from searching the identity mapped region which
 covers every page in the dump. Note the forms of the addresses for the
 first six hits.
 
 The majority of the search time is spent going through the kernel
 vmalloc address range and checking to see if pages are mapped to any of
 those addresses. Any page searched through these addresses should have
 already been searched in the identity mapped search.
 
 So, for the last hit: (ffffc9000468d148: ffff88012491b240), converting
 to physical, and then back to identity-mapped virtual gives:
 
 crash-5.1.1> vtop 0xffffc9000468d148
 VIRTUAL PHYSICAL
 ffffc9000468d148 126eca148
 ...
 
 And:
 crash-5.1.1> ptov 0x126eca148
 VIRTUAL PHYSICAL
 ffff880126eca148 126eca148
 
 And so the hit at 0xffffc9000468d148 was already caught by the earlier
 hit in the identity-mapped range:
 ffff880126eca148: ffff88012491b240
 
 If you don't want to wait, you can find the vmalloc_start_addr from
 "help -m" and use it to restrict the search range:
 
 $ cat cmdfile2a
 search -k -e 0xffffc90000000000 0xffff88012491b240
 
 $ time crash-5.1.1 dump.201101161845 kernel_link <cmdfile2a
 
 ...
 ffff88012491b280: ffff88012491b240
 ffff880126dcca18: ffff88012491b240
 ffff880126dcca20: ffff88012491b240
 ffff880126dcca30: ffff88012491b240
 ffff880126dcca88: ffff88012491b240
 ffff880126eca148: ffff88012491b240
 
 real 0m4.243s
 user 0m4.088s
 sys 0m0.156s
 
 This command finishes with the first 6 hits in 4 seconds.
 
 Once you have those hits, if you have to know if any virtual mappings
 exist, you can use kmem on the physical address:
 
 crash-5.1.1> vtop 0xffff880126eca148
 VIRTUAL PHYSICAL
 ffff880126eca148 126eca148
 ...
 
 crash-5.1.1> kmem -v 126eca148
 VM_STRUCT ADDRESS RANGE SIZE
 ffff8801277f8180 ffffc90004682000 - 1052672
 
 Which shows the virtual range that contains the mapping for the page.
 Then this command takes no time:
 
 crash-5.1.1> search -k -s ffffc90004682000 -e ffffc90004783000
 ffff88012491b240
 ffffc9000468d148: ffff88012491b240
 
 
 
 I think the drastic reduction of search time from 2 minutes to 4
 seconds
 is interesting enough to warrant a shortcut.
 
 The attached patch implements the -K option that is the same as doing
 "-k -e <vmalloc_start_addr>".
 
 Comments?
 Bob Montgomery 
I like the idea...
But it won't work on ia64 machines, where the vmalloc space is contained
within the region starting at a000000000000000, which is below the unity-mapped
region starting at e000000000000000.
I put in a debug statement to show the "start" and "end" values
passed
to search():
  crash> mach
                MACHINE TYPE: ia64
                 MEMORY SIZE: 15.7 GB
                        CPUS: 2
             PROCESSOR SPEED: 1594 Mhz
                          HZ: 1000
                   PAGE SIZE: 16384
           KERNEL STACK SIZE: 32768
        KERNEL CACHED REGION: e000000000000000
      KERNEL UNCACHED REGION: c000000000000000
       KERNEL VMALLOC REGION: a000000000000000
      USER DATA/STACK REGION: 8000000000000000
      USER DATA/STACK REGION: 6000000000000000
            USER TEXT REGION: 4000000000000000
   USER SHARED MEMORY REGION: 2000000000000000
  USER IA32 EMULATION REGION: 0000000000000000
  crash> search -k deadbeef
  start: a000000100000000 end: ffffffffffffffff
  ... [ cut ] ...
  crash> search -K deadbeef
  start: a000000100000000 end: a000000200000000
  ... [ cut ] ...
  crash>
So it looks like it might need a hack for ia64 anyway, which
already has a few.  I don't think any of the other arches have
their vmalloc regions below their unity-mapped regions.
Dave