summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordbeam <dbeam@chromium.org>2015-04-07 19:27:25 -0700
committerCommit bot <commit-bot@chromium.org>2015-04-08 02:27:58 +0000
commit250544bb29f1ce99448f55814800ae1d1059774c (patch)
tree73c87fa32954a1acd003eee683bd098dd0b956dc
parent940af5f4f4c4226d68ca7e35905329c47a07ba54 (diff)
downloadchromium_src-250544bb29f1ce99448f55814800ae1d1059774c.zip
chromium_src-250544bb29f1ce99448f55814800ae1d1059774c.tar.gz
chromium_src-250544bb29f1ce99448f55814800ae1d1059774c.tar.bz2
Detect seek penalties on Linux/ChromeOS.
This wont work any time some fancy /dev setup is going on. R=thestig@chromium.org BUG=463209 NOTRY=true Review URL: https://codereview.chromium.org/1057093003 Cr-Commit-Position: refs/heads/master@{#323865} (cherry picked from commit 022b19cb4b2f4e7a0f56ad92198b050b76e4415f) Review URL: https://codereview.chromium.org/1065793002 Cr-Commit-Position: refs/branch-heads/2357@{#14} Cr-Branched-From: 59d4494849b405682265ed5d3f5164573b9a939b-refs/heads/master@{#323860}
-rw-r--r--chrome/browser/metrics/drive_metrics_provider.cc9
-rw-r--r--chrome/browser/metrics/drive_metrics_provider_linux.cc60
-rw-r--r--chrome/browser/metrics/drive_metrics_provider_mac.mm12
-rw-r--r--chrome/chrome_browser.gypi2
4 files changed, 74 insertions, 9 deletions
diff --git a/chrome/browser/metrics/drive_metrics_provider.cc b/chrome/browser/metrics/drive_metrics_provider.cc
index 5873583..4b88849 100644
--- a/chrome/browser/metrics/drive_metrics_provider.cc
+++ b/chrome/browser/metrics/drive_metrics_provider.cc
@@ -40,15 +40,6 @@ void DriveMetricsProvider::GetDriveMetrics(const base::Closure& done) {
DriveMetricsProvider::SeekPenaltyResponse::SeekPenaltyResponse()
: success(false) {}
-#if !(defined(OS_WIN) || defined(OS_ANDROID) || defined(OS_IOS))
-// static
-bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path,
- bool* has_seek_penalty) {
- // TODO(dbeam): implement on more platforms.
- return false;
-}
-#endif
-
// static
DriveMetricsProvider::DriveMetrics
DriveMetricsProvider::GetDriveMetricsOnFileThread() {
diff --git a/chrome/browser/metrics/drive_metrics_provider_linux.cc b/chrome/browser/metrics/drive_metrics_provider_linux.cc
new file mode 100644
index 0000000..93c37a0
--- /dev/null
+++ b/chrome/browser/metrics/drive_metrics_provider_linux.cc
@@ -0,0 +1,60 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/metrics/drive_metrics_provider.h"
+
+#include <linux/kdev_t.h> // For MAJOR()/MINOR().
+#include <sys/stat.h>
+#include <string>
+
+#include "base/files/file.h"
+#include "base/files/file_path.h"
+#include "base/files/file_util.h"
+#include "base/strings/stringprintf.h"
+
+#if defined(OS_CHROMEOS)
+#include "base/sys_info.h"
+#endif
+
+namespace {
+
+// See http://www.kernel.org/doc/Documentation/devices.txt for more info.
+const int kFirstScsiMajorNumber = 8;
+const int kPartitionsPerScsiDevice = 16;
+const char kRotationalFormat[] = "/sys/block/sd%c/queue/rotational";
+
+} // namespace
+
+// static
+bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path,
+ bool* has_seek_penalty) {
+#if defined(OS_CHROMEOS)
+ std::string board = base::SysInfo::GetLsbReleaseBoard();
+ if (board != "unknown" && board != "parrot") {
+ // All ChromeOS devices have SSDs. Except some parrots.
+ *has_seek_penalty = false;
+ return true;
+ }
+#endif
+
+ base::File file(path, base::File::FLAG_OPEN | base::File::FLAG_READ);
+ if (!file.IsValid())
+ return false;
+
+ struct stat path_stat;
+ int error = fstat(file.GetPlatformFile(), &path_stat);
+ if (error < 0 || MAJOR(path_stat.st_dev) != kFirstScsiMajorNumber) {
+ // TODO(dbeam): support more SCSI major numbers (e.g. /dev/sdq+) and LVM?
+ return false;
+ }
+
+ char sdX = 'a' + MINOR(path_stat.st_dev) / kPartitionsPerScsiDevice;
+ std::string rotational_path = base::StringPrintf(kRotationalFormat, sdX);
+ std::string rotates;
+ if (!base::ReadFileToString(base::FilePath(rotational_path), &rotates))
+ return false;
+
+ *has_seek_penalty = rotates.substr(0, 1) == "1";
+ return true;
+}
diff --git a/chrome/browser/metrics/drive_metrics_provider_mac.mm b/chrome/browser/metrics/drive_metrics_provider_mac.mm
new file mode 100644
index 0000000..ff98485
--- /dev/null
+++ b/chrome/browser/metrics/drive_metrics_provider_mac.mm
@@ -0,0 +1,12 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/metrics/drive_metrics_provider.h"
+
+// static
+bool DriveMetricsProvider::HasSeekPenalty(const base::FilePath& path,
+ bool* has_seek_penalty) {
+ // TODO(dbeam): implement.
+ return false;
+}
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi
index e3fa309..7b4811d 100644
--- a/chrome/chrome_browser.gypi
+++ b/chrome/chrome_browser.gypi
@@ -1735,6 +1735,8 @@
'browser/metrics/drive_metrics_provider.cc',
'browser/metrics/drive_metrics_provider_android.cc',
'browser/metrics/drive_metrics_provider_ios.mm',
+ 'browser/metrics/drive_metrics_provider_linux.cc',
+ 'browser/metrics/drive_metrics_provider_mac.mm',
'browser/metrics/drive_metrics_provider_win.cc',
'browser/metrics/drive_metrics_provider.h',
'browser/metrics/field_trial_synchronizer.cc',