From ecb351e91911d22855384ff4a04041c351dd33a7 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 9 Mar 2011 01:50:33 +0000 Subject: [PATCH] PR gold/12525 * fileread.cc: #include . (GOLD_IOV_MAX): Define. (File_read::read_multiple): Limit number of entries by iov_max. * fileread.h (class File_read): Always set max_readv_entries to 128. --- gold/ChangeLog | 9 +++++++++ gold/fileread.cc | 16 ++++++++++++++-- gold/fileread.h | 8 +------- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/gold/ChangeLog b/gold/ChangeLog index b0e90a118d..c02a174494 100644 --- a/gold/ChangeLog +++ b/gold/ChangeLog @@ -1,3 +1,12 @@ +2011-03-08 Ian Lance Taylor + + PR gold/12525 + * fileread.cc: #include . + (GOLD_IOV_MAX): Define. + (File_read::read_multiple): Limit number of entries by iov_max. + * fileread.h (class File_read): Always set max_readv_entries to + 128. + 2011-03-07 Ian Lance Taylor PR gold/12525 diff --git a/gold/fileread.cc b/gold/fileread.cc index 14a02b2f52..654e47b424 100644 --- a/gold/fileread.cc +++ b/gold/fileread.cc @@ -1,6 +1,6 @@ // fileread.cc -- read files for gold -// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -605,11 +606,22 @@ File_read::do_readv(off_t base, const Read_multiple& rm, size_t start, got, want, static_cast(base + first_offset)); } +// Portable IOV_MAX. + +#if !defined(HAVE_READV) +#define GOLD_IOV_MAX 1 +#elif defined(IOV_MAX) +#define GOLD_IOV_MAX IOV_MAX +#else +#define GOLD_IOV_MAX (File_read::max_readv_entries * 2) +#endif + // Read several pieces of data from the file. void File_read::read_multiple(off_t base, const Read_multiple& rm) { + static size_t iov_max = GOLD_IOV_MAX; size_t count = rm.size(); size_t i = 0; while (i < count) @@ -622,7 +634,7 @@ File_read::read_multiple(off_t base, const Read_multiple& rm) size_t j; for (j = i + 1; j < count; ++j) { - if (j - i >= File_read::max_readv_entries) + if (j - i >= File_read::max_readv_entries || j - i >= iov_max / 2) break; const Read_multiple_entry& j_entry(rm[j]); off_t j_off = j_entry.file_offset; diff --git a/gold/fileread.h b/gold/fileread.h index a972af9ee7..d2ac9276f3 100644 --- a/gold/fileread.h +++ b/gold/fileread.h @@ -1,6 +1,6 @@ // fileread.h -- read files for gold -*- C++ -*- -// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -399,13 +399,7 @@ class File_read { return (file_size + (page_size - 1)) & ~ (page_size - 1); } // The maximum number of entries we will pass to ::readv. -#ifdef HAVE_READV static const size_t max_readv_entries = 128; -#else - // On targets that don't have readv set the max to 1 so readv is not - // used. - static const size_t max_readv_entries = 1; -#endif // Use readv to read data. void