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.
This commit is contained in:
Ian Lance Taylor 2011-03-09 01:50:33 +00:00
parent 98689b2504
commit ecb351e919
3 changed files with 24 additions and 9 deletions

View File

@ -1,3 +1,12 @@
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

View File

@ -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 <iant@google.com>.
// This file is part of gold.
@ -24,6 +24,7 @@
#include <cstring>
#include <cerrno>
#include <climits>
#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
@ -605,11 +606,22 @@ File_read::do_readv(off_t base, const Read_multiple& rm, size_t start,
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)
@ -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;

View File

@ -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 <iant@google.com>.
// 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