+2011-03-08 Ian Lance Taylor <iant@google.com>
+
+ PR gold/12525
+ * fileread.cc: #include <climits>.
+ (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 <iant@google.com>
PR gold/12525
// 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 <iant@google.com>.
// This file is part of gold.
#include <cstring>
#include <cerrno>
+#include <climits>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
got, want, static_cast<long long>(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)
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;
// 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 <iant@google.com>.
// This file is part of gold.
{ 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