[PATCH] Adding limitation while checking for cardTable
Y.S.Ramakrishna at Sun.COM
Y.S.Ramakrishna at Sun.COM
Thu May 17 22:00:12 UTC 2007
Hi Neo -- thanks for finding this problem and
initiating a fix. I will help shepherd this bug fix via:
6559052 [OpenJDK] CardTableRS::do_MemRegion() could attempt
out-of-bounds translation in addr_for()
-- ramki.
Neo Jia wrote:
> On 5/10/07, Y Srinivas Ramakrishna <Y.S.Ramakrishna at sun.com> wrote:
>
>> Hi Neo --
>>
>> Thanks for the heads-up. This seems worth fixing, at least
>> for hygiene, How about the following instead, where we avoid the
>> addr_for() translation until we are sure it will be safe,
>> provided that the mr argument to the method is backed by
>> card table entries. This avoids the need for the
>> extra compare-and-branch inside the loop in your patch.
>>
>
> Ramki,
>
> Thanks. Your fix makes more sense than mine.
>
> Neo
>
>> void do_MemRegion(MemRegion mr) {
>> HeapWord* end_of_non_clean = mr.end();
>> HeapWord* start_of_non_clean = end_of_non_clean;
>> jbyte* entry = _ct->byte_for(mr.last());
>> jbyte* first_entry = _ct->byte_for(mr.start());
>> while (entry >= first_entry) {
>> jbyte entry_val = *entry;
>> HeapWord* cur = _ct->addr_for(entry);
>> if (!clear_card(entry)) {
>> if (start_of_non_clean < end_of_non_clean) {
>> MemRegion mr2(start_of_non_clean, end_of_non_clean);
>> _dirty_card_closure->do_MemRegion(mr2);
>> }
>> end_of_non_clean = cur;
>> start_of_non_clean = end_of_non_clean;
>> }
>> start_of_non_clean = cur;
>> entry--;
>> }
>> if (start_of_non_clean < end_of_non_clean) {
>> MemRegion mr2(start_of_non_clean, end_of_non_clean);
>> _dirty_card_closure->do_MemRegion(mr2);
>> }
>> }
>>
>> -- Ramki Ramakrishna
>>
>> Neo Jia wrote On 05/09/07 03:31 PM,:
>>
>> > hi,
>> >
>> > Acturally, the existing code works well although it misses the
>> > limitation checking, because the current heap layout will make sure
>> > the memory region checking failed before it goes beyond the limitation
>> > of byte map.
>> >
>> > The reason is that the nursery space is on the lower address, which
>> > will make its committed card table also on the lower address of inside
>> > the byte maps. While walking through the card table of the mature
>> > space and keeping reduce the entry, we will finally hit the boundary
>> > of its byte map before doing the check of memory region, which will
>> > fire the assert of the addr_for, if it is on the lower address.
>> >
>> > So, just adding more safety for this function.
>> >
>> > Thanks,
>> > Neo
>> > Index: memory/cardTableRS.cpp
>> > ===================================================================
>> > --- memory/cardTableRS.cpp (revision 86)
>> > +++ memory/cardTableRS.cpp (working copy)
>> > @@ -163,6 +163,9 @@
>> > start_of_non_clean = end_of_non_clean;
>> > }
>> > entry--;
>> > + // Adding a limit checking for safety.
>> > + if (entry < _ct->base_map())
>> > + break;
>> > start_of_non_clean = cur;
>> > cur = _ct->addr_for(entry);
>> > }
>> > Index: memory/cardTableRS.hpp
>> > ===================================================================
>> > --- memory/cardTableRS.hpp (revision 86)
>> > +++ memory/cardTableRS.hpp (working copy)
>> > @@ -101,6 +101,8 @@
>> >
>> > CardTableModRefBS* ct_bs() { return &_ct_bs; }
>> >
>> > + jbyte * base_map() { return &(_ct_bs._byte_map[0]); }
>> > +
>> > // Override.
>> > void prepare_for_younger_refs_iterate(bool parallel);
>> >
>>
>> --
>>
>> ----------------------------------------------------------------------------
>>
>> Y. Srinivas Ramakrishna HotSpot JVM
>> Sun Microsystems, Inc., USCA 14-102 JWS / Software Group
>> 4140 Network Circle 408 276 7250 (x17250)
>> Santa Clara, CA 95054, U.S.A. Y dot S dot Ramakrishna at Sun
>> dot COM
>> ----------------------------------------------------------------------------
>>
>>
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>>
>> NOTICE: This email message is for the sole use of the intended
>> recipient(s)
>> and may contain confidential and privileged information. Any
>> unauthorized
>> review, use, disclosure or distribution is prohibited. If you are not
>> the
>> intended recipient, please contact the sender by reply email and destroy
>> all copies of the original message.
>>
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>
>>
>>
>
>
More information about the hotspot-gc-dev
mailing list